diff --git a/.gitignore b/.gitignore
index fb45ebd9..b8802665 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,4 +8,6 @@ test/dummy/log/*.log
test/dummy/tmp/
*/.DS_Store
.DS_Store
-.env
\ No newline at end of file
+.env
+node_modules/*
+node_modules
\ No newline at end of file
diff --git a/Gemfile.lock b/Gemfile.lock
index 176fc667..d66a4d4d 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -19,76 +19,87 @@ PATH
simple_xlsx_writer
spina
statesman
+ tailwindcss-rails
valvat
+ view_component
zip-zip
GEM
remote: https://rubygems.org/
specs:
- actioncable (6.0.3.4)
- actionpack (= 6.0.3.4)
+ actioncable (7.0.4.3)
+ actionpack (= 7.0.4.3)
+ activesupport (= 7.0.4.3)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
- actionmailbox (6.0.3.4)
- actionpack (= 6.0.3.4)
- activejob (= 6.0.3.4)
- activerecord (= 6.0.3.4)
- activestorage (= 6.0.3.4)
- activesupport (= 6.0.3.4)
+ actionmailbox (7.0.4.3)
+ actionpack (= 7.0.4.3)
+ activejob (= 7.0.4.3)
+ activerecord (= 7.0.4.3)
+ activestorage (= 7.0.4.3)
+ activesupport (= 7.0.4.3)
mail (>= 2.7.1)
- actionmailer (6.0.3.4)
- actionpack (= 6.0.3.4)
- actionview (= 6.0.3.4)
- activejob (= 6.0.3.4)
+ net-imap
+ net-pop
+ net-smtp
+ actionmailer (7.0.4.3)
+ actionpack (= 7.0.4.3)
+ actionview (= 7.0.4.3)
+ activejob (= 7.0.4.3)
+ activesupport (= 7.0.4.3)
mail (~> 2.5, >= 2.5.4)
+ net-imap
+ net-pop
+ net-smtp
rails-dom-testing (~> 2.0)
- actionpack (6.0.3.4)
- actionview (= 6.0.3.4)
- activesupport (= 6.0.3.4)
- rack (~> 2.0, >= 2.0.8)
+ actionpack (7.0.4.3)
+ actionview (= 7.0.4.3)
+ activesupport (= 7.0.4.3)
+ rack (~> 2.0, >= 2.2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
- actiontext (6.0.3.4)
- actionpack (= 6.0.3.4)
- activerecord (= 6.0.3.4)
- activestorage (= 6.0.3.4)
- activesupport (= 6.0.3.4)
+ actiontext (7.0.4.3)
+ actionpack (= 7.0.4.3)
+ activerecord (= 7.0.4.3)
+ activestorage (= 7.0.4.3)
+ activesupport (= 7.0.4.3)
+ globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
- actionview (6.0.3.4)
- activesupport (= 6.0.3.4)
+ actionview (7.0.4.3)
+ activesupport (= 7.0.4.3)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
- activejob (6.0.3.4)
- activesupport (= 6.0.3.4)
+ activejob (7.0.4.3)
+ activesupport (= 7.0.4.3)
globalid (>= 0.3.6)
- activemodel (6.0.3.4)
- activesupport (= 6.0.3.4)
- activerecord (6.0.3.4)
- activemodel (= 6.0.3.4)
- activesupport (= 6.0.3.4)
- activestorage (6.0.3.4)
- actionpack (= 6.0.3.4)
- activejob (= 6.0.3.4)
- activerecord (= 6.0.3.4)
- marcel (~> 0.3.1)
- activesupport (6.0.3.4)
+ activemodel (7.0.4.3)
+ activesupport (= 7.0.4.3)
+ activerecord (7.0.4.3)
+ activemodel (= 7.0.4.3)
+ activesupport (= 7.0.4.3)
+ activestorage (7.0.4.3)
+ actionpack (= 7.0.4.3)
+ activejob (= 7.0.4.3)
+ activerecord (= 7.0.4.3)
+ activesupport (= 7.0.4.3)
+ marcel (~> 1.0)
+ mini_mime (>= 1.1.0)
+ activesupport (7.0.4.3)
concurrent-ruby (~> 1.0, >= 1.0.2)
- i18n (>= 0.7, < 2)
- minitest (~> 5.1)
- tzinfo (~> 1.1)
- zeitwerk (~> 2.2, >= 2.2.2)
- addressable (2.8.0)
- public_suffix (>= 2.0.2, < 5.0)
- akami (1.3.1)
- gyoku (>= 0.4.0)
- nokogiri
- ancestry (4.0.0)
- activerecord (>= 5.2.4.5)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ addressable (2.8.4)
+ public_suffix (>= 2.0.2, < 6.0)
+ ancestry (4.3.3)
+ activerecord (>= 5.2.6)
ansi (1.5.0)
- bcrypt (3.1.16)
+ attr_json (2.0.1)
+ activerecord (>= 6.0.0, < 7.1)
+ bcrypt (3.1.18)
breadcrumbs_on_rails (4.1.0)
railties (>= 5.0)
builder (3.2.4)
@@ -110,25 +121,25 @@ GEM
coffee-script-source
execjs
coffee-script-source (1.12.2)
- concurrent-ruby (1.1.7)
+ concurrent-ruby (1.2.2)
crass (1.0.6)
- css_parser (1.7.1)
+ css_parser (1.14.0)
addressable
+ date (3.3.3)
delocalize (1.2.0)
rails (>= 2)
descriptive_statistics (2.5.1)
- email_validator (2.2.2)
+ email_validator (2.2.4)
activemodel
- erubi (1.10.0)
- erubis (2.7.0)
- execjs (2.7.0)
+ erubi (1.12.0)
+ execjs (2.8.1)
factory_bot (6.1.0)
activesupport (>= 5.0.0)
fast_xs (0.8.0)
ffi (1.15.5)
formatador (0.2.5)
- globalid (0.4.2)
- activesupport (>= 4.2.0)
+ globalid (1.1.0)
+ activesupport (>= 5.0)
guard (2.16.2)
formatador (>= 0.2.4)
listen (>= 2.7, < 4.0)
@@ -142,155 +153,158 @@ GEM
guard-minitest (2.4.6)
guard-compat (~> 1.2)
minitest (>= 3.0)
- gyoku (1.3.1)
- builder (>= 2.1.2)
- haml (5.2.1)
- temple (>= 0.8.0)
+ haml (6.1.1)
+ temple (>= 0.8.2)
+ thor
tilt
- haml-rails (2.0.1)
+ haml-rails (2.1.0)
actionpack (>= 5.1)
activesupport (>= 5.1)
- haml (>= 4.0.6, < 6.0)
- html2haml (>= 1.0.1)
+ haml (>= 4.0.6)
railties (>= 5.1)
- html2haml (2.2.0)
- erubis (~> 2.7.0)
- haml (>= 4.0, < 6)
- nokogiri (>= 1.6.0)
- ruby_parser (~> 3.5)
- httpi (2.4.5)
- rack
- socksify
- i18n (1.8.5)
+ i18n (1.13.0)
concurrent-ruby (~> 1.0)
- jbuilder (2.11.2)
+ image_processing (1.12.2)
+ mini_magick (>= 4.9.5, < 5)
+ ruby-vips (>= 2.0.17, < 3)
+ jbuilder (2.11.5)
+ actionview (>= 5.0.0)
activesupport (>= 5.0.0)
- jquery-rails (4.4.0)
+ jquery-rails (4.5.1)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
- jsonb_accessor (1.1.0)
+ jsonb_accessor (1.3.7)
activerecord (>= 5.0)
activesupport (>= 5.0)
pg (>= 0.18.1)
- kaminari (1.2.1)
+ kaminari (1.2.2)
activesupport (>= 4.1.0)
- kaminari-actionview (= 1.2.1)
- kaminari-activerecord (= 1.2.1)
- kaminari-core (= 1.2.1)
- kaminari-actionview (1.2.1)
+ kaminari-actionview (= 1.2.2)
+ kaminari-activerecord (= 1.2.2)
+ kaminari-core (= 1.2.2)
+ kaminari-actionview (1.2.2)
actionview
- kaminari-core (= 1.2.1)
- kaminari-activerecord (1.2.1)
+ kaminari-core (= 1.2.2)
+ kaminari-activerecord (1.2.2)
activerecord
- kaminari-core (= 1.2.1)
- kaminari-core (1.2.1)
+ kaminari-core (= 1.2.2)
+ kaminari-core (1.2.2)
listen (3.3.3)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
- loofah (2.10.0)
+ loofah (2.20.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
lumberjack (1.2.8)
- mail (2.7.1)
+ mail (2.8.1)
mini_mime (>= 0.1.1)
- marcel (0.3.3)
- mimemagic (~> 0.3.2)
+ net-imap
+ net-pop
+ net-smtp
+ marcel (1.0.2)
method_source (1.0.0)
- mimemagic (0.3.10)
- nokogiri (~> 1)
- rake
- mini_magick (4.11.0)
- mini_mime (1.0.2)
- mini_portile2 (2.5.3)
- minitest (5.14.2)
+ mini_magick (4.12.0)
+ mini_mime (1.1.2)
+ mini_portile2 (2.8.2)
+ minitest (5.18.0)
minitest-reporters (1.4.2)
ansi
builder
minitest (>= 5.0)
ruby-progressbar
- mobility (1.1.2)
+ mobility (1.1.1)
i18n (>= 0.6.10, < 2)
request_store (~> 1.0)
nenv (0.3.0)
- nio4r (2.5.7)
- nokogiri (1.11.7)
- mini_portile2 (~> 2.5.0)
+ net-imap (0.3.4)
+ date
+ net-protocol
+ net-pop (0.1.2)
+ net-protocol
+ net-protocol (0.2.1)
+ timeout
+ net-smtp (0.3.3)
+ net-protocol
+ nio4r (2.5.9)
+ nokogiri (1.14.3)
+ mini_portile2 (~> 2.8.0)
racc (~> 1.4)
- nori (2.6.0)
notiffany (0.1.3)
nenv (~> 0.1)
shellany (~> 0.0)
pdf-core (0.9.0)
pg (0.21.0)
- pg_search (2.3.5)
+ pg_search (2.3.6)
activerecord (>= 5.2)
activesupport (>= 5.2)
prawn (2.4.0)
pdf-core (~> 0.9.0)
ttfunk (~> 1.7)
- prawn-svg (0.31.0)
+ prawn-svg (0.32.0)
css_parser (~> 1.6)
prawn (>= 0.11.1, < 3)
+ rexml (~> 3.2)
prawn-table (0.2.2)
prawn (>= 1.3.0, < 3.0.0)
pry (0.13.1)
coderay (~> 1.1)
method_source (~> 1.0)
- public_suffix (4.0.6)
+ public_suffix (5.0.1)
puma (5.3.2)
nio4r (~> 2.0)
- racc (1.5.2)
- rack (2.2.3)
+ racc (1.6.2)
+ rack (2.2.7)
rack-rewrite (1.5.1)
- rack-test (1.1.0)
- rack (>= 1.0, < 3)
- rails (6.0.3.4)
- actioncable (= 6.0.3.4)
- actionmailbox (= 6.0.3.4)
- actionmailer (= 6.0.3.4)
- actionpack (= 6.0.3.4)
- actiontext (= 6.0.3.4)
- actionview (= 6.0.3.4)
- activejob (= 6.0.3.4)
- activemodel (= 6.0.3.4)
- activerecord (= 6.0.3.4)
- activestorage (= 6.0.3.4)
- activesupport (= 6.0.3.4)
- bundler (>= 1.3.0)
- railties (= 6.0.3.4)
- sprockets-rails (>= 2.0.0)
+ rack-test (2.1.0)
+ rack (>= 1.3)
+ rails (7.0.4.3)
+ actioncable (= 7.0.4.3)
+ actionmailbox (= 7.0.4.3)
+ actionmailer (= 7.0.4.3)
+ actionpack (= 7.0.4.3)
+ actiontext (= 7.0.4.3)
+ actionview (= 7.0.4.3)
+ activejob (= 7.0.4.3)
+ activemodel (= 7.0.4.3)
+ activerecord (= 7.0.4.3)
+ activestorage (= 7.0.4.3)
+ activesupport (= 7.0.4.3)
+ bundler (>= 1.15.0)
+ railties (= 7.0.4.3)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
- rails-html-sanitizer (1.3.0)
- loofah (~> 2.3)
- railties (6.0.3.4)
- actionpack (= 6.0.3.4)
- activesupport (= 6.0.3.4)
+ rails-html-sanitizer (1.5.0)
+ loofah (~> 2.19, >= 2.19.1)
+ railties (7.0.4.3)
+ actionpack (= 7.0.4.3)
+ activesupport (= 7.0.4.3)
method_source
- rake (>= 0.8.7)
- thor (>= 0.20.3, < 2.0)
- rake (13.0.3)
- ransack (2.4.1)
- activerecord (>= 5.2.4)
- activesupport (>= 5.2.4)
+ rake (>= 12.2)
+ thor (~> 1.0)
+ zeitwerk (~> 2.5)
+ rake (13.0.6)
+ ransack (4.0.0)
+ activerecord (>= 6.1.5)
+ activesupport (>= 6.1.5)
i18n
rb-fsevent (0.10.4)
rb-inotify (0.10.1)
ffi (~> 1.0)
regexp_parser (1.8.2)
- request_store (1.5.0)
+ request_store (1.5.1)
rack (>= 1.4)
- rqrcode (1.2.0)
+ rexml (3.2.5)
+ rqrcode (2.1.2)
chunky_png (~> 1.0)
- rqrcode_core (~> 0.2)
- rqrcode_core (0.2.0)
- ruby-measurement (1.2.3)
+ rqrcode_core (~> 1.0)
+ rqrcode_core (1.2.0)
+ ruby-measurement (1.3.0)
ruby-progressbar (1.10.1)
- ruby_parser (3.15.1)
- sexp_processor (~> 4.9)
- rubyzip (2.3.0)
+ ruby-vips (2.1.4)
+ ffi (~> 1.12)
+ rubyzip (2.3.2)
sass-rails (6.0.0)
sassc-rails (~> 2.1, >= 2.1.1)
sassc (2.4.0)
@@ -301,69 +315,62 @@ GEM
sprockets (> 3.0)
sprockets-rails
tilt
- savon (2.12.1)
- akami (~> 1.2)
- builder (>= 2.1.2)
- gyoku (~> 1.2)
- httpi (~> 2.3)
- nokogiri (>= 1.8.1)
- nori (~> 2.4)
- wasabi (~> 3.4)
selenium-webdriver (3.142.7)
childprocess (>= 0.5, < 4.0)
rubyzip (>= 1.2.2)
- sexp_processor (4.15.2)
shellany (0.0.1)
simple_xlsx_writer (0.5.3)
fast_xs (>= 0.7.3)
rubyzip (>= 0.9.4)
- socksify (1.7.1)
- spina (1.2.0)
+ spina (2.0.2)
ancestry
+ attr_json
bcrypt
breadcrumbs_on_rails
coffee-rails
haml-rails
+ image_processing
jquery-rails
jsonb_accessor (>= 1.0.0)
kaminari
- mini_magick
- mobility (>= 0.8.9)
+ mobility (= 1.1.1)
pg
rack-rewrite (>= 1.5.0)
- rails (>= 5.2)
+ rails (>= 6.0)
sass-rails
turbolinks (~> 5)
- sprockets (4.0.2)
+ sprockets (4.2.0)
concurrent-ruby (~> 1.0)
- rack (> 1, < 3)
- sprockets-rails (3.2.2)
- actionpack (>= 4.0)
- activesupport (>= 4.0)
+ rack (>= 2.2.4, < 4)
+ sprockets-rails (3.4.2)
+ actionpack (>= 5.2)
+ activesupport (>= 5.2)
sprockets (>= 3.0.0)
- statesman (8.0.0)
- temple (0.8.2)
- thor (1.0.1)
- thread_safe (0.3.6)
- tilt (2.0.10)
+ statesman (10.2.2)
+ tailwindcss-rails (2.0.29)
+ railties (>= 6.0.0)
+ temple (0.10.0)
+ thor (1.2.1)
+ tilt (2.1.0)
+ timeout (0.3.2)
ttfunk (1.7.0)
turbolinks (5.2.1)
turbolinks-source (~> 5.2)
turbolinks-source (5.2.0)
- tzinfo (1.2.8)
- thread_safe (~> 0.1)
- valvat (1.0.1)
- savon (>= 2.3.0)
- wasabi (3.6.1)
- addressable
- httpi (~> 2.0)
- nokogiri (>= 1.4.2)
+ tzinfo (2.0.6)
+ concurrent-ruby (~> 1.0)
+ valvat (1.3.0)
+ rexml (>= 3.2, < 4.0)
+ view_component (3.0.0)
+ activesupport (>= 5.2.0, < 8.0)
+ concurrent-ruby (~> 1.0)
+ method_source (~> 1.0)
websocket-driver (0.7.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
xpath (3.2.0)
nokogiri (~> 1.8)
- zeitwerk (2.4.2)
+ zeitwerk (2.6.8)
zip-zip (0.3)
rubyzip (>= 1.0.0)
diff --git a/app/assets/javascripts/spina/shop/admin/controllers/filter_controller.js b/app/assets/javascripts/spina/shop/admin/controllers/filter_controller.js
new file mode 100644
index 00000000..e86bda6f
--- /dev/null
+++ b/app/assets/javascripts/spina/shop/admin/controllers/filter_controller.js
@@ -0,0 +1,37 @@
+(() => {
+ const application = Stimulus.Application.start()
+
+ application.register("filter", class extends Stimulus.Controller {
+ static get targets() {
+ return ["form", "submitButton"]
+ }
+
+ delayedSubmit = debounce(function() {
+ this.submitButtonTarget.click()
+ }.bind(this), 300)
+
+ submit(event) {
+ this.delayedSubmit()
+ }
+
+ })
+})()
+
+// Returns a function, that, as long as it continues to be invoked, will not
+// be triggered. The function will be called after it stops being called for
+// N milliseconds. If `immediate` is passed, trigger the function on the
+// leading edge, instead of the trailing.
+function debounce(func, wait, immediate) {
+ var timeout;
+ return function() {
+ var context = this, args = arguments;
+ var later = function() {
+ timeout = null;
+ if (!immediate) func.apply(context, args);
+ };
+ var callNow = immediate && !timeout;
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ if (callNow) func.apply(context, args);
+ };
+};
\ No newline at end of file
diff --git a/app/assets/stylesheets/spina/shop/application.tailwind.css b/app/assets/stylesheets/spina/shop/application.tailwind.css
new file mode 100644
index 00000000..7617222d
--- /dev/null
+++ b/app/assets/stylesheets/spina/shop/application.tailwind.css
@@ -0,0 +1,201 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+/* Configuration */
+@layer base {
+ :root {
+ --animate-duration: 600ms;
+ }
+
+ html {
+ @apply font-body;
+ }
+
+ body {
+ background: #F5F5FA; /* Ever so slightly indigo bg */
+ @apply antialiased;
+ }
+
+ /* Disable tap highlight on iOS */
+ a, button {
+ -webkit-tap-highlight-color: rgba(0,0,0,0);
+ }
+}
+
+/* Components */
+@layer components {
+ /* Buttons */
+ .btn {
+ @apply flex items-center justify-center rounded-md border;
+ @apply h-9 px-4;
+ @apply text-sm font-medium leading-none whitespace-nowrap;
+ @apply transition-colors duration-200;
+ @apply cursor-pointer;
+ }
+
+ .btn-default {
+ @apply text-gray-700 bg-white shadow-sm border-gray-300;
+ }
+
+ .btn-default:hover {
+ @apply bg-gray-50;
+ }
+
+ .btn-default:active {
+ @apply shadow-inner bg-gray-100;
+ }
+
+ .btn-primary {
+ @apply bg-spina border-spina-dark text-white;
+ }
+
+ .btn-primary:hover {
+ @apply bg-spina-dark;
+ }
+
+ .btn-red {
+ @apply bg-red-500 border-red-500;
+ @apply text-white;
+ }
+
+ .btn.btn-red:hover {
+ @apply bg-red-600 border-red-600;
+ }
+
+ .btn.btn-red:active {
+ @apply bg-red-600 border-red-600 shadow-inner;
+ }
+
+ .btn-gray {
+ @apply border-gray-300;
+ @apply text-gray-800;
+ @apply bg-gray-300;
+ }
+
+ .btn-gray:hover {
+ @apply bg-gray-400 border-gray-400 bg-opacity-75;
+ }
+
+ .btn-gray:active {
+ @apply bg-gray-400 border-gray-400 bg-opacity-75 shadow-inner;
+ }
+
+ .btn-green {
+ @apply bg-green-500;
+ }
+
+ /* Forms */
+ .form-input, .form-select {
+ /* @apply py-3 px-4; */
+ @apply text-gray-700;
+ @apply shadow-sm;
+ @apply transition duration-150 ease-in-out;
+ @apply border-gray-300;
+ @apply rounded-md;
+ }
+
+ .form-input::placeholder {
+ @apply text-gray-400;
+ }
+
+ .form-select {
+ @apply text-sm font-medium;
+ @apply pr-12;
+ }
+
+ .form-select:focus {
+ @apply border-spina-light;
+ @apply ring-spina-light;
+ }
+
+ .form-textarea {
+ @apply bg-white;
+ @apply text-gray-700;
+ @apply shadow-sm;
+ @apply transition duration-150 ease-in-out;
+ @apply border border-gray-300;
+ @apply rounded-md;
+ }
+
+ .form-input:focus {
+ @apply border-spina-light;
+ @apply ring-spina-light
+ }
+
+ /* Modals */
+ /*
+ .modal {
+ @apply flex items-center justify-center;
+ @apply fixed z-40 inset-0 h-full p-6;
+ }
+
+ .modal-window {
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px);
+ @apply w-full max-w-lg overflow-hidden relative;
+ @apply bg-white bg-opacity-75 shadow-lg rounded-xl;
+ @apply border border-gray-400;
+ } */
+
+ /* Trix */
+ .trix-toolbar {
+ button[data-trix-active] {
+ @apply text-white bg-spina;
+ }
+
+ button[disabled] {
+ @apply bg-gray-100 text-gray-400;
+ }
+ }
+
+ trix-editor {
+
+ [data-trix-mutable]:not(.attachment__captain-editor) {
+ @apply select-none
+ }
+
+ figure.attachment {
+ @apply m-0 inline-block
+ }
+
+ figure.attachment[data-trix-content-type="Spina::Image"] {
+ max-height: 150px;
+ max-width: 200px;
+ }
+
+ figure.attachment[data-trix-content-type="Spina::Image"] img {
+ @apply m-0 rounded-md object-contain;
+ }
+
+ figure.attachment[data-trix-content-type="Spina::Image"] [data-label]:after {
+ content: attr(data-label);
+ @apply italic text-gray-500 h-8 flex items-center px-2 mt-1 text-sm;
+ }
+
+ figure[data-trix-mutable].attachment[data-trix-content-type="Spina::Image"] img {
+ @apply shadow-lg ring ring-spina-light
+ }
+
+ figure[data-trix-mutable][data-trix-content-type="application/vnd+spina.embed+html"].attachment > spina-embed {
+ @apply block;
+ @apply shadow-lg ring ring-spina-light rounded-md;
+ }
+
+ figure .attachment__caption {
+ @apply hidden
+ }
+
+ figure .attachment__toolbar {
+ @apply hidden
+ }
+
+ }
+
+ trix-editor [data-trix-mutable]::-moz-selection,
+ trix-editor [data-trix-cursor-target]::-moz-selection, trix-editor [data-trix-mutable] ::-moz-selection {
+ background: none; }
+ trix-editor [data-trix-mutable]::selection,
+ trix-editor [data-trix-cursor-target]::selection, trix-editor [data-trix-mutable] ::selection {
+ background: none; }
+}
diff --git a/app/components/spina/shop/application_component.rb b/app/components/spina/shop/application_component.rb
new file mode 100644
index 00000000..ed277fc1
--- /dev/null
+++ b/app/components/spina/shop/application_component.rb
@@ -0,0 +1,4 @@
+module Spina::Shop
+ class ApplicationComponent < ViewComponent::Base
+ end
+end
\ No newline at end of file
diff --git a/app/components/spina/shop/orders/progress_component.html.erb b/app/components/spina/shop/orders/progress_component.html.erb
new file mode 100644
index 00000000..a4eba90f
--- /dev/null
+++ b/app/components/spina/shop/orders/progress_component.html.erb
@@ -0,0 +1,19 @@
+<% if cancelled_or_failed? %>
+
+
+ <%= label %>
+
+
+<% else %>
+
+
+ <% 4.times do %>
+
+ <% end %>
+
+
+
+
+
<%= label %>
+
+<% end %>
\ No newline at end of file
diff --git a/app/components/spina/shop/orders/progress_component.rb b/app/components/spina/shop/orders/progress_component.rb
new file mode 100644
index 00000000..729d3467
--- /dev/null
+++ b/app/components/spina/shop/orders/progress_component.rb
@@ -0,0 +1,65 @@
+module Spina::Shop
+ module Orders
+ class ProgressComponent < ApplicationComponent
+ attr_reader :order
+
+ def initialize(order)
+ @order = order
+ end
+
+ def label
+ I18n.t("spina.shop.orders.states.#{order.current_state}")
+ end
+
+ def cancelled_or_failed?
+ order.current_state.in? %w(failed cancelled)
+ end
+
+ private
+
+ def classes
+ "#{bg_color} #{text_color} py-0.5 px-1 inline-block rounded whitespace-nowrap overflow-ellipsis overflow-hidden"
+ end
+
+ def text_color
+ case order.status_css_class
+ when "success"
+ "text-white"
+ when "primary"
+ "text-white"
+ when "danger"
+ "text-red-500"
+ else
+ "text-gray-700"
+ end
+ end
+
+ def border_color
+ case order.status_css_class
+ when "success"
+ "border-green-500"
+ when "primary"
+ "border-spina"
+ when "danger"
+ "border-red-300"
+ else
+ "border-gray-400"
+ end
+ end
+
+ def bg_color
+ case order.status_css_class
+ when "success"
+ "bg-green-500 bg-opacity-50"
+ when "primary"
+ "bg-spina bg-opacity-50"
+ when "danger"
+ "bg-red-300 bg-opacity-50"
+ else
+ "bg-gray-400 bg-opacity-50"
+ end
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/components/spina/shop/user_interface/filter_component.html.erb b/app/components/spina/shop/user_interface/filter_component.html.erb
new file mode 100644
index 00000000..85210594
--- /dev/null
+++ b/app/components/spina/shop/user_interface/filter_component.html.erb
@@ -0,0 +1,30 @@
+
+
+
+
+ <% options.each do |option| %>
+ <% if option.is_a? Array %>
+ <% value = option[1] %>
+ <% label = option[0] %>
+ <% else %>
+ <% value = label = option %>
+ <% end %>
+
+ <% if radio %>
+ <%= f.radio_button name, value, {class: 'appearance-none border-gray-300 hover:border-gray-400 shadow-sm rounded-full checked:bg-spina hover:checked:bg-spina', data: {action: "filter#submit"}} %>
+ <% else %>
+ <%= f.check_box name, {class: 'appearance-none border-gray-300 hover:border-gray-400 shadow-sm rounded checked:bg-spina hover:checked:bg-spina', multiple: true, data: {action: "filter#submit"}}, value, nil %>
+ <% end %>
+
+
+ <%= label %>
+
+
+ <% end %>
+
+
\ No newline at end of file
diff --git a/app/components/spina/shop/user_interface/filter_component.rb b/app/components/spina/shop/user_interface/filter_component.rb
new file mode 100644
index 00000000..7d3840d8
--- /dev/null
+++ b/app/components/spina/shop/user_interface/filter_component.rb
@@ -0,0 +1,18 @@
+module Spina::Shop
+ module UserInterface
+ class FilterComponent < ApplicationComponent
+ attr_reader :label, :name, :options, :f
+ attr_reader :radio
+
+ def initialize(f, label, name, options, radio: false)
+ @f, @label, @name, @options = f, label, name, options
+ @radio = radio
+ end
+
+ def render?
+ options.any?
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/spina/shop/admin/orders_controller.rb b/app/controllers/spina/shop/admin/orders_controller.rb
index ab141c60..84f846a9 100644
--- a/app/controllers/spina/shop/admin/orders_controller.rb
+++ b/app/controllers/spina/shop/admin/orders_controller.rb
@@ -85,31 +85,58 @@ def transition
# end
def index
- @orders = Order.confirmed.includes(:order_items, :order_transitions, :delivery_option, :store).sorted
- filter_orders
+ orders = Order.confirmed.includes(:order_items, :order_transitions, :delivery_option, :store).sorted
+
+ if params[:query].present?
+ orders = orders.search(params[:query])
+ end
+
+ if params[:status].present?
+ orders = orders.in_state(params[:status])
+ end
+
+ if params[:billing_country_id].present?
+ orders = orders.where(billing_country_id: params[:billing_country_id])
+ end
+
+ if params[:pos].present?
+ orders = orders.where(pos: params[:pos])
+ end
+
+ if params[:delivery_option_id].present?
+ orders = orders.where(delivery_option_id: params[:delivery_option_id])
+ end
+
+ if params[:discount_id].present?
+ orders = orders.joins(:discount).where(spina_shop_discounts: {id: params[:discount_id]}).distinct
+ end
+
+ if params[:order].present?
+ orders = orders.reorder(params[:order])
+ end
+
+ if params[:received_at_gt].present?
+ begin
+ date = Date.parse(params[:received_at_gt])
+ orders = orders.where("received_at::date >= ?", date)
+ rescue
+ end
+ end
+
+ if params[:received_at_lt].present?
+ begin
+ date = Date.parse(params[:received_at_lt])
+ orders = orders.where("received_at::date <= ?", date)
+ rescue
+ end
+ end
+
+ @all_orders = orders.distinct
+ @orders = orders.page(params[:page]).per(25)
end
def concepts
- @orders = Spina::Shop::Order.concept.includes(:order_items, :order_transitions).sorted
- filter_orders
- render :index
- end
-
- def to_process
- @orders = Order.to_process.includes(:order_items, :order_transitions).sorted
- filter_orders
- render :index
- end
-
- def ready_for_pickup_orders
- @orders = Order.in_state(:ready_for_pickup).includes(:order_items, :order_transitions).sorted
- filter_orders
- render :index
- end
-
- def failed
- @orders = Order.in_state(:failed).includes(:order_items, :order_transitions).sorted
- filter_orders
+ @orders = Spina::Shop::Order.concept.includes(:order_items, :order_transitions, :order_attachments).order(created_at: :desc).page(params[:page]).per(50)
render :index
end
@@ -191,7 +218,7 @@ def filter_orders
@advanced_filter = advanced_filters.values.any?(&:present?)
# Pagination
- @orders = @orders.page(params[:page]).per(15)
+ @orders = @orders.page(params[:page]).per(100)
end
def order_params
diff --git a/app/models/spina/shop/country.rb b/app/models/spina/shop/country.rb
index bfbcd5a1..2d0d9958 100644
--- a/app/models/spina/shop/country.rb
+++ b/app/models/spina/shop/country.rb
@@ -1,5 +1,44 @@
module Spina::Shop
class Country < Zone
has_many :customers, dependent: :restrict_with_exception
+
+ def flag
+ case code.to_s.downcase
+ when "nl"
+ "🇳🇱"
+ when "de"
+ "🇩🇪"
+ when "fr"
+ "🇫🇷"
+ when "be"
+ "🇧🇪"
+ when "es"
+ "🇪🇸"
+ when "at"
+ "🇦🇹"
+ when "ch"
+ "🇨ðŸ‡"
+ when "gb"
+ "🇬🇧"
+ when "it"
+ "🇮🇹"
+ when "lu"
+ "🇱🇺"
+ when "se"
+ "🇸🇪"
+ when "fi"
+ "🇫🇮"
+ when "hu"
+ "ðŸ‡ðŸ‡º"
+ when "pt"
+ "🇵🇹"
+ when "pl"
+ "🇵🇱"
+ when "dk"
+ "🇩🇰"
+ else
+ code
+ end
+ end
end
end
\ No newline at end of file
diff --git a/app/views/spina/admin/hooks/shop/_head.html.haml b/app/views/spina/admin/hooks/shop/_head.html.haml
index 8580315a..39edadad 100644
--- a/app/views/spina/admin/hooks/shop/_head.html.haml
+++ b/app/views/spina/admin/hooks/shop/_head.html.haml
@@ -1,2 +1,3 @@
+= stylesheet_link_tag "spina/shop/tailwind", data: {turbolinks_track: true}
= stylesheet_link_tag 'spina/shop/admin/shop', data: {turbolinks_track: true}
= javascript_include_tag 'spina/shop/admin/shop', data: {turbolinks_track: true}
\ No newline at end of file
diff --git a/app/views/spina/shop/admin/orders/_custom_fields.html.erb b/app/views/spina/shop/admin/orders/_custom_fields.html.erb
new file mode 100644
index 00000000..da85c48b
--- /dev/null
+++ b/app/views/spina/shop/admin/orders/_custom_fields.html.erb
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/views/spina/shop/admin/orders/_custom_headers.html.erb b/app/views/spina/shop/admin/orders/_custom_headers.html.erb
new file mode 100644
index 00000000..d03f13c6
--- /dev/null
+++ b/app/views/spina/shop/admin/orders/_custom_headers.html.erb
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/views/spina/shop/admin/orders/_custom_name.html.erb b/app/views/spina/shop/admin/orders/_custom_name.html.erb
new file mode 100644
index 00000000..a0f301ba
--- /dev/null
+++ b/app/views/spina/shop/admin/orders/_custom_name.html.erb
@@ -0,0 +1,13 @@
+<% if order.company.present? %>
+ <%= order.company %>
+<% else %>
+ <%= order.full_name %>
+<% end %>
+
+<% unless order.customer.customer_account %>
+ (gast)
+<% end %>
+
+<% if order.first_order_for_email? %>
+ <%=t 'spina.shop.orders.first_order_for_email' %>
+<% end %>
\ No newline at end of file
diff --git a/app/views/spina/shop/admin/orders/_order.html.erb b/app/views/spina/shop/admin/orders/_order.html.erb
new file mode 100644
index 00000000..7dd79899
--- /dev/null
+++ b/app/views/spina/shop/admin/orders/_order.html.erb
@@ -0,0 +1,43 @@
+<% cache order do %>
+ <%= link_to spina.shop_admin_order_path(order), class: "table-row text-sm font-medium px-4 py-2 space-x-6 hover:bg-gray-100 hover:text-gray-900 font-body group" do %>
+
+
+
+
+
+ <%= order.order_number %>
+
+
+
+ <%= order.billing_country.code %>
+
+
+
+
+
+
+ <% if order.customer %>
+ <%= render partial: 'spina/shop/admin/orders/custom_name', locals: {order: order} %>
+ <% end %>
+
+
+
+ <%= number_to_currency order.total %>
+
+
+ <%= render partial: "spina/shop/admin/orders/custom_fields", locals: {order: order} %>
+
+
+ <%= render Spina::Shop::Orders::ProgressComponent.new(order) %>
+
+
+
+ <% date = order.received_at || order.confirming_at || order.created_at %>
+ <%=l(date, format: "%e %b. %y") %>
+
+
+ <% date = order.received_at || order.confirming_at || order.created_at %>
+ <%=l(date, format: "%H:%M") %>
+
+ <% end %>
+<% end %>
\ No newline at end of file
diff --git a/app/views/spina/shop/admin/orders/_order.html.haml b/app/views/spina/shop/admin/orders/_order_backup.html.haml
similarity index 100%
rename from app/views/spina/shop/admin/orders/_order.html.haml
rename to app/views/spina/shop/admin/orders/_order_backup.html.haml
diff --git a/app/views/spina/shop/admin/orders/_totals.html.erb b/app/views/spina/shop/admin/orders/_totals.html.erb
new file mode 100644
index 00000000..cdd26894
--- /dev/null
+++ b/app/views/spina/shop/admin/orders/_totals.html.erb
@@ -0,0 +1,3 @@
+
+ <%= @all_orders.count %> orders
+
\ No newline at end of file
diff --git a/app/views/spina/shop/admin/orders/index.html.erb b/app/views/spina/shop/admin/orders/index.html.erb
new file mode 100644
index 00000000..ffedd1d1
--- /dev/null
+++ b/app/views/spina/shop/admin/orders/index.html.erb
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+ <%= render_breadcrumbs %>
+
+
+
+
+
+ <%= link_to spina.shop_admin_orders_path, class: "block px-3 leading-relaxed py-1 hover:text-gray-800 rounded-md text-gray-400 font-medium text-sm flex items-center #{'cursor-default text-gray-900 bg-spina-dark bg-opacity-10' if action_name == "index"}" do %>
+
+
+
+ Alle bestellingen
+ <% end %>
+
+ <%= link_to spina.concepts_shop_admin_orders_path, class: "block px-3 leading-relaxed py-1 hover:text-gray-800 rounded-md text-gray-400 font-medium text-sm flex items-center #{'cursor-default text-gray-900 bg-spina-dark bg-opacity-10' if action_name == "concepts"}" do %>
+ Concepten
+ <% end %>
+
+
+
+
+
+ <%= link_to 'Nieuwe bestelling', spina.new_shop_admin_order_path, class: 'btn btn-default' %>
+
+
+
+
+ <% if action_name == "index" %>
+
+ <%= form_with url: spina.shop_admin_orders_path, method: :get, data: {target: "filter.form"} do |f| %>
+ <%= button_tag "Filter", type: :submit, class: "hidden", data: {target: "filter.submitButton"} %>
+
+
+
+ <%= f.search_field :query, value: params[:query], placeholder: "Zoeken op klant of ordernummer...", class: "form-input font-medium block w-full h-10", style: "padding: 0 14px; box-sizing: border-box; border-radius: 5px; box-shadow: 0 1px 2px rgba(0, 0, 0, .05); border-color: #d1d5db", autocomplete: "off", data: {action: "input->filter#submit"} %>
+
+
+
+
+
+ <%= render Spina::Shop::UserInterface::FilterComponent.new(f, "Status", :status, ([:confirming, :received, :paid, :preparing, :ready_for_shipment, :shipped, :ready_for_pickup, :picked_up, :delivered, :failed, :cancelled, :refunded].map{|state| [t("spina.shop.orders.states.#{state}"), state]})) %>
+
+ <% if false %>
+ <%= render Spina::Shop::UserInterface::FilterComponent.new(f, "Periode", :date, ["Elke datum"]) %>
+ <% end %>
+
+ <%= render Spina::Shop::UserInterface::FilterComponent.new(f, "Webshop", :store_id, Spina::Shop::Store.order(:name).pluck(:name, :id)) %>
+
+ <%= render Spina::Shop::UserInterface::FilterComponent.new(f, "Land", :billing_country_id, Spina::Shop::Country.order(:name).pluck(:name, :id)) %>
+
+ <%= render Spina::Shop::UserInterface::FilterComponent.new(f, "Verzending", :delivery_option_id, Spina::Shop::DeliveryOption.pluck(:name, :id)) %>
+
+ <%= render Spina::Shop::UserInterface::FilterComponent.new(f, "POS", :pos, [["Alleen winkel", true], ["Alleen webshop", false]], radio: true) %>
+
+
+
+ <%= f.text_field :received_at_gt, placeholder: "Vanaf", class: "form-input font-medium block w-full h-9", style: "padding: 0 10px; box-sizing: border-box; border-radius: 5px; box-shadow: 0 1px 2px rgba(0, 0, 0, .05); border-color: #d1d5db", data: {action: "filter#submit"} %>
+ <%= f.text_field :received_at_lt, placeholder: "T/m", class: "form-input font-medium block w-full h-9", style: "padding: 0 10px; box-sizing: border-box; border-radius: 5px; box-shadow: 0 1px 2px rgba(0, 0, 0, .05); border-color: #d1d5db", data: {action: "filter#submit"} %>
+
+
+
+
+
+
+
+
+
+ <% [["Nieuwste eerst", "order_number DESC"], ["Oudste eerst", "order_number ASC"]].each.with_index do |order, index| %>
+
+ <%= f.radio_button :order, order[1], class: 'border-gray-300 hover:border-gray-400 shadow-sm checked:bg-spina hover:checked:bg-spina', checked: index.zero?, data: {action: "filter#submit"} %>
+ <%= order[0] %>
+
+ <% end %>
+
+
+
+ <% end %>
+
+ <% end %>
+
+
+
+
+
diff --git a/app/views/spina/shop/admin/orders/index.js.erb b/app/views/spina/shop/admin/orders/index.js.erb
index 91d0749a..a29f1f74 100644
--- a/app/views/spina/shop/admin/orders/index.js.erb
+++ b/app/views/spina/shop/admin/orders/index.js.erb
@@ -1,4 +1,11 @@
-$("<%=j render partial: 'order', collection: @orders.to_a.uniq %>").appendTo($(".infinite-table table tbody"));
+<% if params[:page].present? %>
+ document.querySelector(".records").insertAdjacentHTML("beforeend", "<%=j render collection: @orders, partial: 'spina/shop/admin/orders/order' %>")
+<% else %>
+ document.querySelector(".records").innerHTML = "<%=j render collection: @orders, partial: 'spina/shop/admin/orders/order' %>"
+<% end %>
-// Update pagination link
-$('.pagination').html("<%=j link_to_next_page @orders, 'Next' %>").infiniteScroll();
+document.querySelector(".pagination").innerHTML = "<%=j link_to_next_page @orders, "Volgende", data: {remote: true} %>"
+
+document.getElementById("totals").innerHTML = "<%=j render 'totals' %>"
+
+$(".pagination").infiniteScroll()
\ No newline at end of file
diff --git a/app/views/spina/shop/admin/orders/index.html.haml b/app/views/spina/shop/admin/orders/index_backup.html.haml
similarity index 100%
rename from app/views/spina/shop/admin/orders/index.html.haml
rename to app/views/spina/shop/admin/orders/index_backup.html.haml
diff --git a/lib/generators/spina/shop/tailwind_config_generator.rb b/lib/generators/spina/shop/tailwind_config_generator.rb
new file mode 100644
index 00000000..f9950494
--- /dev/null
+++ b/lib/generators/spina/shop/tailwind_config_generator.rb
@@ -0,0 +1,12 @@
+module Spina
+ module Shop
+ class TailwindConfigGenerator < Rails::Generators::Base
+ source_root File.expand_path("../templates", __FILE__)
+
+ def create_tailwind_config_file
+ template 'app/assets/config/spina/shop/tailwind.config.js'
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/lib/generators/spina/shop/templates/app/assets/config/spina/shop/tailwind.config.js.tt b/lib/generators/spina/shop/templates/app/assets/config/spina/shop/tailwind.config.js.tt
new file mode 100644
index 00000000..fbb72b6e
--- /dev/null
+++ b/lib/generators/spina/shop/templates/app/assets/config/spina/shop/tailwind.config.js.tt
@@ -0,0 +1,31 @@
+module.exports = {
+ content: [
+ "<%= Spina::Shop::Engine.root %>/app/views/**/*.*",
+ "<%= Spina::Shop::Engine.root %>/app/components/**/*.*",
+ "<%= Spina::Shop::Engine.root %>/app/helpers/**/*.*",
+ "<%= Spina::Shop::Engine.root %>/app/**/application.tailwind.css",
+ "app/views/**/*.*",
+ "app/components/**/*.*",
+ "app/helpers/**/*.*"
+ ],
+ theme: {
+ fontFamily: {
+ body: ['Metropolis'],
+ mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', "Liberation Mono", "Courier New", 'monospace']
+ },
+ extend: {
+ colors: {
+ spina: {
+ light: '#797ab8',
+ DEFAULT: '#6865b4',
+ dark: '#3a3a70'
+ }
+ }
+ }
+ },
+ plugins: [
+ require('@tailwindcss/forms'),
+ require('@tailwindcss/aspect-ratio'),
+ require('@tailwindcss/typography'),
+ ]
+}
\ No newline at end of file
diff --git a/lib/spina/shop/engine.rb b/lib/spina/shop/engine.rb
index ed8b183a..7eb2e569 100644
--- a/lib/spina/shop/engine.rb
+++ b/lib/spina/shop/engine.rb
@@ -11,6 +11,7 @@
require "valvat"
require "pg_search"
require "jbuilder"
+require "view_component"
module Spina
module Shop
diff --git a/lib/spina/shop/railtie.rb b/lib/spina/shop/railtie.rb
index 1fb4e9c7..beb5c6cd 100644
--- a/lib/spina/shop/railtie.rb
+++ b/lib/spina/shop/railtie.rb
@@ -23,7 +23,7 @@ class Railtie < Rails::Railtie
end
initializer "spina_shop.assets.precompile" do |app|
- app.config.assets.precompile += %w(spina/shop/admin/shop.js spina/shop/admin/shop.css spina/shop/delete-big.png spina/shop/delete-big-confirm.png)
+ app.config.assets.precompile += %w(spina/shop/admin/shop.js spina/shop/admin/shop.css spina/shop/delete-big.png spina/shop/delete-big-confirm.png spina/shop/tailwind.css)
end
end
diff --git a/lib/tasks/spina/shop.rake b/lib/tasks/spina/shop.rake
index fd5a8266..6a7c0883 100644
--- a/lib/tasks/spina/shop.rake
+++ b/lib/tasks/spina/shop.rake
@@ -1,4 +1,7 @@
namespace :spina_shop do
+
+
+
task import_countries: :environment do
Spina::Shop::CountryImporter.import
end
diff --git a/lib/tasks/spina/shop/tailwind.rake b/lib/tasks/spina/shop/tailwind.rake
new file mode 100644
index 00000000..8f0fc769
--- /dev/null
+++ b/lib/tasks/spina/shop/tailwind.rake
@@ -0,0 +1,25 @@
+require 'tailwindcss-rails'
+
+SPINA_SHOP_TAILWIND_COMPILE_COMMAND = "#{Tailwindcss::Engine.root.join("exe/tailwindcss")} -i #{Spina::Shop::Engine.root.join("app/assets/stylesheets/spina/shop/application.tailwind.css")} -o #{Rails.root.join("app/assets/builds", "spina/shop/tailwind.css")} -c #{Rails.root.join("app/assets/config/spina/shop/tailwind.config.js")}"
+
+namespace :spina do
+ namespace :shop do
+ namespace :tailwind do
+
+ task :build do
+ Rails::Generators.invoke("spina:shop:tailwind_config", ["--force"])
+ system SPINA_SHOP_TAILWIND_COMPILE_COMMAND
+ end
+
+ task :watch do
+ Rails::Generators.invoke("spina:shop:tailwind_config", ["--force"])
+ system "#{SPINA_SHOP_TAILWIND_COMPILE_COMMAND} -w"
+ end
+
+ end
+ end
+end
+
+if Rake::Task.task_defined?("assets:precompile")
+ Rake::Task["assets:precompile"].enhance(["spina:shop:tailwind:build"])
+end
\ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..7e7b80df
--- /dev/null
+++ b/package.json
@@ -0,0 +1,13 @@
+{
+ "name": "spina-shop",
+ "private": true,
+ "dependencies": {
+ "@tailwindcss/forms": "^0.2.1",
+ "@tailwindcss/typography": "^0.3.1",
+ "autoprefixer": "^10.2.1",
+ "postcss": "^8.2.10",
+ "tailwindcss": "^2.2.7",
+ "tailwindcss-cli": "^0.1.2"
+ },
+ "version": "2.0.0.alpha"
+}
diff --git a/spina-shop.gemspec b/spina-shop.gemspec
index 11fc22d5..3f192b36 100644
--- a/spina-shop.gemspec
+++ b/spina-shop.gemspec
@@ -35,6 +35,8 @@ Gem::Specification.new do |s|
s.add_dependency "pg_search"
s.add_dependency "descriptive_statistics"
s.add_dependency "jbuilder"
+ s.add_dependency "view_component"
+ s.add_dependency "tailwindcss-rails"
s.add_development_dependency 'minitest-reporters'
s.add_development_dependency 'guard'
diff --git a/yarn-error.log b/yarn-error.log
new file mode 100644
index 00000000..cf982a1b
--- /dev/null
+++ b/yarn-error.log
@@ -0,0 +1,42 @@
+Arguments:
+ /opt/homebrew/Cellar/node/17.0.1/bin/node /opt/homebrew/bin/yarn install
+
+PATH:
+ /Users/bram/.rbenv/shims:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
+
+Yarn version:
+ 1.22.17
+
+Node version:
+ 17.0.1
+
+Platform:
+ darwin arm64
+
+Trace:
+ Error: unable to get local issuer certificate
+ at TLSSocket.onConnectSecure (node:_tls_wrap:1530:34)
+ at TLSSocket.emit (node:events:390:28)
+ at TLSSocket._finishInit (node:_tls_wrap:944:8)
+ at TLSWrap.ssl.onhandshakedone (node:_tls_wrap:725:12)
+
+npm manifest:
+ {
+ "name": "spina-shop",
+ "private": true,
+ "dependencies": {
+ "@tailwindcss/forms": "^0.2.1",
+ "@tailwindcss/typography": "^0.3.1",
+ "autoprefixer": "^10.2.1",
+ "postcss": "^8.2.10",
+ "tailwindcss": "^2.2.7",
+ "tailwindcss-cli": "^0.1.2"
+ },
+ "version": "2.0.0.alpha"
+ }
+
+yarn manifest:
+ No manifest
+
+Lockfile:
+ No lockfile
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 00000000..cf2b3b1e
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,945 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431"
+ integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==
+ dependencies:
+ "@babel/highlight" "^7.16.0"
+
+"@babel/helper-validator-identifier@^7.15.7":
+ version "7.15.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389"
+ integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==
+
+"@babel/highlight@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a"
+ integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.15.7"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@tailwindcss/forms@^0.2.1":
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.2.1.tgz#3244b185854fae1a7cbe8d2456314d8b2d98cf43"
+ integrity sha512-czfvEdY+J2Ogfd6RUSr/ZSUmDxTujr34M++YLnp2cCPC3oJ4kFvFMaRXA6cEXKw7F1hJuapdjXRjsXIEXGgORg==
+ dependencies:
+ mini-svg-data-uri "^1.2.3"
+
+"@tailwindcss/typography@^0.3.1":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.3.1.tgz#253ce580c8e06b6163d9a288edd24f25e1d0dfee"
+ integrity sha512-HyZ+3Eay8SGaPq7kcFoANZLr4EjeXQ19yjjb9fp6B0PHHpvZoe00jdsnpnooMEbx9J5rQ93nxPUG3MQmXVxGMQ==
+
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+acorn-node@^1.6.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8"
+ integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==
+ dependencies:
+ acorn "^7.0.0"
+ acorn-walk "^7.0.0"
+ xtend "^4.0.2"
+
+acorn-walk@^7.0.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
+ integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
+
+acorn@^7.0.0:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+arg@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb"
+ integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==
+
+autoprefixer@^10.0.2, autoprefixer@^10.2.1:
+ version "10.4.0"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.0.tgz#c3577eb32a1079a440ec253e404eaf1eb21388c8"
+ integrity sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==
+ dependencies:
+ browserslist "^4.17.5"
+ caniuse-lite "^1.0.30001272"
+ fraction.js "^4.1.1"
+ normalize-range "^0.1.2"
+ picocolors "^1.0.0"
+ postcss-value-parser "^4.1.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+browserslist@^4.17.5:
+ version "4.18.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f"
+ integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==
+ dependencies:
+ caniuse-lite "^1.0.30001280"
+ electron-to-chromium "^1.3.896"
+ escalade "^3.1.1"
+ node-releases "^2.0.1"
+ picocolors "^1.0.0"
+
+bytes@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a"
+ integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camelcase-css@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
+ integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
+
+caniuse-lite@^1.0.30001272, caniuse-lite@^1.0.30001280:
+ version "1.0.30001280"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz#066a506046ba4be34cde5f74a08db7a396718fb7"
+ integrity sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA==
+
+chalk@^2.0.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chokidar@^3.5.2:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
+ integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@^1.0.0, color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-string@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312"
+ integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==
+ dependencies:
+ color-name "^1.0.0"
+ simple-swizzle "^0.2.2"
+
+color@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/color/-/color-4.0.1.tgz#21df44cd10245a91b1ccf5ba031609b0e10e7d67"
+ integrity sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA==
+ dependencies:
+ color-convert "^2.0.1"
+ color-string "^1.6.0"
+
+commander@^6.0.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
+ integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+cosmiconfig@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
+ integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
+css-color-names@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+ integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+
+css-unit-converter@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21"
+ integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+defined@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+ integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
+
+detective@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b"
+ integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==
+ dependencies:
+ acorn-node "^1.6.1"
+ defined "^1.0.0"
+ minimist "^1.1.1"
+
+didyoumean@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
+ integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==
+
+dlv@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
+ integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
+
+electron-to-chromium@^1.3.896:
+ version "1.3.899"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.899.tgz#4d7d040e73def3d5f5bd6b8a21049025dce6fce0"
+ integrity sha512-w16Dtd2zl7VZ4N4Db+FIa7n36sgPGCKjrKvUUmp5ialsikvcQLjcJR9RWnlYNxIyEHLdHaoIZEqKsPxU9MdyBg==
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+fast-glob@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
+ integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fastq@^1.6.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
+ integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
+ dependencies:
+ reusify "^1.0.4"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+fraction.js@^4.1.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8"
+ integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==
+
+fs-extra@^10.0.0:
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1"
+ integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob@^7.0.0, glob@^7.1.3:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+ integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
+ integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hex-color-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+ integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+
+hsl-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
+ integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
+
+hsla-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
+ integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
+
+html-tags@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
+ integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==
+
+import-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92"
+ integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==
+ dependencies:
+ import-from "^3.0.0"
+
+import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966"
+ integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==
+ dependencies:
+ resolve-from "^5.0.0"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-arrayish@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+ integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-color-stop@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
+ integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
+ dependencies:
+ css-color-names "^0.0.4"
+ hex-color-regex "^1.1.0"
+ hsl-regex "^1.0.0"
+ hsla-regex "^1.0.0"
+ rgb-regex "^1.0.1"
+ rgba-regex "^1.0.0"
+
+is-core-module@^2.2.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
+ integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
+ dependencies:
+ has "^1.0.3"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+lilconfig@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082"
+ integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==
+
+lines-and-columns@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
+ integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+
+lodash.topath@^4.5.2:
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009"
+ integrity sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=
+
+lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.2.3"
+
+mini-svg-data-uri@^1.2.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.3.tgz#43177b2e93766ba338931a3e2a84a3dfd3a222b8"
+ integrity sha512-gSfqpMRC8IxghvMcxzzmMnWpXAChSA+vy4cia33RgerMS8Fex95akUyQZPbxJJmeBGiGmK7n/1OpUX8ksRjIdA==
+
+minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.1.1:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+modern-normalize@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/modern-normalize/-/modern-normalize-1.1.0.tgz#da8e80140d9221426bd4f725c6e11283d34f90b7"
+ integrity sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==
+
+nanoid@^3.1.30:
+ version "3.1.30"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362"
+ integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==
+
+node-emoji@^1.11.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c"
+ integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==
+ dependencies:
+ lodash "^4.17.21"
+
+node-releases@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5"
+ integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-range@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+ integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
+
+object-hash@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5"
+ integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-json@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
+
+postcss-js@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-3.0.3.tgz#2f0bd370a2e8599d45439f6970403b5873abda33"
+ integrity sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==
+ dependencies:
+ camelcase-css "^2.0.1"
+ postcss "^8.1.6"
+
+postcss-load-config@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.0.tgz#d39c47091c4aec37f50272373a6a648ef5e97829"
+ integrity sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==
+ dependencies:
+ import-cwd "^3.0.0"
+ lilconfig "^2.0.3"
+ yaml "^1.10.2"
+
+postcss-nested@5.0.6:
+ version "5.0.6"
+ resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc"
+ integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==
+ dependencies:
+ postcss-selector-parser "^6.0.6"
+
+postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.6:
+ version "6.0.6"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea"
+ integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==
+ dependencies:
+ cssesc "^3.0.0"
+ util-deprecate "^1.0.2"
+
+postcss-value-parser@^3.3.0:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
+ integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
+
+postcss-value-parser@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
+ integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
+
+postcss@^8.1.6, postcss@^8.1.8, postcss@^8.2.1, postcss@^8.2.10:
+ version "8.3.11"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.11.tgz#c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858"
+ integrity sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==
+ dependencies:
+ nanoid "^3.1.30"
+ picocolors "^1.0.0"
+ source-map-js "^0.6.2"
+
+pretty-hrtime@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
+ integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=
+
+purgecss@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-4.0.3.tgz#8147b429f9c09db719e05d64908ea8b672913742"
+ integrity sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw==
+ dependencies:
+ commander "^6.0.0"
+ glob "^7.0.0"
+ postcss "^8.2.1"
+ postcss-selector-parser "^6.0.2"
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+quick-lru@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
+ integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+reduce-css-calc@^2.1.8:
+ version "2.1.8"
+ resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03"
+ integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==
+ dependencies:
+ css-unit-converter "^1.1.1"
+ postcss-value-parser "^3.3.0"
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve@^1.20.0:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rgb-regex@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
+ integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
+
+rgba-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+ integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
+
+rimraf@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+simple-swizzle@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+ integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
+ dependencies:
+ is-arrayish "^0.3.1"
+
+source-map-js@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e"
+ integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+tailwindcss-cli@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/tailwindcss-cli/-/tailwindcss-cli-0.1.2.tgz#b53e5ccc9a7b43ade736a955f07e88b661433f36"
+ integrity sha512-17NuGSHKTr4twN1BFxuoTArMcBQH+7YL6x4PHFnmWsGNOX45O4Roc8EdMVhSSH2rQoSDoLvR4TmlfddMon3yKg==
+ dependencies:
+ autoprefixer "^10.0.2"
+ postcss "^8.1.8"
+ tailwindcss "^2.0.1"
+
+tailwindcss@^2.0.1, tailwindcss@^2.2.7:
+ version "2.2.19"
+ resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-2.2.19.tgz#540e464832cd462bb9649c1484b0a38315c2653c"
+ integrity sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw==
+ dependencies:
+ arg "^5.0.1"
+ bytes "^3.0.0"
+ chalk "^4.1.2"
+ chokidar "^3.5.2"
+ color "^4.0.1"
+ cosmiconfig "^7.0.1"
+ detective "^5.2.0"
+ didyoumean "^1.2.2"
+ dlv "^1.1.3"
+ fast-glob "^3.2.7"
+ fs-extra "^10.0.0"
+ glob-parent "^6.0.1"
+ html-tags "^3.1.0"
+ is-color-stop "^1.1.0"
+ is-glob "^4.0.1"
+ lodash "^4.17.21"
+ lodash.topath "^4.5.2"
+ modern-normalize "^1.1.0"
+ node-emoji "^1.11.0"
+ normalize-path "^3.0.0"
+ object-hash "^2.2.0"
+ postcss-js "^3.0.3"
+ postcss-load-config "^3.1.0"
+ postcss-nested "5.0.6"
+ postcss-selector-parser "^6.0.6"
+ postcss-value-parser "^4.1.0"
+ pretty-hrtime "^1.0.3"
+ purgecss "^4.0.3"
+ quick-lru "^5.1.1"
+ reduce-css-calc "^2.1.8"
+ resolve "^1.20.0"
+ tmp "^0.2.1"
+
+tmp@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
+ integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
+ dependencies:
+ rimraf "^3.0.0"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+universalify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+ integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+util-deprecate@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+xtend@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+yaml@^1.10.0, yaml@^1.10.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==