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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +889 -0
- data/LICENSE +21 -0
- data/README.md +2739 -0
- data/SECURITY.md +73 -0
- data/THIRD_PARTY_NOTICES.md +46 -0
- data/app/assets/css/_common.css +3125 -0
- data/app/assets/js/carousel.js +39 -0
- data/app/assets/js/contact-button.js +28 -0
- data/app/assets/js/random-pool.js +44 -0
- data/app/assets/js/search-init.js +11 -0
- data/app/assets/js/theme-toggle.js +39 -0
- data/app/assets/js/viz-tag-bubble.js +108 -0
- data/app/assets/js/viz-tag-cooccurrence.js +125 -0
- data/app/assets/js/viz-topic-constellation.js +142 -0
- data/app/icons/bluesky.svg +3 -0
- data/app/icons/github.svg +3 -0
- data/app/icons/linkedin.svg +3 -0
- data/app/icons/mail.svg +4 -0
- data/app/icons/mastodon.svg +3 -0
- data/app/icons/moon.svg +3 -0
- data/app/icons/rss.svg +3 -0
- data/app/icons/sun.svg +4 -0
- data/app/icons/x.svg +3 -0
- data/app/views/layouts/about.html.erb +70 -0
- data/app/views/layouts/application.html.erb +65 -0
- data/app/views/layouts/book_series_index.html.erb +43 -0
- data/app/views/layouts/bundle.html.erb +111 -0
- data/app/views/layouts/bundles_index.html.erb +46 -0
- data/app/views/layouts/country_index.html.erb +59 -0
- data/app/views/layouts/gallery_index.html.erb +126 -0
- data/app/views/layouts/home.html.erb +107 -0
- data/app/views/layouts/photo.html.erb +100 -0
- data/app/views/layouts/photos_archive.html.erb +101 -0
- data/app/views/layouts/photos_index.html.erb +204 -0
- data/app/views/layouts/post.html.erb +153 -0
- data/app/views/layouts/posts_archive.html.erb +98 -0
- data/app/views/layouts/posts_index.html.erb +80 -0
- data/app/views/layouts/publication.html.erb +116 -0
- data/app/views/layouts/publications_archive.html.erb +89 -0
- data/app/views/layouts/publications_index.html.erb +246 -0
- data/app/views/layouts/related_index.html.erb +48 -0
- data/app/views/layouts/series.html.erb +110 -0
- data/app/views/layouts/series_index.html.erb +202 -0
- data/app/views/layouts/tag.html.erb +16 -0
- data/app/views/layouts/visualization.html.erb +32 -0
- data/app/views/layouts/workshop.html.erb +163 -0
- data/app/views/layouts/workshops_index.html.erb +209 -0
- data/app/views/partials/_back_link.html.erb +27 -0
- data/app/views/partials/_back_to_index.html.erb +25 -0
- data/app/views/partials/_book_grid.html.erb +76 -0
- data/app/views/partials/_book_jsonld.html.erb +72 -0
- data/app/views/partials/_book_related.html.erb +87 -0
- data/app/views/partials/_breadcrumb_jsonld.html.erb +60 -0
- data/app/views/partials/_bundle_cta.html.erb +26 -0
- data/app/views/partials/_carousel.html.erb +64 -0
- data/app/views/partials/_collection_page_jsonld.html.erb +81 -0
- data/app/views/partials/_contact_button.html.erb +42 -0
- data/app/views/partials/_course_jsonld.html.erb +95 -0
- data/app/views/partials/_draft_banner.html.erb +20 -0
- data/app/views/partials/_event_jsonld.html.erb +122 -0
- data/app/views/partials/_footer.html.erb +88 -0
- data/app/views/partials/_future_banner.html.erb +25 -0
- data/app/views/partials/_head.html.erb +440 -0
- data/app/views/partials/_image_gallery.html.erb +64 -0
- data/app/views/partials/_image_object_jsonld.html.erb +61 -0
- data/app/views/partials/_nav.html.erb +63 -0
- data/app/views/partials/_newsletter_subscribe.html.erb +85 -0
- data/app/views/partials/_next_in_series.html.erb +27 -0
- data/app/views/partials/_next_item.html.erb +38 -0
- data/app/views/partials/_pagination.html.erb +15 -0
- data/app/views/partials/_person_jsonld.html.erb +46 -0
- data/app/views/partials/_plausible.html.erb +24 -0
- data/app/views/partials/_post_list.html.erb +101 -0
- data/app/views/partials/_post_series_previews.html.erb +92 -0
- data/app/views/partials/_publication_card.html.erb +75 -0
- data/app/views/partials/_publication_header.html.erb +61 -0
- data/app/views/partials/_related_item.html.erb +68 -0
- data/app/views/partials/_related_items.html.erb +105 -0
- data/app/views/partials/_search.html.erb +26 -0
- data/app/views/partials/_series_pager.html.erb +48 -0
- data/app/views/partials/_skip_link.html.erb +12 -0
- data/app/views/partials/_taxonomy_row.html.erb +62 -0
- data/app/views/partials/_testimonials.html.erb +149 -0
- data/app/views/partials/_theme_toggle.html.erb +19 -0
- data/app/views/partials/_toc.html.erb +136 -0
- data/app/views/partials/_webmentions.html.erb +131 -0
- data/app/views/partials/_website_jsonld.html.erb +39 -0
- data/app/views/partials/home/_contact.html.erb +19 -0
- data/app/views/partials/home/_featured_publication.html.erb +107 -0
- data/app/views/partials/home/_latest_photo.html.erb +95 -0
- data/app/views/partials/home/_latest_post.html.erb +48 -0
- data/app/views/partials/home/_latest_publication.html.erb +89 -0
- data/app/views/partials/home/_next_workshop.html.erb +119 -0
- data/app/views/partials/home/_photo_gallery.html.erb +71 -0
- data/app/views/partials/home/_random_photo.html.erb +106 -0
- data/app/views/partials/home/_random_post.html.erb +64 -0
- data/exe/abqari +37 -0
- data/lib/abqari/artifact_writer.rb +196 -0
- data/lib/abqari/asset_pipeline.rb +235 -0
- data/lib/abqari/audit/a11y.rb +80 -0
- data/lib/abqari/audit/content.rb +154 -0
- data/lib/abqari/audit/dependencies.rb +127 -0
- data/lib/abqari/audit/links.rb +120 -0
- data/lib/abqari/audit/performance.rb +120 -0
- data/lib/abqari/audit/privacy.rb +42 -0
- data/lib/abqari/audit/rule.rb +56 -0
- data/lib/abqari/audit/seo.rb +105 -0
- data/lib/abqari/audit.rb +149 -0
- data/lib/abqari/bundle_assets.rb +127 -0
- data/lib/abqari/cli/new.rb +541 -0
- data/lib/abqari/cli/theme.rb +181 -0
- data/lib/abqari/cli.rb +130 -0
- data/lib/abqari/erbi_template.rb +72 -0
- data/lib/abqari/feed.rb +159 -0
- data/lib/abqari/folio.rb +195 -0
- data/lib/abqari/font_pipeline.rb +104 -0
- data/lib/abqari/headers_file.rb +324 -0
- data/lib/abqari/helpers.rb +308 -0
- data/lib/abqari/hooks.rb +136 -0
- data/lib/abqari/http_safe.rb +222 -0
- data/lib/abqari/image_pipeline.rb +800 -0
- data/lib/abqari/importers/base.rb +351 -0
- data/lib/abqari/importers/cli.rb +169 -0
- data/lib/abqari/importers/ghost.rb +113 -0
- data/lib/abqari/importers/jekyll.rb +256 -0
- data/lib/abqari/importers/substack.rb +204 -0
- data/lib/abqari/importers/support/html_to_markdown.rb +126 -0
- data/lib/abqari/importers/support/image_downloader.rb +170 -0
- data/lib/abqari/importers/support/report.rb +87 -0
- data/lib/abqari/importers/support/slug_normalizer.rb +53 -0
- data/lib/abqari/importers.rb +64 -0
- data/lib/abqari/indieweb.rb +551 -0
- data/lib/abqari/llms_txt.rb +110 -0
- data/lib/abqari/log.rb +61 -0
- data/lib/abqari/manifest.rb +58 -0
- data/lib/abqari/minifier.rb +108 -0
- data/lib/abqari/og_image_generator.rb +223 -0
- data/lib/abqari/page/bundle.rb +152 -0
- data/lib/abqari/page/incremental.rb +74 -0
- data/lib/abqari/page/parser.rb +129 -0
- data/lib/abqari/page/path.rb +153 -0
- data/lib/abqari/page.rb +424 -0
- data/lib/abqari/paginated_shard.rb +109 -0
- data/lib/abqari/paginator.rb +35 -0
- data/lib/abqari/path_safe.rb +62 -0
- data/lib/abqari/plausible_script.rb +20 -0
- data/lib/abqari/publication_normaliser.rb +111 -0
- data/lib/abqari/publisher_pages.rb +342 -0
- data/lib/abqari/redirects.rb +134 -0
- data/lib/abqari/related_index_page.rb +79 -0
- data/lib/abqari/render_context/cover_helpers.rb +338 -0
- data/lib/abqari/render_context/picture_helpers.rb +178 -0
- data/lib/abqari/render_context/publication_helpers.rb +120 -0
- data/lib/abqari/render_context.rb +251 -0
- data/lib/abqari/renderer.rb +788 -0
- data/lib/abqari/robots.rb +93 -0
- data/lib/abqari/search.rb +68 -0
- data/lib/abqari/security_txt.rb +44 -0
- data/lib/abqari/server.rb +508 -0
- data/lib/abqari/site.rb +952 -0
- data/lib/abqari/site_config.rb +212 -0
- data/lib/abqari/site_loader.rb +265 -0
- data/lib/abqari/sitemap.rb +87 -0
- data/lib/abqari/speculation_rules_guard.rb +26 -0
- data/lib/abqari/syndication.rb +466 -0
- data/lib/abqari/syntax_highlighter.rb +146 -0
- data/lib/abqari/taxonomy_page.rb +129 -0
- data/lib/abqari/templates/site_skeleton/.github/dependabot.yml +53 -0
- data/lib/abqari/templates/site_skeleton/.github/workflows/deploy-cloudflare.yml +107 -0
- data/lib/abqari/templates/site_skeleton/.github/workflows/deploy-github-pages.yml +107 -0
- data/lib/abqari/templates/site_skeleton/.github/workflows/deploy-render.yml +87 -0
- data/lib/abqari/templates/site_skeleton/.gitignore +24 -0
- data/lib/abqari/templates/site_skeleton/.ruby-version.tt +1 -0
- data/lib/abqari/templates/site_skeleton/Gemfile.tt +20 -0
- data/lib/abqari/templates/site_skeleton/README.md.tt +60 -0
- data/lib/abqari/templates/site_skeleton/app/assets/css/site.css +9 -0
- data/lib/abqari/templates/site_skeleton/bin/audit +46 -0
- data/lib/abqari/templates/site_skeleton/bin/build +32 -0
- data/lib/abqari/templates/site_skeleton/bin/fetch-folio +32 -0
- data/lib/abqari/templates/site_skeleton/bin/fetch-fonts +20 -0
- data/lib/abqari/templates/site_skeleton/bin/import +31 -0
- data/lib/abqari/templates/site_skeleton/bin/index +30 -0
- data/lib/abqari/templates/site_skeleton/bin/new +235 -0
- data/lib/abqari/templates/site_skeleton/bin/serve +30 -0
- data/lib/abqari/templates/site_skeleton/config/site.blank.yml.tt +65 -0
- data/lib/abqari/templates/site_skeleton/config/site.yml.tt +266 -0
- data/lib/abqari/templates/site_skeleton/content/404.md +17 -0
- data/lib/abqari/templates/site_skeleton/content/about.blank.md.tt +12 -0
- data/lib/abqari/templates/site_skeleton/content/about.md.tt +18 -0
- data/lib/abqari/templates/site_skeleton/content/index.blank.md.tt +11 -0
- data/lib/abqari/templates/site_skeleton/content/index.md.tt +34 -0
- data/lib/abqari/templates/site_skeleton/content/photos/index.md.tt +12 -0
- data/lib/abqari/templates/site_skeleton/content/posts/index.md +12 -0
- data/lib/abqari/templates/site_skeleton/content/posts/welcome/index.md.tt +50 -0
- data/lib/abqari/templates/site_skeleton/content/publications/index.md.tt +13 -0
- data/lib/abqari/templates/site_skeleton/content/workshops/index.md.tt +13 -0
- data/lib/abqari/templates/site_skeleton/public/robots.txt +6 -0
- data/lib/abqari/templates/site_skeleton/themes/.gitkeep +0 -0
- data/lib/abqari/templates/site_skeleton/vendor/folio/.gitkeep +0 -0
- data/lib/abqari/templates/site_skeleton/vendor/fonts/.gitkeep +0 -0
- data/lib/abqari/theme_bootstrap.rb +19 -0
- data/lib/abqari/theme_fonts.rb +51 -0
- data/lib/abqari/version.rb +18 -0
- data/lib/abqari/visualizations.rb +215 -0
- data/lib/abqari.rb +154 -0
- data/themes/bootstrap/css/app.css +97 -0
- data/themes/bootstrap/public/LICENSE +21 -0
- data/themes/bootstrap/public/css/bootstrap.min.css +6 -0
- data/themes/bootstrap/public/css/bootstrap.min.css.map +1 -0
- data/themes/bootstrap/public/js/bootstrap.bundle.min.js +7 -0
- data/themes/bootstrap/public/js/bootstrap.bundle.min.js.map +1 -0
- data/themes/custom/css/app.css +176 -0
- data/themes/magazine/css/app.css +242 -0
- data/themes/minimal/css/app.css +151 -0
- data/themes/notebook/css/app.css +205 -0
- data/themes/sand/css/app.css +179 -0
- data/vendor/d3/d3.v7.min.js +2 -0
- data/vendor/heroicons/16/solid/academic-cap.svg +4 -0
- data/vendor/heroicons/16/solid/adjustments-horizontal.svg +3 -0
- data/vendor/heroicons/16/solid/adjustments-vertical.svg +3 -0
- data/vendor/heroicons/16/solid/archive-box-arrow-down.svg +4 -0
- data/vendor/heroicons/16/solid/archive-box-x-mark.svg +4 -0
- data/vendor/heroicons/16/solid/archive-box.svg +4 -0
- data/vendor/heroicons/16/solid/arrow-down-circle.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-down-left.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-down-on-square-stack.svg +4 -0
- data/vendor/heroicons/16/solid/arrow-down-on-square.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-down-right.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-down-tray.svg +4 -0
- data/vendor/heroicons/16/solid/arrow-down.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-left-circle.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-left-end-on-rectangle.svg +4 -0
- data/vendor/heroicons/16/solid/arrow-left-start-on-rectangle.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-left.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-long-down.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-long-left.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-long-right.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-long-up.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-path-rounded-square.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-path.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-right-circle.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-right-end-on-rectangle.svg +4 -0
- data/vendor/heroicons/16/solid/arrow-right-start-on-rectangle.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-right.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-top-right-on-square.svg +4 -0
- data/vendor/heroicons/16/solid/arrow-trending-down.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-trending-up.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-turn-down-left.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-turn-down-right.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-turn-left-down.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-turn-left-up.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-turn-right-down.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-turn-right-up.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-turn-up-left.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-turn-up-right.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-up-circle.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-up-left.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-up-on-square-stack.svg +4 -0
- data/vendor/heroicons/16/solid/arrow-up-on-square.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-up-right.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-up-tray.svg +4 -0
- data/vendor/heroicons/16/solid/arrow-up.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-uturn-down.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-uturn-left.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-uturn-right.svg +3 -0
- data/vendor/heroicons/16/solid/arrow-uturn-up.svg +3 -0
- data/vendor/heroicons/16/solid/arrows-pointing-in.svg +3 -0
- data/vendor/heroicons/16/solid/arrows-pointing-out.svg +3 -0
- data/vendor/heroicons/16/solid/arrows-right-left.svg +3 -0
- data/vendor/heroicons/16/solid/arrows-up-down.svg +3 -0
- data/vendor/heroicons/16/solid/at-symbol.svg +3 -0
- data/vendor/heroicons/16/solid/backspace.svg +3 -0
- data/vendor/heroicons/16/solid/backward.svg +3 -0
- data/vendor/heroicons/16/solid/banknotes.svg +4 -0
- data/vendor/heroicons/16/solid/bars-2.svg +3 -0
- data/vendor/heroicons/16/solid/bars-3-bottom-left.svg +3 -0
- data/vendor/heroicons/16/solid/bars-3-bottom-right.svg +3 -0
- data/vendor/heroicons/16/solid/bars-3-center-left.svg +3 -0
- data/vendor/heroicons/16/solid/bars-3.svg +3 -0
- data/vendor/heroicons/16/solid/bars-4.svg +3 -0
- data/vendor/heroicons/16/solid/bars-arrow-down.svg +3 -0
- data/vendor/heroicons/16/solid/bars-arrow-up.svg +3 -0
- data/vendor/heroicons/16/solid/battery-0.svg +3 -0
- data/vendor/heroicons/16/solid/battery-100.svg +4 -0
- data/vendor/heroicons/16/solid/battery-50.svg +4 -0
- data/vendor/heroicons/16/solid/beaker.svg +3 -0
- data/vendor/heroicons/16/solid/bell-alert.svg +4 -0
- data/vendor/heroicons/16/solid/bell-slash.svg +4 -0
- data/vendor/heroicons/16/solid/bell-snooze.svg +3 -0
- data/vendor/heroicons/16/solid/bell.svg +3 -0
- data/vendor/heroicons/16/solid/bold.svg +3 -0
- data/vendor/heroicons/16/solid/bolt-slash.svg +3 -0
- data/vendor/heroicons/16/solid/bolt.svg +3 -0
- data/vendor/heroicons/16/solid/book-open.svg +3 -0
- data/vendor/heroicons/16/solid/bookmark-slash.svg +3 -0
- data/vendor/heroicons/16/solid/bookmark-square.svg +3 -0
- data/vendor/heroicons/16/solid/bookmark.svg +3 -0
- data/vendor/heroicons/16/solid/briefcase.svg +4 -0
- data/vendor/heroicons/16/solid/bug-ant.svg +3 -0
- data/vendor/heroicons/16/solid/building-library.svg +3 -0
- data/vendor/heroicons/16/solid/building-office-2.svg +3 -0
- data/vendor/heroicons/16/solid/building-office.svg +3 -0
- data/vendor/heroicons/16/solid/building-storefront.svg +3 -0
- data/vendor/heroicons/16/solid/cake.svg +3 -0
- data/vendor/heroicons/16/solid/calculator.svg +3 -0
- data/vendor/heroicons/16/solid/calendar-date-range.svg +4 -0
- data/vendor/heroicons/16/solid/calendar-days.svg +4 -0
- data/vendor/heroicons/16/solid/calendar.svg +3 -0
- data/vendor/heroicons/16/solid/camera.svg +4 -0
- data/vendor/heroicons/16/solid/chart-bar-square.svg +3 -0
- data/vendor/heroicons/16/solid/chart-bar.svg +3 -0
- data/vendor/heroicons/16/solid/chart-pie.svg +4 -0
- data/vendor/heroicons/16/solid/chat-bubble-bottom-center-text.svg +3 -0
- data/vendor/heroicons/16/solid/chat-bubble-bottom-center.svg +3 -0
- data/vendor/heroicons/16/solid/chat-bubble-left-ellipsis.svg +3 -0
- data/vendor/heroicons/16/solid/chat-bubble-left-right.svg +4 -0
- data/vendor/heroicons/16/solid/chat-bubble-left.svg +3 -0
- data/vendor/heroicons/16/solid/chat-bubble-oval-left-ellipsis.svg +3 -0
- data/vendor/heroicons/16/solid/chat-bubble-oval-left.svg +3 -0
- data/vendor/heroicons/16/solid/check-badge.svg +3 -0
- data/vendor/heroicons/16/solid/check-circle.svg +3 -0
- data/vendor/heroicons/16/solid/check.svg +3 -0
- data/vendor/heroicons/16/solid/chevron-double-down.svg +3 -0
- data/vendor/heroicons/16/solid/chevron-double-left.svg +3 -0
- data/vendor/heroicons/16/solid/chevron-double-right.svg +3 -0
- data/vendor/heroicons/16/solid/chevron-double-up.svg +3 -0
- data/vendor/heroicons/16/solid/chevron-down.svg +3 -0
- data/vendor/heroicons/16/solid/chevron-left.svg +3 -0
- data/vendor/heroicons/16/solid/chevron-right.svg +3 -0
- data/vendor/heroicons/16/solid/chevron-up-down.svg +3 -0
- data/vendor/heroicons/16/solid/chevron-up.svg +3 -0
- data/vendor/heroicons/16/solid/circle-stack.svg +5 -0
- data/vendor/heroicons/16/solid/clipboard-document-check.svg +4 -0
- data/vendor/heroicons/16/solid/clipboard-document-list.svg +4 -0
- data/vendor/heroicons/16/solid/clipboard-document.svg +4 -0
- data/vendor/heroicons/16/solid/clipboard.svg +3 -0
- data/vendor/heroicons/16/solid/clock.svg +3 -0
- data/vendor/heroicons/16/solid/cloud-arrow-down.svg +3 -0
- data/vendor/heroicons/16/solid/cloud-arrow-up.svg +3 -0
- data/vendor/heroicons/16/solid/cloud.svg +3 -0
- data/vendor/heroicons/16/solid/code-bracket-square.svg +3 -0
- data/vendor/heroicons/16/solid/code-bracket.svg +3 -0
- data/vendor/heroicons/16/solid/cog-6-tooth.svg +3 -0
- data/vendor/heroicons/16/solid/cog-8-tooth.svg +3 -0
- data/vendor/heroicons/16/solid/cog.svg +3 -0
- data/vendor/heroicons/16/solid/command-line.svg +3 -0
- data/vendor/heroicons/16/solid/computer-desktop.svg +3 -0
- data/vendor/heroicons/16/solid/cpu-chip.svg +4 -0
- data/vendor/heroicons/16/solid/credit-card.svg +4 -0
- data/vendor/heroicons/16/solid/cube-transparent.svg +3 -0
- data/vendor/heroicons/16/solid/cube.svg +3 -0
- data/vendor/heroicons/16/solid/currency-bangladeshi.svg +3 -0
- data/vendor/heroicons/16/solid/currency-dollar.svg +4 -0
- data/vendor/heroicons/16/solid/currency-euro.svg +3 -0
- data/vendor/heroicons/16/solid/currency-pound.svg +3 -0
- data/vendor/heroicons/16/solid/currency-rupee.svg +3 -0
- data/vendor/heroicons/16/solid/currency-yen.svg +3 -0
- data/vendor/heroicons/16/solid/cursor-arrow-rays.svg +3 -0
- data/vendor/heroicons/16/solid/cursor-arrow-ripple.svg +5 -0
- data/vendor/heroicons/16/solid/device-phone-mobile.svg +4 -0
- data/vendor/heroicons/16/solid/device-tablet.svg +4 -0
- data/vendor/heroicons/16/solid/divide.svg +4 -0
- data/vendor/heroicons/16/solid/document-arrow-down.svg +3 -0
- data/vendor/heroicons/16/solid/document-arrow-up.svg +3 -0
- data/vendor/heroicons/16/solid/document-chart-bar.svg +3 -0
- data/vendor/heroicons/16/solid/document-check.svg +3 -0
- data/vendor/heroicons/16/solid/document-currency-bangladeshi.svg +3 -0
- data/vendor/heroicons/16/solid/document-currency-dollar.svg +4 -0
- data/vendor/heroicons/16/solid/document-currency-euro.svg +3 -0
- data/vendor/heroicons/16/solid/document-currency-pound.svg +3 -0
- data/vendor/heroicons/16/solid/document-currency-rupee.svg +3 -0
- data/vendor/heroicons/16/solid/document-currency-yen.svg +3 -0
- data/vendor/heroicons/16/solid/document-duplicate.svg +4 -0
- data/vendor/heroicons/16/solid/document-magnifying-glass.svg +4 -0
- data/vendor/heroicons/16/solid/document-minus.svg +3 -0
- data/vendor/heroicons/16/solid/document-plus.svg +3 -0
- data/vendor/heroicons/16/solid/document-text.svg +3 -0
- data/vendor/heroicons/16/solid/document.svg +3 -0
- data/vendor/heroicons/16/solid/ellipsis-horizontal-circle.svg +3 -0
- data/vendor/heroicons/16/solid/ellipsis-horizontal.svg +3 -0
- data/vendor/heroicons/16/solid/ellipsis-vertical.svg +3 -0
- data/vendor/heroicons/16/solid/envelope-open.svg +3 -0
- data/vendor/heroicons/16/solid/envelope.svg +4 -0
- data/vendor/heroicons/16/solid/equals.svg +3 -0
- data/vendor/heroicons/16/solid/exclamation-circle.svg +3 -0
- data/vendor/heroicons/16/solid/exclamation-triangle.svg +3 -0
- data/vendor/heroicons/16/solid/eye-dropper.svg +3 -0
- data/vendor/heroicons/16/solid/eye-slash.svg +4 -0
- data/vendor/heroicons/16/solid/eye.svg +4 -0
- data/vendor/heroicons/16/solid/face-frown.svg +3 -0
- data/vendor/heroicons/16/solid/face-smile.svg +3 -0
- data/vendor/heroicons/16/solid/film.svg +3 -0
- data/vendor/heroicons/16/solid/finger-print.svg +3 -0
- data/vendor/heroicons/16/solid/fire.svg +3 -0
- data/vendor/heroicons/16/solid/flag.svg +3 -0
- data/vendor/heroicons/16/solid/folder-arrow-down.svg +3 -0
- data/vendor/heroicons/16/solid/folder-minus.svg +3 -0
- data/vendor/heroicons/16/solid/folder-open.svg +3 -0
- data/vendor/heroicons/16/solid/folder-plus.svg +3 -0
- data/vendor/heroicons/16/solid/folder.svg +3 -0
- data/vendor/heroicons/16/solid/forward.svg +3 -0
- data/vendor/heroicons/16/solid/funnel.svg +3 -0
- data/vendor/heroicons/16/solid/gif.svg +3 -0
- data/vendor/heroicons/16/solid/gift-top.svg +4 -0
- data/vendor/heroicons/16/solid/gift.svg +4 -0
- data/vendor/heroicons/16/solid/globe-alt.svg +3 -0
- data/vendor/heroicons/16/solid/globe-americas.svg +3 -0
- data/vendor/heroicons/16/solid/globe-asia-australia.svg +3 -0
- data/vendor/heroicons/16/solid/globe-europe-africa.svg +3 -0
- data/vendor/heroicons/16/solid/h1.svg +3 -0
- data/vendor/heroicons/16/solid/h2.svg +3 -0
- data/vendor/heroicons/16/solid/h3.svg +3 -0
- data/vendor/heroicons/16/solid/hand-raised.svg +3 -0
- data/vendor/heroicons/16/solid/hand-thumb-down.svg +3 -0
- data/vendor/heroicons/16/solid/hand-thumb-up.svg +3 -0
- data/vendor/heroicons/16/solid/hashtag.svg +3 -0
- data/vendor/heroicons/16/solid/heart.svg +3 -0
- data/vendor/heroicons/16/solid/home-modern.svg +3 -0
- data/vendor/heroicons/16/solid/home.svg +3 -0
- data/vendor/heroicons/16/solid/identification.svg +3 -0
- data/vendor/heroicons/16/solid/inbox-arrow-down.svg +4 -0
- data/vendor/heroicons/16/solid/inbox-stack.svg +4 -0
- data/vendor/heroicons/16/solid/inbox.svg +3 -0
- data/vendor/heroicons/16/solid/information-circle.svg +3 -0
- data/vendor/heroicons/16/solid/italic.svg +3 -0
- data/vendor/heroicons/16/solid/key.svg +3 -0
- data/vendor/heroicons/16/solid/language.svg +3 -0
- data/vendor/heroicons/16/solid/lifebuoy.svg +3 -0
- data/vendor/heroicons/16/solid/light-bulb.svg +3 -0
- data/vendor/heroicons/16/solid/link-slash.svg +3 -0
- data/vendor/heroicons/16/solid/link.svg +4 -0
- data/vendor/heroicons/16/solid/list-bullet.svg +3 -0
- data/vendor/heroicons/16/solid/lock-closed.svg +3 -0
- data/vendor/heroicons/16/solid/lock-open.svg +3 -0
- data/vendor/heroicons/16/solid/magnifying-glass-circle.svg +4 -0
- data/vendor/heroicons/16/solid/magnifying-glass-minus.svg +4 -0
- data/vendor/heroicons/16/solid/magnifying-glass-plus.svg +4 -0
- data/vendor/heroicons/16/solid/magnifying-glass.svg +3 -0
- data/vendor/heroicons/16/solid/map-pin.svg +3 -0
- data/vendor/heroicons/16/solid/map.svg +3 -0
- data/vendor/heroicons/16/solid/megaphone.svg +3 -0
- data/vendor/heroicons/16/solid/microphone.svg +4 -0
- data/vendor/heroicons/16/solid/minus-circle.svg +3 -0
- data/vendor/heroicons/16/solid/minus.svg +3 -0
- data/vendor/heroicons/16/solid/moon.svg +3 -0
- data/vendor/heroicons/16/solid/musical-note.svg +3 -0
- data/vendor/heroicons/16/solid/newspaper.svg +4 -0
- data/vendor/heroicons/16/solid/no-symbol.svg +3 -0
- data/vendor/heroicons/16/solid/numbered-list.svg +3 -0
- data/vendor/heroicons/16/solid/paint-brush.svg +3 -0
- data/vendor/heroicons/16/solid/paper-airplane.svg +3 -0
- data/vendor/heroicons/16/solid/paper-clip.svg +3 -0
- data/vendor/heroicons/16/solid/pause-circle.svg +3 -0
- data/vendor/heroicons/16/solid/pause.svg +3 -0
- data/vendor/heroicons/16/solid/pencil-square.svg +4 -0
- data/vendor/heroicons/16/solid/pencil.svg +3 -0
- data/vendor/heroicons/16/solid/percent-badge.svg +3 -0
- data/vendor/heroicons/16/solid/phone-arrow-down-left.svg +4 -0
- data/vendor/heroicons/16/solid/phone-arrow-up-right.svg +4 -0
- data/vendor/heroicons/16/solid/phone-x-mark.svg +4 -0
- data/vendor/heroicons/16/solid/phone.svg +3 -0
- data/vendor/heroicons/16/solid/photo.svg +3 -0
- data/vendor/heroicons/16/solid/play-circle.svg +3 -0
- data/vendor/heroicons/16/solid/play-pause.svg +3 -0
- data/vendor/heroicons/16/solid/play.svg +3 -0
- data/vendor/heroicons/16/solid/plus-circle.svg +3 -0
- data/vendor/heroicons/16/solid/plus.svg +3 -0
- data/vendor/heroicons/16/solid/power.svg +3 -0
- data/vendor/heroicons/16/solid/presentation-chart-bar.svg +3 -0
- data/vendor/heroicons/16/solid/presentation-chart-line.svg +3 -0
- data/vendor/heroicons/16/solid/printer.svg +3 -0
- data/vendor/heroicons/16/solid/puzzle-piece.svg +3 -0
- data/vendor/heroicons/16/solid/qr-code.svg +9 -0
- data/vendor/heroicons/16/solid/question-mark-circle.svg +3 -0
- data/vendor/heroicons/16/solid/queue-list.svg +3 -0
- data/vendor/heroicons/16/solid/radio.svg +3 -0
- data/vendor/heroicons/16/solid/receipt-percent.svg +3 -0
- data/vendor/heroicons/16/solid/receipt-refund.svg +3 -0
- data/vendor/heroicons/16/solid/rectangle-group.svg +3 -0
- data/vendor/heroicons/16/solid/rectangle-stack.svg +3 -0
- data/vendor/heroicons/16/solid/rocket-launch.svg +4 -0
- data/vendor/heroicons/16/solid/rss.svg +3 -0
- data/vendor/heroicons/16/solid/scale.svg +3 -0
- data/vendor/heroicons/16/solid/scissors.svg +4 -0
- data/vendor/heroicons/16/solid/server-stack.svg +4 -0
- data/vendor/heroicons/16/solid/server.svg +4 -0
- data/vendor/heroicons/16/solid/share.svg +3 -0
- data/vendor/heroicons/16/solid/shield-check.svg +3 -0
- data/vendor/heroicons/16/solid/shield-exclamation.svg +3 -0
- data/vendor/heroicons/16/solid/shopping-bag.svg +3 -0
- data/vendor/heroicons/16/solid/shopping-cart.svg +3 -0
- data/vendor/heroicons/16/solid/signal-slash.svg +3 -0
- data/vendor/heroicons/16/solid/signal.svg +5 -0
- data/vendor/heroicons/16/solid/slash.svg +3 -0
- data/vendor/heroicons/16/solid/sparkles.svg +3 -0
- data/vendor/heroicons/16/solid/speaker-wave.svg +4 -0
- data/vendor/heroicons/16/solid/speaker-x-mark.svg +3 -0
- data/vendor/heroicons/16/solid/square-2-stack.svg +4 -0
- data/vendor/heroicons/16/solid/square-3-stack-3d.svg +5 -0
- data/vendor/heroicons/16/solid/squares-2x2.svg +3 -0
- data/vendor/heroicons/16/solid/squares-plus.svg +3 -0
- data/vendor/heroicons/16/solid/star.svg +3 -0
- data/vendor/heroicons/16/solid/stop-circle.svg +3 -0
- data/vendor/heroicons/16/solid/stop.svg +3 -0
- data/vendor/heroicons/16/solid/strikethrough.svg +3 -0
- data/vendor/heroicons/16/solid/sun.svg +3 -0
- data/vendor/heroicons/16/solid/swatch.svg +4 -0
- data/vendor/heroicons/16/solid/table-cells.svg +3 -0
- data/vendor/heroicons/16/solid/tag.svg +3 -0
- data/vendor/heroicons/16/solid/ticket.svg +3 -0
- data/vendor/heroicons/16/solid/trash.svg +3 -0
- data/vendor/heroicons/16/solid/trophy.svg +3 -0
- data/vendor/heroicons/16/solid/truck.svg +5 -0
- data/vendor/heroicons/16/solid/tv.svg +4 -0
- data/vendor/heroicons/16/solid/underline.svg +3 -0
- data/vendor/heroicons/16/solid/user-circle.svg +3 -0
- data/vendor/heroicons/16/solid/user-group.svg +3 -0
- data/vendor/heroicons/16/solid/user-minus.svg +3 -0
- data/vendor/heroicons/16/solid/user-plus.svg +3 -0
- data/vendor/heroicons/16/solid/user.svg +3 -0
- data/vendor/heroicons/16/solid/users.svg +3 -0
- data/vendor/heroicons/16/solid/variable.svg +3 -0
- data/vendor/heroicons/16/solid/video-camera-slash.svg +3 -0
- data/vendor/heroicons/16/solid/video-camera.svg +3 -0
- data/vendor/heroicons/16/solid/view-columns.svg +3 -0
- data/vendor/heroicons/16/solid/viewfinder-circle.svg +3 -0
- data/vendor/heroicons/16/solid/wallet.svg +3 -0
- data/vendor/heroicons/16/solid/wifi.svg +3 -0
- data/vendor/heroicons/16/solid/window.svg +3 -0
- data/vendor/heroicons/16/solid/wrench-screwdriver.svg +4 -0
- data/vendor/heroicons/16/solid/wrench.svg +3 -0
- data/vendor/heroicons/16/solid/x-circle.svg +3 -0
- data/vendor/heroicons/16/solid/x-mark.svg +3 -0
- data/vendor/heroicons/20/solid/academic-cap.svg +3 -0
- data/vendor/heroicons/20/solid/adjustments-horizontal.svg +3 -0
- data/vendor/heroicons/20/solid/adjustments-vertical.svg +3 -0
- data/vendor/heroicons/20/solid/archive-box-arrow-down.svg +3 -0
- data/vendor/heroicons/20/solid/archive-box-x-mark.svg +4 -0
- data/vendor/heroicons/20/solid/archive-box.svg +4 -0
- data/vendor/heroicons/20/solid/arrow-down-circle.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-down-left.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-down-on-square-stack.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-down-on-square.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-down-right.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-down-tray.svg +4 -0
- data/vendor/heroicons/20/solid/arrow-down.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-left-circle.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-left-end-on-rectangle.svg +4 -0
- data/vendor/heroicons/20/solid/arrow-left-on-rectangle.svg +4 -0
- data/vendor/heroicons/20/solid/arrow-left-start-on-rectangle.svg +4 -0
- data/vendor/heroicons/20/solid/arrow-left.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-long-down.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-long-left.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-long-right.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-long-up.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-path-rounded-square.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-path.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-right-circle.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-right-end-on-rectangle.svg +4 -0
- data/vendor/heroicons/20/solid/arrow-right-on-rectangle.svg +4 -0
- data/vendor/heroicons/20/solid/arrow-right-start-on-rectangle.svg +4 -0
- data/vendor/heroicons/20/solid/arrow-right.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-small-down.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-small-left.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-small-right.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-small-up.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-top-right-on-square.svg +4 -0
- data/vendor/heroicons/20/solid/arrow-trending-down.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-trending-up.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-turn-down-left.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-turn-down-right.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-turn-left-down.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-turn-left-up.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-turn-right-down.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-turn-right-up.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-turn-up-left.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-turn-up-right.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-up-circle.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-up-left.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-up-on-square-stack.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-up-on-square.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-up-right.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-up-tray.svg +4 -0
- data/vendor/heroicons/20/solid/arrow-up.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-uturn-down.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-uturn-left.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-uturn-right.svg +3 -0
- data/vendor/heroicons/20/solid/arrow-uturn-up.svg +3 -0
- data/vendor/heroicons/20/solid/arrows-pointing-in.svg +3 -0
- data/vendor/heroicons/20/solid/arrows-pointing-out.svg +3 -0
- data/vendor/heroicons/20/solid/arrows-right-left.svg +3 -0
- data/vendor/heroicons/20/solid/arrows-up-down.svg +3 -0
- data/vendor/heroicons/20/solid/at-symbol.svg +3 -0
- data/vendor/heroicons/20/solid/backspace.svg +3 -0
- data/vendor/heroicons/20/solid/backward.svg +3 -0
- data/vendor/heroicons/20/solid/banknotes.svg +3 -0
- data/vendor/heroicons/20/solid/bars-2.svg +3 -0
- data/vendor/heroicons/20/solid/bars-3-bottom-left.svg +3 -0
- data/vendor/heroicons/20/solid/bars-3-bottom-right.svg +3 -0
- data/vendor/heroicons/20/solid/bars-3-center-left.svg +3 -0
- data/vendor/heroicons/20/solid/bars-3.svg +3 -0
- data/vendor/heroicons/20/solid/bars-4.svg +3 -0
- data/vendor/heroicons/20/solid/bars-arrow-down.svg +3 -0
- data/vendor/heroicons/20/solid/bars-arrow-up.svg +3 -0
- data/vendor/heroicons/20/solid/battery-0.svg +3 -0
- data/vendor/heroicons/20/solid/battery-100.svg +4 -0
- data/vendor/heroicons/20/solid/battery-50.svg +4 -0
- data/vendor/heroicons/20/solid/beaker.svg +3 -0
- data/vendor/heroicons/20/solid/bell-alert.svg +4 -0
- data/vendor/heroicons/20/solid/bell-slash.svg +3 -0
- data/vendor/heroicons/20/solid/bell-snooze.svg +3 -0
- data/vendor/heroicons/20/solid/bell.svg +3 -0
- data/vendor/heroicons/20/solid/bold.svg +3 -0
- data/vendor/heroicons/20/solid/bolt-slash.svg +4 -0
- data/vendor/heroicons/20/solid/bolt.svg +3 -0
- data/vendor/heroicons/20/solid/book-open.svg +3 -0
- data/vendor/heroicons/20/solid/bookmark-slash.svg +3 -0
- data/vendor/heroicons/20/solid/bookmark-square.svg +3 -0
- data/vendor/heroicons/20/solid/bookmark.svg +3 -0
- data/vendor/heroicons/20/solid/briefcase.svg +4 -0
- data/vendor/heroicons/20/solid/bug-ant.svg +3 -0
- data/vendor/heroicons/20/solid/building-library.svg +3 -0
- data/vendor/heroicons/20/solid/building-office-2.svg +3 -0
- data/vendor/heroicons/20/solid/building-office.svg +3 -0
- data/vendor/heroicons/20/solid/building-storefront.svg +3 -0
- data/vendor/heroicons/20/solid/cake.svg +3 -0
- data/vendor/heroicons/20/solid/calculator.svg +3 -0
- data/vendor/heroicons/20/solid/calendar-date-range.svg +4 -0
- data/vendor/heroicons/20/solid/calendar-days.svg +4 -0
- data/vendor/heroicons/20/solid/calendar.svg +3 -0
- data/vendor/heroicons/20/solid/camera.svg +3 -0
- data/vendor/heroicons/20/solid/chart-bar-square.svg +3 -0
- data/vendor/heroicons/20/solid/chart-bar.svg +3 -0
- data/vendor/heroicons/20/solid/chart-pie.svg +4 -0
- data/vendor/heroicons/20/solid/chat-bubble-bottom-center-text.svg +3 -0
- data/vendor/heroicons/20/solid/chat-bubble-bottom-center.svg +3 -0
- data/vendor/heroicons/20/solid/chat-bubble-left-ellipsis.svg +3 -0
- data/vendor/heroicons/20/solid/chat-bubble-left-right.svg +4 -0
- data/vendor/heroicons/20/solid/chat-bubble-left.svg +3 -0
- data/vendor/heroicons/20/solid/chat-bubble-oval-left-ellipsis.svg +3 -0
- data/vendor/heroicons/20/solid/chat-bubble-oval-left.svg +3 -0
- data/vendor/heroicons/20/solid/check-badge.svg +3 -0
- data/vendor/heroicons/20/solid/check-circle.svg +3 -0
- data/vendor/heroicons/20/solid/check.svg +3 -0
- data/vendor/heroicons/20/solid/chevron-double-down.svg +3 -0
- data/vendor/heroicons/20/solid/chevron-double-left.svg +3 -0
- data/vendor/heroicons/20/solid/chevron-double-right.svg +3 -0
- data/vendor/heroicons/20/solid/chevron-double-up.svg +3 -0
- data/vendor/heroicons/20/solid/chevron-down.svg +3 -0
- data/vendor/heroicons/20/solid/chevron-left.svg +3 -0
- data/vendor/heroicons/20/solid/chevron-right.svg +3 -0
- data/vendor/heroicons/20/solid/chevron-up-down.svg +3 -0
- data/vendor/heroicons/20/solid/chevron-up.svg +3 -0
- data/vendor/heroicons/20/solid/circle-stack.svg +3 -0
- data/vendor/heroicons/20/solid/clipboard-document-check.svg +4 -0
- data/vendor/heroicons/20/solid/clipboard-document-list.svg +4 -0
- data/vendor/heroicons/20/solid/clipboard-document.svg +4 -0
- data/vendor/heroicons/20/solid/clipboard.svg +3 -0
- data/vendor/heroicons/20/solid/clock.svg +3 -0
- data/vendor/heroicons/20/solid/cloud-arrow-down.svg +3 -0
- data/vendor/heroicons/20/solid/cloud-arrow-up.svg +3 -0
- data/vendor/heroicons/20/solid/cloud.svg +3 -0
- data/vendor/heroicons/20/solid/code-bracket-square.svg +3 -0
- data/vendor/heroicons/20/solid/code-bracket.svg +3 -0
- data/vendor/heroicons/20/solid/cog-6-tooth.svg +3 -0
- data/vendor/heroicons/20/solid/cog-8-tooth.svg +3 -0
- data/vendor/heroicons/20/solid/cog.svg +4 -0
- data/vendor/heroicons/20/solid/command-line.svg +3 -0
- data/vendor/heroicons/20/solid/computer-desktop.svg +3 -0
- data/vendor/heroicons/20/solid/cpu-chip.svg +4 -0
- data/vendor/heroicons/20/solid/credit-card.svg +3 -0
- data/vendor/heroicons/20/solid/cube-transparent.svg +3 -0
- data/vendor/heroicons/20/solid/cube.svg +3 -0
- data/vendor/heroicons/20/solid/currency-bangladeshi.svg +3 -0
- data/vendor/heroicons/20/solid/currency-dollar.svg +4 -0
- data/vendor/heroicons/20/solid/currency-euro.svg +3 -0
- data/vendor/heroicons/20/solid/currency-pound.svg +3 -0
- data/vendor/heroicons/20/solid/currency-rupee.svg +3 -0
- data/vendor/heroicons/20/solid/currency-yen.svg +3 -0
- data/vendor/heroicons/20/solid/cursor-arrow-rays.svg +3 -0
- data/vendor/heroicons/20/solid/cursor-arrow-ripple.svg +5 -0
- data/vendor/heroicons/20/solid/device-phone-mobile.svg +4 -0
- data/vendor/heroicons/20/solid/device-tablet.svg +3 -0
- data/vendor/heroicons/20/solid/divide.svg +3 -0
- data/vendor/heroicons/20/solid/document-arrow-down.svg +3 -0
- data/vendor/heroicons/20/solid/document-arrow-up.svg +3 -0
- data/vendor/heroicons/20/solid/document-chart-bar.svg +3 -0
- data/vendor/heroicons/20/solid/document-check.svg +3 -0
- data/vendor/heroicons/20/solid/document-currency-bangladeshi.svg +3 -0
- data/vendor/heroicons/20/solid/document-currency-dollar.svg +3 -0
- data/vendor/heroicons/20/solid/document-currency-euro.svg +3 -0
- data/vendor/heroicons/20/solid/document-currency-pound.svg +3 -0
- data/vendor/heroicons/20/solid/document-currency-rupee.svg +3 -0
- data/vendor/heroicons/20/solid/document-currency-yen.svg +3 -0
- data/vendor/heroicons/20/solid/document-duplicate.svg +4 -0
- data/vendor/heroicons/20/solid/document-magnifying-glass.svg +4 -0
- data/vendor/heroicons/20/solid/document-minus.svg +3 -0
- data/vendor/heroicons/20/solid/document-plus.svg +3 -0
- data/vendor/heroicons/20/solid/document-text.svg +3 -0
- data/vendor/heroicons/20/solid/document.svg +3 -0
- data/vendor/heroicons/20/solid/ellipsis-horizontal-circle.svg +3 -0
- data/vendor/heroicons/20/solid/ellipsis-horizontal.svg +3 -0
- data/vendor/heroicons/20/solid/ellipsis-vertical.svg +3 -0
- data/vendor/heroicons/20/solid/envelope-open.svg +3 -0
- data/vendor/heroicons/20/solid/envelope.svg +4 -0
- data/vendor/heroicons/20/solid/equals.svg +3 -0
- data/vendor/heroicons/20/solid/exclamation-circle.svg +3 -0
- data/vendor/heroicons/20/solid/exclamation-triangle.svg +3 -0
- data/vendor/heroicons/20/solid/eye-dropper.svg +3 -0
- data/vendor/heroicons/20/solid/eye-slash.svg +4 -0
- data/vendor/heroicons/20/solid/eye.svg +4 -0
- data/vendor/heroicons/20/solid/face-frown.svg +3 -0
- data/vendor/heroicons/20/solid/face-smile.svg +3 -0
- data/vendor/heroicons/20/solid/film.svg +3 -0
- data/vendor/heroicons/20/solid/finger-print.svg +3 -0
- data/vendor/heroicons/20/solid/fire.svg +3 -0
- data/vendor/heroicons/20/solid/flag.svg +3 -0
- data/vendor/heroicons/20/solid/folder-arrow-down.svg +3 -0
- data/vendor/heroicons/20/solid/folder-minus.svg +3 -0
- data/vendor/heroicons/20/solid/folder-open.svg +3 -0
- data/vendor/heroicons/20/solid/folder-plus.svg +3 -0
- data/vendor/heroicons/20/solid/folder.svg +3 -0
- data/vendor/heroicons/20/solid/forward.svg +3 -0
- data/vendor/heroicons/20/solid/funnel.svg +3 -0
- data/vendor/heroicons/20/solid/gif.svg +3 -0
- data/vendor/heroicons/20/solid/gift-top.svg +3 -0
- data/vendor/heroicons/20/solid/gift.svg +4 -0
- data/vendor/heroicons/20/solid/globe-alt.svg +3 -0
- data/vendor/heroicons/20/solid/globe-americas.svg +3 -0
- data/vendor/heroicons/20/solid/globe-asia-australia.svg +3 -0
- data/vendor/heroicons/20/solid/globe-europe-africa.svg +3 -0
- data/vendor/heroicons/20/solid/h1.svg +3 -0
- data/vendor/heroicons/20/solid/h2.svg +3 -0
- data/vendor/heroicons/20/solid/h3.svg +3 -0
- data/vendor/heroicons/20/solid/hand-raised.svg +3 -0
- data/vendor/heroicons/20/solid/hand-thumb-down.svg +3 -0
- data/vendor/heroicons/20/solid/hand-thumb-up.svg +3 -0
- data/vendor/heroicons/20/solid/hashtag.svg +3 -0
- data/vendor/heroicons/20/solid/heart.svg +3 -0
- data/vendor/heroicons/20/solid/home-modern.svg +3 -0
- data/vendor/heroicons/20/solid/home.svg +3 -0
- data/vendor/heroicons/20/solid/identification.svg +3 -0
- data/vendor/heroicons/20/solid/inbox-arrow-down.svg +4 -0
- data/vendor/heroicons/20/solid/inbox-stack.svg +4 -0
- data/vendor/heroicons/20/solid/inbox.svg +3 -0
- data/vendor/heroicons/20/solid/information-circle.svg +3 -0
- data/vendor/heroicons/20/solid/italic.svg +3 -0
- data/vendor/heroicons/20/solid/key.svg +3 -0
- data/vendor/heroicons/20/solid/language.svg +4 -0
- data/vendor/heroicons/20/solid/lifebuoy.svg +3 -0
- data/vendor/heroicons/20/solid/light-bulb.svg +3 -0
- data/vendor/heroicons/20/solid/link-slash.svg +3 -0
- data/vendor/heroicons/20/solid/link.svg +4 -0
- data/vendor/heroicons/20/solid/list-bullet.svg +3 -0
- data/vendor/heroicons/20/solid/lock-closed.svg +3 -0
- data/vendor/heroicons/20/solid/lock-open.svg +3 -0
- data/vendor/heroicons/20/solid/magnifying-glass-circle.svg +4 -0
- data/vendor/heroicons/20/solid/magnifying-glass-minus.svg +4 -0
- data/vendor/heroicons/20/solid/magnifying-glass-plus.svg +4 -0
- data/vendor/heroicons/20/solid/magnifying-glass.svg +3 -0
- data/vendor/heroicons/20/solid/map-pin.svg +3 -0
- data/vendor/heroicons/20/solid/map.svg +3 -0
- data/vendor/heroicons/20/solid/megaphone.svg +3 -0
- data/vendor/heroicons/20/solid/microphone.svg +4 -0
- data/vendor/heroicons/20/solid/minus-circle.svg +3 -0
- data/vendor/heroicons/20/solid/minus-small.svg +3 -0
- data/vendor/heroicons/20/solid/minus.svg +3 -0
- data/vendor/heroicons/20/solid/moon.svg +3 -0
- data/vendor/heroicons/20/solid/musical-note.svg +3 -0
- data/vendor/heroicons/20/solid/newspaper.svg +4 -0
- data/vendor/heroicons/20/solid/no-symbol.svg +3 -0
- data/vendor/heroicons/20/solid/numbered-list.svg +3 -0
- data/vendor/heroicons/20/solid/paint-brush.svg +3 -0
- data/vendor/heroicons/20/solid/paper-airplane.svg +3 -0
- data/vendor/heroicons/20/solid/paper-clip.svg +3 -0
- data/vendor/heroicons/20/solid/pause-circle.svg +3 -0
- data/vendor/heroicons/20/solid/pause.svg +3 -0
- data/vendor/heroicons/20/solid/pencil-square.svg +4 -0
- data/vendor/heroicons/20/solid/pencil.svg +3 -0
- data/vendor/heroicons/20/solid/percent-badge.svg +3 -0
- data/vendor/heroicons/20/solid/phone-arrow-down-left.svg +3 -0
- data/vendor/heroicons/20/solid/phone-arrow-up-right.svg +3 -0
- data/vendor/heroicons/20/solid/phone-x-mark.svg +3 -0
- data/vendor/heroicons/20/solid/phone.svg +3 -0
- data/vendor/heroicons/20/solid/photo.svg +3 -0
- data/vendor/heroicons/20/solid/play-circle.svg +3 -0
- data/vendor/heroicons/20/solid/play-pause.svg +3 -0
- data/vendor/heroicons/20/solid/play.svg +3 -0
- data/vendor/heroicons/20/solid/plus-circle.svg +3 -0
- data/vendor/heroicons/20/solid/plus-small.svg +3 -0
- data/vendor/heroicons/20/solid/plus.svg +3 -0
- data/vendor/heroicons/20/solid/power.svg +3 -0
- data/vendor/heroicons/20/solid/presentation-chart-bar.svg +3 -0
- data/vendor/heroicons/20/solid/presentation-chart-line.svg +3 -0
- data/vendor/heroicons/20/solid/printer.svg +3 -0
- data/vendor/heroicons/20/solid/puzzle-piece.svg +3 -0
- data/vendor/heroicons/20/solid/qr-code.svg +3 -0
- data/vendor/heroicons/20/solid/question-mark-circle.svg +3 -0
- data/vendor/heroicons/20/solid/queue-list.svg +3 -0
- data/vendor/heroicons/20/solid/radio.svg +3 -0
- data/vendor/heroicons/20/solid/receipt-percent.svg +3 -0
- data/vendor/heroicons/20/solid/receipt-refund.svg +3 -0
- data/vendor/heroicons/20/solid/rectangle-group.svg +3 -0
- data/vendor/heroicons/20/solid/rectangle-stack.svg +3 -0
- data/vendor/heroicons/20/solid/rocket-launch.svg +4 -0
- data/vendor/heroicons/20/solid/rss.svg +4 -0
- data/vendor/heroicons/20/solid/scale.svg +3 -0
- data/vendor/heroicons/20/solid/scissors.svg +4 -0
- data/vendor/heroicons/20/solid/server-stack.svg +4 -0
- data/vendor/heroicons/20/solid/server.svg +4 -0
- data/vendor/heroicons/20/solid/share.svg +3 -0
- data/vendor/heroicons/20/solid/shield-check.svg +3 -0
- data/vendor/heroicons/20/solid/shield-exclamation.svg +3 -0
- data/vendor/heroicons/20/solid/shopping-bag.svg +3 -0
- data/vendor/heroicons/20/solid/shopping-cart.svg +3 -0
- data/vendor/heroicons/20/solid/signal-slash.svg +3 -0
- data/vendor/heroicons/20/solid/signal.svg +4 -0
- data/vendor/heroicons/20/solid/slash.svg +3 -0
- data/vendor/heroicons/20/solid/sparkles.svg +3 -0
- data/vendor/heroicons/20/solid/speaker-wave.svg +4 -0
- data/vendor/heroicons/20/solid/speaker-x-mark.svg +3 -0
- data/vendor/heroicons/20/solid/square-2-stack.svg +4 -0
- data/vendor/heroicons/20/solid/square-3-stack-3d.svg +5 -0
- data/vendor/heroicons/20/solid/squares-2x2.svg +3 -0
- data/vendor/heroicons/20/solid/squares-plus.svg +3 -0
- data/vendor/heroicons/20/solid/star.svg +3 -0
- data/vendor/heroicons/20/solid/stop-circle.svg +3 -0
- data/vendor/heroicons/20/solid/stop.svg +3 -0
- data/vendor/heroicons/20/solid/strikethrough.svg +3 -0
- data/vendor/heroicons/20/solid/sun.svg +3 -0
- data/vendor/heroicons/20/solid/swatch.svg +3 -0
- data/vendor/heroicons/20/solid/table-cells.svg +3 -0
- data/vendor/heroicons/20/solid/tag.svg +3 -0
- data/vendor/heroicons/20/solid/ticket.svg +3 -0
- data/vendor/heroicons/20/solid/trash.svg +3 -0
- data/vendor/heroicons/20/solid/trophy.svg +3 -0
- data/vendor/heroicons/20/solid/truck.svg +4 -0
- data/vendor/heroicons/20/solid/tv.svg +4 -0
- data/vendor/heroicons/20/solid/underline.svg +3 -0
- data/vendor/heroicons/20/solid/user-circle.svg +3 -0
- data/vendor/heroicons/20/solid/user-group.svg +3 -0
- data/vendor/heroicons/20/solid/user-minus.svg +3 -0
- data/vendor/heroicons/20/solid/user-plus.svg +3 -0
- data/vendor/heroicons/20/solid/user.svg +3 -0
- data/vendor/heroicons/20/solid/users.svg +3 -0
- data/vendor/heroicons/20/solid/variable.svg +3 -0
- data/vendor/heroicons/20/solid/video-camera-slash.svg +3 -0
- data/vendor/heroicons/20/solid/video-camera.svg +3 -0
- data/vendor/heroicons/20/solid/view-columns.svg +3 -0
- data/vendor/heroicons/20/solid/viewfinder-circle.svg +3 -0
- data/vendor/heroicons/20/solid/wallet.svg +3 -0
- data/vendor/heroicons/20/solid/wifi.svg +3 -0
- data/vendor/heroicons/20/solid/window.svg +3 -0
- data/vendor/heroicons/20/solid/wrench-screwdriver.svg +4 -0
- data/vendor/heroicons/20/solid/wrench.svg +3 -0
- data/vendor/heroicons/20/solid/x-circle.svg +3 -0
- data/vendor/heroicons/20/solid/x-mark.svg +3 -0
- data/vendor/heroicons/24/outline/academic-cap.svg +3 -0
- data/vendor/heroicons/24/outline/adjustments-horizontal.svg +3 -0
- data/vendor/heroicons/24/outline/adjustments-vertical.svg +3 -0
- data/vendor/heroicons/24/outline/archive-box-arrow-down.svg +3 -0
- data/vendor/heroicons/24/outline/archive-box-x-mark.svg +3 -0
- data/vendor/heroicons/24/outline/archive-box.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-down-circle.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-down-left.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-down-on-square-stack.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-down-on-square.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-down-right.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-down-tray.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-down.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-left-circle.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-left-end-on-rectangle.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-left-on-rectangle.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-left-start-on-rectangle.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-left.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-long-down.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-long-left.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-long-right.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-long-up.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-path-rounded-square.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-path.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-right-circle.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-right-end-on-rectangle.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-right-on-rectangle.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-right-start-on-rectangle.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-right.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-small-down.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-small-left.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-small-right.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-small-up.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-top-right-on-square.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-trending-down.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-trending-up.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-turn-down-left.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-turn-down-right.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-turn-left-down.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-turn-left-up.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-turn-right-down.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-turn-right-up.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-turn-up-left.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-turn-up-right.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-up-circle.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-up-left.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-up-on-square-stack.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-up-on-square.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-up-right.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-up-tray.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-up.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-uturn-down.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-uturn-left.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-uturn-right.svg +3 -0
- data/vendor/heroicons/24/outline/arrow-uturn-up.svg +3 -0
- data/vendor/heroicons/24/outline/arrows-pointing-in.svg +3 -0
- data/vendor/heroicons/24/outline/arrows-pointing-out.svg +3 -0
- data/vendor/heroicons/24/outline/arrows-right-left.svg +3 -0
- data/vendor/heroicons/24/outline/arrows-up-down.svg +3 -0
- data/vendor/heroicons/24/outline/at-symbol.svg +3 -0
- data/vendor/heroicons/24/outline/backspace.svg +3 -0
- data/vendor/heroicons/24/outline/backward.svg +3 -0
- data/vendor/heroicons/24/outline/banknotes.svg +3 -0
- data/vendor/heroicons/24/outline/bars-2.svg +3 -0
- data/vendor/heroicons/24/outline/bars-3-bottom-left.svg +3 -0
- data/vendor/heroicons/24/outline/bars-3-bottom-right.svg +3 -0
- data/vendor/heroicons/24/outline/bars-3-center-left.svg +3 -0
- data/vendor/heroicons/24/outline/bars-3.svg +3 -0
- data/vendor/heroicons/24/outline/bars-4.svg +3 -0
- data/vendor/heroicons/24/outline/bars-arrow-down.svg +3 -0
- data/vendor/heroicons/24/outline/bars-arrow-up.svg +3 -0
- data/vendor/heroicons/24/outline/battery-0.svg +3 -0
- data/vendor/heroicons/24/outline/battery-100.svg +3 -0
- data/vendor/heroicons/24/outline/battery-50.svg +3 -0
- data/vendor/heroicons/24/outline/beaker.svg +3 -0
- data/vendor/heroicons/24/outline/bell-alert.svg +3 -0
- data/vendor/heroicons/24/outline/bell-slash.svg +3 -0
- data/vendor/heroicons/24/outline/bell-snooze.svg +3 -0
- data/vendor/heroicons/24/outline/bell.svg +3 -0
- data/vendor/heroicons/24/outline/bold.svg +3 -0
- data/vendor/heroicons/24/outline/bolt-slash.svg +3 -0
- data/vendor/heroicons/24/outline/bolt.svg +3 -0
- data/vendor/heroicons/24/outline/book-open.svg +3 -0
- data/vendor/heroicons/24/outline/bookmark-slash.svg +3 -0
- data/vendor/heroicons/24/outline/bookmark-square.svg +3 -0
- data/vendor/heroicons/24/outline/bookmark.svg +3 -0
- data/vendor/heroicons/24/outline/briefcase.svg +3 -0
- data/vendor/heroicons/24/outline/bug-ant.svg +3 -0
- data/vendor/heroicons/24/outline/building-library.svg +3 -0
- data/vendor/heroicons/24/outline/building-office-2.svg +3 -0
- data/vendor/heroicons/24/outline/building-office.svg +3 -0
- data/vendor/heroicons/24/outline/building-storefront.svg +3 -0
- data/vendor/heroicons/24/outline/cake.svg +3 -0
- data/vendor/heroicons/24/outline/calculator.svg +3 -0
- data/vendor/heroicons/24/outline/calendar-date-range.svg +3 -0
- data/vendor/heroicons/24/outline/calendar-days.svg +3 -0
- data/vendor/heroicons/24/outline/calendar.svg +3 -0
- data/vendor/heroicons/24/outline/camera.svg +4 -0
- data/vendor/heroicons/24/outline/chart-bar-square.svg +3 -0
- data/vendor/heroicons/24/outline/chart-bar.svg +3 -0
- data/vendor/heroicons/24/outline/chart-pie.svg +4 -0
- data/vendor/heroicons/24/outline/chat-bubble-bottom-center-text.svg +3 -0
- data/vendor/heroicons/24/outline/chat-bubble-bottom-center.svg +3 -0
- data/vendor/heroicons/24/outline/chat-bubble-left-ellipsis.svg +3 -0
- data/vendor/heroicons/24/outline/chat-bubble-left-right.svg +3 -0
- data/vendor/heroicons/24/outline/chat-bubble-left.svg +3 -0
- data/vendor/heroicons/24/outline/chat-bubble-oval-left-ellipsis.svg +3 -0
- data/vendor/heroicons/24/outline/chat-bubble-oval-left.svg +3 -0
- data/vendor/heroicons/24/outline/check-badge.svg +3 -0
- data/vendor/heroicons/24/outline/check-circle.svg +3 -0
- data/vendor/heroicons/24/outline/check.svg +3 -0
- data/vendor/heroicons/24/outline/chevron-double-down.svg +3 -0
- data/vendor/heroicons/24/outline/chevron-double-left.svg +3 -0
- data/vendor/heroicons/24/outline/chevron-double-right.svg +3 -0
- data/vendor/heroicons/24/outline/chevron-double-up.svg +4 -0
- data/vendor/heroicons/24/outline/chevron-down.svg +3 -0
- data/vendor/heroicons/24/outline/chevron-left.svg +3 -0
- data/vendor/heroicons/24/outline/chevron-right.svg +3 -0
- data/vendor/heroicons/24/outline/chevron-up-down.svg +3 -0
- data/vendor/heroicons/24/outline/chevron-up.svg +3 -0
- data/vendor/heroicons/24/outline/circle-stack.svg +3 -0
- data/vendor/heroicons/24/outline/clipboard-document-check.svg +3 -0
- data/vendor/heroicons/24/outline/clipboard-document-list.svg +3 -0
- data/vendor/heroicons/24/outline/clipboard-document.svg +3 -0
- data/vendor/heroicons/24/outline/clipboard.svg +3 -0
- data/vendor/heroicons/24/outline/clock.svg +3 -0
- data/vendor/heroicons/24/outline/cloud-arrow-down.svg +3 -0
- data/vendor/heroicons/24/outline/cloud-arrow-up.svg +3 -0
- data/vendor/heroicons/24/outline/cloud.svg +3 -0
- data/vendor/heroicons/24/outline/code-bracket-square.svg +3 -0
- data/vendor/heroicons/24/outline/code-bracket.svg +3 -0
- data/vendor/heroicons/24/outline/cog-6-tooth.svg +4 -0
- data/vendor/heroicons/24/outline/cog-8-tooth.svg +4 -0
- data/vendor/heroicons/24/outline/cog.svg +3 -0
- data/vendor/heroicons/24/outline/command-line.svg +3 -0
- data/vendor/heroicons/24/outline/computer-desktop.svg +3 -0
- data/vendor/heroicons/24/outline/cpu-chip.svg +3 -0
- data/vendor/heroicons/24/outline/credit-card.svg +3 -0
- data/vendor/heroicons/24/outline/cube-transparent.svg +3 -0
- data/vendor/heroicons/24/outline/cube.svg +3 -0
- data/vendor/heroicons/24/outline/currency-bangladeshi.svg +3 -0
- data/vendor/heroicons/24/outline/currency-dollar.svg +3 -0
- data/vendor/heroicons/24/outline/currency-euro.svg +3 -0
- data/vendor/heroicons/24/outline/currency-pound.svg +3 -0
- data/vendor/heroicons/24/outline/currency-rupee.svg +3 -0
- data/vendor/heroicons/24/outline/currency-yen.svg +3 -0
- data/vendor/heroicons/24/outline/cursor-arrow-rays.svg +3 -0
- data/vendor/heroicons/24/outline/cursor-arrow-ripple.svg +3 -0
- data/vendor/heroicons/24/outline/device-phone-mobile.svg +3 -0
- data/vendor/heroicons/24/outline/device-tablet.svg +3 -0
- data/vendor/heroicons/24/outline/divide.svg +3 -0
- data/vendor/heroicons/24/outline/document-arrow-down.svg +3 -0
- data/vendor/heroicons/24/outline/document-arrow-up.svg +3 -0
- data/vendor/heroicons/24/outline/document-chart-bar.svg +3 -0
- data/vendor/heroicons/24/outline/document-check.svg +3 -0
- data/vendor/heroicons/24/outline/document-currency-bangladeshi.svg +3 -0
- data/vendor/heroicons/24/outline/document-currency-dollar.svg +3 -0
- data/vendor/heroicons/24/outline/document-currency-euro.svg +3 -0
- data/vendor/heroicons/24/outline/document-currency-pound.svg +3 -0
- data/vendor/heroicons/24/outline/document-currency-rupee.svg +3 -0
- data/vendor/heroicons/24/outline/document-currency-yen.svg +3 -0
- data/vendor/heroicons/24/outline/document-duplicate.svg +3 -0
- data/vendor/heroicons/24/outline/document-magnifying-glass.svg +3 -0
- data/vendor/heroicons/24/outline/document-minus.svg +3 -0
- data/vendor/heroicons/24/outline/document-plus.svg +3 -0
- data/vendor/heroicons/24/outline/document-text.svg +3 -0
- data/vendor/heroicons/24/outline/document.svg +3 -0
- data/vendor/heroicons/24/outline/ellipsis-horizontal-circle.svg +3 -0
- data/vendor/heroicons/24/outline/ellipsis-horizontal.svg +3 -0
- data/vendor/heroicons/24/outline/ellipsis-vertical.svg +3 -0
- data/vendor/heroicons/24/outline/envelope-open.svg +3 -0
- data/vendor/heroicons/24/outline/envelope.svg +3 -0
- data/vendor/heroicons/24/outline/equals.svg +3 -0
- data/vendor/heroicons/24/outline/exclamation-circle.svg +3 -0
- data/vendor/heroicons/24/outline/exclamation-triangle.svg +3 -0
- data/vendor/heroicons/24/outline/eye-dropper.svg +3 -0
- data/vendor/heroicons/24/outline/eye-slash.svg +3 -0
- data/vendor/heroicons/24/outline/eye.svg +4 -0
- data/vendor/heroicons/24/outline/face-frown.svg +3 -0
- data/vendor/heroicons/24/outline/face-smile.svg +3 -0
- data/vendor/heroicons/24/outline/film.svg +3 -0
- data/vendor/heroicons/24/outline/finger-print.svg +3 -0
- data/vendor/heroicons/24/outline/fire.svg +4 -0
- data/vendor/heroicons/24/outline/flag.svg +3 -0
- data/vendor/heroicons/24/outline/folder-arrow-down.svg +3 -0
- data/vendor/heroicons/24/outline/folder-minus.svg +3 -0
- data/vendor/heroicons/24/outline/folder-open.svg +3 -0
- data/vendor/heroicons/24/outline/folder-plus.svg +3 -0
- data/vendor/heroicons/24/outline/folder.svg +3 -0
- data/vendor/heroicons/24/outline/forward.svg +3 -0
- data/vendor/heroicons/24/outline/funnel.svg +3 -0
- data/vendor/heroicons/24/outline/gif.svg +3 -0
- data/vendor/heroicons/24/outline/gift-top.svg +3 -0
- data/vendor/heroicons/24/outline/gift.svg +3 -0
- data/vendor/heroicons/24/outline/globe-alt.svg +3 -0
- data/vendor/heroicons/24/outline/globe-americas.svg +3 -0
- data/vendor/heroicons/24/outline/globe-asia-australia.svg +3 -0
- data/vendor/heroicons/24/outline/globe-europe-africa.svg +3 -0
- data/vendor/heroicons/24/outline/h1.svg +3 -0
- data/vendor/heroicons/24/outline/h2.svg +3 -0
- data/vendor/heroicons/24/outline/h3.svg +3 -0
- data/vendor/heroicons/24/outline/hand-raised.svg +3 -0
- data/vendor/heroicons/24/outline/hand-thumb-down.svg +3 -0
- data/vendor/heroicons/24/outline/hand-thumb-up.svg +3 -0
- data/vendor/heroicons/24/outline/hashtag.svg +3 -0
- data/vendor/heroicons/24/outline/heart.svg +3 -0
- data/vendor/heroicons/24/outline/home-modern.svg +3 -0
- data/vendor/heroicons/24/outline/home.svg +3 -0
- data/vendor/heroicons/24/outline/identification.svg +3 -0
- data/vendor/heroicons/24/outline/inbox-arrow-down.svg +3 -0
- data/vendor/heroicons/24/outline/inbox-stack.svg +3 -0
- data/vendor/heroicons/24/outline/inbox.svg +3 -0
- data/vendor/heroicons/24/outline/information-circle.svg +3 -0
- data/vendor/heroicons/24/outline/italic.svg +3 -0
- data/vendor/heroicons/24/outline/key.svg +3 -0
- data/vendor/heroicons/24/outline/language.svg +3 -0
- data/vendor/heroicons/24/outline/lifebuoy.svg +3 -0
- data/vendor/heroicons/24/outline/light-bulb.svg +3 -0
- data/vendor/heroicons/24/outline/link-slash.svg +3 -0
- data/vendor/heroicons/24/outline/link.svg +3 -0
- data/vendor/heroicons/24/outline/list-bullet.svg +3 -0
- data/vendor/heroicons/24/outline/lock-closed.svg +3 -0
- data/vendor/heroicons/24/outline/lock-open.svg +3 -0
- data/vendor/heroicons/24/outline/magnifying-glass-circle.svg +3 -0
- data/vendor/heroicons/24/outline/magnifying-glass-minus.svg +3 -0
- data/vendor/heroicons/24/outline/magnifying-glass-plus.svg +3 -0
- data/vendor/heroicons/24/outline/magnifying-glass.svg +3 -0
- data/vendor/heroicons/24/outline/map-pin.svg +4 -0
- data/vendor/heroicons/24/outline/map.svg +3 -0
- data/vendor/heroicons/24/outline/megaphone.svg +3 -0
- data/vendor/heroicons/24/outline/microphone.svg +3 -0
- data/vendor/heroicons/24/outline/minus-circle.svg +3 -0
- data/vendor/heroicons/24/outline/minus-small.svg +3 -0
- data/vendor/heroicons/24/outline/minus.svg +3 -0
- data/vendor/heroicons/24/outline/moon.svg +3 -0
- data/vendor/heroicons/24/outline/musical-note.svg +3 -0
- data/vendor/heroicons/24/outline/newspaper.svg +3 -0
- data/vendor/heroicons/24/outline/no-symbol.svg +3 -0
- data/vendor/heroicons/24/outline/numbered-list.svg +3 -0
- data/vendor/heroicons/24/outline/paint-brush.svg +3 -0
- data/vendor/heroicons/24/outline/paper-airplane.svg +3 -0
- data/vendor/heroicons/24/outline/paper-clip.svg +3 -0
- data/vendor/heroicons/24/outline/pause-circle.svg +3 -0
- data/vendor/heroicons/24/outline/pause.svg +3 -0
- data/vendor/heroicons/24/outline/pencil-square.svg +3 -0
- data/vendor/heroicons/24/outline/pencil.svg +3 -0
- data/vendor/heroicons/24/outline/percent-badge.svg +3 -0
- data/vendor/heroicons/24/outline/phone-arrow-down-left.svg +3 -0
- data/vendor/heroicons/24/outline/phone-arrow-up-right.svg +3 -0
- data/vendor/heroicons/24/outline/phone-x-mark.svg +3 -0
- data/vendor/heroicons/24/outline/phone.svg +3 -0
- data/vendor/heroicons/24/outline/photo.svg +3 -0
- data/vendor/heroicons/24/outline/play-circle.svg +4 -0
- data/vendor/heroicons/24/outline/play-pause.svg +3 -0
- data/vendor/heroicons/24/outline/play.svg +3 -0
- data/vendor/heroicons/24/outline/plus-circle.svg +3 -0
- data/vendor/heroicons/24/outline/plus-small.svg +3 -0
- data/vendor/heroicons/24/outline/plus.svg +3 -0
- data/vendor/heroicons/24/outline/power.svg +3 -0
- data/vendor/heroicons/24/outline/presentation-chart-bar.svg +3 -0
- data/vendor/heroicons/24/outline/presentation-chart-line.svg +3 -0
- data/vendor/heroicons/24/outline/printer.svg +3 -0
- data/vendor/heroicons/24/outline/puzzle-piece.svg +3 -0
- data/vendor/heroicons/24/outline/qr-code.svg +4 -0
- data/vendor/heroicons/24/outline/question-mark-circle.svg +3 -0
- data/vendor/heroicons/24/outline/queue-list.svg +3 -0
- data/vendor/heroicons/24/outline/radio.svg +3 -0
- data/vendor/heroicons/24/outline/receipt-percent.svg +3 -0
- data/vendor/heroicons/24/outline/receipt-refund.svg +3 -0
- data/vendor/heroicons/24/outline/rectangle-group.svg +3 -0
- data/vendor/heroicons/24/outline/rectangle-stack.svg +3 -0
- data/vendor/heroicons/24/outline/rocket-launch.svg +3 -0
- data/vendor/heroicons/24/outline/rss.svg +3 -0
- data/vendor/heroicons/24/outline/scale.svg +3 -0
- data/vendor/heroicons/24/outline/scissors.svg +3 -0
- data/vendor/heroicons/24/outline/server-stack.svg +3 -0
- data/vendor/heroicons/24/outline/server.svg +3 -0
- data/vendor/heroicons/24/outline/share.svg +3 -0
- data/vendor/heroicons/24/outline/shield-check.svg +3 -0
- data/vendor/heroicons/24/outline/shield-exclamation.svg +3 -0
- data/vendor/heroicons/24/outline/shopping-bag.svg +3 -0
- data/vendor/heroicons/24/outline/shopping-cart.svg +3 -0
- data/vendor/heroicons/24/outline/signal-slash.svg +3 -0
- data/vendor/heroicons/24/outline/signal.svg +3 -0
- data/vendor/heroicons/24/outline/slash.svg +3 -0
- data/vendor/heroicons/24/outline/sparkles.svg +3 -0
- data/vendor/heroicons/24/outline/speaker-wave.svg +3 -0
- data/vendor/heroicons/24/outline/speaker-x-mark.svg +3 -0
- data/vendor/heroicons/24/outline/square-2-stack.svg +3 -0
- data/vendor/heroicons/24/outline/square-3-stack-3d.svg +3 -0
- data/vendor/heroicons/24/outline/squares-2x2.svg +3 -0
- data/vendor/heroicons/24/outline/squares-plus.svg +3 -0
- data/vendor/heroicons/24/outline/star.svg +3 -0
- data/vendor/heroicons/24/outline/stop-circle.svg +4 -0
- data/vendor/heroicons/24/outline/stop.svg +3 -0
- data/vendor/heroicons/24/outline/strikethrough.svg +3 -0
- data/vendor/heroicons/24/outline/sun.svg +3 -0
- data/vendor/heroicons/24/outline/swatch.svg +3 -0
- data/vendor/heroicons/24/outline/table-cells.svg +3 -0
- data/vendor/heroicons/24/outline/tag.svg +4 -0
- data/vendor/heroicons/24/outline/ticket.svg +3 -0
- data/vendor/heroicons/24/outline/trash.svg +3 -0
- data/vendor/heroicons/24/outline/trophy.svg +3 -0
- data/vendor/heroicons/24/outline/truck.svg +3 -0
- data/vendor/heroicons/24/outline/tv.svg +3 -0
- data/vendor/heroicons/24/outline/underline.svg +3 -0
- data/vendor/heroicons/24/outline/user-circle.svg +3 -0
- data/vendor/heroicons/24/outline/user-group.svg +3 -0
- data/vendor/heroicons/24/outline/user-minus.svg +3 -0
- data/vendor/heroicons/24/outline/user-plus.svg +3 -0
- data/vendor/heroicons/24/outline/user.svg +3 -0
- data/vendor/heroicons/24/outline/users.svg +3 -0
- data/vendor/heroicons/24/outline/variable.svg +3 -0
- data/vendor/heroicons/24/outline/video-camera-slash.svg +3 -0
- data/vendor/heroicons/24/outline/video-camera.svg +3 -0
- data/vendor/heroicons/24/outline/view-columns.svg +3 -0
- data/vendor/heroicons/24/outline/viewfinder-circle.svg +3 -0
- data/vendor/heroicons/24/outline/wallet.svg +3 -0
- data/vendor/heroicons/24/outline/wifi.svg +3 -0
- data/vendor/heroicons/24/outline/window.svg +3 -0
- data/vendor/heroicons/24/outline/wrench-screwdriver.svg +3 -0
- data/vendor/heroicons/24/outline/wrench.svg +4 -0
- data/vendor/heroicons/24/outline/x-circle.svg +3 -0
- data/vendor/heroicons/24/outline/x-mark.svg +3 -0
- data/vendor/heroicons/24/solid/academic-cap.svg +5 -0
- data/vendor/heroicons/24/solid/adjustments-horizontal.svg +3 -0
- data/vendor/heroicons/24/solid/adjustments-vertical.svg +3 -0
- data/vendor/heroicons/24/solid/archive-box-arrow-down.svg +4 -0
- data/vendor/heroicons/24/solid/archive-box-x-mark.svg +4 -0
- data/vendor/heroicons/24/solid/archive-box.svg +4 -0
- data/vendor/heroicons/24/solid/arrow-down-circle.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-down-left.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-down-on-square-stack.svg +4 -0
- data/vendor/heroicons/24/solid/arrow-down-on-square.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-down-right.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-down-tray.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-down.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-left-circle.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-left-end-on-rectangle.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-left-on-rectangle.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-left-start-on-rectangle.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-left.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-long-down.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-long-left.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-long-right.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-long-up.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-path-rounded-square.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-path.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-right-circle.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-right-end-on-rectangle.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-right-on-rectangle.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-right-start-on-rectangle.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-right.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-small-down.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-small-left.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-small-right.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-small-up.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-top-right-on-square.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-trending-down.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-trending-up.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-turn-down-left.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-turn-down-right.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-turn-left-down.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-turn-left-up.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-turn-right-down.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-turn-right-up.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-turn-up-left.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-turn-up-right.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-up-circle.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-up-left.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-up-on-square-stack.svg +4 -0
- data/vendor/heroicons/24/solid/arrow-up-on-square.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-up-right.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-up-tray.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-up.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-uturn-down.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-uturn-left.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-uturn-right.svg +3 -0
- data/vendor/heroicons/24/solid/arrow-uturn-up.svg +3 -0
- data/vendor/heroicons/24/solid/arrows-pointing-in.svg +3 -0
- data/vendor/heroicons/24/solid/arrows-pointing-out.svg +3 -0
- data/vendor/heroicons/24/solid/arrows-right-left.svg +3 -0
- data/vendor/heroicons/24/solid/arrows-up-down.svg +3 -0
- data/vendor/heroicons/24/solid/at-symbol.svg +3 -0
- data/vendor/heroicons/24/solid/backspace.svg +3 -0
- data/vendor/heroicons/24/solid/backward.svg +3 -0
- data/vendor/heroicons/24/solid/banknotes.svg +5 -0
- data/vendor/heroicons/24/solid/bars-2.svg +3 -0
- data/vendor/heroicons/24/solid/bars-3-bottom-left.svg +3 -0
- data/vendor/heroicons/24/solid/bars-3-bottom-right.svg +3 -0
- data/vendor/heroicons/24/solid/bars-3-center-left.svg +3 -0
- data/vendor/heroicons/24/solid/bars-3.svg +3 -0
- data/vendor/heroicons/24/solid/bars-4.svg +3 -0
- data/vendor/heroicons/24/solid/bars-arrow-down.svg +3 -0
- data/vendor/heroicons/24/solid/bars-arrow-up.svg +3 -0
- data/vendor/heroicons/24/solid/battery-0.svg +3 -0
- data/vendor/heroicons/24/solid/battery-100.svg +3 -0
- data/vendor/heroicons/24/solid/battery-50.svg +4 -0
- data/vendor/heroicons/24/solid/beaker.svg +3 -0
- data/vendor/heroicons/24/solid/bell-alert.svg +4 -0
- data/vendor/heroicons/24/solid/bell-slash.svg +4 -0
- data/vendor/heroicons/24/solid/bell-snooze.svg +3 -0
- data/vendor/heroicons/24/solid/bell.svg +3 -0
- data/vendor/heroicons/24/solid/bold.svg +3 -0
- data/vendor/heroicons/24/solid/bolt-slash.svg +3 -0
- data/vendor/heroicons/24/solid/bolt.svg +3 -0
- data/vendor/heroicons/24/solid/book-open.svg +3 -0
- data/vendor/heroicons/24/solid/bookmark-slash.svg +3 -0
- data/vendor/heroicons/24/solid/bookmark-square.svg +3 -0
- data/vendor/heroicons/24/solid/bookmark.svg +3 -0
- data/vendor/heroicons/24/solid/briefcase.svg +4 -0
- data/vendor/heroicons/24/solid/bug-ant.svg +3 -0
- data/vendor/heroicons/24/solid/building-library.svg +5 -0
- data/vendor/heroicons/24/solid/building-office-2.svg +3 -0
- data/vendor/heroicons/24/solid/building-office.svg +3 -0
- data/vendor/heroicons/24/solid/building-storefront.svg +4 -0
- data/vendor/heroicons/24/solid/cake.svg +3 -0
- data/vendor/heroicons/24/solid/calculator.svg +3 -0
- data/vendor/heroicons/24/solid/calendar-date-range.svg +4 -0
- data/vendor/heroicons/24/solid/calendar-days.svg +4 -0
- data/vendor/heroicons/24/solid/calendar.svg +3 -0
- data/vendor/heroicons/24/solid/camera.svg +4 -0
- data/vendor/heroicons/24/solid/chart-bar-square.svg +3 -0
- data/vendor/heroicons/24/solid/chart-bar.svg +3 -0
- data/vendor/heroicons/24/solid/chart-pie.svg +4 -0
- data/vendor/heroicons/24/solid/chat-bubble-bottom-center-text.svg +3 -0
- data/vendor/heroicons/24/solid/chat-bubble-bottom-center.svg +3 -0
- data/vendor/heroicons/24/solid/chat-bubble-left-ellipsis.svg +3 -0
- data/vendor/heroicons/24/solid/chat-bubble-left-right.svg +4 -0
- data/vendor/heroicons/24/solid/chat-bubble-left.svg +3 -0
- data/vendor/heroicons/24/solid/chat-bubble-oval-left-ellipsis.svg +3 -0
- data/vendor/heroicons/24/solid/chat-bubble-oval-left.svg +3 -0
- data/vendor/heroicons/24/solid/check-badge.svg +3 -0
- data/vendor/heroicons/24/solid/check-circle.svg +3 -0
- data/vendor/heroicons/24/solid/check.svg +3 -0
- data/vendor/heroicons/24/solid/chevron-double-down.svg +4 -0
- data/vendor/heroicons/24/solid/chevron-double-left.svg +4 -0
- data/vendor/heroicons/24/solid/chevron-double-right.svg +4 -0
- data/vendor/heroicons/24/solid/chevron-double-up.svg +4 -0
- data/vendor/heroicons/24/solid/chevron-down.svg +3 -0
- data/vendor/heroicons/24/solid/chevron-left.svg +3 -0
- data/vendor/heroicons/24/solid/chevron-right.svg +3 -0
- data/vendor/heroicons/24/solid/chevron-up-down.svg +3 -0
- data/vendor/heroicons/24/solid/chevron-up.svg +3 -0
- data/vendor/heroicons/24/solid/circle-stack.svg +6 -0
- data/vendor/heroicons/24/solid/clipboard-document-check.svg +4 -0
- data/vendor/heroicons/24/solid/clipboard-document-list.svg +4 -0
- data/vendor/heroicons/24/solid/clipboard-document.svg +5 -0
- data/vendor/heroicons/24/solid/clipboard.svg +3 -0
- data/vendor/heroicons/24/solid/clock.svg +3 -0
- data/vendor/heroicons/24/solid/cloud-arrow-down.svg +3 -0
- data/vendor/heroicons/24/solid/cloud-arrow-up.svg +3 -0
- data/vendor/heroicons/24/solid/cloud.svg +3 -0
- data/vendor/heroicons/24/solid/code-bracket-square.svg +3 -0
- data/vendor/heroicons/24/solid/code-bracket.svg +3 -0
- data/vendor/heroicons/24/solid/cog-6-tooth.svg +3 -0
- data/vendor/heroicons/24/solid/cog-8-tooth.svg +3 -0
- data/vendor/heroicons/24/solid/cog.svg +4 -0
- data/vendor/heroicons/24/solid/command-line.svg +3 -0
- data/vendor/heroicons/24/solid/computer-desktop.svg +3 -0
- data/vendor/heroicons/24/solid/cpu-chip.svg +4 -0
- data/vendor/heroicons/24/solid/credit-card.svg +4 -0
- data/vendor/heroicons/24/solid/cube-transparent.svg +3 -0
- data/vendor/heroicons/24/solid/cube.svg +3 -0
- data/vendor/heroicons/24/solid/currency-bangladeshi.svg +3 -0
- data/vendor/heroicons/24/solid/currency-dollar.svg +4 -0
- data/vendor/heroicons/24/solid/currency-euro.svg +3 -0
- data/vendor/heroicons/24/solid/currency-pound.svg +3 -0
- data/vendor/heroicons/24/solid/currency-rupee.svg +3 -0
- data/vendor/heroicons/24/solid/currency-yen.svg +3 -0
- data/vendor/heroicons/24/solid/cursor-arrow-rays.svg +3 -0
- data/vendor/heroicons/24/solid/cursor-arrow-ripple.svg +3 -0
- data/vendor/heroicons/24/solid/device-phone-mobile.svg +4 -0
- data/vendor/heroicons/24/solid/device-tablet.svg +4 -0
- data/vendor/heroicons/24/solid/divide.svg +3 -0
- data/vendor/heroicons/24/solid/document-arrow-down.svg +4 -0
- data/vendor/heroicons/24/solid/document-arrow-up.svg +4 -0
- data/vendor/heroicons/24/solid/document-chart-bar.svg +4 -0
- data/vendor/heroicons/24/solid/document-check.svg +4 -0
- data/vendor/heroicons/24/solid/document-currency-bangladeshi.svg +3 -0
- data/vendor/heroicons/24/solid/document-currency-dollar.svg +3 -0
- data/vendor/heroicons/24/solid/document-currency-euro.svg +4 -0
- data/vendor/heroicons/24/solid/document-currency-pound.svg +3 -0
- data/vendor/heroicons/24/solid/document-currency-rupee.svg +3 -0
- data/vendor/heroicons/24/solid/document-currency-yen.svg +3 -0
- data/vendor/heroicons/24/solid/document-duplicate.svg +4 -0
- data/vendor/heroicons/24/solid/document-magnifying-glass.svg +5 -0
- data/vendor/heroicons/24/solid/document-minus.svg +4 -0
- data/vendor/heroicons/24/solid/document-plus.svg +4 -0
- data/vendor/heroicons/24/solid/document-text.svg +4 -0
- data/vendor/heroicons/24/solid/document.svg +4 -0
- data/vendor/heroicons/24/solid/ellipsis-horizontal-circle.svg +3 -0
- data/vendor/heroicons/24/solid/ellipsis-horizontal.svg +3 -0
- data/vendor/heroicons/24/solid/ellipsis-vertical.svg +3 -0
- data/vendor/heroicons/24/solid/envelope-open.svg +4 -0
- data/vendor/heroicons/24/solid/envelope.svg +4 -0
- data/vendor/heroicons/24/solid/equals.svg +3 -0
- data/vendor/heroicons/24/solid/exclamation-circle.svg +3 -0
- data/vendor/heroicons/24/solid/exclamation-triangle.svg +3 -0
- data/vendor/heroicons/24/solid/eye-dropper.svg +3 -0
- data/vendor/heroicons/24/solid/eye-slash.svg +5 -0
- data/vendor/heroicons/24/solid/eye.svg +4 -0
- data/vendor/heroicons/24/solid/face-frown.svg +3 -0
- data/vendor/heroicons/24/solid/face-smile.svg +3 -0
- data/vendor/heroicons/24/solid/film.svg +3 -0
- data/vendor/heroicons/24/solid/finger-print.svg +3 -0
- data/vendor/heroicons/24/solid/fire.svg +3 -0
- data/vendor/heroicons/24/solid/flag.svg +3 -0
- data/vendor/heroicons/24/solid/folder-arrow-down.svg +3 -0
- data/vendor/heroicons/24/solid/folder-minus.svg +3 -0
- data/vendor/heroicons/24/solid/folder-open.svg +3 -0
- data/vendor/heroicons/24/solid/folder-plus.svg +3 -0
- data/vendor/heroicons/24/solid/folder.svg +3 -0
- data/vendor/heroicons/24/solid/forward.svg +3 -0
- data/vendor/heroicons/24/solid/funnel.svg +3 -0
- data/vendor/heroicons/24/solid/gif.svg +3 -0
- data/vendor/heroicons/24/solid/gift-top.svg +4 -0
- data/vendor/heroicons/24/solid/gift.svg +3 -0
- data/vendor/heroicons/24/solid/globe-alt.svg +3 -0
- data/vendor/heroicons/24/solid/globe-americas.svg +3 -0
- data/vendor/heroicons/24/solid/globe-asia-australia.svg +4 -0
- data/vendor/heroicons/24/solid/globe-europe-africa.svg +3 -0
- data/vendor/heroicons/24/solid/h1.svg +3 -0
- data/vendor/heroicons/24/solid/h2.svg +3 -0
- data/vendor/heroicons/24/solid/h3.svg +3 -0
- data/vendor/heroicons/24/solid/hand-raised.svg +3 -0
- data/vendor/heroicons/24/solid/hand-thumb-down.svg +3 -0
- data/vendor/heroicons/24/solid/hand-thumb-up.svg +3 -0
- data/vendor/heroicons/24/solid/hashtag.svg +3 -0
- data/vendor/heroicons/24/solid/heart.svg +3 -0
- data/vendor/heroicons/24/solid/home-modern.svg +4 -0
- data/vendor/heroicons/24/solid/home.svg +4 -0
- data/vendor/heroicons/24/solid/identification.svg +3 -0
- data/vendor/heroicons/24/solid/inbox-arrow-down.svg +4 -0
- data/vendor/heroicons/24/solid/inbox-stack.svg +4 -0
- data/vendor/heroicons/24/solid/inbox.svg +3 -0
- data/vendor/heroicons/24/solid/information-circle.svg +3 -0
- data/vendor/heroicons/24/solid/italic.svg +3 -0
- data/vendor/heroicons/24/solid/key.svg +3 -0
- data/vendor/heroicons/24/solid/language.svg +3 -0
- data/vendor/heroicons/24/solid/lifebuoy.svg +3 -0
- data/vendor/heroicons/24/solid/light-bulb.svg +4 -0
- data/vendor/heroicons/24/solid/link-slash.svg +3 -0
- data/vendor/heroicons/24/solid/link.svg +3 -0
- data/vendor/heroicons/24/solid/list-bullet.svg +3 -0
- data/vendor/heroicons/24/solid/lock-closed.svg +3 -0
- data/vendor/heroicons/24/solid/lock-open.svg +3 -0
- data/vendor/heroicons/24/solid/magnifying-glass-circle.svg +4 -0
- data/vendor/heroicons/24/solid/magnifying-glass-minus.svg +3 -0
- data/vendor/heroicons/24/solid/magnifying-glass-plus.svg +3 -0
- data/vendor/heroicons/24/solid/magnifying-glass.svg +3 -0
- data/vendor/heroicons/24/solid/map-pin.svg +3 -0
- data/vendor/heroicons/24/solid/map.svg +3 -0
- data/vendor/heroicons/24/solid/megaphone.svg +3 -0
- data/vendor/heroicons/24/solid/microphone.svg +4 -0
- data/vendor/heroicons/24/solid/minus-circle.svg +3 -0
- data/vendor/heroicons/24/solid/minus-small.svg +3 -0
- data/vendor/heroicons/24/solid/minus.svg +3 -0
- data/vendor/heroicons/24/solid/moon.svg +3 -0
- data/vendor/heroicons/24/solid/musical-note.svg +3 -0
- data/vendor/heroicons/24/solid/newspaper.svg +4 -0
- data/vendor/heroicons/24/solid/no-symbol.svg +3 -0
- data/vendor/heroicons/24/solid/numbered-list.svg +3 -0
- data/vendor/heroicons/24/solid/paint-brush.svg +3 -0
- data/vendor/heroicons/24/solid/paper-airplane.svg +3 -0
- data/vendor/heroicons/24/solid/paper-clip.svg +3 -0
- data/vendor/heroicons/24/solid/pause-circle.svg +3 -0
- data/vendor/heroicons/24/solid/pause.svg +3 -0
- data/vendor/heroicons/24/solid/pencil-square.svg +4 -0
- data/vendor/heroicons/24/solid/pencil.svg +3 -0
- data/vendor/heroicons/24/solid/percent-badge.svg +3 -0
- data/vendor/heroicons/24/solid/phone-arrow-down-left.svg +4 -0
- data/vendor/heroicons/24/solid/phone-arrow-up-right.svg +4 -0
- data/vendor/heroicons/24/solid/phone-x-mark.svg +3 -0
- data/vendor/heroicons/24/solid/phone.svg +3 -0
- data/vendor/heroicons/24/solid/photo.svg +3 -0
- data/vendor/heroicons/24/solid/play-circle.svg +3 -0
- data/vendor/heroicons/24/solid/play-pause.svg +3 -0
- data/vendor/heroicons/24/solid/play.svg +3 -0
- data/vendor/heroicons/24/solid/plus-circle.svg +3 -0
- data/vendor/heroicons/24/solid/plus-small.svg +3 -0
- data/vendor/heroicons/24/solid/plus.svg +3 -0
- data/vendor/heroicons/24/solid/power.svg +3 -0
- data/vendor/heroicons/24/solid/presentation-chart-bar.svg +3 -0
- data/vendor/heroicons/24/solid/presentation-chart-line.svg +3 -0
- data/vendor/heroicons/24/solid/printer.svg +3 -0
- data/vendor/heroicons/24/solid/puzzle-piece.svg +3 -0
- data/vendor/heroicons/24/solid/qr-code.svg +3 -0
- data/vendor/heroicons/24/solid/question-mark-circle.svg +3 -0
- data/vendor/heroicons/24/solid/queue-list.svg +3 -0
- data/vendor/heroicons/24/solid/radio.svg +3 -0
- data/vendor/heroicons/24/solid/receipt-percent.svg +3 -0
- data/vendor/heroicons/24/solid/receipt-refund.svg +3 -0
- data/vendor/heroicons/24/solid/rectangle-group.svg +3 -0
- data/vendor/heroicons/24/solid/rectangle-stack.svg +3 -0
- data/vendor/heroicons/24/solid/rocket-launch.svg +4 -0
- data/vendor/heroicons/24/solid/rss.svg +3 -0
- data/vendor/heroicons/24/solid/scale.svg +3 -0
- data/vendor/heroicons/24/solid/scissors.svg +4 -0
- data/vendor/heroicons/24/solid/server-stack.svg +4 -0
- data/vendor/heroicons/24/solid/server.svg +4 -0
- data/vendor/heroicons/24/solid/share.svg +3 -0
- data/vendor/heroicons/24/solid/shield-check.svg +3 -0
- data/vendor/heroicons/24/solid/shield-exclamation.svg +3 -0
- data/vendor/heroicons/24/solid/shopping-bag.svg +3 -0
- data/vendor/heroicons/24/solid/shopping-cart.svg +3 -0
- data/vendor/heroicons/24/solid/signal-slash.svg +3 -0
- data/vendor/heroicons/24/solid/signal.svg +3 -0
- data/vendor/heroicons/24/solid/slash.svg +3 -0
- data/vendor/heroicons/24/solid/sparkles.svg +3 -0
- data/vendor/heroicons/24/solid/speaker-wave.svg +4 -0
- data/vendor/heroicons/24/solid/speaker-x-mark.svg +3 -0
- data/vendor/heroicons/24/solid/square-2-stack.svg +4 -0
- data/vendor/heroicons/24/solid/square-3-stack-3d.svg +5 -0
- data/vendor/heroicons/24/solid/squares-2x2.svg +3 -0
- data/vendor/heroicons/24/solid/squares-plus.svg +3 -0
- data/vendor/heroicons/24/solid/star.svg +3 -0
- data/vendor/heroicons/24/solid/stop-circle.svg +3 -0
- data/vendor/heroicons/24/solid/stop.svg +3 -0
- data/vendor/heroicons/24/solid/strikethrough.svg +3 -0
- data/vendor/heroicons/24/solid/sun.svg +3 -0
- data/vendor/heroicons/24/solid/swatch.svg +4 -0
- data/vendor/heroicons/24/solid/table-cells.svg +3 -0
- data/vendor/heroicons/24/solid/tag.svg +3 -0
- data/vendor/heroicons/24/solid/ticket.svg +3 -0
- data/vendor/heroicons/24/solid/trash.svg +3 -0
- data/vendor/heroicons/24/solid/trophy.svg +3 -0
- data/vendor/heroicons/24/solid/truck.svg +5 -0
- data/vendor/heroicons/24/solid/tv.svg +4 -0
- data/vendor/heroicons/24/solid/underline.svg +3 -0
- data/vendor/heroicons/24/solid/user-circle.svg +3 -0
- data/vendor/heroicons/24/solid/user-group.svg +4 -0
- data/vendor/heroicons/24/solid/user-minus.svg +3 -0
- data/vendor/heroicons/24/solid/user-plus.svg +3 -0
- data/vendor/heroicons/24/solid/user.svg +3 -0
- data/vendor/heroicons/24/solid/users.svg +3 -0
- data/vendor/heroicons/24/solid/variable.svg +3 -0
- data/vendor/heroicons/24/solid/video-camera-slash.svg +3 -0
- data/vendor/heroicons/24/solid/video-camera.svg +3 -0
- data/vendor/heroicons/24/solid/view-columns.svg +3 -0
- data/vendor/heroicons/24/solid/viewfinder-circle.svg +3 -0
- data/vendor/heroicons/24/solid/wallet.svg +3 -0
- data/vendor/heroicons/24/solid/wifi.svg +3 -0
- data/vendor/heroicons/24/solid/window.svg +3 -0
- data/vendor/heroicons/24/solid/wrench-screwdriver.svg +5 -0
- data/vendor/heroicons/24/solid/wrench.svg +3 -0
- data/vendor/heroicons/24/solid/x-circle.svg +3 -0
- data/vendor/heroicons/24/solid/x-mark.svg +3 -0
- data/vendor/heroicons/LICENSE +21 -0
- data/vendor/heroicons/VERSION +5 -0
- metadata +1664 -0
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,889 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Abqari will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
_Nothing yet._
|
|
11
|
+
|
|
12
|
+
## [1.1.0] — 2026-08-06
|
|
13
|
+
|
|
14
|
+
First public release on RubyGems. 1.0.0 below was tagged in git but
|
|
15
|
+
never published, so this is the first version installable with
|
|
16
|
+
`gem install abqari`.
|
|
17
|
+
|
|
18
|
+
Ordered-series navigation and a CSP that can be extended rather than
|
|
19
|
+
replaced — both out of building a course-shaped site on top of the
|
|
20
|
+
existing series taxonomies — plus a theme-quality pass: dark mode
|
|
21
|
+
gets dark code blocks, the decorative cover tiles join the theme's
|
|
22
|
+
colour world, and each shipped theme leans harder into its own
|
|
23
|
+
identity.
|
|
24
|
+
|
|
25
|
+
The Fixed and Security sections are longer than a first release usually
|
|
26
|
+
warrants because this version went through a full pre-publication
|
|
27
|
+
review. Those entries describe defects that existed in the git history
|
|
28
|
+
and never reached a published gem — they're recorded because the
|
|
29
|
+
reasoning is worth keeping, and because anyone running from a checkout
|
|
30
|
+
or the `v1.0.0` tag *was* exposed to them. If you're coming from a
|
|
31
|
+
checkout, the bundle-asset change under **Changed** is the one that can
|
|
32
|
+
alter what your site publishes.
|
|
33
|
+
|
|
34
|
+
### Added
|
|
35
|
+
|
|
36
|
+
- **`bundle_assets.extensions:`** — extra file extensions to publish
|
|
37
|
+
out of a page bundle, on top of the built-in media set:
|
|
38
|
+
|
|
39
|
+
bundle_assets:
|
|
40
|
+
extensions: [.gpx, .stl]
|
|
41
|
+
|
|
42
|
+
Additive rather than replacing, so adding one download type can't
|
|
43
|
+
silently drop an image format when the defaults grow. Accepts bare
|
|
44
|
+
(`gpx`), dotted (`.gpx`) and upper-case forms. Markdown cannot be
|
|
45
|
+
added — see the bundle-asset change below.
|
|
46
|
+
|
|
47
|
+
- **`Abqari::UserError`** — the exception class for expected, actionable
|
|
48
|
+
failures: invalid YAML, an unknown config key under strict mode, a bad
|
|
49
|
+
`url:`, a malformed CLI argument. Entry points print these as a plain
|
|
50
|
+
message and exit 1; every other exception keeps its backtrace, because
|
|
51
|
+
an unexpected error is a defect and hiding its trace makes it
|
|
52
|
+
unreportable. Raising `UserError` is a claim that the message alone
|
|
53
|
+
tells the user what to fix.
|
|
54
|
+
|
|
55
|
+
Config and frontmatter validation previously raised `ArgumentError` /
|
|
56
|
+
`RuntimeError`; anything rescuing those specifically should rescue
|
|
57
|
+
`Abqari::UserError` instead.
|
|
58
|
+
|
|
59
|
+
- **`ABQARI_DEBUG=1`** — restore the backtrace for a `UserError`, for
|
|
60
|
+
when a "user error" turns out to be hiding an engine one.
|
|
61
|
+
|
|
62
|
+
- **`Abqari.run_cli`** — wraps a CLI entry point with that presentation,
|
|
63
|
+
plus clean `Interrupt` handling (Ctrl-C now prints `Interrupted.` and
|
|
64
|
+
exits 130 instead of unwinding a stack trace through the render pool).
|
|
65
|
+
Used by `exe/abqari` and every scaffolded `bin/*`.
|
|
66
|
+
|
|
67
|
+
- **`Helpers#external_http_url`** — the stricter sibling of
|
|
68
|
+
`sanitized_url`, for URLs arriving from a third party rather than from
|
|
69
|
+
your own content. Accepts only absolute `http(s)` URLs; rejects
|
|
70
|
+
`mailto:` and same-origin paths, which a stranger's "profile URL" has
|
|
71
|
+
no business being.
|
|
72
|
+
|
|
73
|
+
- `ABQARI_PORT` — dev-server port, alongside the existing `ABQARI_BIND`.
|
|
74
|
+
`bin/serve` takes no arguments by design, so a machine running several
|
|
75
|
+
Abqari sites had no way to move a second one off 4000 without editing
|
|
76
|
+
the script. Parsed strictly: anything that isn't a whole number in
|
|
77
|
+
1–65535 raises with the variable named, rather than going through
|
|
78
|
+
`String#to_i` — `"abc".to_i` is `0`, which WEBrick reads as "bind any
|
|
79
|
+
free port", so a typo would have started a server on a port the
|
|
80
|
+
operator can't guess, and `"4000x".to_i` is `4000`, so a typo would
|
|
81
|
+
have silently worked. Empty or whitespace-only means unset. Resolution
|
|
82
|
+
order is explicit argument → environment → default, matching `bind:`,
|
|
83
|
+
so an exported value can't hijack the test suite.
|
|
84
|
+
- **Dark-mode syntax highlighting.** The syntax layer now renders a
|
|
85
|
+
dark Rouge theme under the same two dark-mode scopes every theme's
|
|
86
|
+
token file uses — previously dark pages showed light-mode tokens on
|
|
87
|
+
Rouge's hardcoded near-white background. New `syntax_theme_dark:`
|
|
88
|
+
config key: a Rouge theme name (`github.dark` style names work),
|
|
89
|
+
`false` to opt out, or unset to derive from `syntax_theme`.
|
|
90
|
+
- **`--color-price` token** — price text on publication cards/headers.
|
|
91
|
+
Defaults to `--color-primary`; minimal points it at `--color-text`
|
|
92
|
+
so prices stop rendering in the link blue.
|
|
93
|
+
- **Per-theme webfont manifests** (`Abqari::ThemeFonts`). `abqari new
|
|
94
|
+
--theme <name>` scaffolds the matching `fonts:` block and
|
|
95
|
+
`abqari theme eject` prints it — magazine and sand previously
|
|
96
|
+
declared faces (Playfair Display, Merriweather) that no scaffold
|
|
97
|
+
ever downloaded, so their typography silently fell back to system
|
|
98
|
+
serifs on every new site.
|
|
99
|
+
- **Theme-keyed cover-tile palettes.** The decorative SVG title cards
|
|
100
|
+
draw from a palette tuned to the active theme (magazine, notebook,
|
|
101
|
+
sand) instead of the neutral set, so slug-hashed teal/violet tiles
|
|
102
|
+
stop landing on warm pages. Tile titles also render in the theme's
|
|
103
|
+
`--font-heading` (the SVG's baked-in sans stays as a no-CSS
|
|
104
|
+
fallback).
|
|
105
|
+
- **Theme-derived auto OG cards.** With `og_images.auto: true` and no
|
|
106
|
+
explicit `manifest.theme_color`, share cards now use a gradient
|
|
107
|
+
matched to the active theme instead of the one-size slate pair. An
|
|
108
|
+
explicit `theme_color` still wins.
|
|
109
|
+
|
|
110
|
+
- `Site#prev_in_series` — the backwards counterpart to
|
|
111
|
+
`next_in_series`. Both now delegate to a shared `series_sibling`
|
|
112
|
+
scan, so the two directions can't drift apart.
|
|
113
|
+
- `partials/series_pager` — compact bidirectional prev/next series
|
|
114
|
+
nav, for collections readers move through sequentially. The
|
|
115
|
+
forward-only `partials/next_in_series` card is unchanged and still
|
|
116
|
+
what the built-in `post` layout renders; the pager is opt-in from
|
|
117
|
+
your own layout.
|
|
118
|
+
- `RenderContext#series_url` and `Site#series_taxonomy_for` — resolve
|
|
119
|
+
the series index URL for a page's own collection instead of
|
|
120
|
+
assuming `posts_series`.
|
|
121
|
+
- `media:` config — allows off-origin audio / video in the CSP:
|
|
122
|
+
|
|
123
|
+
media:
|
|
124
|
+
host: https://media.example.com # or a list
|
|
125
|
+
|
|
126
|
+
Colocated bundle media needs nothing; it's same-origin and inherits
|
|
127
|
+
`default-src 'self'`. No `media-src` directive is emitted unless a
|
|
128
|
+
host is configured, so existing sites' headers are byte-identical.
|
|
129
|
+
- `csp:` config — additive per-directive origin allow-list for
|
|
130
|
+
anything the engine doesn't model:
|
|
131
|
+
|
|
132
|
+
csp:
|
|
133
|
+
img-src: [https://cdn.example.com]
|
|
134
|
+
connect-src: [https://api.example.com]
|
|
135
|
+
|
|
136
|
+
Previously the only escape hatch was `headers:`, which replaces the
|
|
137
|
+
computed policy wholesale and takes the pinned theme-bootstrap hash,
|
|
138
|
+
`'wasm-unsafe-eval'` and the Plausible hash down with it. `csp:`
|
|
139
|
+
appends instead. Restricted to eleven extendable directives (the
|
|
140
|
+
hardening directives and `default-src` are excluded); values must be
|
|
141
|
+
`scheme://host`, so keywords, wildcards and non-http schemes are
|
|
142
|
+
rejected by construction. A bad value fails the build rather than
|
|
143
|
+
being silently dropped — a malformed CSP fails open in the browser,
|
|
144
|
+
so a silent skip would ship a policy the operator believes is
|
|
145
|
+
enforced.
|
|
146
|
+
- Audit (Content): `series_position` problems that are otherwise
|
|
147
|
+
invisible — a non-Integer position (warn), duplicate positions
|
|
148
|
+
within one series (warn), and a page in a series with no position
|
|
149
|
+
(info). Each of these builds cleanly and renders correctly in
|
|
150
|
+
isolation while dropping out of the prev/next chain.
|
|
151
|
+
- `article:published_time` / `article:modified_time` / `article:tag`
|
|
152
|
+
OG meta on posts. `og:type: article` was already emitted, but the
|
|
153
|
+
dates lived only in JSON-LD — Facebook and LinkedIn read the
|
|
154
|
+
OG-level properties, not schema.org.
|
|
155
|
+
- The site skeleton now ships `content/404.md` (`permalink:
|
|
156
|
+
/404.html`, `sitemap: false`, `robots: noindex`), so every new site
|
|
157
|
+
starts with a not-found page in both default and `--blank` modes.
|
|
158
|
+
- The skeleton's `config/site.yml` gained a commented "SEO + social
|
|
159
|
+
sharing" section (`share_image`, `og_images.auto`, `twitter`,
|
|
160
|
+
`og_locale`) and now discloses the `block_ai_scraping: true`
|
|
161
|
+
default — the knobs existed but new sites had no way to discover
|
|
162
|
+
them from their own config file.
|
|
163
|
+
- `deploy` added to `SiteConfig::KNOWN_KEYS` — configuring
|
|
164
|
+
`bin/deploy`'s `deploy:` block no longer warns as an unknown key
|
|
165
|
+
(and no longer errors under `ABQARI_STRICT_CONFIG=true`).
|
|
166
|
+
|
|
167
|
+
### Changed
|
|
168
|
+
|
|
169
|
+
- **`reverse_markdown` is no longer a runtime dependency.**
|
|
170
|
+
*(Affects content importing only.)*
|
|
171
|
+
|
|
172
|
+
It's needed just by `bin/import` — a one-time migration step most
|
|
173
|
+
sites never run — and it pulls in nokogiri, which pulls in racc. That
|
|
174
|
+
chain broke installation outright on Ruby 3.3, the version this gem
|
|
175
|
+
advertises as its floor: 3.3 bundles racc 1.7.3, Bundler resolves to
|
|
176
|
+
1.8.1, and 1.8.1 ships no precompiled Linux binary, so `bundle
|
|
177
|
+
install` tried to compile it and failed for want of `make` on any
|
|
178
|
+
toolchain-free image (`ruby:3.3-slim` and most deploy bases). Ruby
|
|
179
|
+
3.4 and 4.0 were unaffected, which is why it went unnoticed — their
|
|
180
|
+
default racc already satisfies the constraint.
|
|
181
|
+
|
|
182
|
+
`bin/import` now asks for the gem at the moment it's needed and says
|
|
183
|
+
exactly how to install it. Every other command is unaffected: the
|
|
184
|
+
importers were already lazy-loaded and `require 'abqari'` never
|
|
185
|
+
reached them. Runtime dependencies drop from eight to seven, and a
|
|
186
|
+
normal install no longer carries a native-extension gem for a feature
|
|
187
|
+
it doesn't use.
|
|
188
|
+
|
|
189
|
+
To import: `gem install reverse_markdown`, or uncomment the line in
|
|
190
|
+
your site's Gemfile.
|
|
191
|
+
|
|
192
|
+
- **Bundle assets are an allow-list.** *(Behaviour change — read this
|
|
193
|
+
if you're upgrading from a git checkout.)*
|
|
194
|
+
|
|
195
|
+
Files colocated with a post's `index.md` used to publish unless they
|
|
196
|
+
were a directory, a dotfile or `index.md` itself. That shipped
|
|
197
|
+
whatever an author left in the folder — including a `notes.md` marked
|
|
198
|
+
`published: false`, which went to production verbatim, frontmatter and
|
|
199
|
+
all, at a guessable URL. `published: false` has to be a promise, and a
|
|
200
|
+
rule that publishes the file anyway makes the flag lie.
|
|
201
|
+
|
|
202
|
+
Only known media extensions now publish: images, video, audio,
|
|
203
|
+
subtitles, and PDF/EPUB/ZIP. Anything else is left behind and named at
|
|
204
|
+
build time — a warning, never a silent skip, since silent omission is
|
|
205
|
+
the failure this closes. Extend with `bundle_assets.extensions:`, or
|
|
206
|
+
prefix a file with a dot (`.notes.md`) to keep it local with no
|
|
207
|
+
warning.
|
|
208
|
+
|
|
209
|
+
Excluding `.md` alone would have fixed the case and left the class:
|
|
210
|
+
the next `.psd`, `.sketch` or `.docx` would ship the same way. An
|
|
211
|
+
allow-list fails closed on everything nobody thought of, and it's the
|
|
212
|
+
direction that stays cheap to reverse — loosening it later is not a
|
|
213
|
+
breaking change; tightening it would be.
|
|
214
|
+
|
|
215
|
+
Note `copy_flat_collection_assets` has always excluded `.md` for flat
|
|
216
|
+
collections. Bundles simply never applied the same rule, and that
|
|
217
|
+
inconsistency is what let it through.
|
|
218
|
+
|
|
219
|
+
- **Only `index.md` renders inside a bundle directory.** A second `.md`
|
|
220
|
+
in a bundle had no defined role and got two contradictory ones: copied
|
|
221
|
+
raw into the output as an "asset", *and* loaded as a stray page at
|
|
222
|
+
`/posts/my-post/notes/` (`Page#collection` rejects it for not being an
|
|
223
|
+
index, so it fell through uncollected rather than being dropped).
|
|
224
|
+
Published twice, in two forms, neither intended. It's now skipped with
|
|
225
|
+
a warning naming the file.
|
|
226
|
+
|
|
227
|
+
- **Collections are finalised before the deriving generators run.**
|
|
228
|
+
`Renderer#generate_all` is now two phases: generators that ADD pages
|
|
229
|
+
to a collection (publisher pages) run first, then
|
|
230
|
+
`Site#finalise_collections!`, then generators that READ collections
|
|
231
|
+
(pagination, taxonomies, visualizations, related indexes). Adding a
|
|
232
|
+
collection-joining page after the barrier now raises, naming the page
|
|
233
|
+
— see the pagination fix below for what the silent version cost.
|
|
234
|
+
|
|
235
|
+
- **CLI errors are presented, not dumped.** A malformed `config/site.yml`
|
|
236
|
+
used to answer with ten frames of Psych internals; the useful part
|
|
237
|
+
(file, line, column) was there, just buried. Same for a typo'd flag,
|
|
238
|
+
an unknown config key under strict mode, and a bad `url:`. These now
|
|
239
|
+
print one line. `ABQARI_DEBUG=1` brings the trace back.
|
|
240
|
+
|
|
241
|
+
- **`abqari new` validates its argument.** The argument names a
|
|
242
|
+
directory created in the current directory — it isn't a path. Nothing
|
|
243
|
+
checked that, so `abqari new ""` scaffolded into the cwd with an empty
|
|
244
|
+
title, and `..` or an absolute path wrote ~40 files wherever they
|
|
245
|
+
pointed, overwriting same-named `Gemfile` / `README.md` /
|
|
246
|
+
`content/index.md`. Empty, path-like, `.`/`..` and leading-dash names
|
|
247
|
+
are now refused. Extra positional arguments are reported rather than
|
|
248
|
+
silently dropped (an unquoted two-word name used to lose everything
|
|
249
|
+
after the first word).
|
|
250
|
+
|
|
251
|
+
- **`--force` refuses a target containing `.git`.** It skips the
|
|
252
|
+
non-empty check by design, but it never meant "write into an unrelated
|
|
253
|
+
repository", and a `.git` directory is the clearest signal of exactly
|
|
254
|
+
that.
|
|
255
|
+
|
|
256
|
+
- **Code-block backgrounds now belong to the theme.** `.highlight`
|
|
257
|
+
backgrounds come from `--color-code-bg` in both modes; Rouge
|
|
258
|
+
supplies token colours only. Sites that relied on the Rouge theme's
|
|
259
|
+
own background should set `--color-code-bg` (or
|
|
260
|
+
`syntax_theme_dark: false`) to taste.
|
|
261
|
+
- **Sand redesigned.** Sandier light surface, brick links (the old
|
|
262
|
+
`#444` grey links were nearly indistinguishable from body text),
|
|
263
|
+
olive-charcoal "desert night" dark mode (the old warm black was a
|
|
264
|
+
near-duplicate of magazine's), tag-chip tokens, pill buttons.
|
|
265
|
+
- **Notebook** carries its mono voice through the chrome: nav,
|
|
266
|
+
pagination, and buttons render in `--font-mono`, buttons squared
|
|
267
|
+
to 2px corners (matching its tag chips).
|
|
268
|
+
- **Magazine** buttons render in the display serif with slight
|
|
269
|
+
tracking, matching its nav and pagination.
|
|
270
|
+
- **Fixture heroes quieted.** The hand-authored post/workshop hero
|
|
271
|
+
SVGs no longer bake large titles in a generic sans (the page h1
|
|
272
|
+
already carries the title) and use muted duotones that sit on any
|
|
273
|
+
theme; the fixture config now downloads every shipped theme's
|
|
274
|
+
webfonts so each theme demos at full character.
|
|
275
|
+
|
|
276
|
+
- Auto OG cards carry a faint rub el hizb (۞) in the top-right
|
|
277
|
+
corner — Abqari's mark, the eight-pointed star Arabic manuscripts
|
|
278
|
+
use to structure text. Rendered at 12% opacity so it reads as
|
|
279
|
+
texture, not branding, on your cards.
|
|
280
|
+
|
|
281
|
+
- The dev server no longer logs client-disconnect errors. Every open
|
|
282
|
+
tab holds a live-reload SSE stream, and navigating tears that socket
|
|
283
|
+
down without a clean close — WEBrick's own request loop raises
|
|
284
|
+
`Errno::ECONNRESET` from `io_fillbuf` and logs it at ERROR with a
|
|
285
|
+
full backtrace, one per tab per navigation. The SSE handler already
|
|
286
|
+
rescued these, but WEBrick raises before dispatching to application
|
|
287
|
+
code, so the rescue never saw them; filtering at the logger is the
|
|
288
|
+
only interception point.
|
|
289
|
+
|
|
290
|
+
`Server::QuietLog` drops `ECONNRESET`, `EPIPE`, `ECONNABORTED` and
|
|
291
|
+
`ENOTCONN` and is otherwise stock `WEBrick::Log`. Suppression is by
|
|
292
|
+
exception class, never by message text, so a genuine fault that
|
|
293
|
+
happens to mention a reset connection is still logged in full — as
|
|
294
|
+
are all other levels, and all String messages. Set
|
|
295
|
+
`ABQARI_VERBOSE_LOG=true` for stock WEBrick logging when the socket
|
|
296
|
+
layer is what you're debugging. Dev-server only; nothing about a
|
|
297
|
+
production deploy changes.
|
|
298
|
+
|
|
299
|
+
### Fixed
|
|
300
|
+
|
|
301
|
+
- **`abqari new --name "My Site: A Story"` produced a site that couldn't
|
|
302
|
+
build.** Template values were interpolated into YAML unquoted, so a
|
|
303
|
+
colon in a title — entirely ordinary — made `config/site.yml` and
|
|
304
|
+
every scaffolded frontmatter file unparseable. The scaffolder reported
|
|
305
|
+
success and exited 0; the failure surfaced on the user's first
|
|
306
|
+
`bin/build`, in a file they never wrote. A `#` was quieter and worse:
|
|
307
|
+
it silently truncated the value at the comment marker.
|
|
308
|
+
|
|
309
|
+
Values now emit as YAML scalars via Psych, which quotes only when
|
|
310
|
+
needed (so an ordinary scaffold still reads as plain YAML) and knows
|
|
311
|
+
the whole grammar — including the resolver traps where an unquoted
|
|
312
|
+
`yes` loads back as `true` and `1.0` as a Float. Applies to all seven
|
|
313
|
+
affected templates, not just `config/site.yml`.
|
|
314
|
+
|
|
315
|
+
- **Folio-sourced entries went missing from paginated archives.**
|
|
316
|
+
Pagination ran before publisher pages and freezes its slices at
|
|
317
|
+
generation time, so on a site with more manual publications than
|
|
318
|
+
`per_page`, every Folio-sourced publication was absent from the
|
|
319
|
+
archive and all its shards — no warning, no error, just missing
|
|
320
|
+
entries against a green build. (The archive layout's own comment
|
|
321
|
+
promised the merged list would paginate automatically.)
|
|
322
|
+
|
|
323
|
+
- **A relative `ABQARI_OUTPUT_DIR` put local filesystem paths in the
|
|
324
|
+
published sitemap.** `Page#url` strips the output root off an absolute
|
|
325
|
+
output path; an unanchored `sub` with a relative root stripped nothing
|
|
326
|
+
and left the developer's full path as the URL —
|
|
327
|
+
`<loc>https://example.com/Users/me/dev/mysite//about/</loc>` — while
|
|
328
|
+
files still landed correctly, so the build reported success. A
|
|
329
|
+
trailing slash was the mirror image, eating the leading `/`.
|
|
330
|
+
`Site#output_dir` now expands (matching what `reset_output` already
|
|
331
|
+
did before deleting — the two had drifted), and the strip is anchored.
|
|
332
|
+
|
|
333
|
+
- **Generated pages ignored layout edits in incremental builds.**
|
|
334
|
+
Layouts are deliberately outside `GLOBAL_DEP_GLOBS` and tracked
|
|
335
|
+
per-page, but only `Page` consulted them — so editing
|
|
336
|
+
`taxonomy.html.erb`, an archive layout, `publications_index.html.erb`
|
|
337
|
+
or `visualization.html.erb` with the dev server running rebuilt
|
|
338
|
+
nothing and the browser reloaded to stale HTML. All generated page
|
|
339
|
+
classes now check `layout_deps_mtime`, sharing one `layout_name` with
|
|
340
|
+
their own `render` so the two can't drift.
|
|
341
|
+
|
|
342
|
+
- **Folio series pages never noticed a changed cache.** The cache path
|
|
343
|
+
was built by pluralising `kind`, giving `vendor/folio/seriess.yml` — a
|
|
344
|
+
file that never exists. Series show pages therefore never re-rendered
|
|
345
|
+
when Folio data changed, and fell through to a `Time.now` lastmod that
|
|
346
|
+
restamped every series entry in the sitemap on every build. The
|
|
347
|
+
determinism test couldn't catch it: both builds run on the same day.
|
|
348
|
+
|
|
349
|
+
- **Scaffolded `bin/*` failed when run from another directory.** The
|
|
350
|
+
scripts pin `ABQARI_SITE_ROOT` to their own location precisely so
|
|
351
|
+
they're cwd-independent, but `require 'bundler/setup'` resolves its
|
|
352
|
+
Gemfile from the current directory, undoing it. Running
|
|
353
|
+
`/path/to/site/bin/build` from a directory holding any other Gemfile
|
|
354
|
+
died with `cannot load such file -- abqari`, naming neither the site
|
|
355
|
+
nor the cause — hitting cron jobs, deploy hooks and editor task
|
|
356
|
+
runners. All seven bundler-using scripts now pin `BUNDLE_GEMFILE`
|
|
357
|
+
first (with `||=`, so an explicit value still wins).
|
|
358
|
+
|
|
359
|
+
- **`--blank` dropped the `fonts:` block for font-dependent themes.**
|
|
360
|
+
Blank mode emitted no fonts section while the next-steps text still
|
|
361
|
+
told the user to run `bin/fetch-fonts`, which then reported "No fonts
|
|
362
|
+
configured" — leaving magazine and sand on system serifs, exactly the
|
|
363
|
+
silent typography downgrade the fonts machinery exists to prevent.
|
|
364
|
+
System-font themes still get nothing, since there's nothing to
|
|
365
|
+
declare.
|
|
366
|
+
|
|
367
|
+
- **A non-ASCII project name crashed mid-scaffold under a C locale.**
|
|
368
|
+
Ruby tags ARGV with the locale encoding, so under `LC_ALL=C` (Docker,
|
|
369
|
+
cron, `env -i`) `abqari new café` raised
|
|
370
|
+
`Encoding::CompatibilityError` partway through writing files — and the
|
|
371
|
+
half-written directory then blocked a corrected retry as "non-empty".
|
|
372
|
+
ARGV is now normalised to UTF-8 when the bytes are valid.
|
|
373
|
+
|
|
374
|
+
- **A typo'd flag printed a backtrace.** `OptionParser#parse` raises on
|
|
375
|
+
an unknown option and nothing caught it, so `abqari new --bloank
|
|
376
|
+
mysite` met a new user with six frames of trace. Caught centrally in
|
|
377
|
+
the dispatcher, so future subcommands inherit it.
|
|
378
|
+
|
|
379
|
+
- **The strict-config error told you to enable strict config.** The
|
|
380
|
+
unknown-key message ended "…or set `ABQARI_STRICT_CONFIG=true` to make
|
|
381
|
+
this a hard error" in both branches — including the one raised
|
|
382
|
+
*because* it was already set. The advice now differs by mode.
|
|
383
|
+
|
|
384
|
+
- **A non-Latin tag overwrote the taxonomy index.** A term with no
|
|
385
|
+
URL-safe characters slugifies to "", collapsing `/tags/:slug/` to
|
|
386
|
+
`/tags/` — so the term page was written over `_site/tags/index.html`.
|
|
387
|
+
With two such terms the build did fail, via the output-collision
|
|
388
|
+
check, but named colliding paths rather than the tag responsible.
|
|
389
|
+
Now refused up front, naming the term (and rendered raw rather than
|
|
390
|
+
through `inspect`, which turns a CJK tag into escape sequences the
|
|
391
|
+
author can't match to anything).
|
|
392
|
+
|
|
393
|
+
- **Photo bundles went stale in incremental builds.** The bundle-asset
|
|
394
|
+
mtime check was gated on `post?`, so changing only a photo's image
|
|
395
|
+
didn't re-render its page — while `lastmod`, which does include bundle
|
|
396
|
+
assets, still advertised the page as updated. Now gated on having a
|
|
397
|
+
bundle, covering photos and any bundle-style collection you define.
|
|
398
|
+
|
|
399
|
+
- **Bundle image filenames weren't URL-encoded in the sitemap.** A file
|
|
400
|
+
named `my photo.jpg` produced an `<image:loc>` containing a literal
|
|
401
|
+
space, which is invalid — XML escaping is a different layer and
|
|
402
|
+
doesn't help. Filesystem-derived basenames are now percent-encoded;
|
|
403
|
+
frontmatter values are left alone, since they're author-written URLs
|
|
404
|
+
that may already be encoded.
|
|
405
|
+
|
|
406
|
+
- **Importer frontmatter could be split by a newline in a title.**
|
|
407
|
+
`yaml_scalar` quoted on a documented character list that didn't
|
|
408
|
+
include control characters — and a literal newline ends the line even
|
|
409
|
+
inside a double-quoted scalar, so a title of `"Hello\npermalink: …"`
|
|
410
|
+
from a third-party export became two mapping entries. Control
|
|
411
|
+
characters are now escaped to their YAML forms.
|
|
412
|
+
|
|
413
|
+
- **`bin/import` with no arguments exited 0.** It printed help and
|
|
414
|
+
reported success, out of step with every other command (`abqari new`
|
|
415
|
+
and `abqari theme` both exit 1 for the same mistake) and a trap for
|
|
416
|
+
any script checking the status. An explicit `--help` is still a
|
|
417
|
+
success.
|
|
418
|
+
|
|
419
|
+
- **`abqari new` exited 0 when `bundle install` failed.** The scaffold
|
|
420
|
+
is complete at that point, but the site can't build, so a script
|
|
421
|
+
running `abqari new … && cd … && bin/build` had no way to detect it.
|
|
422
|
+
|
|
423
|
+
- **`bin/serve` validated `ABQARI_PORT` only after building the site.**
|
|
424
|
+
A typo cost a full build before the error appeared. `Server.validate_env!`
|
|
425
|
+
now runs first.
|
|
426
|
+
|
|
427
|
+
- **The skeleton's `bin/audit` had no `--verbose`.** The engine's copy
|
|
428
|
+
gained it; the scaffolded copy never did — the only real behavioural
|
|
429
|
+
drift across the eight script pairs.
|
|
430
|
+
|
|
431
|
+
- **The release workflow's tag check loaded the whole engine to read one
|
|
432
|
+
constant.** `ruby -Ilib -r abqari -e 'puts Abqari::VERSION'` ran
|
|
433
|
+
without `bundle exec`, and `bundler-cache` installs to `vendor/bundle`
|
|
434
|
+
where a bare `ruby` can't see it — so the step died on "cannot load
|
|
435
|
+
such file -- erubi" before reaching the constant, failing every
|
|
436
|
+
release at the first gate.
|
|
437
|
+
|
|
438
|
+
It now requires `abqari/version`, which has no dependencies. This is
|
|
439
|
+
the same trap that split `lib/abqari/version.rb` out of the engine in
|
|
440
|
+
the first place (its comment explains the gemspec version), one step
|
|
441
|
+
removed — and like that one, it only appears on a clean runner. Two
|
|
442
|
+
tests now pin both halves: workflows may only require
|
|
443
|
+
`abqari/version` to read VERSION, and reading it must work with no
|
|
444
|
+
gems installed at all.
|
|
445
|
+
|
|
446
|
+
- **`bin/check`'s CVE step broke whenever the active Ruby changed.**
|
|
447
|
+
`bundler-audit` was expected as a global `gem install`, and a global
|
|
448
|
+
install belongs to exactly one Ruby — so switching the development
|
|
449
|
+
Ruby from 3.3 to 4.0 left `bundle exec bundle-audit` reporting
|
|
450
|
+
"command not found", and the check silently sat at ✗. A gate nobody
|
|
451
|
+
can get to pass is a gate nobody reads.
|
|
452
|
+
|
|
453
|
+
It's now in the Gemfile's development group (`require: false` — it's a
|
|
454
|
+
CLI), so it's pinned, Dependabot-visible, and present under whichever
|
|
455
|
+
Ruby is active. Both CI workflows dropped their separate
|
|
456
|
+
`gem install bundler-audit` step and call it through the bundle, so
|
|
457
|
+
the version that gates a release is the version a contributor runs.
|
|
458
|
+
|
|
459
|
+
(Unchanged for scaffolded sites: `bin/audit`'s optional CVE section
|
|
460
|
+
still shells out to a globally installed `bundle-audit`, as the README
|
|
461
|
+
describes.)
|
|
462
|
+
|
|
463
|
+
- **`bin/test` buried its own result.** A passing run emitted well over
|
|
464
|
+
a thousand lines: ~400 chilled-string warnings from inside
|
|
465
|
+
`reverse_markdown` (Ruby 3.4+ warns on every literal mutation in a
|
|
466
|
+
file without the magic comment, and the importer tests call it in a
|
|
467
|
+
loop), plus every `Built 1 page(s)`, `Missing \`url\``, webmention
|
|
468
|
+
and syndication line the suite legitimately triggers. Finding a
|
|
469
|
+
failure meant scrolling past all of it.
|
|
470
|
+
|
|
471
|
+
Warnings originating inside installed gems are now filtered
|
|
472
|
+
(`VERBOSE_WARNINGS=1` restores them), and the engine's own info/warn
|
|
473
|
+
output is suppressed only when nothing is capturing it — detected by
|
|
474
|
+
checking whether `$stdout`/`$stderr` has been swapped, so all three
|
|
475
|
+
capture idioms in the suite keep seeing byte-identical output.
|
|
476
|
+
`ABQARI_LOG=info bin/test` restores everything. Errors are never
|
|
477
|
+
suppressed. A clean run is now 12 lines.
|
|
478
|
+
|
|
479
|
+
Four tests that deliberately trigger logged errors now capture and
|
|
480
|
+
assert on them rather than printing to the terminal — including
|
|
481
|
+
`test_hook_exceptions_are_re_raised_with_logged_backtrace`, which
|
|
482
|
+
never actually checked that a backtrace was logged.
|
|
483
|
+
|
|
484
|
+
- **The clean-container test skipped the Ruby version the gemspec
|
|
485
|
+
advertises.** Both `bin/stranger-test` and CI's `stranger` job ran
|
|
486
|
+
3.4 and 4.0 while `required_ruby_version` is `>= 3.3`, leaving the
|
|
487
|
+
floor unproven in the environment the test exists to simulate — and
|
|
488
|
+
the floor is where a native gem is likeliest to have no precompiled
|
|
489
|
+
binary and fall back to a source build these images can't perform.
|
|
490
|
+
That gap hid a real installation break (see the `reverse_markdown`
|
|
491
|
+
entry under **Changed**).
|
|
492
|
+
|
|
493
|
+
3.3 is now in all three matrices — the test suite, the local
|
|
494
|
+
stranger script, and CI's clean-container job. The three lists are
|
|
495
|
+
duplicated rather than derived and had already drifted, so each now
|
|
496
|
+
carries a comment pointing at the others.
|
|
497
|
+
|
|
498
|
+
- **A scheme-less `url:` reported the wrong mistake.**
|
|
499
|
+
`URI.parse('example.com')` puts the whole string in `path`, so the
|
|
500
|
+
path check fired and reported that `url` "has a path component
|
|
501
|
+
(\"example.com\")" — technically true, humanly baffling. Missing
|
|
502
|
+
schemes are now detected first and suggest the corrected value.
|
|
503
|
+
|
|
504
|
+
- **WCAG-AA contrast across all shipped themes.** A token-level
|
|
505
|
+
contrast pass found seven sub-4.5:1 pairs: magazine's light info
|
|
506
|
+
banner, notebook's light muted/warning and dark muted, and sand's
|
|
507
|
+
dark success/danger/info (now dark-text-on-brighter-accent). All
|
|
508
|
+
measured pairs pass in both modes.
|
|
509
|
+
- **Magazine's drop cap was dead CSS on every post.** The selector
|
|
510
|
+
targeted `article > p:first-of-type`, but body paragraphs live
|
|
511
|
+
inside the `e-content` wrapper — the only direct `<p>` child of
|
|
512
|
+
`<article>` is the back-link. Now anchored to `.e-content`.
|
|
513
|
+
|
|
514
|
+
- **The CSS minifier silently deleted every theme token in production
|
|
515
|
+
builds.** `Minifier.css` stashed quoted strings before stripping
|
|
516
|
+
comments, and treated a bare `'` as a string delimiter — but CSS
|
|
517
|
+
comments here are English prose, full of apostrophes ("the theme's
|
|
518
|
+
tokens", "Safari's tap-flash"). Two comments each carrying one
|
|
519
|
+
apostrophe were paired into a single "string" spanning both, so every
|
|
520
|
+
rule between them — plus the `*/` that should have closed the first
|
|
521
|
+
comment — was swallowed and then deleted.
|
|
522
|
+
|
|
523
|
+
`_common.css` has an odd number of apostrophes, so in the concatenated
|
|
524
|
+
bundle the casualty was the entire `:root` block of whatever theme
|
|
525
|
+
followed it: every colour and font custom property in the site. Pages
|
|
526
|
+
rendered in Times with no palette. Development builds don't minify, so
|
|
527
|
+
this only appeared once deployed.
|
|
528
|
+
|
|
529
|
+
Comments and strings are now tokenised in a single left-to-right pass
|
|
530
|
+
with ordered alternation, so whichever construct starts first consumes
|
|
531
|
+
the other. `content: "/* not a comment */"` still survives verbatim.
|
|
532
|
+
|
|
533
|
+
- The `post` layout hardcoded `posts_series` in the series breadcrumb
|
|
534
|
+
and the end-of-series note. Since the layout is deliberately
|
|
535
|
+
reusable (`cookbook` ships on it), any other collection's series
|
|
536
|
+
breadcrumb linked into the posts series index. Now resolved from the
|
|
537
|
+
page's own collection, and rendered as plain text when the
|
|
538
|
+
collection has no series taxonomy configured. Posts are unaffected.
|
|
539
|
+
|
|
540
|
+
- **Auto OG cards: generated pages advertised og:image files that
|
|
541
|
+
don't exist.** With `og_images.auto: true`, the head emitted an
|
|
542
|
+
`<page-url>og.svg` og:image for any page without a hero — but
|
|
543
|
+
`OgImageGenerator` only writes cards for real content pages with
|
|
544
|
+
directory URLs. Tag indexes, pagination shards, related indexes,
|
|
545
|
+
and flat-URL pages (`/404.html` — which produced the mangled
|
|
546
|
+
`/404.htmlog.svg`) all pointed social validators at 404s. The head
|
|
547
|
+
and the generator now share one eligibility predicate
|
|
548
|
+
(`OgImageGenerator.auto_card?`), so they can't drift apart again.
|
|
549
|
+
|
|
550
|
+
- Slug-aliased posts feeds carried the wrong `<title>`. The head's
|
|
551
|
+
autodiscovery link says "Site — Stories" for a `posts.slug:
|
|
552
|
+
stories` site, but `Feed#feed_title` tested the internal collection
|
|
553
|
+
name instead of the effective slug and emitted just "Site". The
|
|
554
|
+
comment claimed they matched; now they do.
|
|
555
|
+
|
|
556
|
+
- The skeleton config's commented social-links example used the wrong
|
|
557
|
+
key (`social_links:` — the engine reads `social:`) and bare handles
|
|
558
|
+
where the engine expects full URLs. Uncommenting it produced an
|
|
559
|
+
unknown-key warning and, with the key corrected, broken footer
|
|
560
|
+
links. A scaffold test now validates both templates' keys — real
|
|
561
|
+
AND commented examples — against `KNOWN_KEYS`.
|
|
562
|
+
|
|
563
|
+
- The skeleton config claimed posts feeds render at `/posts/feed.xml`;
|
|
564
|
+
they render at the root `/feed.xml` (deliberately, for subscriber
|
|
565
|
+
back-compat). The footer signature also baked in the scaffold-time
|
|
566
|
+
year — it now uses the `{year}` build-time token, so it can't go
|
|
567
|
+
stale.
|
|
568
|
+
|
|
569
|
+
- The dev server showed WEBrick's stock error page for unknown URLs
|
|
570
|
+
instead of the site's own `/404.html` — the one page an author
|
|
571
|
+
could never preview with `bin/serve`. Static hosts (Cloudflare
|
|
572
|
+
Pages, Netlify, GitHub Pages) serve the custom page in production;
|
|
573
|
+
the dev server now mirrors them. The status stays 404, only the
|
|
574
|
+
body changes, and WEBrick's default page still appears if the
|
|
575
|
+
build produced no `404.html`.
|
|
576
|
+
|
|
577
|
+
- The no-libvips regression test failed on any machine with the
|
|
578
|
+
`vips`/`magick` CLIs installed: the subprocess inherited PATH, so
|
|
579
|
+
the pipeline (correctly) picked the shell backend instead of the
|
|
580
|
+
no-backend state under test. The subprocess now runs with an empty
|
|
581
|
+
PATH.
|
|
582
|
+
|
|
583
|
+
- `abqari new --engine git` scaffolded a placeholder URL
|
|
584
|
+
(`your-handle`) that failed `bundle install` as-is; it now defaults
|
|
585
|
+
to the canonical repo.
|
|
586
|
+
|
|
587
|
+
### Security
|
|
588
|
+
|
|
589
|
+
- **Webmention URLs are sanitised before any template sees them.**
|
|
590
|
+
Webmentions are the least-trusted data the engine renders — anyone on
|
|
591
|
+
the internet can send one, and the author name, avatar and source URL
|
|
592
|
+
are copied from the *sender's* markup into `href` and `src`
|
|
593
|
+
attributes. Erubi's auto-escaping stops a value breaking out of the
|
|
594
|
+
attribute but leaves the URL scheme untouched, so an author URL of
|
|
595
|
+
`javascript:…` escaped to itself and stayed a working link: stored
|
|
596
|
+
XSS on a published site, one reader click away.
|
|
597
|
+
|
|
598
|
+
`Indieweb::Fetcher` now scrubs `url`, `wm-source`, `author.url` and
|
|
599
|
+
`author.photo` to absolute `http(s)` URLs (or `nil`) as mentions are
|
|
600
|
+
indexed — so anything reading `site.data['webmentions']` gets clean
|
|
601
|
+
data by construction, rather than every template having to remember.
|
|
602
|
+
Sanitising at index time covers the cached path too, so a
|
|
603
|
+
`vendor/webmentions/mentions.json` written by an older version is
|
|
604
|
+
scrubbed on load. Dropped URLs degrade to unlinked text.
|
|
605
|
+
|
|
606
|
+
Only affects sites with `indieweb.enabled` and a webmention.io token.
|
|
607
|
+
|
|
608
|
+
- **The importer's SSRF guard resolves through the same resolver that
|
|
609
|
+
connects.** `HttpSafe`'s `block_private` check used `Resolv` plus
|
|
610
|
+
`IPAddr` parsing while the request used `getaddrinfo`, and the gap
|
|
611
|
+
between them was a bypass: `http://2130706433/`, `http://0x7f000001/`,
|
|
612
|
+
`http://017700000001/`, `http://127.1/` and `http://127.0.1/` all
|
|
613
|
+
reach 127.0.0.1, but `Resolv` returned nothing and `IPAddr.new`
|
|
614
|
+
raised, so the guard skipped the host and let the request through.
|
|
615
|
+
`0.0.0.0` passed too — it isn't loopback, private or link-local by
|
|
616
|
+
any of `IPAddr`'s predicates, yet connecting to it reaches localhost.
|
|
617
|
+
|
|
618
|
+
Resolution now goes through `Addrinfo.getaddrinfo`, closing the whole
|
|
619
|
+
class of parse mismatch rather than enumerating the forms. Added
|
|
620
|
+
coverage for CGNAT (`100.64/10`), multicast, reserved/broadcast, the
|
|
621
|
+
unspecified addresses, and IPv4-mapped IPv6 (`::ffff:127.0.0.1`).
|
|
622
|
+
A host that doesn't resolve still falls through to its natural "no
|
|
623
|
+
such host" error — safe now that the guard and the connection share
|
|
624
|
+
one resolver.
|
|
625
|
+
|
|
626
|
+
Reachable only when importing an attacker-supplied export
|
|
627
|
+
(`bin/import`), the one place `block_private` is enabled.
|
|
628
|
+
|
|
629
|
+
- **Substack zip extraction is verified after unzipping.** Extraction
|
|
630
|
+
shells out to `unzip` (argv-form, so no shell injection), and modern
|
|
631
|
+
Info-ZIP already refuses traversing entries — but an export zip is the
|
|
632
|
+
least-trusted input the engine accepts, and containment was being
|
|
633
|
+
delegated to whichever `unzip` happens to be on PATH. Every extracted
|
|
634
|
+
path is now checked to resolve inside the tempdir, and archives
|
|
635
|
+
containing symlinks are refused outright (an export has no legitimate
|
|
636
|
+
use for one, and refusing avoids reasoning about multi-hop chains).
|
|
637
|
+
|
|
638
|
+
- **`Site#memo` is mutex-guarded.** Templates call memoised accessors
|
|
639
|
+
from the parallel render pool. Most memos are warm before rendering
|
|
640
|
+
starts and MRI's GVL makes a torn Hash unlikely, but `Renderer`
|
|
641
|
+
already takes this precaution for its own caches. Re-entrant by
|
|
642
|
+
design: the fast path reads without the lock and the block runs
|
|
643
|
+
outside it, so a memo that calls another memo can't deadlock.
|
|
644
|
+
|
|
645
|
+
- **Deploy workflow templates are SHA-pinned.** The scaffolded
|
|
646
|
+
`.github/workflows/` used floating tags (`actions/checkout@v5`,
|
|
647
|
+
`cloudflare/wrangler-action@v3`) while this changelog claimed they
|
|
648
|
+
were pinned. A repointed tag on a third-party action holding
|
|
649
|
+
`CLOUDFLARE_API_TOKEN` would have been a credential leak replicated
|
|
650
|
+
across every site scaffolded from the template. All actions in the
|
|
651
|
+
templates — and in this repo's own workflows — are now pinned to a
|
|
652
|
+
commit SHA with the version in a trailing comment; the shipped
|
|
653
|
+
`dependabot.yml` keeps them current as reviewable PRs.
|
|
654
|
+
|
|
655
|
+
- **Releases authenticate with trusted publishing — there is no RubyGems
|
|
656
|
+
API key in this repository.** The `publish` job exchanges GitHub's
|
|
657
|
+
OIDC token for a credential RubyGems accepts only for this repo and
|
|
658
|
+
this workflow file, valid for minutes. Nothing to store as a repo
|
|
659
|
+
secret, nothing to rotate, and a credential that leaked into a log is
|
|
660
|
+
expired before anyone could read it.
|
|
661
|
+
|
|
662
|
+
`id-token: write` is granted at JOB level, so the `verify` job — which
|
|
663
|
+
runs the test suite, the audit, and a `curl | bash` installer — cannot
|
|
664
|
+
request a token at all. The setup steps live in CONTRIBUTING.md; the
|
|
665
|
+
gem's `rubygems_mfa_required` still applies, since trusted publishing
|
|
666
|
+
doesn't replace account MFA.
|
|
667
|
+
|
|
668
|
+
- **The release workflow no longer runs a third-party installer beside
|
|
669
|
+
the RubyGems key.** `release.yml` piped `curl … | bash` from
|
|
670
|
+
pagefind.app in the same job as `GEM_HOST_API_KEY`, so a compromised
|
|
671
|
+
or hijacked host could have read the key and published a malicious
|
|
672
|
+
release. The workflow is now two jobs: `verify` runs the gate and
|
|
673
|
+
holds no secrets, `publish` sees the key and does nothing but
|
|
674
|
+
checkout, build and push. Workflow permissions dropped from
|
|
675
|
+
`contents: write` to `contents: read`, and the `workflow_dispatch`
|
|
676
|
+
tag input is bound through `env` and shape-validated instead of being
|
|
677
|
+
interpolated into a shell line.
|
|
678
|
+
|
|
679
|
+
## [1.0.0] — 2026-07-14
|
|
680
|
+
|
|
681
|
+
Tagged in git, never published to RubyGems — see 1.1.0 for the first
|
|
682
|
+
installable release. The engine is feature-complete for the
|
|
683
|
+
four content types it targets — long-form writing, photo
|
|
684
|
+
galleries, publications, and workshops — with the safety
|
|
685
|
+
primitives, IndieWeb integration, and POSSE syndication needed to
|
|
686
|
+
run a real working author / publisher site.
|
|
687
|
+
|
|
688
|
+
### What ships
|
|
689
|
+
|
|
690
|
+
**Authoring**
|
|
691
|
+
|
|
692
|
+
- Markdown (CommonMark + GFM) with YAML frontmatter.
|
|
693
|
+
- Four default content collections — `posts`, `photos`, `publications`,
|
|
694
|
+
`workshops` — plus `bundles` and `series` for Folio-sourced
|
|
695
|
+
publication groupings. Add your own under `collections:` in
|
|
696
|
+
`config/site.yml`.
|
|
697
|
+
- Bundle-style collections (`content/<name>/<slug>/index.md` plus
|
|
698
|
+
colocated assets) and flat single-file pages where appropriate.
|
|
699
|
+
- Drafts (`published: false`), future-dated scheduling, custom
|
|
700
|
+
taxonomies with scalar (`country: Syria`) or list (`tags: [a, b]`)
|
|
701
|
+
frontmatter.
|
|
702
|
+
- Slug aliasing: rename a built-in collection's URL prefix without
|
|
703
|
+
forking the layout (e.g. `posts.slug: guides` publishes posts at
|
|
704
|
+
`/guides/`).
|
|
705
|
+
- Content scaffolders: `bin/new`, `bin/new post "Title"`,
|
|
706
|
+
`bin/new page "Title"`.
|
|
707
|
+
- Opt-in collections at scaffold time: `abqari new my-site --with
|
|
708
|
+
photos,publications,workshops` enables the named collections in
|
|
709
|
+
config and creates their `content/<name>/index.md` landing pages.
|
|
710
|
+
Default scaffold stays posts-only.
|
|
711
|
+
- Content importers: `bin/import substack|ghost|jekyll <source>`
|
|
712
|
+
pulls content from another platform's export into the site's
|
|
713
|
+
collections — downloads images into bundles, writes
|
|
714
|
+
`redirect_from:` for inbound link preservation, idempotent
|
|
715
|
+
re-runs.
|
|
716
|
+
|
|
717
|
+
**Templating**
|
|
718
|
+
|
|
719
|
+
- ERB layouts and partials — real Ruby, no sandboxed templating
|
|
720
|
+
language. Erubi auto-escape for `<%= … %>`; explicit raw form
|
|
721
|
+
`<%== … %>` is allow-listed via a build-time audit.
|
|
722
|
+
- Standard helper library — `truncate`, `pluralize`, `local_time`,
|
|
723
|
+
`time_ago`, `time_until`, `years_since`, `excerpt`,
|
|
724
|
+
`reading_time`, `slugify`, `asset_path`, `picture_tag`, `icon`,
|
|
725
|
+
`taxonomy_url`, `script_safe_json`, and more.
|
|
726
|
+
- Three-layer cascade for nav and footer (data file →
|
|
727
|
+
frontmatter → fallback).
|
|
728
|
+
- Light/dark theme toggle with hash-pinned CSP, no FOUC.
|
|
729
|
+
- Spam-resistant contact button, image gallery, carousel,
|
|
730
|
+
newsletter, and webmentions partials.
|
|
731
|
+
|
|
732
|
+
**Styling**
|
|
733
|
+
|
|
734
|
+
- Mobile-first responsive CSS with `clamp()` fluid type, safe-area
|
|
735
|
+
insets, `100dvh`, `@media (hover: hover)` gates.
|
|
736
|
+
- Five hand-tuned themes — `minimal`, `magazine`, `notebook`,
|
|
737
|
+
`sand`, `bootstrap` — plus `custom` as a starter template and
|
|
738
|
+
`none` to bring your own.
|
|
739
|
+
- Decorative SVG title-card covers (`cover: svg` or
|
|
740
|
+
`cover: photo_or_svg`) for posts and workshops without an
|
|
741
|
+
`image:` — slug-hashed gradient with the title word-wrapped over
|
|
742
|
+
it, no per-page artwork required.
|
|
743
|
+
|
|
744
|
+
**Build pipeline**
|
|
745
|
+
|
|
746
|
+
- Pretty URLs, content-hashed asset fingerprinting, HTML + CSS + JS
|
|
747
|
+
minification.
|
|
748
|
+
- Render-blocking CSS (syntax theme, `_common.css`, theme, site
|
|
749
|
+
overrides) ships as a single fingerprinted bundle — one stylesheet
|
|
750
|
+
request per page, immutable-cached.
|
|
751
|
+
- Self-hosted Google Fonts via `bin/fetch-fonts`.
|
|
752
|
+
- libvips-backed image pipeline: responsive `<picture>`, AVIF +
|
|
753
|
+
WebP variants, CLS-safe dimensions. Falls back to shell-out
|
|
754
|
+
(`vips` / `magick`) or passthrough mode when libvips isn't
|
|
755
|
+
available.
|
|
756
|
+
- Parallel page rendering, compiled-template cache, mtime-aware
|
|
757
|
+
copying.
|
|
758
|
+
- Build-OK sentinel (`_site/.abqari-build-ok`) written only on
|
|
759
|
+
successful builds; `bin/deploy` refuses to ship without it.
|
|
760
|
+
- Atomic state-file writes (POSSE log, webmention cache, sender
|
|
761
|
+
log) — SIGINT mid-write won't corrupt them.
|
|
762
|
+
|
|
763
|
+
**Discovery and SEO**
|
|
764
|
+
|
|
765
|
+
- Sitemap with `<lastmod>` and image extension, RSS, JSON Feed
|
|
766
|
+
(one set per collection that opts in).
|
|
767
|
+
- Open Graph + Twitter card meta, JSON-LD `Article` and `Book`
|
|
768
|
+
schemas.
|
|
769
|
+
- Per-environment `robots.txt`, `_redirects` from `redirect_from:`
|
|
770
|
+
frontmatter, `security.txt`.
|
|
771
|
+
- Plausible analytics: one config line, automatic CSP extension.
|
|
772
|
+
- Static search via Pagefind, no third-party server.
|
|
773
|
+
|
|
774
|
+
**IndieWeb and POSSE**
|
|
775
|
+
|
|
776
|
+
- Microformats2 markup baked into post, post-list, and about
|
|
777
|
+
layouts (`h-entry`, `h-card`, `p-name`, `dt-published`,
|
|
778
|
+
`e-content`, `p-category`, `u-url`, `h-feed`, `p-summary`).
|
|
779
|
+
- Webmention receive via webmention.io with ETag caching. A
|
|
780
|
+
"Replies & mentions" section renders below each post —
|
|
781
|
+
conversational mentions get full author + body cards; likes,
|
|
782
|
+
reposts, and bookmarks render facepile-style.
|
|
783
|
+
- Webmention send (opt-in): POSTs notifications to external URLs
|
|
784
|
+
recent posts link to. Tracked in `vendor/webmentions/sent.yml`
|
|
785
|
+
with retry-on-failure semantics.
|
|
786
|
+
- Bridgy Fed link tags (opt-in): `<link rel="me">` +
|
|
787
|
+
`application/activity+json` advertisement so Mastodon users can
|
|
788
|
+
follow the site directly via ActivityPub.
|
|
789
|
+
- POSSE auto-syndication to Mastodon and Bluesky on each build.
|
|
790
|
+
Per-post opt-out via `syndicate: false`; custom snippet via
|
|
791
|
+
`syndication_text:`. Idempotent; replies on the syndicated
|
|
792
|
+
posts flow back as webmentions via Bridgy Fed.
|
|
793
|
+
|
|
794
|
+
**Security**
|
|
795
|
+
|
|
796
|
+
- `PathSafe` for every filesystem write derived from user input
|
|
797
|
+
(permalinks, redirects, bundle assets, og:image generation).
|
|
798
|
+
- `HttpSafe` for every build-time HTTP — streaming reads with
|
|
799
|
+
size caps, configurable timeouts, no `Net::HTTP.start` outside
|
|
800
|
+
the wrapper.
|
|
801
|
+
- ERB rendering uses Erubi with `escape: true` by default.
|
|
802
|
+
`<%== … %>` is allow-listed via `test/erb_escape_audit_test.rb`.
|
|
803
|
+
- YAML loading uses `YAML.safe_load_file` with a minimal
|
|
804
|
+
permitted-classes set (`Date`, `Time` only).
|
|
805
|
+
- Strict CSP with hashed inline scripts, `object-src 'none'`,
|
|
806
|
+
`frame-ancestors 'none'`, `base-uri 'self'`.
|
|
807
|
+
- The dev server binds to `127.0.0.1` by default. WEBrick's stdlib
|
|
808
|
+
default of `0.0.0.0` would expose unrendered drafts and
|
|
809
|
+
future-dated content to anyone on the LAN.
|
|
810
|
+
|
|
811
|
+
**Quality and shipping**
|
|
812
|
+
|
|
813
|
+
- `bin/audit`: links + SEO + a11y + privacy + dependency CVEs +
|
|
814
|
+
content quality in one markdown report. `--strict` exits
|
|
815
|
+
non-zero on any error-severity finding.
|
|
816
|
+
- `bin/deploy` for Cloudflare and Netlify.
|
|
817
|
+
- GitHub Actions workflow templates for Cloudflare Pages, GitHub
|
|
818
|
+
Pages, and Render (all SHA-pinned, Dependabot-managed).
|
|
819
|
+
- Test suite: 680+ runs, 8000+ assertions, ~30 second wall-clock.
|
|
820
|
+
- Memo registry on `Site` — adding a new cached accessor doesn't
|
|
821
|
+
require touching the rebuild-reset code path.
|
|
822
|
+
- Pre-launch hardening pass: security, output-correctness, and DX
|
|
823
|
+
fixes from a full code review, each with regression tests.
|
|
824
|
+
- Gem packaging: the site skeleton's dotfiles (`.gitignore`,
|
|
825
|
+
`vendor/*/.gitkeep`) ship in the gem, `abqari new` defaults to the
|
|
826
|
+
released RubyGems engine source, and Heroicons 2.2.0 is vendored
|
|
827
|
+
(with license) so the `heroicon` helper works from a gem install.
|
|
828
|
+
- The gemspec reads `VERSION` from a dependency-free
|
|
829
|
+
`lib/abqari/version.rb` rather than loading the engine. Loading it
|
|
830
|
+
pulled in every runtime gem, which broke `bundle install` for any
|
|
831
|
+
git or path source (Bundler evaluates the gemspec before installing
|
|
832
|
+
dependencies).
|
|
833
|
+
- `abqari new` writes a `.ruby-version` pinned to the scaffolding
|
|
834
|
+
Ruby, so a scaffolded site doesn't silently build on whatever
|
|
835
|
+
version its deploy host defaults to.
|
|
836
|
+
- commonmarker moved to `~> 2.4`. Its precompiled binaries are
|
|
837
|
+
per-Ruby-ABI and 1.1.x stops at Ruby 3.3, so installing under 3.4
|
|
838
|
+
fell back to a source build needing a Rust toolchain. Two rendering
|
|
839
|
+
details are pinned explicitly as a result: `hardbreaks: false`
|
|
840
|
+
(2.x defaults it to true, which turns every hard-wrapped source
|
|
841
|
+
line into a `<br />`), and the TOC partial now reads commonmarker
|
|
842
|
+
2.x's `id`-on-heading anchor markup.
|
|
843
|
+
- `word_count` strips HTML before counting. Callers pass rendered
|
|
844
|
+
content, so JSON-LD `wordCount` had been counting tag attributes as
|
|
845
|
+
words.
|
|
846
|
+
- `slugify` folds diacritics instead of deleting them: "Café" now
|
|
847
|
+
slugs to `cafe` rather than `caf`, and "Mabrūk" to `mabruk` rather
|
|
848
|
+
than `mabr-k`. It builds public taxonomy URLs (`/tags/:slug/`), so a
|
|
849
|
+
transliterated or accented tag previously got a mangled URL.
|
|
850
|
+
Stroked and ligature letters Unicode doesn't decompose (ø, ß, æ, þ,
|
|
851
|
+
…) fold via an explicit table. Non-Latin scripts still slug to "",
|
|
852
|
+
which `Page::Path` reports as an actionable error. Path-derived
|
|
853
|
+
strings tagged ASCII-8BIT and outright invalid byte sequences are
|
|
854
|
+
now handled rather than raising mid-build.
|
|
855
|
+
|
|
856
|
+
Upgrade note: this changes URLs only for taxonomy terms or slugs
|
|
857
|
+
that actually contain such characters. Pure-ASCII sites are
|
|
858
|
+
byte-identical. If you have an affected tag, add `redirect_from:`
|
|
859
|
+
for the old path.
|
|
860
|
+
- Theme handling hardened and opened up:
|
|
861
|
+
- `theme:` is validated at the start of every build — a typo aborts
|
|
862
|
+
with one clear message listing the available themes (previously N
|
|
863
|
+
opaque per-page failures), and traversal-shaped names
|
|
864
|
+
(`theme: ../x`) are rejected outright.
|
|
865
|
+
- `abqari theme eject <name> [--as newname]` copies an engine
|
|
866
|
+
theme's stylesheet into the site's `themes/`, where it shadows the
|
|
867
|
+
gem's copy. `abqari new --theme custom` now copies the starter in
|
|
868
|
+
automatically, and `--theme none` scaffolds an editable
|
|
869
|
+
`app/assets/css/app.css` (a `--theme none` site previously failed
|
|
870
|
+
its first build).
|
|
871
|
+
- Site-local `themes/<name>/public/` now MERGES with the engine
|
|
872
|
+
theme's public tree per-file instead of replacing it wholesale.
|
|
873
|
+
- `theme: bootstrap` no longer fingerprints dead copies of the
|
|
874
|
+
vendored dist (~700 KB) into `_site/assets/`.
|
|
875
|
+
- The `minimal` default moved to `SiteConfig::DEFAULTS`, fixing
|
|
876
|
+
stale CSS hot-reload on sites with no `theme:` key; the skeleton
|
|
877
|
+
ships `themes/.gitkeep` so the watcher covers theme work from
|
|
878
|
+
first serve.
|
|
879
|
+
- New `docs/theming.md`: the theming guide and full token reference,
|
|
880
|
+
drift-tested against `_common.css`.
|
|
881
|
+
- Ruby 4.0 supported and now the development Ruby (`.ruby-version`
|
|
882
|
+
4.0.2); CI tests 3.3 / 3.4 / 4.0. The gemspec floor stays `>= 3.3`.
|
|
883
|
+
Full suite green on 4.0 with the same locked dependencies —
|
|
884
|
+
commonmarker ≥ 2.4 ships precompiled 4.0 binaries, which is what
|
|
885
|
+
the `~> 2.4` floor bought.
|
|
886
|
+
|
|
887
|
+
[Unreleased]: https://github.com/grantrayner/abqari/compare/v1.1.0...HEAD
|
|
888
|
+
[1.1.0]: https://github.com/grantrayner/abqari/compare/v1.0.0...v1.1.0
|
|
889
|
+
[1.0.0]: https://github.com/grantrayner/abqari/releases/tag/v1.0.0
|