diff --git a/README.md b/README.md index 4ca24a1..adce0f6 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,14 @@ Passport is a simple, fast, and lightweight web dashboard/new tab replacement. ## Getting Started + ![Screenshot 2024-11-11 at 00-20-06 Passport](https://github.com/user-attachments/assets/ba16da2f-fb84-4f45-827f-3de0af6626a0) ### Prerequisites - [Go](https://go.dev/doc/install) - [sqlite3](https://www.sqlite.org/download.html) +- [TailwdinCSS CLI](https://github.com/tailwindlabs/tailwindcss/releases/latest) ### Usage diff --git a/assets/fonts/InstrumentSans-Italic.ttf b/assets/fonts/InstrumentSans-Italic.ttf deleted file mode 100644 index 059865d..0000000 Binary files a/assets/fonts/InstrumentSans-Italic.ttf and /dev/null differ diff --git a/assets/fonts/InstrumentSans-Regular.ttf b/assets/fonts/InstrumentSans-Regular.ttf deleted file mode 100644 index 64e1dd0..0000000 Binary files a/assets/fonts/InstrumentSans-Regular.ttf and /dev/null differ diff --git a/assets/fonts/InstrumentSans-SemiBold.ttf b/assets/fonts/InstrumentSans-SemiBold.ttf deleted file mode 100644 index b7e4d3c..0000000 Binary files a/assets/fonts/InstrumentSans-SemiBold.ttf and /dev/null differ diff --git a/assets/fonts/InstrumentSans-VariableFont_wdth,wght.woff2 b/assets/fonts/InstrumentSans-VariableFont_wdth,wght.woff2 new file mode 100644 index 0000000..02203d6 Binary files /dev/null and b/assets/fonts/InstrumentSans-VariableFont_wdth,wght.woff2 differ diff --git a/assets/tailwind.css b/assets/tailwind.css new file mode 100644 index 0000000..96a350a --- /dev/null +++ b/assets/tailwind.css @@ -0,0 +1 @@ +*,: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-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--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:rgba(59,130,246,.5);--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: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::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-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--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:rgba(59,130,246,.5);--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: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.15 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:Instrument Sans,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}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-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-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}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}.absolute{position:absolute}.relative{position:relative}.bottom-0{bottom:0}.left-0{left:0}.left-2\.5{left:.625rem}.right-0{right:0}.right-1{right:.25rem}.top-0{top:0}.top-1{top:.25rem}.top-2\.5{top:.625rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-2{margin-bottom:.5rem;margin-top:.5rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.flex{display:flex}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-7{height:1.75rem}.h-96{height:24rem}.h-fit{height:-moz-fit-content;height:fit-content}.h-screen{height:100vh}.w-64{width:16rem}.w-\[clamp\(48px\2c 10vw\2c 60px\)\]{width:clamp(48px,10vw,60px)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.max-w-3xl{max-width:48rem}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-\[repeat\(auto-fill\2c _minmax\(min\(330px\2c _100\%\)\2c _1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(min(330px,100%),1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-2{gap:.5rem}.gap-y-3{row-gap:.75rem}.overflow-hidden{overflow:hidden}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-0{border-width:0}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-\[\#211F23\]{--tw-border-opacity:1;border-color:rgb(33 31 35/var(--tw-border-opacity,1))}.border-\[\#56565b\]\/30{border-color:rgba(86,86,91,.3)}.border-\[\#656565\]{--tw-border-opacity:1;border-color:rgb(101 101 101/var(--tw-border-opacity,1))}.border-\[rgb\(86\2c 86\2c 91\)\/30\]{border-color:#56565b/30}.bg-\[\#00000070\]{background-color:#00000070}.bg-\[\#0E0A0E\]{--tw-bg-opacity:1;background-color:rgb(14 10 14/var(--tw-bg-opacity,1))}.bg-\[\#151316\]{--tw-bg-opacity:1;background-color:rgb(21 19 22/var(--tw-bg-opacity,1))}.bg-\[\#1C1C21\]{--tw-bg-opacity:1;background-color:rgb(28 28 33/var(--tw-bg-opacity,1))}.bg-\[\#211F23\]{--tw-bg-opacity:1;background-color:rgb(33 31 35/var(--tw-bg-opacity,1))}.bg-\[\#8A42FF\]{--tw-bg-opacity:1;background-color:rgb(138 66 255/var(--tw-bg-opacity,1))}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0\.5{padding:.125rem}.p-2\.5{padding:.625rem}.p-4{padding:1rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.pb-2\.5{padding-bottom:.625rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.text-\[\#656565\]{--tw-text-opacity:1;color:rgb(101 101 101/var(--tw-text-opacity,1))}.text-\[\#BABABA\]{--tw-text-opacity:1;color:rgb(186 186 186/var(--tw-text-opacity,1))}.text-\[\#D7D7D7\]{--tw-text-opacity:1;color:rgb(215 215 215/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.decoration-dashed{text-decoration-style:dashed}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.transition-\[shadow\2c transform\]{transition-duration:.15s;transition-property:shadow,transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-\[cubic-bezier\(0\.16\2c 1\2c 0\.3\2c 1\)\]{transition-timing-function:cubic-bezier(.16,1,.3,1)}@font-face{font-family:Instrument Sans;src:url(/assets/fonts/InstrumentSans-VariableFont_wdth,wght.woff2) format("woff2")}html{line-height:normal}h1,h2,h3,h4,h5,h6{font-weight:600}h1{font-size:clamp(48px,10vw,64px)}h2{font-size:clamp(30px,6vw,36px)}h3{font-size:1.25rem}.placeholder\:italic::-moz-placeholder{font-style:italic}.placeholder\:italic::placeholder{font-style:italic}.placeholder\:text-\[\#434343\]::-moz-placeholder{--tw-text-opacity:1;color:rgb(67 67 67/var(--tw-text-opacity,1))}.placeholder\:text-\[\#434343\]::placeholder{--tw-text-opacity:1;color:rgb(67 67 67/var(--tw-text-opacity,1))}.hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-\[\#29292e\]:hover{--tw-bg-opacity:1;background-color:rgb(41 41 46/var(--tw-bg-opacity,1))}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}@media (min-width:640px){.sm\:w-4\/5{width:80%}} \ No newline at end of file diff --git a/main.go b/main.go index bdd3a93..282318d 100644 --- a/main.go +++ b/main.go @@ -1,3 +1,5 @@ +//go:generate tailwindcss -i styles/main.css -o assets/tailwind.css --minify + package main import ( @@ -470,7 +472,16 @@ func main() { log.Fatal(err) } + css, err := fs.ReadFile(assetsFS, "assets/tailwind.css") + + if err != nil { + log.Fatal(err) + } + engine := handlebars.NewFileSystem(http.FS(viewsDir), ".hbs") + engine.AddFunc("inlineCSS", func() string { + return string(css) + }) router := fiber.New(fiber.Config{ Views: engine, diff --git a/styles/main.css b/styles/main.css new file mode 100644 index 0000000..4ee37b0 --- /dev/null +++ b/styles/main.css @@ -0,0 +1,34 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@font-face { + font-family: "Instrument Sans"; + src: url("/assets/fonts/InstrumentSans-VariableFont_wdth,wght.woff2") + format("woff2"); +} + +html { + line-height: normal; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + @apply font-semibold; +} + +h1 { + font-size: clamp(48px, 10vw, 64px); +} + +h2 { + font-size: clamp(30px, 6vw, 36px); +} + +h3 { + font-size: 1.25rem; +} diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..0b80f72 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,12 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["./views/**/*.hbs"], + theme: { + extend: { + fontFamily: { + sans: ["Instrument Sans", "sans-serif"], + }, + }, + }, + plugins: [], +}; diff --git a/views/admin/index.hbs b/views/admin/index.hbs index 462a7a8..bdda3d9 100644 --- a/views/admin/index.hbs +++ b/views/admin/index.hbs @@ -1,5 +1,5 @@
-
+
{{#each Categories}}
diff --git a/views/index.hbs b/views/index.hbs index fce9210..71a7d94 100644 --- a/views/index.hbs +++ b/views/index.hbs @@ -1,4 +1,4 @@ -
+
@@ -15,11 +15,11 @@

Passport

- +
-
+
{{#each Categories}}
diff --git a/views/layouts/main.hbs b/views/layouts/main.hbs index 0055776..7d61d47 100644 --- a/views/layouts/main.hbs +++ b/views/layouts/main.hbs @@ -5,443 +5,11 @@ Passport - + + - + {{embed}} diff --git a/views/styles/main.css b/views/styles/main.css deleted file mode 100644 index 7e86320..0000000 --- a/views/styles/main.css +++ /dev/null @@ -1,425 +0,0 @@ -@font-face { - font-family: "Instrument Sans"; - src: url("/fonts/InstrumentSans-Regular.ttf"); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: "Instrument Sans"; - src: url("/fonts/InstrumentSans-SemiBold.ttf"); - font-weight: 600; - font-style: normal; -} - -@font-face { - font-family: "Instrument Sans"; - src: url("/fonts/InstrumentSans-Italic.ttf"); - font-weight: normal; - font-style: italic; -} - -* { - box-sizing: border-box; -} - -html, -body { - margin: 0; - padding: 0; - background-color: #151316; - color: white; - font-family: "Instrument Sans", sans-serif; - font-optical-sizing: auto; - font-weight: 400; - font-style: normal; - font-variation-settings: - "wdth" 100; -} - -p { - margin: 0; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - font-weight: 600; -} - -h1 { - font-size: 64px; -} - -h2 { - font-size: 36px; -} - -.font-semibold { - font-weight: 600; -} - -.bg-transparent { - background-color: transparent; -} - -.bg-\[\#211F23\] { - background-color: #211F23; -} - -.bg-\[\#0E0A0E\] { - background-color: #0E0A0E; -} - -.bg-\[\#1C1C21\] { - background-color: #1C1C21; -} - -.hover\:bg-\[\#29292e\]:hover { - background-color: #29292e; -} - -.bg-\[\#151316\] { - background-color: #151316; -} - -.bg-\[\#8A42FF\] { - background-color: #8A42FF; -} - -.bg-\[\#00000070\] { - background-color: rgba(0, 0, 0, 0.7); -} - -.border-0 { - border-width: 0px; -} - -.border { - border-style: solid; - border-width: 1px; -} - -.border-solid { - border-style: solid; -} - -.border-dashed { - border-style: dashed; -} - -.border-\[rgb\(86\,86\,91\)\/30\] { - border-color: rgba(86, 86, 91, 0.30); -} - -.border-\[\#656565\] { - border-color: #656565; -} - -.border-\[\#211F23\] { - border-color: #211F23; -} - -.rounded-full { - border-radius: 9999px; -} - -.relative { - position: relative; -} - -.absolute { - position: absolute; -} - -.hidden { - display: none; -} - -.flex { - display: flex; -} - -.grid { - display: grid; -} - -.grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.gap-2 { - gap: 0.5rem; -} - -.gap-y-3 { - row-gap: 0.75rem; -} - -.justify-center { - justify-content: center; -} - -.items-center { - align-items: center; -} - -.h-100vh { - height: 100vh; -} - -.h-7 { - height: 1.752rem; -} - -.h-96 { - height: 24rem; -} - -.h-fit { - height: fit-content; -} - -.w-64 { - width: 16rem; -} - -.w-full { - width: 100%; -} - -.w-fit { - width: fit-content; -} - -.w-\[700px\] { - width: 700px; -} - -.min-w-\[50vw\] { - min-width: 50vw; -} - -.max-w-\[80vw\] { - max-width: 80vw; -} - -.flex-col { - flex-direction: column; -} - -.mr-3 { - margin-right: 0.75rem; -} - -.mr-2 { - margin-right: 0.5rem; -} - -.my-2 { - margin-top: 0.5rem; - margin-bottom: 0.5rem; -} - -.p-0\.5 { - padding: 0.125rem; -} - -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} - -.px-3 { - padding-left: 0.75rem; - padding-right: 0.75rem; -} - -.px-4 { - padding-left: 1rem; - padding-right: 1rem; -} - -.py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.py-1 { - padding-top: 0.25rem; - padding-bottom: 0.25rem; -} - -.pb-2\.5 { - padding-bottom: 0.625rem; -} - -.p-2\.5 { - padding: 0.625rem; -} - -.p-4 { - padding: 1rem; -} - -.h-2 { - height: 2rem; -} - -.w-8\/10 { - width: 80%; -} - -.top-0 { - top: 0px; -} - -.left-0 { - left: 0px; -} - -.bottom-0 { - bottom: 0px; -} - -.right-0 { - right: 0px; -} - -.top-1 { - top: 0.25rem; -} - -.right-1 { - right: 0.25rem; -} - -.top-2\.5 { - top: 0.625rem; -} - -.left-2\.5 { - left: 0.625rem; -} - -.text-\[\#BABABA\] { - color: #BABABA; -} - -.text-\[\#D7D7D7\] { - color: #D7D7D7; -} - -.text-\[\#656565\] { - color: #656565; -} - -.text-white { - color: white; -} - -.text-4xl { - font-size: 2.25rem; -} - -.underline-none { - text-decoration: none; -} - -.underline { - text-decoration: underline; -} - -.decoration-dashed { - text-decoration-style: dashed; -} - -.text-unset { - color: unset; -} - -.text-sm { - font-size: 0.875rem; -} - -.text-center { - text-align: center; -} - -.rounded-md { - border-radius: 0.375rem; -} - -.rounded-xl { - border-radius: 0.75rem; -} - -.rounded-2xl { - border-radius: 1rem; -} - -.overflow-hidden { - overflow: hidden; -} - -.shadow-md { - box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); -} - -.hover\:shadow-xl:hover { - box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); -} - -.transition-\[shadow\,transform\] { - transition-property: box-shadow,transform; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.ease-\[cubic-bezier\(0\.16\,1\,0\.3\,1\)\] { - transition-timing-function: cubic-bezier(0.16, 1, 0.3, 1); -} - -.capitalize { - text-transform: capitalize; -} - -.hover\:-translate-y-1:hover { - transform: translateY(-0.25rem); -} - -.object-contain { - object-fit: contain; -} - -.object-cover { - object-fit: cover; -} - -.select-none { - user-select: none; -} - -.cursor-pointer { - cursor: pointer; -} - -input, -textarea, -select { - color: inherit; - font: inherit; -} - -input:focus-visible { - outline: none; -} - -input::placeholder { - color: #656565; - font-style: italic; -} \ No newline at end of file