scrapbook 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 215d5d39bc38386f6e2c7c08e2126e26718305961ae675a3b6d433b13ff5a4d9
4
- data.tar.gz: 07662ed1539e36da1323a74fcb2f4314ea23546586d86036f90d60635b62c913
3
+ metadata.gz: ef6dc0f95ede6ecc1b68f75aaac825101f84252d5f7b8724e2b59534d40c083f
4
+ data.tar.gz: 6bd20440efd3e0ed318a5d1103c364600163fd48e3fd72f497e221ae07a08cc0
5
5
  SHA512:
6
- metadata.gz: 2f2c0d4853af4a8fa82f5a9175874c082932ee36eb9825eccfe1f733afa8bb01025feaa70811321d1f118392ef7803a3da9c0b7addf240967262d6a23171fd6c
7
- data.tar.gz: e6e4215895e268d0bb554c1b7fa88ffb1f60e3e18ae2a8ed29fdd62762585ea6998ef582528a637bb2e55f8f3a048e6599732807bfc10ae8c1a899cbd2ea2120
6
+ metadata.gz: e031db1caa0fdc1aea56a3efc5a969b8990305bf3263c7f8445bc7b66908390008465488031819774cfc3404298f9c1eac3cb18ec1c82b122e210f964652c33a
7
+ data.tar.gz: ff32ea7dad5cadb5f6d88ca444bb803033681f7845c99d4371645e0000da87de6d40609cf46d4c9fa4121cbca36cd2678ba519a49c127ade364fd6616e9d49ae
data/README.md CHANGED
@@ -117,6 +117,12 @@ $> npx tailwindcss -i app/assets/stylesheets/scrapbook/application.tailwind.css
117
117
  (Note, the "tailwindcss-rails" gem currently doesn't support Rails engines, so we have to
118
118
  install and run Tailwind manually.)
119
119
 
120
+ ## Updating the Turbo javascript
121
+
122
+ - Download the compiled JS file from the turbo rails gem. (The releases on the Turbo website
123
+ didn't include it.)
124
+ - Comment out or remove the `export` statement towards the end.
125
+
120
126
  ## License
121
127
 
122
128
  Copyright 2022 Brad Lindsay
@@ -1 +1 @@
1
- /*! tailwindcss v3.0.23 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,select:focus,textarea:focus{outline:2px solid #0000;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}[multiple]{background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow:0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid #0000;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[type=checkbox]:checked,[type=radio]:checked{border-color:#0000;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=checkbox]:indeterminate,[type=radio]:checked:focus,[type=radio]:checked:hover{border-color:#0000;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-size:100% 100%;background-position:50%;background-repeat:no-repeat}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{border-color:#0000;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px auto -webkit-focus-ring-color}body>nav li{cursor:default}body>nav a,body>nav a:active,body>nav a:hover,body>nav a:visited{color:#0f172a;cursor:default;text-decoration:none;transition:background-color 80ms linear;font-weight:400;font-size:unset;line-height:inherit}body>nav a:hover{background-color:#f0f9ff}body>nav a:active{background-color:#bae6fd}*,:after,:before{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.block{display:block}.flex{display:flex}.contents{display:contents}.h-screen{height:100vh}.h-full{height:100%}.w-screen{width:100vw}.w-full{width:100%}.min-w-\[20ch\]{min-width:20ch}.max-w-\[50\%\]{max-width:50%}.flex-none{flex:none}.overflow-scroll{overflow:scroll}.border-0{border-width:0}.border-r{border-right-width:1px}.border-solid{border-style:solid}.border-sky-700{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.bg-sky-100{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.\!px-0{padding-left:0!important;padding-right:0!important}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.text-2xl{font-size:1.5rem;line-height:2rem}.children\:px-4>*{padding-left:1rem;padding-right:1rem}
1
+ /*! tailwindcss v3.2.1 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,select:focus,textarea:focus{outline:2px solid #0000;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple]{background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow:0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid #0000;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[type=checkbox]:checked,[type=radio]:checked{border-color:#0000;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=checkbox]:indeterminate,[type=radio]:checked:focus,[type=radio]:checked:hover{border-color:#0000;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-size:100% 100%;background-position:50%;background-repeat:no-repeat}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{border-color:#0000;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}body>nav li{cursor:default}body>nav a,body>nav a:active,body>nav a:hover,body>nav a:visited{color:#0f172a;cursor:default;text-decoration:none;transition:background-color 80ms linear;font-weight:400;font-size:unset;line-height:inherit}turbo-frame{display:block}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::-webkit-backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.block{display:block}.flex{display:flex}.contents{display:contents}.h-screen{height:100vh}.h-full{height:100%}.w-screen{width:100vw}.w-full{width:100%}.min-w-\[20ch\]{min-width:20ch}.max-w-\[50\%\]{max-width:50%}.flex-none{flex:none}.grow{flex-grow:1}.overflow-scroll{overflow:scroll}.border-0{border-width:0}.border-r{border-right-width:1px}.border-solid{border-style:solid}.border-sky-700{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.\!px-0{padding-left:0!important;padding-right:0!important}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.text-2xl{font-size:1.5rem;line-height:2rem}summary{list-style:none}summary::-webkit-details-marker{display:none}details>summary:before{content:"▶︎";font-size:.8rem;flex:none;line-height:1.6rem;margin-right:.4rem;transition:rotate .2s ease-in-out}details[open]>summary:before{rotate:90deg;transition:rotate .2s ease-in-out}.hover\:bg-sky-50:hover{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.active\:bg-sky-200:active{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}.children\:px-4>*{padding-left:1rem;padding-right:1rem}.\[\&\:has\(\[aria-current\=page\]\)\]\:bg-sky-100:has([aria-current=page]){--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}
@@ -1 +1,2 @@
1
1
  //= link_directory ../stylesheets/scrapbook .css
2
+ //= link_directory ../javascripts .js
@@ -0,0 +1,115 @@
1
+ //= require scrapbook/turbo.min
2
+
3
+ function ready(fn) {
4
+ if (document.readyState !== 'loading') {
5
+ fn()
6
+ } else {
7
+ document.addEventListener('DOMContentLoaded', fn)
8
+ }
9
+ }
10
+ ready(() => {
11
+ const scrapbook_root_path = document.head.querySelector("meta[name=scrapbook-root]").content
12
+
13
+ function buildInitialTree() {
14
+ const paths = window.location.pathname.substring(scrapbook_root_path.length).split("/")
15
+ if (paths.length === 1 && paths[0] === "") { return }
16
+
17
+ fetch(scrapbook_root_path)
18
+ .then((response) => response.text())
19
+ .then((data) => {
20
+ const root = document.createElement('html')
21
+ const nav = document.getElementById('folder_listing')
22
+ const frame = nav.querySelector('turbo-frame')
23
+
24
+ root.innerHTML = data
25
+ // Keep the nav element to keep listeners on it intact.
26
+ nav.innerHTML = root.querySelector('#folder_listing').innerHTML
27
+ setCurrent()
28
+
29
+ openFolderPath(window.location.pathname, scrapbook_root_path + paths[0])
30
+ })
31
+ .catch((error) => {
32
+ console.error("Unknown error:", error)
33
+ })
34
+ }
35
+
36
+ function openFolderPath(path, currentSubPath = scrapbook_root_path) {
37
+ const frame = document.querySelector('turbo-frame[src="' + currentSubPath + '"]')
38
+ if (!frame) { return }
39
+
40
+ if (path !== currentSubPath)
41
+ frame.addEventListener('turbo:frame-render', () => {
42
+ nextSegment = path.replace(currentSubPath + '/', '').split('/')[0]
43
+ openFolderPath(path, currentSubPath + '/' + nextSegment)
44
+ }, {once: true})
45
+ frame.parentElement.open = true
46
+ }
47
+
48
+ function runOpenFor(ids) {
49
+ const idsLeft = []
50
+ const framesFound = []
51
+
52
+ ids.forEach((id) => {
53
+ let frame = document.getElementById(id)
54
+ !frame ? idsLeft.push(id) : framesFound.push(frame)
55
+ })
56
+
57
+ framesFound.forEach((frame) => {
58
+ frame.addEventListener('turbo:frame-render', () => {
59
+ runOpenFor(idsLeft)
60
+ }, {once: true})
61
+ frame.parentElement.open = true
62
+ })
63
+ }
64
+
65
+ function setCurrent(link = document.querySelector('#folder_listing a[href="' + window.location.pathname + '"]')) {
66
+ if (link === null) { return }
67
+
68
+ oldSelection = document.querySelector('#folder_listing a[aria-current="page"]')
69
+ if (oldSelection == link) { return }
70
+
71
+ if (oldSelection) {
72
+ oldSelection.removeAttribute('aria-current', 'page')
73
+ }
74
+
75
+ link.setAttribute('aria-current', 'page')
76
+ }
77
+
78
+
79
+ buildInitialTree()
80
+ folderListingElem = document.getElementById("folder_listing")
81
+
82
+ // Update selection when a link is clicked
83
+ folderListingElem.addEventListener('click', (e) => {
84
+ const target = e.target
85
+ if (target.tagName != 'A') { return }
86
+
87
+ setCurrent(target)
88
+ })
89
+
90
+ // Every time a folder is opened, it's possible to be re-revealing the selected page.
91
+ folderListingElem.addEventListener('turbo:frame-render', () => {
92
+ setCurrent()
93
+ })
94
+
95
+ // Refresh trees when a folder is toggled back open
96
+ // The first time a details element is toggled open, the turbo frame lazily loads. This
97
+ // adds support for reloading whenever the element is closed and then re-opened. All
98
+ // turbo frames of any nested folders are also refreshed.
99
+ folderListingElem.addEventListener('toggle', (e) => {
100
+ if (!e.target.open) { return }
101
+ if ('loadedOnce' in e.target.dataset === false) {
102
+ e.target.dataset.loadedOnce = true
103
+ return
104
+ }
105
+
106
+ const idsToOpen = []
107
+ e.target.querySelectorAll('details[open] > turbo-frame').forEach(elem => idsToOpen.push(elem.id))
108
+
109
+ const firstFrame = document.getElementById(idsToOpen.shift())
110
+ firstFrame.addEventListener('turbo:frame-render', () => {
111
+ runOpenFor(idsToOpen)
112
+ }, {once: true})
113
+ firstFrame.reload()
114
+ }, {capture: true})
115
+ })
@@ -22,11 +22,24 @@
22
22
  line-height:inherit;
23
23
  }
24
24
 
25
- body > nav a:hover {
26
- background-color: theme('colors.sky.50');
25
+ turbo-frame {
26
+ display: block;
27
27
  }
28
+ }
28
29
 
29
- body > nav a:active {
30
- background-color: theme('colors.sky.200');
31
- }
30
+ summary { list-style: none; }
31
+ summary::-webkit-details-marker { display: none; }
32
+
33
+ details > summary::before {
34
+ content: "▶︎";
35
+ font-size: 0.8rem;
36
+ flex: none;
37
+ line-height: 1.6rem;
38
+ margin-right: 0.4rem;
39
+ transition: rotate 0.2s ease-in-out;
40
+ }
41
+
42
+ details[open] > summary::before {
43
+ rotate: 90deg;
44
+ transition: rotate 0.2s ease-in-out;
32
45
  }
@@ -5,13 +5,19 @@ module Scrapbook
5
5
  class PagesController < ApplicationController
6
6
  self.view_paths = Engine.config.paths['app/views'].to_a
7
7
 
8
+ layout -> { false if request.headers.include?('Turbo-Frame') }
9
+
8
10
  def show
9
11
  return head(:not_found) if (scrapbook = find_scrapbook).nil?
10
12
 
11
13
  pathname = calculate_pathname(scrapbook, params[:id])
12
- template = calculate_template
13
14
 
14
- render locals: {scrapbook: scrapbook, pathname: pathname}, formats: [:html]
15
+ if request.headers['Turbo-Frame']&.start_with?('path_')
16
+ render partial: 'layouts/scrapbook/folder_listing',
17
+ locals: {scrapbook: scrapbook, pathname: pathname}
18
+ else
19
+ render locals: {scrapbook: scrapbook, pathname: pathname}, formats: [:html]
20
+ end
15
21
  end
16
22
 
17
23
  def raw
@@ -3,12 +3,13 @@
3
3
  module Scrapbook
4
4
  # Model to assest list a folder's contents
5
5
  class FolderListingViewModel
6
- attr_reader :view, :scrapbook, :pathname, :files, :folders
6
+ attr_reader :view, :scrapbook, :pathname, :files, :folders, :depth
7
7
 
8
8
  def initialize(view, scrapbook, pathname)
9
9
  self.view = view
10
10
  self.scrapbook = scrapbook
11
11
  self.pathname = pathname.directory? ? pathname : pathname.dirname
12
+ self.depth = calculate_depth
12
13
  self.folders, self.files = split_files_and_folders
13
14
  end
14
15
 
@@ -24,12 +25,18 @@ module Scrapbook
24
25
  end
25
26
 
26
27
  def header_name
27
- root? ? "/#{scrapbook.name}" : "/#{pathname.basename}/"
28
+ root? ? scrapbook.name : pathname.basename.to_s
28
29
  end
29
30
 
30
31
  private
31
32
 
32
- attr_writer :view, :scrapbook, :pathname, :files, :folders
33
+ attr_writer :view, :scrapbook, :pathname, :files, :folders, :depth
34
+
35
+ def calculate_depth
36
+ return 0 if pathname == scrapbook.pages_pathname
37
+
38
+ scrapbook.relative_page_pathname_for(pathname).descend.count
39
+ end
33
40
 
34
41
  def split_files_and_folders
35
42
  helper = HelperForView.new(view)
@@ -13,6 +13,23 @@ module Scrapbook
13
13
  view.short_page_path(scrapbook.relative_page_path_for(pathname))
14
14
  end
15
15
 
16
+ def nav_link_for(scrapbook:, pathname:, is_current: false, depth: 0, **kwargs)
17
+ link_name = pathname == scrapbook.pages_pathname ? scrapbook.name : pathname.basename
18
+ link_attrs = {
19
+ data: {'turbo-frame': 'page_content'},
20
+ class: %w[block w-100],
21
+ aria: {}
22
+ }
23
+ link_attrs[:style] = "padding-left: #{depth}rem;" if depth != 0
24
+ link_attrs[:aria][:current] = 'page' if is_current
25
+ link_attrs[:class].concat(Array(kwargs.delete(:class))) if kwargs.include?(:class)
26
+ link_attrs[:data].merge!(kwargs.delete(:data)) if kwargs.include?(:data)
27
+ link_attrs[:aria].merge!(kwargs.delete(:aria)) if kwargs.include?(:aria)
28
+ link_attrs.merge!(kwargs)
29
+
30
+ view.link_to(link_name, short_path_to(pathname, scrapbook), **link_attrs)
31
+ end
32
+
16
33
  def remove_handler_exts_from(pathname)
17
34
  pathname.dirname.join(
18
35
  pathname.basename.sub(/(?:.#{view.lookup_context.handlers.join('|.')})+\z/, '')
@@ -43,6 +43,15 @@ module Scrapbook
43
43
  relative_path
44
44
  end
45
45
 
46
+ def relative_page_pathname_for(pathname)
47
+ relative_path = pathname.relative_path_from(pages_pathname)
48
+ if relative_path.to_s.start_with?('..')
49
+ raise ArgumentError, "Pathname isn't inside the scrapbook pages: #{relative_path}"
50
+ end
51
+
52
+ relative_path
53
+ end
54
+
46
55
  def ==(other)
47
56
  other.class == self.class && other.root == root
48
57
  end
@@ -2,8 +2,29 @@
2
2
  helper = Scrapbook::HelperForView.new(self)
3
3
  listing = Scrapbook::FolderListingViewModel.new(self, scrapbook, pathname)
4
4
  pathname_without_handler_exts = helper.remove_handler_exts_from(pathname)
5
+ indentation_depth = (local_assigns[:nav_depth] || listing.depth) + 1
6
+ selection_classes = "active:bg-sky-200 hover:bg-sky-50 [&:has([aria-current=page])]:bg-sky-100"
5
7
  %>
6
- <% unless listing.root? %><%= link_to "‹ #{listing.parent_display_name}", helper.short_path_to(listing.pathname.parent), class: 'back-to-parent block w-100' %><% end %>
7
- <header aria-label="Which folder's contents" class="text-2xl <%= listing.pathname == pathname ? 'bg-sky-100' : '!px-0 children:px-4' %>"><% if listing.pathname == pathname %><span aria-current="page"><%= listing.header_name %></span><% else %><%= link_to(listing.header_name, helper.short_path_to(listing.pathname), class: 'block w-100') %><% end %></header>
8
- <ul class="!px-0" aria-label="Sub-folders"><% listing.folders.each do |folder| %><li class="children:px-4"><%= link_to "#{folder.basename}/", helper.short_path_to(folder, scrapbook), class: 'block w-100' %></li><% end %></ul>
9
- <ul class="!px-0" aria-label="Sub-files"><% listing.files.each do |file| %><% next if listing.folders.include?(file) %><li class="children:px-4"><% if file == pathname_without_handler_exts %><span class="block w-100 bg-sky-100" aria-current="page"><%= file.basename %></span><% else %><%= link_to file.basename, helper.short_path_to(file, scrapbook), class: 'block w-100' %><% end %></li><% end %></ul>
8
+ <% unless listing.root? %><%= link_to "‹ #{listing.parent_display_name}", helper.short_path_to(listing.pathname.parent, scrapbook), class: 'back-to-parent block w-100' %><% end %>
9
+ <header aria-label="Which folder's contents" class="text-2xl !px-0 children:px-4 <%= selection_classes %>">
10
+ <%= helper.nav_link_for(scrapbook: scrapbook, pathname: listing.pathname, is_current: pathname == listing.pathname) %>
11
+ </header>
12
+ <turbo-frame id="path_<%= pathname.hash %>">
13
+ <ul aria-label="Sub-folders">
14
+ <% listing.folders.each do |folder| %>
15
+ <li>
16
+ <details>
17
+ <summary class="flex <%= selection_classes %>" style="padding-left: <%= indentation_depth %>rem;">
18
+ <%= helper.nav_link_for(scrapbook: scrapbook, pathname: folder, class: 'grow') %>
19
+ </summary>
20
+ <turbo-frame id="path_<%= folder.hash %>" src="<%= helper.short_path_to(folder, scrapbook) %>" loading="lazy"></turbo-frame>
21
+ </details>
22
+ </li>
23
+ <% end %>
24
+ </ul>
25
+ <ul aria-label="Sub-files">
26
+ <% listing.files.each do |file| %><% next if listing.folders.include?(file) %>
27
+ <li class="<%= selection_classes %>"><%= helper.nav_link_for(scrapbook: scrapbook, pathname: file, is_current: file == pathname_without_handler_exts, depth: indentation_depth) %></li>
28
+ <% end %>
29
+ </ul>
30
+ </turbo-frame>
@@ -6,9 +6,14 @@
6
6
  <%= csp_meta_tag %>
7
7
 
8
8
  <%= stylesheet_link_tag "scrapbook/application", media: "all", "data-turbo-track": "reload" %>
9
+ <%= javascript_include_tag "scrapbook/application" %>
10
+ <meta name="scrapbook-root" content="<%= root_path %>">
9
11
  </head>
10
12
  <body class="flex">
11
- <nav class="flex-none min-w-[20ch] max-w-[50%] h-screen overflow-scroll children:px-4 py-2 border-solid border-sky-700 border-0 border-r"><%= render 'layouts/scrapbook/folder_listing', scrapbook: local_assigns[:scrapbook], pathname: local_assigns[:pathname] %></nav>
13
+ <nav id="folder_listing" class="flex-none min-w-[20ch] max-w-[50%] h-screen overflow-scroll border-solid border-sky-700 border-0 border-r"><%= render 'layouts/scrapbook/folder_listing', scrapbook: local_assigns[:scrapbook], pathname: local_assigns[:pathname], nav_depth: 0 %></nav>
12
14
  <main class="py-2 px-4 h-screen w-screen overflow-scroll"><%= yield %></main>
15
+ <script type="text/javascript">
16
+
17
+ </script>
13
18
  </body>
14
19
  </html>
@@ -1 +1,3 @@
1
- <iframe src="<%= raw_page_path(scrapbook.relative_page_path_for(pathname)) %>" class="w-full h-full"></iframe>
1
+ <turbo-frame id="page_content" class="w-full h-full" data-turbo-action="advance">
2
+ <iframe src="<%= raw_page_path(scrapbook.relative_page_path_for(pathname)) %>" class="w-full h-full"></iframe>
3
+ </turbo-frame>
@@ -21,7 +21,8 @@ module Scrapbook
21
21
  relative_path = 'app/assets/config/manifest.js'
22
22
  return unless FileTest.exist?(File.expand_path(relative_path, destination_root))
23
23
 
24
- insert_into_file(relative_path, '//= link scrapbook/application.css')
24
+ insert_into_file(relative_path, "//= link scrapbook/application.css\n")
25
+ insert_into_file(relative_path, "//= link scrapbook/application.js\n")
25
26
  end
26
27
  end
27
28
  end
@@ -11,9 +11,7 @@ module Scrapbook
11
11
 
12
12
  initializer 'scrapbook.assets' do |app|
13
13
  if app.config.scrapbook.precompile_assets && app.config.respond_to?(:assets)
14
- app.config.assets.precompile.concat %w[
15
- scrapbook/application.css
16
- ]
14
+ app.config.assets.precompile.push('scrapbook/application.css')
17
15
  end
18
16
  end
19
17
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Scrapbook
4
- VERSION = '0.2.2'
4
+ VERSION = '0.3.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scrapbook
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brad Lindsay
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-01 00:00:00.000000000 Z
11
+ date: 2023-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -43,6 +43,7 @@ files:
43
43
  - Rakefile
44
44
  - app/assets/builds/scrapbook/application.css
45
45
  - app/assets/config/scrapbook_manifest.js
46
+ - app/assets/javascripts/scrapbook/application.js
46
47
  - app/assets/stylesheets/scrapbook/application.tailwind.css
47
48
  - app/controllers/scrapbook/application_controller.rb
48
49
  - app/controllers/scrapbook/empty_controller.rb
@@ -50,7 +51,6 @@ files:
50
51
  - app/helpers/scrapbook/application_helper.rb
51
52
  - app/helpers/scrapbook/folder_listing_view_model.rb
52
53
  - app/helpers/scrapbook/helper_for_view.rb
53
- - app/mailers/scrapbook/application_mailer.rb
54
54
  - app/models/scrapbook/scrapbook.rb
55
55
  - app/views/layouts/scrapbook/_folder_listing.html.erb
56
56
  - app/views/layouts/scrapbook/application.html.erb
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Scrapbook
4
- class ApplicationMailer < ActionMailer::Base
5
- default from: 'from@example.com'
6
- layout 'mailer'
7
- end
8
- end