spina 2.0.1 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of spina might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/README.md +9 -7
- data/Rakefile +2 -0
- data/app/assets/config/spina/manifest.js +7 -4
- data/app/assets/config/spina/tailwind.config.js +27 -0
- data/app/assets/icons/heroicons/outline/academic-cap.svg +5 -0
- data/app/assets/icons/heroicons/outline/adjustments.svg +3 -0
- data/app/assets/icons/heroicons/outline/annotation.svg +3 -0
- data/app/assets/icons/heroicons/outline/archive.svg +3 -0
- data/app/assets/icons/heroicons/outline/arrow-circle-down.svg +3 -0
- data/app/assets/icons/heroicons/outline/arrow-circle-left.svg +3 -0
- data/app/assets/icons/heroicons/outline/arrow-circle-right.svg +3 -0
- data/app/assets/icons/heroicons/outline/arrow-circle-up.svg +3 -0
- data/app/assets/icons/heroicons/outline/arrow-down.svg +3 -0
- data/app/assets/icons/heroicons/outline/arrow-left.svg +3 -0
- data/app/assets/icons/heroicons/outline/arrow-narrow-down.svg +3 -0
- data/app/assets/icons/heroicons/outline/arrow-narrow-left.svg +3 -0
- data/app/assets/icons/heroicons/outline/arrow-narrow-right.svg +3 -0
- data/app/assets/icons/heroicons/outline/arrow-narrow-up.svg +3 -0
- data/app/assets/icons/heroicons/outline/arrow-right.svg +3 -0
- data/app/assets/icons/heroicons/outline/arrow-up.svg +3 -0
- data/app/assets/icons/heroicons/outline/arrows-expand.svg +3 -0
- data/app/assets/icons/heroicons/outline/at-symbol.svg +3 -0
- data/app/assets/icons/heroicons/outline/backspace.svg +3 -0
- data/app/assets/icons/heroicons/outline/badge-check.svg +3 -0
- data/app/assets/icons/heroicons/outline/ban.svg +3 -0
- data/app/assets/icons/heroicons/outline/beaker.svg +3 -0
- data/app/assets/icons/heroicons/outline/bell.svg +3 -0
- data/app/assets/icons/heroicons/outline/book-open.svg +3 -0
- data/app/assets/icons/heroicons/outline/bookmark-alt.svg +3 -0
- data/app/assets/icons/heroicons/outline/bookmark.svg +3 -0
- data/app/assets/icons/heroicons/outline/briefcase.svg +3 -0
- data/app/assets/icons/heroicons/outline/cake.svg +3 -0
- data/app/assets/icons/heroicons/outline/calculator.svg +3 -0
- data/app/assets/icons/heroicons/outline/calendar.svg +3 -0
- data/app/assets/icons/heroicons/outline/camera.svg +4 -0
- data/app/assets/icons/heroicons/outline/cash.svg +3 -0
- data/app/assets/icons/heroicons/outline/chart-bar.svg +3 -0
- data/app/assets/icons/heroicons/outline/chart-pie.svg +4 -0
- data/app/assets/icons/heroicons/outline/chart-square-bar.svg +3 -0
- data/app/assets/icons/heroicons/outline/chat-alt-2.svg +3 -0
- data/app/assets/icons/heroicons/outline/chat-alt.svg +3 -0
- data/app/assets/icons/heroicons/outline/chat.svg +3 -0
- data/app/assets/icons/heroicons/outline/check-circle.svg +3 -0
- data/app/assets/icons/heroicons/outline/check.svg +3 -0
- data/app/assets/icons/heroicons/outline/chevron-double-down.svg +3 -0
- data/app/assets/icons/heroicons/outline/chevron-double-left.svg +3 -0
- data/app/assets/icons/heroicons/outline/chevron-double-right.svg +3 -0
- data/app/assets/icons/heroicons/outline/chevron-double-up.svg +3 -0
- data/app/assets/icons/heroicons/outline/chevron-down.svg +3 -0
- data/app/assets/icons/heroicons/outline/chevron-left.svg +3 -0
- data/app/assets/icons/heroicons/outline/chevron-right.svg +3 -0
- data/app/assets/icons/heroicons/outline/chevron-up.svg +3 -0
- data/app/assets/icons/heroicons/outline/chip.svg +3 -0
- data/app/assets/icons/heroicons/outline/clipboard-check.svg +3 -0
- data/app/assets/icons/heroicons/outline/clipboard-copy.svg +3 -0
- data/app/assets/icons/heroicons/outline/clipboard-list.svg +3 -0
- data/app/assets/icons/heroicons/outline/clipboard.svg +3 -0
- data/app/assets/icons/heroicons/outline/clock.svg +3 -0
- data/app/assets/icons/heroicons/outline/cloud-download.svg +3 -0
- data/app/assets/icons/heroicons/outline/cloud-upload.svg +3 -0
- data/app/assets/icons/heroicons/outline/cloud.svg +3 -0
- data/app/assets/icons/heroicons/outline/code.svg +3 -0
- data/app/assets/icons/heroicons/outline/cog.svg +4 -0
- data/app/assets/icons/heroicons/outline/collection.svg +3 -0
- data/app/assets/icons/heroicons/outline/color-swatch.svg +3 -0
- data/app/assets/icons/heroicons/outline/credit-card.svg +3 -0
- data/app/assets/icons/heroicons/outline/cube-transparent.svg +3 -0
- data/app/assets/icons/heroicons/outline/cube.svg +3 -0
- data/app/assets/icons/heroicons/outline/currency-bangladeshi.svg +3 -0
- data/app/assets/icons/heroicons/outline/currency-dollar.svg +3 -0
- data/app/assets/icons/heroicons/outline/currency-euro.svg +3 -0
- data/app/assets/icons/heroicons/outline/currency-pound.svg +3 -0
- data/app/assets/icons/heroicons/outline/currency-rupee.svg +3 -0
- data/app/assets/icons/heroicons/outline/currency-yen.svg +3 -0
- data/app/assets/icons/heroicons/outline/cursor-click.svg +3 -0
- data/app/assets/icons/heroicons/outline/database.svg +3 -0
- data/app/assets/icons/heroicons/outline/desktop-computer.svg +3 -0
- data/app/assets/icons/heroicons/outline/device-mobile.svg +3 -0
- data/app/assets/icons/heroicons/outline/device-tablet.svg +3 -0
- data/app/assets/icons/heroicons/outline/document-add.svg +3 -0
- data/app/assets/icons/heroicons/outline/document-download.svg +3 -0
- data/app/assets/icons/heroicons/outline/document-duplicate.svg +3 -0
- data/app/assets/icons/heroicons/outline/document-remove.svg +3 -0
- data/app/assets/icons/heroicons/outline/document-report.svg +3 -0
- data/app/assets/icons/heroicons/outline/document-search.svg +3 -0
- data/app/assets/icons/heroicons/outline/document-text.svg +3 -0
- data/app/assets/icons/heroicons/outline/document.svg +3 -0
- data/app/assets/icons/heroicons/outline/dots-circle-horizontal.svg +3 -0
- data/app/assets/icons/heroicons/outline/dots-horizontal.svg +3 -0
- data/app/assets/icons/heroicons/outline/dots-vertical.svg +3 -0
- data/app/assets/icons/heroicons/outline/download.svg +3 -0
- data/app/assets/icons/heroicons/outline/duplicate.svg +3 -0
- data/app/assets/icons/heroicons/outline/emoji-happy.svg +3 -0
- data/app/assets/icons/heroicons/outline/emoji-sad.svg +3 -0
- data/app/assets/icons/heroicons/outline/exclamation-circle.svg +3 -0
- data/app/assets/icons/heroicons/outline/exclamation.svg +3 -0
- data/app/assets/icons/heroicons/outline/external-link.svg +3 -0
- data/app/assets/icons/heroicons/outline/eye-off.svg +3 -0
- data/app/assets/icons/heroicons/outline/eye.svg +4 -0
- data/app/assets/icons/heroicons/outline/fast-forward.svg +3 -0
- data/app/assets/icons/heroicons/outline/film.svg +3 -0
- data/app/assets/icons/heroicons/outline/filter.svg +3 -0
- data/app/assets/icons/heroicons/outline/finger-print.svg +3 -0
- data/app/assets/icons/heroicons/outline/fire.svg +4 -0
- data/app/assets/icons/heroicons/outline/flag.svg +3 -0
- data/app/assets/icons/heroicons/outline/folder-add.svg +3 -0
- data/app/assets/icons/heroicons/outline/folder-download.svg +3 -0
- data/app/assets/icons/heroicons/outline/folder-open.svg +3 -0
- data/app/assets/icons/heroicons/outline/folder-remove.svg +3 -0
- data/app/assets/icons/heroicons/outline/folder.svg +3 -0
- data/app/assets/icons/heroicons/outline/gift.svg +3 -0
- data/app/assets/icons/heroicons/outline/globe-alt.svg +3 -0
- data/app/assets/icons/heroicons/outline/globe.svg +3 -0
- data/app/assets/icons/heroicons/outline/hand.svg +3 -0
- data/app/assets/icons/heroicons/outline/hashtag.svg +3 -0
- data/app/assets/icons/heroicons/outline/heart.svg +3 -0
- data/app/assets/icons/heroicons/outline/home.svg +3 -0
- data/app/assets/icons/heroicons/outline/identification.svg +3 -0
- data/app/assets/icons/heroicons/outline/inbox-in.svg +3 -0
- data/app/assets/icons/heroicons/outline/inbox.svg +3 -0
- data/app/assets/icons/heroicons/outline/information-circle.svg +3 -0
- data/app/assets/icons/heroicons/outline/key.svg +3 -0
- data/app/assets/icons/heroicons/outline/library.svg +3 -0
- data/app/assets/icons/heroicons/outline/light-bulb.svg +3 -0
- data/app/assets/icons/heroicons/outline/lightning-bolt.svg +3 -0
- data/app/assets/icons/heroicons/outline/link.svg +3 -0
- data/app/assets/icons/heroicons/outline/location-marker.svg +4 -0
- data/app/assets/icons/heroicons/outline/lock-closed.svg +3 -0
- data/app/assets/icons/heroicons/outline/lock-open.svg +3 -0
- data/app/assets/icons/heroicons/outline/login.svg +3 -0
- data/app/assets/icons/heroicons/outline/logout.svg +3 -0
- data/app/assets/icons/heroicons/outline/mail-open.svg +3 -0
- data/app/assets/icons/heroicons/outline/mail.svg +3 -0
- data/app/assets/icons/heroicons/outline/map.svg +3 -0
- data/app/assets/icons/heroicons/outline/menu-alt-1.svg +3 -0
- data/app/assets/icons/heroicons/outline/menu-alt-2.svg +3 -0
- data/app/assets/icons/heroicons/outline/menu-alt-3.svg +3 -0
- data/app/assets/icons/heroicons/outline/menu-alt-4.svg +3 -0
- data/app/assets/icons/heroicons/outline/menu.svg +3 -0
- data/app/assets/icons/heroicons/outline/microphone.svg +3 -0
- data/app/assets/icons/heroicons/outline/minus-circle.svg +3 -0
- data/app/assets/icons/heroicons/outline/minus-sm.svg +3 -0
- data/app/assets/icons/heroicons/outline/minus.svg +3 -0
- data/app/assets/icons/heroicons/outline/moon.svg +3 -0
- data/app/assets/icons/heroicons/outline/music-note.svg +3 -0
- data/app/assets/icons/heroicons/outline/newspaper.svg +3 -0
- data/app/assets/icons/heroicons/outline/office-building.svg +3 -0
- data/app/assets/icons/heroicons/outline/paper-airplane.svg +3 -0
- data/app/assets/icons/heroicons/outline/paper-clip.svg +3 -0
- data/app/assets/icons/heroicons/outline/pause.svg +3 -0
- data/app/assets/icons/heroicons/outline/pencil-alt.svg +3 -0
- data/app/assets/icons/heroicons/outline/pencil.svg +3 -0
- data/app/assets/icons/heroicons/outline/phone-incoming.svg +3 -0
- data/app/assets/icons/heroicons/outline/phone-missed-call.svg +3 -0
- data/app/assets/icons/heroicons/outline/phone-outgoing.svg +3 -0
- data/app/assets/icons/heroicons/outline/phone.svg +3 -0
- data/app/assets/icons/heroicons/outline/photograph.svg +3 -0
- data/app/assets/icons/heroicons/outline/play.svg +4 -0
- data/app/assets/icons/heroicons/outline/plus-circle.svg +3 -0
- data/app/assets/icons/heroicons/outline/plus-sm.svg +3 -0
- data/app/assets/icons/heroicons/outline/plus.svg +3 -0
- data/app/assets/icons/heroicons/outline/presentation-chart-bar.svg +3 -0
- data/app/assets/icons/heroicons/outline/presentation-chart-line.svg +3 -0
- data/app/assets/icons/heroicons/outline/printer.svg +3 -0
- data/app/assets/icons/heroicons/outline/puzzle.svg +3 -0
- data/app/assets/icons/heroicons/outline/qrcode.svg +3 -0
- data/app/assets/icons/heroicons/outline/question-mark-circle.svg +3 -0
- data/app/assets/icons/heroicons/outline/receipt-refund.svg +3 -0
- data/app/assets/icons/heroicons/outline/receipt-tax.svg +3 -0
- data/app/assets/icons/heroicons/outline/refresh.svg +3 -0
- data/app/assets/icons/heroicons/outline/reply.svg +3 -0
- data/app/assets/icons/heroicons/outline/rewind.svg +3 -0
- data/app/assets/icons/heroicons/outline/rss.svg +3 -0
- data/app/assets/icons/heroicons/outline/save-as.svg +3 -0
- data/app/assets/icons/heroicons/outline/save.svg +3 -0
- data/app/assets/icons/heroicons/outline/scale.svg +3 -0
- data/app/assets/icons/heroicons/outline/scissors.svg +3 -0
- data/app/assets/icons/heroicons/outline/search-circle.svg +3 -0
- data/app/assets/icons/heroicons/outline/search.svg +3 -0
- data/app/assets/icons/heroicons/outline/selector.svg +3 -0
- data/app/assets/icons/heroicons/outline/server.svg +3 -0
- data/app/assets/icons/heroicons/outline/share.svg +3 -0
- data/app/assets/icons/heroicons/outline/shield-check.svg +3 -0
- data/app/assets/icons/heroicons/outline/shield-exclamation.svg +3 -0
- data/app/assets/icons/heroicons/outline/shopping-bag.svg +3 -0
- data/app/assets/icons/heroicons/outline/shopping-cart.svg +3 -0
- data/app/assets/icons/heroicons/outline/sort-ascending.svg +3 -0
- data/app/assets/icons/heroicons/outline/sort-descending.svg +3 -0
- data/app/assets/icons/heroicons/outline/sparkles.svg +3 -0
- data/app/assets/icons/heroicons/outline/speakerphone.svg +3 -0
- data/app/assets/icons/heroicons/outline/star.svg +3 -0
- data/app/assets/icons/heroicons/outline/status-offline.svg +3 -0
- data/app/assets/icons/heroicons/outline/status-online.svg +3 -0
- data/app/assets/icons/heroicons/outline/stop.svg +4 -0
- data/app/assets/icons/heroicons/outline/sun.svg +3 -0
- data/app/assets/icons/heroicons/outline/support.svg +3 -0
- data/app/assets/icons/heroicons/outline/switch-horizontal.svg +3 -0
- data/app/assets/icons/heroicons/outline/switch-vertical.svg +3 -0
- data/app/assets/icons/heroicons/outline/table.svg +3 -0
- data/app/assets/icons/heroicons/outline/tag.svg +3 -0
- data/app/assets/icons/heroicons/outline/template.svg +3 -0
- data/app/assets/icons/heroicons/outline/terminal.svg +3 -0
- data/app/assets/icons/heroicons/outline/thumb-down.svg +3 -0
- data/app/assets/icons/heroicons/outline/thumb-up.svg +3 -0
- data/app/assets/icons/heroicons/outline/ticket.svg +3 -0
- data/app/assets/icons/heroicons/outline/translate.svg +3 -0
- data/app/assets/icons/heroicons/outline/trash.svg +3 -0
- data/app/assets/icons/heroicons/outline/trending-down.svg +3 -0
- data/app/assets/icons/heroicons/outline/trending-up.svg +3 -0
- data/app/assets/icons/heroicons/outline/truck.svg +4 -0
- data/app/assets/icons/heroicons/outline/upload.svg +3 -0
- data/app/assets/icons/heroicons/outline/user-add.svg +3 -0
- data/app/assets/icons/heroicons/outline/user-circle.svg +3 -0
- data/app/assets/icons/heroicons/outline/user-group.svg +3 -0
- data/app/assets/icons/heroicons/outline/user-remove.svg +3 -0
- data/app/assets/icons/heroicons/outline/user.svg +3 -0
- data/app/assets/icons/heroicons/outline/users.svg +3 -0
- data/app/assets/icons/heroicons/outline/variable.svg +3 -0
- data/app/assets/icons/heroicons/outline/video-camera.svg +3 -0
- data/app/assets/icons/heroicons/outline/view-boards.svg +3 -0
- data/app/assets/icons/heroicons/outline/view-grid-add.svg +3 -0
- data/app/assets/icons/heroicons/outline/view-grid.svg +3 -0
- data/app/assets/icons/heroicons/outline/view-list.svg +3 -0
- data/app/assets/icons/heroicons/outline/volume-off.svg +4 -0
- data/app/assets/icons/heroicons/outline/volume-up.svg +3 -0
- data/app/assets/icons/heroicons/outline/wifi.svg +3 -0
- data/app/assets/icons/heroicons/outline/x-circle.svg +3 -0
- data/app/assets/icons/heroicons/outline/x.svg +3 -0
- data/app/assets/icons/heroicons/outline/zoom-in.svg +3 -0
- data/app/assets/icons/heroicons/outline/zoom-out.svg +3 -0
- data/app/assets/icons/heroicons/solid/academic-cap.svg +3 -0
- data/app/assets/icons/heroicons/solid/adjustments.svg +3 -0
- data/app/assets/icons/heroicons/solid/annotation.svg +3 -0
- data/app/assets/icons/heroicons/solid/archive.svg +4 -0
- data/app/assets/icons/heroicons/solid/arrow-circle-down.svg +3 -0
- data/app/assets/icons/heroicons/solid/arrow-circle-left.svg +3 -0
- data/app/assets/icons/heroicons/solid/arrow-circle-right.svg +3 -0
- data/app/assets/icons/heroicons/solid/arrow-circle-up.svg +3 -0
- data/app/assets/icons/heroicons/solid/arrow-down.svg +3 -0
- data/app/assets/icons/heroicons/solid/arrow-left.svg +3 -0
- data/app/assets/icons/heroicons/solid/arrow-narrow-down.svg +3 -0
- data/app/assets/icons/heroicons/solid/arrow-narrow-left.svg +3 -0
- data/app/assets/icons/heroicons/solid/arrow-narrow-right.svg +3 -0
- data/app/assets/icons/heroicons/solid/arrow-narrow-up.svg +3 -0
- data/app/assets/icons/heroicons/solid/arrow-right.svg +3 -0
- data/app/assets/icons/heroicons/solid/arrow-up.svg +3 -0
- data/app/assets/icons/heroicons/solid/arrows-expand.svg +3 -0
- data/app/assets/icons/heroicons/solid/at-symbol.svg +3 -0
- data/app/assets/icons/heroicons/solid/backspace.svg +3 -0
- data/app/assets/icons/heroicons/solid/badge-check.svg +3 -0
- data/app/assets/icons/heroicons/solid/ban.svg +3 -0
- data/app/assets/icons/heroicons/solid/beaker.svg +3 -0
- data/app/assets/icons/heroicons/solid/bell.svg +3 -0
- data/app/assets/icons/heroicons/solid/book-open.svg +3 -0
- data/app/assets/icons/heroicons/solid/bookmark-alt.svg +3 -0
- data/app/assets/icons/heroicons/solid/bookmark.svg +3 -0
- data/app/assets/icons/heroicons/solid/briefcase.svg +4 -0
- data/app/assets/icons/heroicons/solid/cake.svg +3 -0
- data/app/assets/icons/heroicons/solid/calculator.svg +3 -0
- data/app/assets/icons/heroicons/solid/calendar.svg +3 -0
- data/app/assets/icons/heroicons/solid/camera.svg +3 -0
- data/app/assets/icons/heroicons/solid/cash.svg +3 -0
- data/app/assets/icons/heroicons/solid/chart-bar.svg +3 -0
- data/app/assets/icons/heroicons/solid/chart-pie.svg +4 -0
- data/app/assets/icons/heroicons/solid/chart-square-bar.svg +3 -0
- data/app/assets/icons/heroicons/solid/chat-alt-2.svg +4 -0
- data/app/assets/icons/heroicons/solid/chat-alt.svg +3 -0
- data/app/assets/icons/heroicons/solid/chat.svg +3 -0
- data/app/assets/icons/heroicons/solid/check-circle.svg +3 -0
- data/app/assets/icons/heroicons/solid/check.svg +3 -0
- data/app/assets/icons/heroicons/solid/chevron-double-down.svg +3 -0
- data/app/assets/icons/heroicons/solid/chevron-double-left.svg +3 -0
- data/app/assets/icons/heroicons/solid/chevron-double-right.svg +4 -0
- data/app/assets/icons/heroicons/solid/chevron-double-up.svg +3 -0
- data/app/assets/icons/heroicons/solid/chevron-down.svg +3 -0
- data/app/assets/icons/heroicons/solid/chevron-left.svg +3 -0
- data/app/assets/icons/heroicons/solid/chevron-right.svg +3 -0
- data/app/assets/icons/heroicons/solid/chevron-up.svg +3 -0
- data/app/assets/icons/heroicons/solid/chip.svg +4 -0
- data/app/assets/icons/heroicons/solid/clipboard-check.svg +4 -0
- data/app/assets/icons/heroicons/solid/clipboard-copy.svg +4 -0
- data/app/assets/icons/heroicons/solid/clipboard-list.svg +4 -0
- data/app/assets/icons/heroicons/solid/clipboard.svg +4 -0
- data/app/assets/icons/heroicons/solid/clock.svg +3 -0
- data/app/assets/icons/heroicons/solid/cloud-download.svg +3 -0
- data/app/assets/icons/heroicons/solid/cloud-upload.svg +4 -0
- data/app/assets/icons/heroicons/solid/cloud.svg +3 -0
- data/app/assets/icons/heroicons/solid/code.svg +3 -0
- data/app/assets/icons/heroicons/solid/cog.svg +3 -0
- data/app/assets/icons/heroicons/solid/collection.svg +3 -0
- data/app/assets/icons/heroicons/solid/color-swatch.svg +3 -0
- data/app/assets/icons/heroicons/solid/credit-card.svg +4 -0
- data/app/assets/icons/heroicons/solid/cube-transparent.svg +3 -0
- data/app/assets/icons/heroicons/solid/cube.svg +3 -0
- data/app/assets/icons/heroicons/solid/currency-bangladeshi.svg +3 -0
- data/app/assets/icons/heroicons/solid/currency-dollar.svg +4 -0
- data/app/assets/icons/heroicons/solid/currency-euro.svg +3 -0
- data/app/assets/icons/heroicons/solid/currency-pound.svg +3 -0
- data/app/assets/icons/heroicons/solid/currency-rupee.svg +3 -0
- data/app/assets/icons/heroicons/solid/currency-yen.svg +3 -0
- data/app/assets/icons/heroicons/solid/cursor-click.svg +3 -0
- data/app/assets/icons/heroicons/solid/database.svg +5 -0
- data/app/assets/icons/heroicons/solid/desktop-computer.svg +3 -0
- data/app/assets/icons/heroicons/solid/device-mobile.svg +3 -0
- data/app/assets/icons/heroicons/solid/device-tablet.svg +3 -0
- data/app/assets/icons/heroicons/solid/document-add.svg +3 -0
- data/app/assets/icons/heroicons/solid/document-download.svg +3 -0
- data/app/assets/icons/heroicons/solid/document-duplicate.svg +4 -0
- data/app/assets/icons/heroicons/solid/document-remove.svg +3 -0
- data/app/assets/icons/heroicons/solid/document-report.svg +3 -0
- data/app/assets/icons/heroicons/solid/document-search.svg +4 -0
- data/app/assets/icons/heroicons/solid/document-text.svg +3 -0
- data/app/assets/icons/heroicons/solid/document.svg +3 -0
- data/app/assets/icons/heroicons/solid/dots-circle-horizontal.svg +3 -0
- data/app/assets/icons/heroicons/solid/dots-horizontal.svg +3 -0
- data/app/assets/icons/heroicons/solid/dots-vertical.svg +3 -0
- data/app/assets/icons/heroicons/solid/download.svg +3 -0
- data/app/assets/icons/heroicons/solid/duplicate.svg +4 -0
- data/app/assets/icons/heroicons/solid/emoji-happy.svg +3 -0
- data/app/assets/icons/heroicons/solid/emoji-sad.svg +3 -0
- data/app/assets/icons/heroicons/solid/exclamation-circle.svg +3 -0
- data/app/assets/icons/heroicons/solid/exclamation.svg +3 -0
- data/app/assets/icons/heroicons/solid/external-link.svg +4 -0
- data/app/assets/icons/heroicons/solid/eye-off.svg +4 -0
- data/app/assets/icons/heroicons/solid/eye.svg +4 -0
- data/app/assets/icons/heroicons/solid/fast-forward.svg +3 -0
- data/app/assets/icons/heroicons/solid/film.svg +3 -0
- data/app/assets/icons/heroicons/solid/filter.svg +3 -0
- data/app/assets/icons/heroicons/solid/finger-print.svg +5 -0
- data/app/assets/icons/heroicons/solid/fire.svg +3 -0
- data/app/assets/icons/heroicons/solid/flag.svg +3 -0
- data/app/assets/icons/heroicons/solid/folder-add.svg +4 -0
- data/app/assets/icons/heroicons/solid/folder-download.svg +4 -0
- data/app/assets/icons/heroicons/solid/folder-open.svg +4 -0
- data/app/assets/icons/heroicons/solid/folder-remove.svg +4 -0
- data/app/assets/icons/heroicons/solid/folder.svg +3 -0
- data/app/assets/icons/heroicons/solid/gift.svg +4 -0
- data/app/assets/icons/heroicons/solid/globe-alt.svg +3 -0
- data/app/assets/icons/heroicons/solid/globe.svg +3 -0
- data/app/assets/icons/heroicons/solid/hand.svg +3 -0
- data/app/assets/icons/heroicons/solid/hashtag.svg +3 -0
- data/app/assets/icons/heroicons/solid/heart.svg +3 -0
- data/app/assets/icons/heroicons/solid/home.svg +3 -0
- data/app/assets/icons/heroicons/solid/identification.svg +3 -0
- data/app/assets/icons/heroicons/solid/inbox-in.svg +4 -0
- data/app/assets/icons/heroicons/solid/inbox.svg +3 -0
- data/app/assets/icons/heroicons/solid/information-circle.svg +3 -0
- data/app/assets/icons/heroicons/solid/key.svg +3 -0
- data/app/assets/icons/heroicons/solid/library.svg +3 -0
- data/app/assets/icons/heroicons/solid/light-bulb.svg +3 -0
- data/app/assets/icons/heroicons/solid/lightning-bolt.svg +3 -0
- data/app/assets/icons/heroicons/solid/link.svg +3 -0
- data/app/assets/icons/heroicons/solid/location-marker.svg +3 -0
- data/app/assets/icons/heroicons/solid/lock-closed.svg +3 -0
- data/app/assets/icons/heroicons/solid/lock-open.svg +3 -0
- data/app/assets/icons/heroicons/solid/login.svg +3 -0
- data/app/assets/icons/heroicons/solid/logout.svg +3 -0
- data/app/assets/icons/heroicons/solid/mail-open.svg +3 -0
- data/app/assets/icons/heroicons/solid/mail.svg +4 -0
- data/app/assets/icons/heroicons/solid/map.svg +3 -0
- data/app/assets/icons/heroicons/solid/menu-alt-1.svg +3 -0
- data/app/assets/icons/heroicons/solid/menu-alt-2.svg +3 -0
- data/app/assets/icons/heroicons/solid/menu-alt-3.svg +3 -0
- data/app/assets/icons/heroicons/solid/menu-alt-4.svg +3 -0
- data/app/assets/icons/heroicons/solid/menu.svg +3 -0
- data/app/assets/icons/heroicons/solid/microphone.svg +3 -0
- data/app/assets/icons/heroicons/solid/minus-circle.svg +3 -0
- data/app/assets/icons/heroicons/solid/minus-sm.svg +3 -0
- data/app/assets/icons/heroicons/solid/minus.svg +3 -0
- data/app/assets/icons/heroicons/solid/moon.svg +3 -0
- data/app/assets/icons/heroicons/solid/music-note.svg +3 -0
- data/app/assets/icons/heroicons/solid/newspaper.svg +4 -0
- data/app/assets/icons/heroicons/solid/office-building.svg +3 -0
- data/app/assets/icons/heroicons/solid/paper-airplane.svg +3 -0
- data/app/assets/icons/heroicons/solid/paper-clip.svg +3 -0
- data/app/assets/icons/heroicons/solid/pause.svg +3 -0
- data/app/assets/icons/heroicons/solid/pencil-alt.svg +4 -0
- data/app/assets/icons/heroicons/solid/pencil.svg +3 -0
- data/app/assets/icons/heroicons/solid/phone-incoming.svg +4 -0
- data/app/assets/icons/heroicons/solid/phone-missed-call.svg +4 -0
- data/app/assets/icons/heroicons/solid/phone-outgoing.svg +4 -0
- data/app/assets/icons/heroicons/solid/phone.svg +3 -0
- data/app/assets/icons/heroicons/solid/photograph.svg +3 -0
- data/app/assets/icons/heroicons/solid/play.svg +3 -0
- data/app/assets/icons/heroicons/solid/plus-circle.svg +3 -0
- data/app/assets/icons/heroicons/solid/plus-sm.svg +3 -0
- data/app/assets/icons/heroicons/solid/plus.svg +3 -0
- data/app/assets/icons/heroicons/solid/presentation-chart-bar.svg +3 -0
- data/app/assets/icons/heroicons/solid/presentation-chart-line.svg +3 -0
- data/app/assets/icons/heroicons/solid/printer.svg +3 -0
- data/app/assets/icons/heroicons/solid/puzzle.svg +3 -0
- data/app/assets/icons/heroicons/solid/qrcode.svg +4 -0
- data/app/assets/icons/heroicons/solid/question-mark-circle.svg +3 -0
- data/app/assets/icons/heroicons/solid/receipt-refund.svg +3 -0
- data/app/assets/icons/heroicons/solid/receipt-tax.svg +3 -0
- data/app/assets/icons/heroicons/solid/refresh.svg +3 -0
- data/app/assets/icons/heroicons/solid/reply.svg +3 -0
- data/app/assets/icons/heroicons/solid/rewind.svg +3 -0
- data/app/assets/icons/heroicons/solid/rss.svg +4 -0
- data/app/assets/icons/heroicons/solid/save-as.svg +4 -0
- data/app/assets/icons/heroicons/solid/save.svg +3 -0
- data/app/assets/icons/heroicons/solid/scale.svg +3 -0
- data/app/assets/icons/heroicons/solid/scissors.svg +4 -0
- data/app/assets/icons/heroicons/solid/search-circle.svg +4 -0
- data/app/assets/icons/heroicons/solid/search.svg +3 -0
- data/app/assets/icons/heroicons/solid/selector.svg +3 -0
- data/app/assets/icons/heroicons/solid/server.svg +3 -0
- data/app/assets/icons/heroicons/solid/share.svg +3 -0
- data/app/assets/icons/heroicons/solid/shield-check.svg +3 -0
- data/app/assets/icons/heroicons/solid/shield-exclamation.svg +3 -0
- data/app/assets/icons/heroicons/solid/shopping-bag.svg +3 -0
- data/app/assets/icons/heroicons/solid/shopping-cart.svg +3 -0
- data/app/assets/icons/heroicons/solid/sort-ascending.svg +3 -0
- data/app/assets/icons/heroicons/solid/sort-descending.svg +3 -0
- data/app/assets/icons/heroicons/solid/sparkles.svg +3 -0
- data/app/assets/icons/heroicons/solid/speakerphone.svg +3 -0
- data/app/assets/icons/heroicons/solid/star.svg +3 -0
- data/app/assets/icons/heroicons/solid/status-offline.svg +3 -0
- data/app/assets/icons/heroicons/solid/status-online.svg +3 -0
- data/app/assets/icons/heroicons/solid/stop.svg +3 -0
- data/app/assets/icons/heroicons/solid/sun.svg +3 -0
- data/app/assets/icons/heroicons/solid/support.svg +3 -0
- data/app/assets/icons/heroicons/solid/switch-horizontal.svg +3 -0
- data/app/assets/icons/heroicons/solid/switch-vertical.svg +3 -0
- data/app/assets/icons/heroicons/solid/table.svg +3 -0
- data/app/assets/icons/heroicons/solid/tag.svg +3 -0
- data/app/assets/icons/heroicons/solid/template.svg +3 -0
- data/app/assets/icons/heroicons/solid/terminal.svg +3 -0
- data/app/assets/icons/heroicons/solid/thumb-down.svg +3 -0
- data/app/assets/icons/heroicons/solid/thumb-up.svg +3 -0
- data/app/assets/icons/heroicons/solid/ticket.svg +3 -0
- data/app/assets/icons/heroicons/solid/translate.svg +3 -0
- data/app/assets/icons/heroicons/solid/trash.svg +3 -0
- data/app/assets/icons/heroicons/solid/trending-down.svg +3 -0
- data/app/assets/icons/heroicons/solid/trending-up.svg +3 -0
- data/app/assets/icons/heroicons/solid/truck.svg +4 -0
- data/app/assets/icons/heroicons/solid/upload.svg +3 -0
- data/app/assets/icons/heroicons/solid/user-add.svg +3 -0
- data/app/assets/icons/heroicons/solid/user-circle.svg +3 -0
- data/app/assets/icons/heroicons/solid/user-group.svg +3 -0
- data/app/assets/icons/heroicons/solid/user-remove.svg +3 -0
- data/app/assets/icons/heroicons/solid/user.svg +3 -0
- data/app/assets/icons/heroicons/solid/users.svg +3 -0
- data/app/assets/icons/heroicons/solid/variable.svg +3 -0
- data/app/assets/icons/heroicons/solid/video-camera.svg +3 -0
- data/app/assets/icons/heroicons/solid/view-boards.svg +3 -0
- data/app/assets/icons/heroicons/solid/view-grid-add.svg +3 -0
- data/app/assets/icons/heroicons/solid/view-grid.svg +3 -0
- data/app/assets/icons/heroicons/solid/view-list.svg +3 -0
- data/app/assets/icons/heroicons/solid/volume-off.svg +3 -0
- data/app/assets/icons/heroicons/solid/volume-up.svg +3 -0
- data/app/assets/icons/heroicons/solid/wifi.svg +3 -0
- data/app/assets/icons/heroicons/solid/x-circle.svg +3 -0
- data/app/assets/icons/heroicons/solid/x.svg +3 -0
- data/app/assets/icons/heroicons/solid/zoom-in.svg +4 -0
- data/app/assets/icons/heroicons/solid/zoom-out.svg +4 -0
- data/app/assets/images/spina/favicon.png +0 -0
- data/app/assets/images/spina/spina.png +0 -0
- data/app/assets/images/spina/spina.svg +9 -1
- data/app/assets/javascripts/spina/controllers/attachment_picker_controller.js +15 -0
- data/app/assets/javascripts/spina/controllers/autofocus_controller.js +9 -0
- data/app/assets/javascripts/spina/controllers/button_controller.js +37 -0
- data/app/assets/javascripts/spina/controllers/confetti_controller.js +43 -0
- data/app/assets/javascripts/spina/controllers/confirm_controller.js +62 -0
- data/app/assets/javascripts/spina/controllers/delegate_click_controller.js +13 -0
- data/app/assets/javascripts/spina/controllers/exists_controller.js +11 -0
- data/app/assets/javascripts/spina/controllers/form_controller.js +10 -0
- data/app/assets/javascripts/spina/controllers/hotkeys_controller.js +21 -0
- data/app/assets/javascripts/spina/controllers/image_collection_controller.js +37 -0
- data/app/assets/javascripts/spina/controllers/image_fade_in_controller.js +20 -0
- data/app/assets/javascripts/spina/controllers/infinite_scroll_controller.js +33 -0
- data/app/assets/javascripts/spina/controllers/loading_button_controller.js +40 -0
- data/app/assets/javascripts/spina/controllers/media_picker_controller.js +46 -0
- data/app/assets/javascripts/spina/controllers/media_picker_modal_controller.js +34 -0
- data/app/assets/javascripts/spina/controllers/modal_controller.js +22 -0
- data/app/assets/javascripts/spina/controllers/navigation_controller.js +77 -0
- data/app/assets/javascripts/spina/controllers/parent_pages_controller.js +16 -0
- data/app/assets/javascripts/spina/controllers/repeater_controller.js +71 -0
- data/app/assets/javascripts/spina/controllers/reveal_controller.js +1 -0
- data/app/assets/javascripts/spina/controllers/select_placeholder_controller.js +27 -0
- data/app/assets/javascripts/spina/controllers/selectable_controller.js +44 -0
- data/app/assets/javascripts/spina/controllers/shortcuts_controller.js +15 -0
- data/app/assets/javascripts/spina/controllers/sortable_controller.js +39 -0
- data/app/assets/javascripts/spina/controllers/switch_controller.js +27 -0
- data/app/assets/javascripts/spina/controllers/tabs_controller.js +70 -0
- data/app/assets/javascripts/spina/controllers/toggle_controller.js +12 -0
- data/app/assets/javascripts/spina/controllers/trix_controller.js +87 -0
- data/app/assets/javascripts/spina/controllers/unique_id_controller.js +31 -0
- data/app/assets/javascripts/spina/importmap.json.erb +5 -0
- data/app/assets/javascripts/spina/libraries/canvas-confetti.js +1 -0
- data/app/assets/javascripts/spina/libraries/canvas-confetti@1.3.2.js +592 -0
- data/app/assets/javascripts/spina/libraries/form-request-submit-polyfill.js +1 -0
- data/app/assets/javascripts/spina/libraries/form-request-submit-polyfill@2.0.0.js +27 -0
- data/app/assets/javascripts/spina/libraries/hotkeys.js +1 -0
- data/app/assets/javascripts/spina/libraries/hotkeys@3.8.7.js +596 -0
- data/app/assets/javascripts/spina/libraries/sortablejs.js +1 -0
- data/app/assets/javascripts/spina/libraries/sortablejs@1.13.0.js +3711 -0
- data/app/assets/javascripts/spina/libraries/stimulus-reveal@1.2.4.js +388 -0
- data/app/assets/javascripts/spina/libraries/trix.js +9 -0
- data/app/assets/javascripts/spina/libraries/trix@1.3.1.js +21 -0
- data/app/assets/stylesheets/spina/_animate.css +4072 -0
- data/app/assets/stylesheets/spina/_fonts.scss +114 -0
- data/app/assets/stylesheets/spina/_tailwind.css +199133 -0
- data/app/assets/stylesheets/spina/application.sass +3 -4
- data/app/assets/stylesheets/spina/tailwind/custom.css +193 -0
- data/app/components/spina/application_component.rb +4 -0
- data/app/components/spina/forms/group_component.html.erb +14 -0
- data/app/components/spina/forms/group_component.rb +13 -0
- data/app/components/spina/forms/label_component.rb +17 -0
- data/app/components/spina/forms/password_field_component.html.erb +14 -0
- data/app/components/spina/forms/password_field_component.rb +6 -0
- data/app/components/spina/forms/switch_component.html.erb +7 -0
- data/app/components/spina/forms/switch_component.rb +13 -0
- data/app/components/spina/forms/text_field_component.html.erb +14 -0
- data/app/components/spina/forms/text_field_component.rb +50 -0
- data/app/components/spina/forms/trix_toolbar_component.html.erb +90 -0
- data/app/components/spina/forms/trix_toolbar_component.rb +11 -0
- data/app/components/spina/hooks/hook_component.rb +21 -0
- data/app/components/spina/hooks/partial_component.rb +21 -0
- data/app/components/spina/main_navigation/link_component.html.erb +5 -0
- data/app/components/spina/main_navigation/link_component.rb +21 -0
- data/app/components/spina/main_navigation/sub_nav_component.html.erb +18 -0
- data/app/components/spina/main_navigation/sub_nav_component.rb +33 -0
- data/app/components/spina/media_picker/image_component.html.erb +18 -0
- data/app/components/spina/media_picker/image_component.rb +11 -0
- data/app/components/spina/media_picker/modal_component.html.erb +74 -0
- data/app/components/spina/media_picker/modal_component.rb +29 -0
- data/app/components/spina/pages/actions_component.html.erb +65 -0
- data/app/components/spina/pages/actions_component.rb +12 -0
- data/app/components/spina/pages/list_component.html.erb +8 -0
- data/app/components/spina/pages/list_component.rb +13 -0
- data/app/components/spina/pages/location_component.html.erb +10 -0
- data/app/components/spina/pages/location_component.rb +29 -0
- data/app/components/spina/pages/page_component.html.erb +25 -0
- data/app/components/spina/pages/page_component.rb +43 -0
- data/app/components/spina/pages/page_select_component.html.erb +1 -0
- data/app/components/spina/pages/page_select_component.rb +21 -0
- data/app/components/spina/pages/tab_button_component.html.erb +3 -0
- data/app/components/spina/pages/tab_button_component.rb +11 -0
- data/app/components/spina/pages/translations_component.html.erb +41 -0
- data/app/components/spina/pages/translations_component.rb +32 -0
- data/app/components/spina/user_interface/dropdown_button_component.rb +23 -0
- data/app/components/spina/user_interface/dropdown_component.html.erb +5 -0
- data/app/components/spina/user_interface/dropdown_component.rb +28 -0
- data/app/components/spina/user_interface/flash_message_component.html.erb +3 -0
- data/app/components/spina/user_interface/flash_message_component.rb +25 -0
- data/app/components/spina/user_interface/header_component.html.erb +24 -0
- data/app/components/spina/user_interface/header_component.rb +9 -0
- data/app/components/spina/user_interface/modal_component.html.erb +11 -0
- data/app/components/spina/user_interface/modal_component.rb +11 -0
- data/app/components/spina/user_interface/tab_link_component.html.erb +3 -0
- data/app/components/spina/user_interface/tab_link_component.rb +22 -0
- data/app/controllers/concerns/spina/current_account.rb +17 -0
- data/app/controllers/concerns/spina/current_theme.rb +17 -0
- data/app/controllers/spina/admin/accounts_controller.rb +13 -21
- data/app/controllers/spina/admin/admin_controller.rb +18 -14
- data/app/controllers/spina/admin/attachments_controller.rb +27 -6
- data/app/controllers/spina/admin/images_controller.rb +49 -13
- data/app/controllers/spina/admin/layout_controller.rb +41 -0
- data/app/controllers/spina/admin/media_folders_controller.rb +10 -13
- data/app/controllers/spina/admin/media_picker_controller.rb +6 -30
- data/app/controllers/spina/admin/move_pages_controller.rb +24 -0
- data/app/controllers/spina/admin/navigation_items_controller.rb +36 -0
- data/app/controllers/spina/admin/navigations_controller.rb +19 -16
- data/app/controllers/spina/admin/pages_controller.rb +68 -65
- data/app/controllers/spina/admin/parent_pages_controller.rb +10 -0
- data/app/controllers/spina/admin/password_resets_controller.rb +4 -4
- data/app/controllers/spina/admin/resources_controller.rb +4 -7
- data/app/controllers/spina/admin/sessions_controller.rb +5 -8
- data/app/controllers/spina/admin/settings_controller.rb +30 -29
- data/app/controllers/spina/admin/theme_controller.rb +23 -0
- data/app/controllers/spina/admin/users_controller.rb +32 -13
- data/app/controllers/spina/application_controller.rb +2 -1
- data/app/controllers/spina/pages_controller.rb +5 -5
- data/app/helpers/spina/admin/icons_helper.rb +26 -0
- data/app/helpers/spina/admin/images_helper.rb +18 -0
- data/app/helpers/spina/admin/pages_helper.rb +21 -48
- data/app/helpers/spina/attachments_helper.rb +1 -1
- data/app/helpers/spina/images_helper.rb +30 -2
- data/app/helpers/spina/spina_helper.rb +16 -0
- data/app/jobs/spina/application_job.rb +4 -0
- data/app/jobs/spina/resource_pages_update_job.rb +11 -0
- data/app/models/concerns/spina/gravatar.rb +20 -0
- data/app/models/concerns/spina/translated_content.rb +8 -7
- data/app/models/spina/account.rb +2 -0
- data/app/models/spina/application_record.rb +6 -0
- data/app/models/spina/attachment.rb +5 -1
- data/app/models/spina/current.rb +2 -0
- data/app/models/spina/navigation.rb +1 -0
- data/app/models/spina/navigation_item.rb +1 -1
- data/app/models/spina/page.rb +10 -5
- data/app/models/spina/parts/base.rb +6 -0
- data/app/models/spina/parts/image.rb +2 -0
- data/app/models/spina/resource.rb +12 -2
- data/app/models/spina/user.rb +4 -16
- data/app/views/layouts/spina/admin/admin.html.erb +18 -0
- data/app/views/layouts/spina/admin/application.html.erb +31 -0
- data/app/views/layouts/spina/admin/sessions.html.erb +1 -0
- data/app/views/spina/admin/accounts/edit.html.erb +49 -0
- data/app/views/spina/admin/attachments/_attachment.html.erb +33 -0
- data/app/views/spina/admin/attachments/edit.html.erb +16 -0
- data/app/views/spina/admin/attachments/index.html.erb +46 -0
- data/app/views/spina/admin/attachments/show.html.erb +1 -0
- data/app/views/spina/admin/images/_image.html.erb +65 -0
- data/app/views/spina/admin/images/edit.html.erb +16 -0
- data/app/views/spina/admin/images/index.html.erb +73 -0
- data/app/views/spina/admin/images/show.html.erb +1 -0
- data/app/views/spina/admin/images/update.turbo_stream.erb +5 -0
- data/app/views/spina/admin/layout/edit.html.erb +34 -0
- data/app/views/spina/admin/media_folders/_form.html.erb +30 -0
- data/app/views/spina/admin/media_folders/_media_folder.html.erb +18 -0
- data/app/views/spina/admin/media_folders/edit.html.erb +3 -0
- data/app/views/spina/admin/media_folders/new.html.erb +3 -0
- data/app/views/spina/admin/media_picker/show.html.erb +1 -0
- data/app/views/spina/admin/move_pages/new.html.erb +32 -0
- data/app/views/spina/admin/navigation_items/_form.html.erb +29 -0
- data/app/views/spina/admin/navigation_items/_navigation_item.html.erb +36 -0
- data/app/views/spina/admin/navigation_items/new.html.erb +3 -0
- data/app/views/spina/admin/navigations/_navigation.html.erb +1 -0
- data/app/views/spina/admin/navigations/edit.html.erb +32 -0
- data/app/views/spina/admin/navigations/index.html.erb +7 -0
- data/app/views/spina/admin/pages/_button_advanced.html.erb +4 -0
- data/app/views/spina/admin/pages/_button_page_content.html.erb +4 -0
- data/app/views/spina/admin/pages/_button_search_engines.html.erb +5 -0
- data/app/views/spina/admin/pages/_form.html.erb +36 -0
- data/app/views/spina/admin/pages/_form_advanced.html.erb +55 -0
- data/app/views/spina/admin/pages/_form_page_content.html.erb +8 -0
- data/app/views/spina/admin/pages/_form_search_engines.html.erb +45 -0
- data/app/views/spina/admin/pages/_new_page_form.html.erb +35 -0
- data/app/views/spina/admin/pages/edit.html.erb +1 -0
- data/app/views/spina/admin/pages/edit_content.html.erb +11 -0
- data/app/views/spina/admin/pages/edit_template.html.erb +36 -0
- data/app/views/spina/admin/pages/index.html.erb +66 -0
- data/app/views/spina/admin/pages/new.html.erb +3 -0
- data/app/views/spina/admin/parent_pages/index.html.erb +3 -0
- data/app/views/spina/admin/parts/attachments/_form.html.erb +8 -0
- data/app/views/spina/admin/parts/image_collections/_fields.html.erb +16 -0
- data/app/views/spina/admin/parts/image_collections/_form.html.erb +30 -0
- data/app/views/spina/admin/parts/images/_form.html.erb +32 -0
- data/app/views/spina/admin/parts/lines/_form.html.erb +6 -0
- data/app/views/spina/admin/parts/multi_lines/_form.html.erb +4 -0
- data/app/views/spina/admin/parts/options/_form.html.erb +5 -0
- data/app/views/spina/admin/parts/repeaters/_fields.html.erb +18 -0
- data/app/views/spina/admin/parts/repeaters/_form.html.erb +37 -0
- data/app/views/spina/admin/parts/texts/_form.html.erb +12 -0
- data/app/views/spina/admin/password_resets/edit.html.erb +22 -0
- data/app/views/spina/admin/password_resets/new.html.erb +21 -0
- data/app/views/spina/admin/resources/edit.html.erb +55 -0
- data/app/views/spina/admin/sessions/new.html.erb +24 -0
- data/app/views/spina/admin/settings/_string_field.html.erb +4 -0
- data/app/views/spina/admin/settings/_text_field.html.erb +5 -0
- data/app/views/spina/admin/settings/_wysiwyg_field.html.erb +13 -0
- data/app/views/spina/admin/settings/edit.html.erb +24 -0
- data/app/views/spina/admin/shared/_flash.html.erb +5 -0
- data/app/views/spina/admin/shared/_navigation.html.erb +71 -0
- data/app/views/spina/admin/theme/edit.html.erb +21 -0
- data/app/views/spina/admin/users/_form.html.erb +52 -0
- data/app/views/spina/admin/users/_user.html.erb +36 -0
- data/app/views/spina/admin/users/edit.html.erb +1 -0
- data/app/views/spina/admin/users/index.html.erb +15 -0
- data/app/views/spina/admin/users/new.html.erb +1 -0
- data/app/views/spina/user_mailer/forgot_password.html.erb +1 -1
- data/app/views/spina/user_mailer/forgot_password.txt.erb +1 -1
- data/config/locales/TH.yml +98 -2
- data/config/locales/bg.yml +98 -2
- data/config/locales/de.yml +184 -78
- data/config/locales/en.yml +106 -2
- data/config/locales/es.yml +139 -41
- data/config/locales/fr.yml +98 -2
- data/config/locales/id.yml +98 -2
- data/config/locales/it.yml +107 -11
- data/config/locales/nl.yml +103 -5
- data/config/locales/pl.yml +98 -2
- data/config/locales/pt-BR.yml +98 -2
- data/config/locales/ro.yml +98 -2
- data/config/locales/ru.yml +98 -2
- data/config/locales/sv.yml +98 -2
- data/config/locales/tr.yml +98 -2
- data/config/locales/zh-CN.yml +98 -2
- data/config/routes.rb +21 -24
- data/lib/generators/spina/install_generator.rb +0 -1
- data/lib/generators/spina/templates/app/views/default/pages/homepage.html.erb +2 -0
- data/lib/generators/spina/templates/app/views/default/pages/show.html.erb +3 -0
- data/lib/generators/spina/templates/app/views/default/shared/_navigation.html.erb +2 -0
- data/lib/generators/spina/templates/app/views/demo/pages/demo.html.erb +25 -0
- data/lib/generators/spina/templates/app/views/demo/pages/homepage.html.erb +3 -0
- data/lib/generators/spina/templates/app/views/demo/pages/show.html.erb +3 -0
- data/lib/generators/spina/templates/app/views/demo/shared/_languages.html.erb +5 -0
- data/lib/generators/spina/templates/app/views/demo/shared/_navigation.html.erb +2 -0
- data/lib/generators/spina/templates/app/views/layouts/default/application.html.erb +12 -0
- data/lib/generators/spina/templates/app/views/layouts/demo/application.html.erb +13 -0
- data/lib/generators/spina/templates/config/initializers/mobility.rb +1 -0
- data/lib/generators/spina/templates/config/initializers/spina.rb +44 -12
- data/lib/generators/spina/templates/config/initializers/themes/default.rb +59 -37
- data/lib/generators/spina/templates/config/initializers/themes/demo.rb +63 -64
- data/lib/spina.rb +52 -15
- data/lib/spina/admin_sectionable.rb +23 -0
- data/lib/spina/attr_json_monkeypatch.rb +28 -0
- data/lib/spina/authentication/basic.rb +24 -0
- data/lib/spina/authentication/sessions.rb +32 -0
- data/lib/spina/engine.rb +15 -9
- data/lib/spina/importmap_helper.rb +37 -0
- data/lib/spina/plugin.rb +7 -1
- data/lib/spina/railtie.rb +5 -1
- data/lib/spina/tailwind_purger.rb +147 -0
- data/lib/spina/theme.rb +14 -5
- data/lib/spina/version.rb +1 -1
- data/lib/tasks/spina_tasks.rake +36 -0
- metadata +669 -205
- data/app/assets/config/spina_manifest.js +0 -5
- data/app/assets/fonts/spina/ics_spina.eot +0 -0
- data/app/assets/fonts/spina/ics_spina.svg +0 -380
- data/app/assets/fonts/spina/ics_spina.ttf +0 -0
- data/app/assets/fonts/spina/ics_spina.woff +0 -0
- data/app/assets/fonts/spina/ics_spina.woff2 +0 -0
- data/app/assets/images/spina/arrow-left.svg +0 -1
- data/app/assets/images/spina/arrow-right.svg +0 -1
- data/app/assets/images/spina/datepicker.svg +0 -1
- data/app/assets/images/spina/divider.svg +0 -1
- data/app/assets/images/spina/media_folder_placeholder.svg +0 -1
- data/app/assets/javascripts/spina/admin/application.js +0 -48
- data/app/assets/javascripts/spina/admin/confirm_delete.coffee.erb +0 -24
- data/app/assets/javascripts/spina/admin/controllers/attachment_picker_controller.js +0 -15
- data/app/assets/javascripts/spina/admin/controllers/gallery_select_controller.js +0 -52
- data/app/assets/javascripts/spina/admin/controllers/image_form_controller.js +0 -22
- data/app/assets/javascripts/spina/admin/controllers/infinite_scroll_controller.js +0 -38
- data/app/assets/javascripts/spina/admin/controllers/media_picker_controller.js +0 -171
- data/app/assets/javascripts/spina/admin/controllers/modal_controller.js +0 -18
- data/app/assets/javascripts/spina/admin/controllers/page_collapse_controller.js +0 -35
- data/app/assets/javascripts/spina/admin/controllers/repeater_form_controller.js +0 -38
- data/app/assets/javascripts/spina/admin/dropdown.coffee +0 -75
- data/app/assets/javascripts/spina/admin/forms.coffee +0 -7
- data/app/assets/javascripts/spina/admin/media_gallery.coffee +0 -62
- data/app/assets/javascripts/spina/admin/modal.coffee +0 -53
- data/app/assets/javascripts/spina/admin/navigation.coffee +0 -45
- data/app/assets/javascripts/spina/admin/notifications.coffee +0 -7
- data/app/assets/javascripts/spina/admin/pages.coffee.erb +0 -65
- data/app/assets/javascripts/spina/admin/scaffold.coffee +0 -87
- data/app/assets/javascripts/spina/admin/switch.coffee +0 -43
- data/app/assets/javascripts/spina/admin/tabs.coffee +0 -13
- data/app/assets/javascripts/spina/admin/trix.coffee.erb +0 -114
- data/app/assets/javascripts/spina/admin/uploads.coffee +0 -35
- data/app/assets/stylesheets/spina.sass +0 -564
- data/app/assets/stylesheets/spina/_admin_editing.sass +0 -21
- data/app/assets/stylesheets/spina/_buttons.sass +0 -393
- data/app/assets/stylesheets/spina/_configuration.sass.erb +0 -23
- data/app/assets/stylesheets/spina/_custom_animations.sass +0 -61
- data/app/assets/stylesheets/spina/_fonts.sass +0 -54
- data/app/assets/stylesheets/spina/_forms.sass +0 -893
- data/app/assets/stylesheets/spina/_gallery.sass +0 -405
- data/app/assets/stylesheets/spina/_ics_spina.scss +0 -70
- data/app/assets/stylesheets/spina/_labels.sass +0 -30
- data/app/assets/stylesheets/spina/_login.sass +0 -52
- data/app/assets/stylesheets/spina/_media_picker.sass +0 -133
- data/app/assets/stylesheets/spina/_mixins.sass +0 -5
- data/app/assets/stylesheets/spina/_modal.sass +0 -195
- data/app/assets/stylesheets/spina/_normalize.scss +0 -396
- data/app/assets/stylesheets/spina/_notifications.sass +0 -68
- data/app/assets/stylesheets/spina/_pages.sass +0 -131
- data/app/assets/stylesheets/spina/_sortable_lists.sass +0 -190
- data/app/assets/stylesheets/spina/_tables.sass +0 -308
- data/app/assets/stylesheets/spina/_trix_custom.sass +0 -224
- data/app/assets/stylesheets/spina/_wizard.sass +0 -122
- data/app/assets/stylesheets/spina/admin/application.css.sass +0 -7
- data/app/assets/stylesheets/spina_front_end.sass +0 -19
- data/app/controllers/concerns/spina/current_methods.rb +0 -26
- data/app/helpers/spina/admin/admin_helper.rb +0 -11
- data/app/helpers/spina/admin_nav_helper.rb +0 -7
- data/app/views/layouts/spina/admin/admin.html.haml +0 -34
- data/app/views/layouts/spina/admin/media_library.html.haml +0 -17
- data/app/views/layouts/spina/admin/pages.html.haml +0 -34
- data/app/views/layouts/spina/admin/resources.html.haml +0 -10
- data/app/views/layouts/spina/login.html.haml +0 -18
- data/app/views/spina/admin/accounts/_form.html.haml +0 -54
- data/app/views/spina/admin/accounts/analytics.html.haml +0 -28
- data/app/views/spina/admin/accounts/edit.html.haml +0 -1
- data/app/views/spina/admin/accounts/social.html.haml +0 -52
- data/app/views/spina/admin/accounts/style.html.haml +0 -35
- data/app/views/spina/admin/attachments/_attachment.html.haml +0 -7
- data/app/views/spina/admin/attachments/create.js.erb +0 -1
- data/app/views/spina/admin/attachments/index.html.haml +0 -16
- data/app/views/spina/admin/images/_form.html.haml +0 -5
- data/app/views/spina/admin/images/_image.html.haml +0 -8
- data/app/views/spina/admin/images/create.js.erb +0 -8
- data/app/views/spina/admin/images/index.html.haml +0 -24
- data/app/views/spina/admin/images/index.js.erb +0 -7
- data/app/views/spina/admin/media_folders/_form.html.haml +0 -17
- data/app/views/spina/admin/media_folders/_media_folder.html.haml +0 -8
- data/app/views/spina/admin/media_folders/edit.js.erb +0 -1
- data/app/views/spina/admin/media_folders/new.js.erb +0 -1
- data/app/views/spina/admin/media_folders/show.html.haml +0 -18
- data/app/views/spina/admin/media_picker/_image.html.haml +0 -3
- data/app/views/spina/admin/media_picker/_media_picker.html.haml +0 -32
- data/app/views/spina/admin/media_picker/_media_picker_grid.html.haml +0 -25
- data/app/views/spina/admin/media_picker/_modal.html.haml +0 -63
- data/app/views/spina/admin/media_picker/infinite_scroll.js.erb +0 -5
- data/app/views/spina/admin/media_picker/select.js.erb +0 -33
- data/app/views/spina/admin/media_picker/show.html.haml +0 -1
- data/app/views/spina/admin/media_picker/show.js.erb +0 -1
- data/app/views/spina/admin/navigations/_navigation_item_nested_list.html.haml +0 -7
- data/app/views/spina/admin/navigations/_page.html.haml +0 -8
- data/app/views/spina/admin/navigations/edit.html.haml +0 -22
- data/app/views/spina/admin/navigations/show.html.haml +0 -7
- data/app/views/spina/admin/pages/_form.html.haml +0 -52
- data/app/views/spina/admin/pages/_form_advanced.html.haml +0 -59
- data/app/views/spina/admin/pages/_form_page_content.html.haml +0 -17
- data/app/views/spina/admin/pages/_form_page_seo.html.haml +0 -32
- data/app/views/spina/admin/pages/_page.html.haml +0 -16
- data/app/views/spina/admin/pages/_page_nested_list.html.haml +0 -6
- data/app/views/spina/admin/pages/children.html.haml +0 -4
- data/app/views/spina/admin/pages/create.js.coffee +0 -0
- data/app/views/spina/admin/pages/edit.html.haml +0 -1
- data/app/views/spina/admin/pages/index.html.haml +0 -36
- data/app/views/spina/admin/pages/new.html.haml +0 -1
- data/app/views/spina/admin/pages/update.js.coffee +0 -1
- data/app/views/spina/admin/parts/attachments/_form.html.haml +0 -6
- data/app/views/spina/admin/parts/image_collections/_fields.html.haml +0 -7
- data/app/views/spina/admin/parts/image_collections/_form.html.haml +0 -12
- data/app/views/spina/admin/parts/images/_form.html.haml +0 -18
- data/app/views/spina/admin/parts/lines/_form.html.haml +0 -2
- data/app/views/spina/admin/parts/multi_lines/_form.html.haml +0 -2
- data/app/views/spina/admin/parts/options/_form.html.haml +0 -3
- data/app/views/spina/admin/parts/repeaters/_fields.html.haml +0 -15
- data/app/views/spina/admin/parts/repeaters/_form.html.haml +0 -17
- data/app/views/spina/admin/parts/texts/_form.html.haml +0 -6
- data/app/views/spina/admin/password_resets/edit.html.haml +0 -13
- data/app/views/spina/admin/password_resets/new.html.haml +0 -13
- data/app/views/spina/admin/resources/edit.html.haml +0 -65
- data/app/views/spina/admin/resources/show.html.haml +0 -27
- data/app/views/spina/admin/sessions/new.html.haml +0 -14
- data/app/views/spina/admin/settings/_string_field.html.haml +0 -4
- data/app/views/spina/admin/settings/_wysiwyg_field.html.haml +0 -4
- data/app/views/spina/admin/settings/edit.html.haml +0 -13
- data/app/views/spina/admin/shared/_breadcrumbs.html.haml +0 -1
- data/app/views/spina/admin/shared/_notifications.html.haml +0 -29
- data/app/views/spina/admin/shared/_primary_navigation.html.haml +0 -68
- data/app/views/spina/admin/shared/_rich_text_field.html.haml +0 -4
- data/app/views/spina/admin/users/_form.html.haml +0 -58
- data/app/views/spina/admin/users/edit.html.haml +0 -1
- data/app/views/spina/admin/users/index.html.haml +0 -30
- data/app/views/spina/admin/users/new.html.haml +0 -1
- data/app/views/spina/pages/robots.text.erb +0 -4
- data/app/views/spina/shared/_admin_bar.html.haml +0 -4
- data/app/views/spina/shared/_analytics.html.erb +0 -11
- data/app/views/spina/shared/_google_site_verification.html.haml +0 -1
- data/app/views/spina/shared/_navigation.html.haml +0 -3
- data/app/views/spina/shared/_social.html.haml +0 -5
- data/app/views/spina/shared/_spina_link.html.haml +0 -2
- data/config/fontcustom.yml +0 -95
- data/lib/generators/spina/templates/app/assets/stylesheets/default/application.css.sass +0 -0
- data/lib/generators/spina/templates/app/assets/stylesheets/demo/application.css.sass +0 -69
- data/lib/generators/spina/templates/app/views/default/pages/homepage.html.haml +0 -3
- data/lib/generators/spina/templates/app/views/default/pages/show.html.haml +0 -3
- data/lib/generators/spina/templates/app/views/default/shared/_navigation.html.haml +0 -2
- data/lib/generators/spina/templates/app/views/demo/pages/demo.html.haml +0 -20
- data/lib/generators/spina/templates/app/views/demo/pages/homepage.html.haml +0 -2
- data/lib/generators/spina/templates/app/views/demo/pages/show.html.haml +0 -3
- data/lib/generators/spina/templates/app/views/demo/shared/_languages.html.haml +0 -2
- data/lib/generators/spina/templates/app/views/demo/shared/_navigation.html.haml +0 -2
- data/lib/generators/spina/templates/app/views/layouts/default/application.html.haml +0 -10
- data/lib/generators/spina/templates/app/views/layouts/demo/application.html.haml +0 -11
- data/lib/spina/fontcustom/_ics_spina.scss +0 -5
- data/vendor/assets/javascripts/spina/jquery.customfileinput.js +0 -85
- data/vendor/assets/javascripts/spina/jquery.nestable.js +0 -485
- data/vendor/assets/javascripts/spina/jquery.ui.js +0 -6
- data/vendor/assets/javascripts/spina/sortable.js +0 -2
- data/vendor/assets/javascripts/spina/stimulus.umd.js +0 -5
- data/vendor/assets/javascripts/spina/trix.js +0 -21
- data/vendor/assets/stylesheets/spina/_animate.scss +0 -1
- data/vendor/assets/stylesheets/spina/_normalize.scss +0 -396
- data/vendor/assets/stylesheets/spina/_trix.css +0 -369
@@ -0,0 +1 @@
|
|
1
|
+
//= require ./canvas-confetti@1.3.2.js
|
@@ -0,0 +1,592 @@
|
|
1
|
+
// canvas-confetti v1.3.2 built on 2021-01-15T19:28:37.722Z
|
2
|
+
var module = {};
|
3
|
+
|
4
|
+
// source content
|
5
|
+
(function main(global, module, isWorker, workerSize) {
|
6
|
+
var canUseWorker = !!(
|
7
|
+
global.Worker &&
|
8
|
+
global.Blob &&
|
9
|
+
global.Promise &&
|
10
|
+
global.OffscreenCanvas &&
|
11
|
+
global.OffscreenCanvasRenderingContext2D &&
|
12
|
+
global.HTMLCanvasElement &&
|
13
|
+
global.HTMLCanvasElement.prototype.transferControlToOffscreen &&
|
14
|
+
global.URL &&
|
15
|
+
global.URL.createObjectURL);
|
16
|
+
|
17
|
+
function noop() {}
|
18
|
+
|
19
|
+
// create a promise if it exists, otherwise, just
|
20
|
+
// call the function directly
|
21
|
+
function promise(func) {
|
22
|
+
var ModulePromise = module.exports.Promise;
|
23
|
+
var Prom = ModulePromise !== void 0 ? ModulePromise : global.Promise;
|
24
|
+
|
25
|
+
if (typeof Prom === 'function') {
|
26
|
+
return new Prom(func);
|
27
|
+
}
|
28
|
+
|
29
|
+
func(noop, noop);
|
30
|
+
|
31
|
+
return null;
|
32
|
+
}
|
33
|
+
|
34
|
+
var raf = (function () {
|
35
|
+
var TIME = Math.floor(1000 / 60);
|
36
|
+
var frame, cancel;
|
37
|
+
var frames = {};
|
38
|
+
var lastFrameTime = 0;
|
39
|
+
|
40
|
+
if (typeof requestAnimationFrame === 'function' && typeof cancelAnimationFrame === 'function') {
|
41
|
+
frame = function (cb) {
|
42
|
+
var id = Math.random();
|
43
|
+
|
44
|
+
frames[id] = requestAnimationFrame(function onFrame(time) {
|
45
|
+
if (lastFrameTime === time || lastFrameTime + TIME - 1 < time) {
|
46
|
+
lastFrameTime = time;
|
47
|
+
delete frames[id];
|
48
|
+
|
49
|
+
cb();
|
50
|
+
} else {
|
51
|
+
frames[id] = requestAnimationFrame(onFrame);
|
52
|
+
}
|
53
|
+
});
|
54
|
+
|
55
|
+
return id;
|
56
|
+
};
|
57
|
+
cancel = function (id) {
|
58
|
+
if (frames[id]) {
|
59
|
+
cancelAnimationFrame(frames[id]);
|
60
|
+
}
|
61
|
+
};
|
62
|
+
} else {
|
63
|
+
frame = function (cb) {
|
64
|
+
return setTimeout(cb, TIME);
|
65
|
+
};
|
66
|
+
cancel = function (timer) {
|
67
|
+
return clearTimeout(timer);
|
68
|
+
};
|
69
|
+
}
|
70
|
+
|
71
|
+
return { frame: frame, cancel: cancel };
|
72
|
+
}());
|
73
|
+
|
74
|
+
var getWorker = (function () {
|
75
|
+
var worker;
|
76
|
+
var prom;
|
77
|
+
var resolves = {};
|
78
|
+
|
79
|
+
function decorate(worker) {
|
80
|
+
function execute(options, callback) {
|
81
|
+
worker.postMessage({ options: options || {}, callback: callback });
|
82
|
+
}
|
83
|
+
worker.init = function initWorker(canvas) {
|
84
|
+
var offscreen = canvas.transferControlToOffscreen();
|
85
|
+
worker.postMessage({ canvas: offscreen }, [offscreen]);
|
86
|
+
};
|
87
|
+
|
88
|
+
worker.fire = function fireWorker(options, size, done) {
|
89
|
+
if (prom) {
|
90
|
+
execute(options, null);
|
91
|
+
return prom;
|
92
|
+
}
|
93
|
+
|
94
|
+
var id = Math.random().toString(36).slice(2);
|
95
|
+
|
96
|
+
prom = promise(function (resolve) {
|
97
|
+
function workerDone(msg) {
|
98
|
+
if (msg.data.callback !== id) {
|
99
|
+
return;
|
100
|
+
}
|
101
|
+
|
102
|
+
delete resolves[id];
|
103
|
+
worker.removeEventListener('message', workerDone);
|
104
|
+
|
105
|
+
prom = null;
|
106
|
+
done();
|
107
|
+
resolve();
|
108
|
+
}
|
109
|
+
|
110
|
+
worker.addEventListener('message', workerDone);
|
111
|
+
execute(options, id);
|
112
|
+
|
113
|
+
resolves[id] = workerDone.bind(null, { data: { callback: id }});
|
114
|
+
});
|
115
|
+
|
116
|
+
return prom;
|
117
|
+
};
|
118
|
+
|
119
|
+
worker.reset = function resetWorker() {
|
120
|
+
worker.postMessage({ reset: true });
|
121
|
+
|
122
|
+
for (var id in resolves) {
|
123
|
+
resolves[id]();
|
124
|
+
delete resolves[id];
|
125
|
+
}
|
126
|
+
};
|
127
|
+
}
|
128
|
+
|
129
|
+
return function () {
|
130
|
+
if (worker) {
|
131
|
+
return worker;
|
132
|
+
}
|
133
|
+
|
134
|
+
if (!isWorker && canUseWorker) {
|
135
|
+
var code = [
|
136
|
+
'var CONFETTI, SIZE = {}, module = {};',
|
137
|
+
'(' + main.toString() + ')(this, module, true, SIZE);',
|
138
|
+
'onmessage = function(msg) {',
|
139
|
+
' if (msg.data.options) {',
|
140
|
+
' CONFETTI(msg.data.options).then(function () {',
|
141
|
+
' if (msg.data.callback) {',
|
142
|
+
' postMessage({ callback: msg.data.callback });',
|
143
|
+
' }',
|
144
|
+
' });',
|
145
|
+
' } else if (msg.data.reset) {',
|
146
|
+
' CONFETTI.reset();',
|
147
|
+
' } else if (msg.data.resize) {',
|
148
|
+
' SIZE.width = msg.data.resize.width;',
|
149
|
+
' SIZE.height = msg.data.resize.height;',
|
150
|
+
' } else if (msg.data.canvas) {',
|
151
|
+
' SIZE.width = msg.data.canvas.width;',
|
152
|
+
' SIZE.height = msg.data.canvas.height;',
|
153
|
+
' CONFETTI = module.exports.create(msg.data.canvas);',
|
154
|
+
' }',
|
155
|
+
'}',
|
156
|
+
].join('\n');
|
157
|
+
try {
|
158
|
+
worker = new Worker(URL.createObjectURL(new Blob([code])));
|
159
|
+
} catch (e) {
|
160
|
+
// eslint-disable-next-line no-console
|
161
|
+
typeof console !== undefined && typeof console.warn === 'function' ? console.warn('🎊 Could not load worker', e) : null;
|
162
|
+
|
163
|
+
return null;
|
164
|
+
}
|
165
|
+
|
166
|
+
decorate(worker);
|
167
|
+
}
|
168
|
+
|
169
|
+
return worker;
|
170
|
+
};
|
171
|
+
})();
|
172
|
+
|
173
|
+
var defaults = {
|
174
|
+
particleCount: 50,
|
175
|
+
angle: 90,
|
176
|
+
spread: 45,
|
177
|
+
startVelocity: 45,
|
178
|
+
decay: 0.9,
|
179
|
+
gravity: 1,
|
180
|
+
ticks: 200,
|
181
|
+
x: 0.5,
|
182
|
+
y: 0.5,
|
183
|
+
shapes: ['square', 'circle'],
|
184
|
+
zIndex: 100,
|
185
|
+
colors: [
|
186
|
+
'#26ccff',
|
187
|
+
'#a25afd',
|
188
|
+
'#ff5e7e',
|
189
|
+
'#88ff5a',
|
190
|
+
'#fcff42',
|
191
|
+
'#ffa62d',
|
192
|
+
'#ff36ff'
|
193
|
+
],
|
194
|
+
// probably should be true, but back-compat
|
195
|
+
disableForReducedMotion: false,
|
196
|
+
scalar: 1
|
197
|
+
};
|
198
|
+
|
199
|
+
function convert(val, transform) {
|
200
|
+
return transform ? transform(val) : val;
|
201
|
+
}
|
202
|
+
|
203
|
+
function isOk(val) {
|
204
|
+
return !(val === null || val === undefined);
|
205
|
+
}
|
206
|
+
|
207
|
+
function prop(options, name, transform) {
|
208
|
+
return convert(
|
209
|
+
options && isOk(options[name]) ? options[name] : defaults[name],
|
210
|
+
transform
|
211
|
+
);
|
212
|
+
}
|
213
|
+
|
214
|
+
function onlyPositiveInt(number){
|
215
|
+
return number < 0 ? 0 : Math.floor(number);
|
216
|
+
}
|
217
|
+
|
218
|
+
function randomInt(min, max) {
|
219
|
+
// [min, max)
|
220
|
+
return Math.floor(Math.random() * (max - min)) + min;
|
221
|
+
}
|
222
|
+
|
223
|
+
function toDecimal(str) {
|
224
|
+
return parseInt(str, 16);
|
225
|
+
}
|
226
|
+
|
227
|
+
function hexToRgb(str) {
|
228
|
+
var val = String(str).replace(/[^0-9a-f]/gi, '');
|
229
|
+
|
230
|
+
if (val.length < 6) {
|
231
|
+
val = val[0]+val[0]+val[1]+val[1]+val[2]+val[2];
|
232
|
+
}
|
233
|
+
|
234
|
+
return {
|
235
|
+
r: toDecimal(val.substring(0,2)),
|
236
|
+
g: toDecimal(val.substring(2,4)),
|
237
|
+
b: toDecimal(val.substring(4,6))
|
238
|
+
};
|
239
|
+
}
|
240
|
+
|
241
|
+
function getOrigin(options) {
|
242
|
+
var origin = prop(options, 'origin', Object);
|
243
|
+
origin.x = prop(origin, 'x', Number);
|
244
|
+
origin.y = prop(origin, 'y', Number);
|
245
|
+
|
246
|
+
return origin;
|
247
|
+
}
|
248
|
+
|
249
|
+
function setCanvasWindowSize(canvas) {
|
250
|
+
canvas.width = document.documentElement.clientWidth;
|
251
|
+
canvas.height = document.documentElement.clientHeight;
|
252
|
+
}
|
253
|
+
|
254
|
+
function setCanvasRectSize(canvas) {
|
255
|
+
var rect = canvas.getBoundingClientRect();
|
256
|
+
canvas.width = rect.width;
|
257
|
+
canvas.height = rect.height;
|
258
|
+
}
|
259
|
+
|
260
|
+
function getCanvas(zIndex) {
|
261
|
+
var canvas = document.createElement('canvas');
|
262
|
+
|
263
|
+
canvas.style.position = 'fixed';
|
264
|
+
canvas.style.top = '0px';
|
265
|
+
canvas.style.left = '0px';
|
266
|
+
canvas.style.pointerEvents = 'none';
|
267
|
+
canvas.style.zIndex = zIndex;
|
268
|
+
|
269
|
+
return canvas;
|
270
|
+
}
|
271
|
+
|
272
|
+
function ellipse(context, x, y, radiusX, radiusY, rotation, startAngle, endAngle, antiClockwise) {
|
273
|
+
context.save();
|
274
|
+
context.translate(x, y);
|
275
|
+
context.rotate(rotation);
|
276
|
+
context.scale(radiusX, radiusY);
|
277
|
+
context.arc(0, 0, 1, startAngle, endAngle, antiClockwise);
|
278
|
+
context.restore();
|
279
|
+
}
|
280
|
+
|
281
|
+
function randomPhysics(opts) {
|
282
|
+
var radAngle = opts.angle * (Math.PI / 180);
|
283
|
+
var radSpread = opts.spread * (Math.PI / 180);
|
284
|
+
|
285
|
+
return {
|
286
|
+
x: opts.x,
|
287
|
+
y: opts.y,
|
288
|
+
wobble: Math.random() * 10,
|
289
|
+
velocity: (opts.startVelocity * 0.5) + (Math.random() * opts.startVelocity),
|
290
|
+
angle2D: -radAngle + ((0.5 * radSpread) - (Math.random() * radSpread)),
|
291
|
+
tiltAngle: Math.random() * Math.PI,
|
292
|
+
color: hexToRgb(opts.color),
|
293
|
+
shape: opts.shape,
|
294
|
+
tick: 0,
|
295
|
+
totalTicks: opts.ticks,
|
296
|
+
decay: opts.decay,
|
297
|
+
random: Math.random() + 5,
|
298
|
+
tiltSin: 0,
|
299
|
+
tiltCos: 0,
|
300
|
+
wobbleX: 0,
|
301
|
+
wobbleY: 0,
|
302
|
+
gravity: opts.gravity * 3,
|
303
|
+
ovalScalar: 0.6,
|
304
|
+
scalar: opts.scalar
|
305
|
+
};
|
306
|
+
}
|
307
|
+
|
308
|
+
function updateFetti(context, fetti) {
|
309
|
+
fetti.x += Math.cos(fetti.angle2D) * fetti.velocity;
|
310
|
+
fetti.y += Math.sin(fetti.angle2D) * fetti.velocity + fetti.gravity;
|
311
|
+
fetti.wobble += 0.1;
|
312
|
+
fetti.velocity *= fetti.decay;
|
313
|
+
fetti.tiltAngle += 0.1;
|
314
|
+
fetti.tiltSin = Math.sin(fetti.tiltAngle);
|
315
|
+
fetti.tiltCos = Math.cos(fetti.tiltAngle);
|
316
|
+
fetti.random = Math.random() + 5;
|
317
|
+
fetti.wobbleX = fetti.x + ((10 * fetti.scalar) * Math.cos(fetti.wobble));
|
318
|
+
fetti.wobbleY = fetti.y + ((10 * fetti.scalar) * Math.sin(fetti.wobble));
|
319
|
+
|
320
|
+
var progress = (fetti.tick++) / fetti.totalTicks;
|
321
|
+
|
322
|
+
var x1 = fetti.x + (fetti.random * fetti.tiltCos);
|
323
|
+
var y1 = fetti.y + (fetti.random * fetti.tiltSin);
|
324
|
+
var x2 = fetti.wobbleX + (fetti.random * fetti.tiltCos);
|
325
|
+
var y2 = fetti.wobbleY + (fetti.random * fetti.tiltSin);
|
326
|
+
|
327
|
+
context.fillStyle = 'rgba(' + fetti.color.r + ', ' + fetti.color.g + ', ' + fetti.color.b + ', ' + (1 - progress) + ')';
|
328
|
+
context.beginPath();
|
329
|
+
|
330
|
+
if (fetti.shape === 'circle') {
|
331
|
+
context.ellipse ?
|
332
|
+
context.ellipse(fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI) :
|
333
|
+
ellipse(context, fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI);
|
334
|
+
} else {
|
335
|
+
context.moveTo(Math.floor(fetti.x), Math.floor(fetti.y));
|
336
|
+
context.lineTo(Math.floor(fetti.wobbleX), Math.floor(y1));
|
337
|
+
context.lineTo(Math.floor(x2), Math.floor(y2));
|
338
|
+
context.lineTo(Math.floor(x1), Math.floor(fetti.wobbleY));
|
339
|
+
}
|
340
|
+
|
341
|
+
context.closePath();
|
342
|
+
context.fill();
|
343
|
+
|
344
|
+
return fetti.tick < fetti.totalTicks;
|
345
|
+
}
|
346
|
+
|
347
|
+
function animate(canvas, fettis, resizer, size, done) {
|
348
|
+
var animatingFettis = fettis.slice();
|
349
|
+
var context = canvas.getContext('2d');
|
350
|
+
var animationFrame;
|
351
|
+
var destroy;
|
352
|
+
|
353
|
+
var prom = promise(function (resolve) {
|
354
|
+
function onDone() {
|
355
|
+
animationFrame = destroy = null;
|
356
|
+
|
357
|
+
context.clearRect(0, 0, size.width, size.height);
|
358
|
+
|
359
|
+
done();
|
360
|
+
resolve();
|
361
|
+
}
|
362
|
+
|
363
|
+
function update() {
|
364
|
+
if (isWorker && !(size.width === workerSize.width && size.height === workerSize.height)) {
|
365
|
+
size.width = canvas.width = workerSize.width;
|
366
|
+
size.height = canvas.height = workerSize.height;
|
367
|
+
}
|
368
|
+
|
369
|
+
if (!size.width && !size.height) {
|
370
|
+
resizer(canvas);
|
371
|
+
size.width = canvas.width;
|
372
|
+
size.height = canvas.height;
|
373
|
+
}
|
374
|
+
|
375
|
+
context.clearRect(0, 0, size.width, size.height);
|
376
|
+
|
377
|
+
animatingFettis = animatingFettis.filter(function (fetti) {
|
378
|
+
return updateFetti(context, fetti);
|
379
|
+
});
|
380
|
+
|
381
|
+
if (animatingFettis.length) {
|
382
|
+
animationFrame = raf.frame(update);
|
383
|
+
} else {
|
384
|
+
onDone();
|
385
|
+
}
|
386
|
+
}
|
387
|
+
|
388
|
+
animationFrame = raf.frame(update);
|
389
|
+
destroy = onDone;
|
390
|
+
});
|
391
|
+
|
392
|
+
return {
|
393
|
+
addFettis: function (fettis) {
|
394
|
+
animatingFettis = animatingFettis.concat(fettis);
|
395
|
+
|
396
|
+
return prom;
|
397
|
+
},
|
398
|
+
canvas: canvas,
|
399
|
+
promise: prom,
|
400
|
+
reset: function () {
|
401
|
+
if (animationFrame) {
|
402
|
+
raf.cancel(animationFrame);
|
403
|
+
}
|
404
|
+
|
405
|
+
if (destroy) {
|
406
|
+
destroy();
|
407
|
+
}
|
408
|
+
}
|
409
|
+
};
|
410
|
+
}
|
411
|
+
|
412
|
+
function confettiCannon(canvas, globalOpts) {
|
413
|
+
var isLibCanvas = !canvas;
|
414
|
+
var allowResize = !!prop(globalOpts || {}, 'resize');
|
415
|
+
var globalDisableForReducedMotion = prop(globalOpts, 'disableForReducedMotion', Boolean);
|
416
|
+
var shouldUseWorker = canUseWorker && !!prop(globalOpts || {}, 'useWorker');
|
417
|
+
var worker = shouldUseWorker ? getWorker() : null;
|
418
|
+
var resizer = isLibCanvas ? setCanvasWindowSize : setCanvasRectSize;
|
419
|
+
var initialized = (canvas && worker) ? !!canvas.__confetti_initialized : false;
|
420
|
+
var preferLessMotion = typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion)').matches;
|
421
|
+
var animationObj;
|
422
|
+
|
423
|
+
function fireLocal(options, size, done) {
|
424
|
+
var particleCount = prop(options, 'particleCount', onlyPositiveInt);
|
425
|
+
var angle = prop(options, 'angle', Number);
|
426
|
+
var spread = prop(options, 'spread', Number);
|
427
|
+
var startVelocity = prop(options, 'startVelocity', Number);
|
428
|
+
var decay = prop(options, 'decay', Number);
|
429
|
+
var gravity = prop(options, 'gravity', Number);
|
430
|
+
var colors = prop(options, 'colors');
|
431
|
+
var ticks = prop(options, 'ticks', Number);
|
432
|
+
var shapes = prop(options, 'shapes');
|
433
|
+
var scalar = prop(options, 'scalar');
|
434
|
+
var origin = getOrigin(options);
|
435
|
+
|
436
|
+
var temp = particleCount;
|
437
|
+
var fettis = [];
|
438
|
+
|
439
|
+
var startX = canvas.width * origin.x;
|
440
|
+
var startY = canvas.height * origin.y;
|
441
|
+
|
442
|
+
while (temp--) {
|
443
|
+
fettis.push(
|
444
|
+
randomPhysics({
|
445
|
+
x: startX,
|
446
|
+
y: startY,
|
447
|
+
angle: angle,
|
448
|
+
spread: spread,
|
449
|
+
startVelocity: startVelocity,
|
450
|
+
color: colors[temp % colors.length],
|
451
|
+
shape: shapes[randomInt(0, shapes.length)],
|
452
|
+
ticks: ticks,
|
453
|
+
decay: decay,
|
454
|
+
gravity: gravity,
|
455
|
+
scalar: scalar
|
456
|
+
})
|
457
|
+
);
|
458
|
+
}
|
459
|
+
|
460
|
+
// if we have a previous canvas already animating,
|
461
|
+
// add to it
|
462
|
+
if (animationObj) {
|
463
|
+
return animationObj.addFettis(fettis);
|
464
|
+
}
|
465
|
+
|
466
|
+
animationObj = animate(canvas, fettis, resizer, size , done);
|
467
|
+
|
468
|
+
return animationObj.promise;
|
469
|
+
}
|
470
|
+
|
471
|
+
function fire(options) {
|
472
|
+
var disableForReducedMotion = globalDisableForReducedMotion || prop(options, 'disableForReducedMotion', Boolean);
|
473
|
+
var zIndex = prop(options, 'zIndex', Number);
|
474
|
+
|
475
|
+
if (disableForReducedMotion && preferLessMotion) {
|
476
|
+
return promise(function (resolve) {
|
477
|
+
resolve();
|
478
|
+
});
|
479
|
+
}
|
480
|
+
|
481
|
+
if (isLibCanvas && animationObj) {
|
482
|
+
// use existing canvas from in-progress animation
|
483
|
+
canvas = animationObj.canvas;
|
484
|
+
} else if (isLibCanvas && !canvas) {
|
485
|
+
// create and initialize a new canvas
|
486
|
+
canvas = getCanvas(zIndex);
|
487
|
+
document.body.appendChild(canvas);
|
488
|
+
}
|
489
|
+
|
490
|
+
if (allowResize && !initialized) {
|
491
|
+
// initialize the size of a user-supplied canvas
|
492
|
+
resizer(canvas);
|
493
|
+
}
|
494
|
+
|
495
|
+
var size = {
|
496
|
+
width: canvas.width,
|
497
|
+
height: canvas.height
|
498
|
+
};
|
499
|
+
|
500
|
+
if (worker && !initialized) {
|
501
|
+
worker.init(canvas);
|
502
|
+
}
|
503
|
+
|
504
|
+
initialized = true;
|
505
|
+
|
506
|
+
if (worker) {
|
507
|
+
canvas.__confetti_initialized = true;
|
508
|
+
}
|
509
|
+
|
510
|
+
function onResize() {
|
511
|
+
if (worker) {
|
512
|
+
// TODO this really shouldn't be immediate, because it is expensive
|
513
|
+
var obj = {
|
514
|
+
getBoundingClientRect: function () {
|
515
|
+
if (!isLibCanvas) {
|
516
|
+
return canvas.getBoundingClientRect();
|
517
|
+
}
|
518
|
+
}
|
519
|
+
};
|
520
|
+
|
521
|
+
resizer(obj);
|
522
|
+
|
523
|
+
worker.postMessage({
|
524
|
+
resize: {
|
525
|
+
width: obj.width,
|
526
|
+
height: obj.height
|
527
|
+
}
|
528
|
+
});
|
529
|
+
return;
|
530
|
+
}
|
531
|
+
|
532
|
+
// don't actually query the size here, since this
|
533
|
+
// can execute frequently and rapidly
|
534
|
+
size.width = size.height = null;
|
535
|
+
}
|
536
|
+
|
537
|
+
function done() {
|
538
|
+
animationObj = null;
|
539
|
+
|
540
|
+
if (allowResize) {
|
541
|
+
global.removeEventListener('resize', onResize);
|
542
|
+
}
|
543
|
+
|
544
|
+
if (isLibCanvas && canvas) {
|
545
|
+
document.body.removeChild(canvas);
|
546
|
+
canvas = null;
|
547
|
+
initialized = false;
|
548
|
+
}
|
549
|
+
}
|
550
|
+
|
551
|
+
if (allowResize) {
|
552
|
+
global.addEventListener('resize', onResize, false);
|
553
|
+
}
|
554
|
+
|
555
|
+
if (worker) {
|
556
|
+
return worker.fire(options, size, done);
|
557
|
+
}
|
558
|
+
|
559
|
+
return fireLocal(options, size, done);
|
560
|
+
}
|
561
|
+
|
562
|
+
fire.reset = function () {
|
563
|
+
if (worker) {
|
564
|
+
worker.reset();
|
565
|
+
}
|
566
|
+
|
567
|
+
if (animationObj) {
|
568
|
+
animationObj.reset();
|
569
|
+
}
|
570
|
+
};
|
571
|
+
|
572
|
+
return fire;
|
573
|
+
}
|
574
|
+
|
575
|
+
module.exports = confettiCannon(null, { useWorker: true, resize: true });
|
576
|
+
module.exports.create = confettiCannon;
|
577
|
+
}((function () {
|
578
|
+
if (typeof window !== 'undefined') {
|
579
|
+
return window;
|
580
|
+
}
|
581
|
+
|
582
|
+
if (typeof self !== 'undefined') {
|
583
|
+
return self;
|
584
|
+
}
|
585
|
+
|
586
|
+
return this;
|
587
|
+
})(), module, false));
|
588
|
+
|
589
|
+
// end source content
|
590
|
+
|
591
|
+
export default module.exports;
|
592
|
+
export var create = module.exports.create;
|