diff --git a/compose.yml b/compose.yml index c31fe35..5fb769d 100644 --- a/compose.yml +++ b/compose.yml @@ -28,3 +28,4 @@ services: networks: postgres-network: driver: bridge + diff --git a/public/banner.jpg b/public/banner.jpg deleted file mode 100644 index 4faf4de..0000000 Binary files a/public/banner.jpg and /dev/null differ diff --git a/public/jetzig.png b/public/jetzig.png deleted file mode 100644 index 314d70c..0000000 Binary files a/public/jetzig.png and /dev/null differ diff --git a/public/new-banner.webp b/public/new-banner.webp new file mode 100644 index 0000000..712c437 Binary files /dev/null and b/public/new-banner.webp differ diff --git a/public/new-styles.css b/public/new-styles.css new file mode 100644 index 0000000..b4a554c --- /dev/null +++ b/public/new-styles.css @@ -0,0 +1,1137 @@ +*, ::before, ::after { + --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: rgb(59 130 246 / 0.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: rgb(59 130 246 / 0.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.17 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html, +:host { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ + -webkit-tap-highlight-color: transparent; + /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-feature-settings: normal; + /* 2 */ + font-variation-settings: normal; + /* 3 */ + font-size: 1em; + /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + letter-spacing: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden]:where(:not([hidden="until-found"])) { + display: none; +} + +.prose { + color: #1f2937; +} + +.prose :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: #2563eb; +} + +.prose :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + background-color: #f3f4f6; +} + +.prose :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + border-left-color: #facc15; + font-style: italic; +} + +.static { + position: static; +} + +.relative { + position: relative; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.my-6 { + margin-top: 1.5rem; + margin-bottom: 1.5rem; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mb-10 { + margin-bottom: 2.5rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-6 { + margin-bottom: 1.5rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.ml-3 { + margin-left: 0.75rem; +} + +.ms-3 { + margin-inline-start: 0.75rem; +} + +.ms-8 { + margin-inline-start: 2rem; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mt-10 { + margin-top: 2.5rem; +} + +.mt-12 { + margin-top: 3rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-6 { + margin-top: 1.5rem; +} + +.mt-8 { + margin-top: 2rem; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.inline { + display: inline; +} + +.flex { + display: flex; +} + +.hidden { + display: none; +} + +.min-h-screen { + min-height: 100vh; +} + +.w-1\/2 { + width: 50%; +} + +.w-full { + width: 100%; +} + +.max-w-2xl { + max-width: 42rem; +} + +.max-w-3xl { + max-width: 48rem; +} + +.max-w-4xl { + max-width: 56rem; +} + +.max-w-none { + max-width: none; +} + +.max-w-sm { + max-width: 24rem; +} + +.max-w-xl { + max-width: 36rem; +} + +.list-decimal { + list-style-type: decimal; +} + +.list-disc { + list-style-type: disc; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.items-center { + align-items: center; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.gap-4 { + gap: 1rem; +} + +.space-y-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.rounded-2xl { + border-radius: 1rem; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.rounded-xl { + border-radius: 0.75rem; +} + +.border { + border-width: 1px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-t { + border-top-width: 1px; +} + +.border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity, 1)); +} + +.border-warnbox-border { + --tw-border-opacity: 1; + border-color: rgb(245 232 163 / var(--tw-border-opacity, 1)); +} + +.border-win7-border { + --tw-border-opacity: 1; + border-color: rgb(181 205 228 / var(--tw-border-opacity, 1)); +} + +.bg-gray-900 { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1)); +} + +.bg-warnbox-bg { + --tw-bg-opacity: 1; + background-color: rgb(255 248 216 / var(--tw-bg-opacity, 1)); +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); +} + +.bg-win7-bg { + --tw-bg-opacity: 1; + background-color: rgb(234 243 255 / var(--tw-bg-opacity, 1)); +} + +.bg-win7-link { + --tw-bg-opacity: 1; + background-color: rgb(0 79 159 / var(--tw-bg-opacity, 1)); +} + +.p-2 { + padding: 0.5rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-4 { + padding: 1rem; +} + +.p-5 { + padding: 1.25rem; +} + +.p-6 { + padding: 1.5rem; +} + +.p-8 { + padding: 2rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; +} + +.py-12 { + padding-top: 3rem; + padding-bottom: 3rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.py-8 { + padding-top: 2rem; + padding-bottom: 2rem; +} + +.pb-2 { + padding-bottom: 0.5rem; +} + +.pb-5 { + padding-bottom: 1.25rem; +} + +.pt-4 { + padding-top: 1rem; +} + +.pt-6 { + padding-top: 1.5rem; +} + +.text-center { + text-align: center; +} + +.font-mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +.font-sans { + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.font-bold { + font-weight: 700; +} + +.font-medium { + font-weight: 500; +} + +.font-semibold { + font-weight: 600; +} + +.leading-8 { + line-height: 2rem; +} + +.leading-relaxed { + line-height: 1.625; +} + +.text-\[\#4a5c75\] { + --tw-text-opacity: 1; + color: rgb(74 92 117 / var(--tw-text-opacity, 1)); +} + +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity, 1)); +} + +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity, 1)); +} + +.text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity, 1)); +} + +.text-green-600 { + --tw-text-opacity: 1; + color: rgb(22 163 74 / var(--tw-text-opacity, 1)); +} + +.text-warnbox-text { + --tw-text-opacity: 1; + color: rgb(122 91 0 / var(--tw-text-opacity, 1)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.text-win7-link { + --tw-text-opacity: 1; + color: rgb(0 79 159 / var(--tw-text-opacity, 1)); +} + +.text-win7-red { + --tw-text-opacity: 1; + color: rgb(204 0 0 / var(--tw-text-opacity, 1)); +} + +.text-win7-text { + --tw-text-opacity: 1; + color: rgb(0 60 117 / var(--tw-text-opacity, 1)); +} + +.underline { + text-decoration-line: underline; +} + +.decoration-sky-500 { + text-decoration-color: #0ea5e9; +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-inner { + --tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-md { + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 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); +} + +.shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-xl { + --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 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); +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.duration-150 { + transition-duration: 150ms; +} + +.hover\:border-gray-400:hover { + --tw-border-opacity: 1; + border-color: rgb(156 163 175 / var(--tw-border-opacity, 1)); +} + +.hover\:bg-gray-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-win7-hover:hover { + --tw-bg-opacity: 1; + background-color: rgb(0 93 193 / var(--tw-bg-opacity, 1)); +} + +.hover\:text-red-800:hover { + --tw-text-opacity: 1; + color: rgb(153 27 27 / var(--tw-text-opacity, 1)); +} + +.hover\:text-win7-hover:hover { + --tw-text-opacity: 1; + color: rgb(0 93 193 / var(--tw-text-opacity, 1)); +} + +.hover\:underline:hover { + text-decoration-line: underline; +} + +.hover\:shadow:hover { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.hover\:shadow-md:hover { + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 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); +} + +.focus\:border-win7-hover:focus { + --tw-border-opacity: 1; + border-color: rgb(0 93 193 / var(--tw-border-opacity, 1)); +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus\:ring-2:focus { + --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, 0 0 #0000); +} + +.focus\:ring-win7-hover:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(0 93 193 / var(--tw-ring-opacity, 1)); +} + +@media (min-width: 640px) { + .sm\:text-base { + font-size: 1rem; + line-height: 1.5rem; + } +} + +@media (min-width: 768px) { + .md\:text-base { + font-size: 1rem; + line-height: 1.5rem; + } +} \ No newline at end of file diff --git a/public/one.md b/public/one.md deleted file mode 100644 index b737772..0000000 --- a/public/one.md +++ /dev/null @@ -1,69 +0,0 @@ -### Hi, I'm Yuzu, I am one of many developers who intend to write Discord bots and other bloatware that uses proprietary API's, I do it because I love Discord as a platform, and it'd be a shame to let this amazing community rot. I write code and I dislike wasting time, especially when it comes to the three B's, broken, bloated and badly-operated, this is most likely a rant than anything; however, you must keep up with this article if you want to choose your tech stack to a clean and maintainable endeavour. - ---- -## Discord.js: the evil -First, you must understand what the Latin word *malum* (noun) means, this word, appears innocent, but deeply in its roots, it holds a secret semantic depth that perhaps you are not aware of, if you are a native English speaker, which most likely, if you're reading my blog, you aren't. -The word *malum*, in any romance language, means *bad* and is a synonym of *evil*. Now you must understand what real Evil is, so I'll be writing Evil from now on capitalised. -Evil is not something wicked, Evil is something not pleasing to the eyes, something anti-æsthetic. For it is not limited to moral depravity. -To call something *malum* in the classical sense is not merely to virtue-signal somebody, but to diagnose it as malformed--a deviation from order, reason, and beauty--the ancient Roman conception of malum inherently included the idea of functional and aesthetic failure. Something could be malum because it was ugly, jarring, inelegant, or brutish in how it was constructed or behaved. This understanding aligns far more closely with the way devs talk about code smell, bad ux, bad libraries. It is akin of calling someone who writes all day Excel documents or works in SAP a wagie, or if he's old, a dinosaur. -Evil, then, is not always malevolence. Sometimes evil is simply negligence. Sometimes it's sloppiness. Sometimes it is the arrogance of assuming you're smarter than the end user, which in this case, is you. - -### 1. `broadcastEval()` is a nuclear footgun -If you’ve ever looked into [sharding in Discord.js](https://discordjs.guide/sharding/#broadcasteval), you know about `broadcastEval()`. What they don't tell you is that (dramatic pause) **this thing runs `eval()` on your worker threads**. Yes, **actual JavaScript `eval()`** over IPC. One wrong move and you're executing arbitrary code across your cluster. It’s not clever. It’s dangerous. -This facilitates exploits in your logic, unsanitised inputs might break havoc, they might crash your bot on a syntax error if one of these fools whom we call "maintainers" inserts a backdoor in your codebase, whether accidental or malicious. These "malicious" actors are something I'll discuss later on. -On a different note, what you **actually** want is a Redis cache or any kind of stateless, independent service that can share data across shards without turning your whole app into a Fallout-level hazard. BroadcastEval is stupid, do avoid, and please write a dockercompose for your cache service and your bot so you can deploy them altogether. - -### 2. The hostility of the bad Actors -You think the code is bad? Wait until you interact with the maintainers. Claim your library is better and they'll be in your Github issues forms [threatening legal action.](https://github.com/tiramisulabs/seyfert/issues/174#issue-2226994786) They’ve got an ego complex and take any form of comparison as slander. It's open source, not a cult. Grow up. - -### 3. 15MB of Bloatware -Discord.js is like downloading an entire operating system just to say "hi" to a user. 15MB bundle size, over **25+ nested npm packages, huge node_modules folder**, and yet it *removes* basic methods like `isButton()` or `isChatInputCommand()` on a whim. Then after backlash, they *add it back*. Who's managing this, children? - -### 4. It Hates Frameworks -Discord.js has no support for decorators, adapters, or any semblance of framework facilities (even if the word might be misused herein) And it never will. TypeScript adoption came late. Updates rarely. Cutting-edge features? Forget ab' it. You’re stuck in 2020 tech--even calling it 2020 is disrespectful, because back then we were better off--dealing with breakage every time Discord updates its API, which is often because Discord is stupid. Sapphire is so dumb that I will not waste any braincells witht them. - -### 5. Semver is a Lie -It’s supposed to help, but when you’re building on a proprietary API, but it's a breaking-change mess. And for a library scared of supporting selfbots, you’re also left with the MIT license, which means anyone can fork your bot and make it closed source. That’s not freedom. That’s a liability. - ---- - -## Eris - -### 1. Eris is Dead -Long live Eris. Or not. It was deprecated and rebranded as Oceanic, which is very ridiculous, perhaps they copied my framework--which was called similarly back then--which is somehow even worse, subnautic? romantic?, more like gigantic, they switched to TypeScript, which is also a bloated piece of garbage. - -### 2. Oceanic Devs Are Petty -Let’s be real: the Oceanic maintainer has a vendetta. Against me, against others, who knows. What I do know is they’re needlessly antagonistic, and they docs drama like teenage girls, and don't get me wrong, at least teenage girls act their own age and are not trying to dress-up as anthropomorphic creatures to lure/induct children to their brainwash. - -### 3. No Cluster Support -To its credit, Oceanic is more lightweight than Discord.js. But no cluster support? In 2025? That’s laughable. You’re writing your own shard manager or hoping your single threaded JS won’t ignite himself. Good luck. - ---- - -## Libraries That Are Actually Worth Your Time - -### 1. `discord.py-self` -Python-based. Supports selfbots. Maintained. Featureful. It’s hefty, but you’re getting something solid. Plus, the maintainer isn’t toxic—at least not publicly. The only downside of this library is that it is usually a trap so you get your token and cookies grabbed, so don't fork or download anybody's selfbot, or your account will start spamming Steam-looking links. - -### 2. `Seyfert` (My Baby) -Yeah, I’m plugging my former library. [It’s clean, it’s efficient](https://github.com/tiramisulabs/seyfert/commit/cac85ae0635155fe2e5024d49e6ea021b94c8316), and it doesn’t try to be everything. If you’re not using it, you’re wasting cycles and brain cells, the only downside of this thing is that it uses TypeScript and used to depend on API-types of Discord.js, hence why the legal action. But the Seyfert team has moved pass that. - -### 3. `discord.zig` (Also Mine) -Zig is fun. It’s fast. And this library reflects that. If you like the idea of no runtime and no BS, give it a go, or find a language that actually pays off your bills instead of Zig. - -### 4. `Discordeno` -This one’s built with care. The maintainer is the kind of guy who builds things because he believes in them—family man, grounded, and technically sharp. Discordeno supports cluster sharding, HTTP/WebSocket proxies, and it’s built for scale. Zero dependencies. Small footprint. Respect. -This is also the library Seyfert was originally based off of and I was once a contributor to it. *Probot* runs on this thing. - -### 5. Anything That Isn’t Run by Degenerates -Honestly, if a library is updated regularly (once a month is fine) and isn't made by someone trying to run a para-social dungeon, give it a shot. And if the devs are sane, support them--financially if you can. Don’t let quality open source rot. - ---- - -## Final Word -In contrast, the Greeks spoke of *kalon*, that which is good, beautiful, and true, authentic. -We don’t call Discord.js bad to insult, but to warn. It has lost the shape of what it was meant to be. And rather than reform, it clings to status, mate, just chill the hell out. -Let the code speak for itself. - ---- - diff --git a/public/zmpl.png b/public/zmpl.png deleted file mode 100644 index 0d2f8d3..0000000 Binary files a/public/zmpl.png and /dev/null differ diff --git a/src/app/views/about-me.zig b/src/app/views/about-me.zig new file mode 100644 index 0000000..1543371 --- /dev/null +++ b/src/app/views/about-me.zig @@ -0,0 +1,20 @@ +const std = @import("std"); +const jetzig = @import("jetzig"); + +pub const layout = "panel"; + +pub fn index(request: *jetzig.Request, data: *jetzig.Data) !jetzig.View { + const cookies = try request.cookies(); + const allowed = blk: { + const session = cookies.get("session") orelse break :blk false; + + const session_query = jetzig.database.Query(.Session) + .findBy(.{ .session_id = session.value }); + _ = request.repo.execute(session_query) catch break :blk false; + break :blk true; + }; + + const root = try data.object(); + try root.put("allowed", allowed); + return request.render(.ok); +} diff --git a/src/app/views/about-me/index.zmpl b/src/app/views/about-me/index.zmpl new file mode 100644 index 0000000..9ebb90b --- /dev/null +++ b/src/app/views/about-me/index.zmpl @@ -0,0 +1,43 @@ +
+ I perform sorcery in the software craftmanship endeavours, I do things, quiet things — mostly in text editors, occasionally in thought (I am able to play Balatro in my brain,) and sometimes in places unseen. This site is my collection unbestowed experiments, side quests, and digital breadcrumbs. +
+ ++ I do not sleep — I suspend. I do not dream — I garbage collect. My working hours are loosely tied to the gravitational pull of niche programming languages and the smell of old documentation, I talk about documentation like a synesthetic metaphor, I am very into skeuomorphism, so you will watch me build awful UIs. +
+ ++ You'll find posts here about software, personal projects, systems I’m poking at, and the occasional half-serious exploration into how things break and why that is interesting. +
+ ++ If you'd like to challenge me to a duel, discuss obscure software, or just say hello — I'm usually somewhere near Discord, or off refactoring something that didn't ask for it. May your stack traces be short. +
+ +- {{zmpl.fmt.datetime(blog.get("created_at"), "%Y-%m-%d %H:%M")}} -
-+ {{zmpl.fmt.datetime(blog.get("created_at"), "%Y-%m-%d %H:%M")}} +
+