diff --git a/package.json b/package.json index e69de29..16f50a1 100644 --- a/package.json +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "minecraft-server-status-checker", + "version": "1.0.0", + "description": "A web application to check the status of Minecraft Java and Bedrock Edition servers", + "main": "status_site.js", + "scripts": { + "start": "node status_site.js", + "build:css": "npx tailwindcss -i public/css/style.css -o public/css/style.min.css --minify", + "dev": "nodemon status_site.js" + }, + "dependencies": { + "@tailwindcss/cli": "^4.1.11", + "dotenv": "^16.4.5", + "express": "^4.21.0" + }, + "devDependencies": { + "nodemon": "^3.1.7", + "tailwindcss": "^3.4.13" + }, + "author": "Your Name", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/your-username/minecraft-server-status-checker.git" + }, + "keywords": [ + "minecraft", + "server-status", + "nodejs", + "express", + "tailwindcss" + ] +} diff --git a/public/css/style.css b/public/css/style.css index 734d350..b8cad4b 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -47,4 +47,19 @@ .bg-clip-text { -webkit-background-clip: text; background-clip: text; +} + +.loading-spinner { + display: none; + border: 4px solid rgba(255, 255, 255, 0.2); + border-top: 4px solid #3B82F6; + border-radius: 50%; + width: 24px; + height: 24px; + animation: spin 1s linear infinite; + margin: 0 auto; +} +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } } \ No newline at end of file diff --git a/public/css/style.min.css b/public/css/style.min.css index 7663e42..0887750 100644 --- a/public/css/style.min.css +++ b/public/css/style.min.css @@ -40,7 +40,6 @@ --spacing: 0.25rem; --container-md: 28rem; --container-lg: 32rem; - --container-xl: 36rem; --container-7xl: 80rem; --text-xs: 0.75rem; --text-xs--line-height: calc(1 / 0.75); @@ -66,7 +65,6 @@ --radius-xl: 0.75rem; --radius-2xl: 1rem; --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); - --animate-spin: spin 1s linear infinite; --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; --blur-md: 12px; --default-transition-duration: 150ms; @@ -221,30 +219,12 @@ } } @layer utilities { - .collapse { - visibility: collapse; - } - .invisible { - visibility: hidden; - } - .visible { - visibility: visible; - } .absolute { position: absolute; } - .fixed { - position: fixed; - } .relative { position: relative; } - .static { - position: static; - } - .sticky { - position: sticky; - } .inset-0 { inset: calc(var(--spacing) * 0); } @@ -254,33 +234,9 @@ .z-10 { z-index: 10; } - .z-50 { - z-index: 50; - } - .container { - width: 100%; - @media (width >= 40rem) { - max-width: 40rem; - } - @media (width >= 48rem) { - max-width: 48rem; - } - @media (width >= 64rem) { - max-width: 64rem; - } - @media (width >= 80rem) { - max-width: 80rem; - } - @media (width >= 96rem) { - max-width: 96rem; - } - } .mx-auto { margin-inline: auto; } - .mt-1 { - margin-top: calc(var(--spacing) * 1); - } .mt-2 { margin-top: calc(var(--spacing) * 2); } @@ -290,204 +246,36 @@ .mt-8 { margin-top: calc(var(--spacing) * 8); } - .mr-2 { - margin-right: calc(var(--spacing) * 2); - } - .mb-1 { - margin-bottom: calc(var(--spacing) * 1); - } - .mb-2 { - margin-bottom: calc(var(--spacing) * 2); - } - .mb-3 { - margin-bottom: calc(var(--spacing) * 3); - } - .mb-4 { - margin-bottom: calc(var(--spacing) * 4); - } - .mb-6 { - margin-bottom: calc(var(--spacing) * 6); - } - .ml-2 { - margin-left: calc(var(--spacing) * 2); - } - .ml-4 { - margin-left: calc(var(--spacing) * 4); - } .block { display: block; } - .contents { - display: contents; - } .flex { display: flex; } - .grid { - display: grid; - } .hidden { display: none; } - .inline { - display: inline; - } - .inline-block { - display: inline-block; - } - .table { - display: table; - } - .h-5 { - height: calc(var(--spacing) * 5); - } - .h-24 { - height: calc(var(--spacing) * 24); - } - .h-48 { - height: calc(var(--spacing) * 48); - } - .h-full { - height: 100%; - } - .max-h-\[95vh\] { - max-height: 95vh; - } - .max-h-\[calc\(95vh-10rem\)\] { - max-height: calc(95vh - 10rem); - } - .min-h-full { - min-height: 100%; - } .min-h-screen { min-height: 100vh; } - .w-1\/3 { - width: calc(1/3 * 100%); - } - .w-2\/3 { - width: calc(2/3 * 100%); - } - .w-5 { - width: calc(var(--spacing) * 5); - } - .w-20 { - width: calc(var(--spacing) * 20); - } - .w-32 { - width: calc(var(--spacing) * 32); - } .w-full { width: 100%; } .max-w-7xl { max-width: var(--container-7xl); } - .max-w-\[95\%\] { - max-width: 95%; - } .max-w-lg { max-width: var(--container-lg); } - .max-w-md { - max-width: var(--container-md); - } - .flex-1 { - flex: 1; - } .flex-grow { flex-grow: 1; } - .grow { - flex-grow: 1; - } - .transform { - transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,); - } .animate-pulse { animation: var(--animate-pulse); } - .cursor-not-allowed { - cursor: not-allowed; - } - .resize { - resize: both; - } - .list-inside { - list-style-position: inside; - } - .list-decimal { - list-style-type: decimal; - } - .list-disc { - list-style-type: disc; - } - .grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); - } .flex-col { flex-direction: column; } - .flex-wrap { - flex-wrap: wrap; - } - .items-baseline { - align-items: baseline; - } - .items-center { - align-items: center; - } - .justify-between { - justify-content: space-between; - } - .justify-center { - justify-content: center; - } - .justify-end { - justify-content: flex-end; - } - .justify-start { - justify-content: flex-start; - } - .gap-2 { - gap: calc(var(--spacing) * 2); - } - .gap-4 { - gap: calc(var(--spacing) * 4); - } - .gap-5 { - gap: calc(var(--spacing) * 5); - } - .gap-10 { - gap: calc(var(--spacing) * 10); - } - .gap-15 { - gap: calc(var(--spacing) * 15); - } - .gap-20 { - gap: calc(var(--spacing) * 20); - } - .space-y-1 { - :where(& > :not(:last-child)) { - --tw-space-y-reverse: 0; - margin-block-start: calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse)); - margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse))); - } - } - .space-y-2 { - :where(& > :not(:last-child)) { - --tw-space-y-reverse: 0; - margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse)); - margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))); - } - } - .space-y-4 { - :where(& > :not(:last-child)) { - --tw-space-y-reverse: 0; - margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse)); - margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse))); - } - } .space-y-6 { :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; @@ -495,104 +283,31 @@ margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse))); } } - .space-x-1 { - :where(& > :not(:last-child)) { - --tw-space-x-reverse: 0; - margin-inline-start: calc(calc(var(--spacing) * 1) * var(--tw-space-x-reverse)); - margin-inline-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-x-reverse))); - } - } - .space-x-2 { - :where(& > :not(:last-child)) { - --tw-space-x-reverse: 0; - margin-inline-start: calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse)); - margin-inline-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse))); - } - } - .space-x-4 { - :where(& > :not(:last-child)) { - --tw-space-x-reverse: 0; - margin-inline-start: calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse)); - margin-inline-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse))); - } - } - .truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } .overflow-hidden { overflow: hidden; } - .overflow-x-auto { - overflow-x: auto; - } - .overflow-x-hidden { - overflow-x: hidden; - } - .overflow-y-auto { - overflow-y: auto; - } - .rounded { - border-radius: 0.25rem; - } .rounded-2xl { border-radius: var(--radius-2xl); } - .rounded-full { - border-radius: calc(infinity * 1px); - } .rounded-lg { border-radius: var(--radius-lg); } - .rounded-md { - border-radius: var(--radius-md); - } - .rounded-xl { - border-radius: var(--radius-xl); - } .border { border-style: var(--tw-border-style); border-width: 1px; } - .border-t { - border-top-style: var(--tw-border-style); - border-top-width: 1px; - } - .border-b { - border-bottom-style: var(--tw-border-style); - border-bottom-width: 1px; - } - .border-gray-500 { - border-color: var(--color-gray-500); - } .border-gray-600 { border-color: var(--color-gray-600); } - .bg-black { - background-color: var(--color-black); - } .bg-blue-600 { background-color: var(--color-blue-600); } - .bg-cyan-600 { - background-color: var(--color-cyan-600); - } - .bg-gray-600 { - background-color: var(--color-gray-600); - } - .bg-gray-700 { - background-color: var(--color-gray-700); - } .bg-gray-700\/50 { background-color: color-mix(in srgb, oklch(37.3% 0.034 259.733) 50%, transparent); @supports (color: color-mix(in lab, red, red)) { background-color: color-mix(in oklab, var(--color-gray-700) 50%, transparent); } } - .bg-gray-800 { - background-color: var(--color-gray-800); - } .bg-gray-800\/50 { background-color: color-mix(in srgb, oklch(27.8% 0.033 256.848) 50%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -608,57 +323,18 @@ .bg-gray-900 { background-color: var(--color-gray-900); } - .bg-green-600 { - background-color: var(--color-green-600); - } - .bg-purple-600 { - background-color: var(--color-purple-600); - } - .bg-red-600 { - background-color: var(--color-red-600); - } - .bg-teal-600 { - background-color: var(--color-teal-600); - } - .bg-white { - background-color: var(--color-white); - } - .bg-yellow-600 { - background-color: var(--color-yellow-600); - } - .p-2 { - padding: calc(var(--spacing) * 2); - } - .p-3 { - padding: calc(var(--spacing) * 3); - } - .p-4 { - padding: calc(var(--spacing) * 4); - } .p-6 { padding: calc(var(--spacing) * 6); } .p-8 { padding: calc(var(--spacing) * 8); } - .px-1 { - padding-inline: calc(var(--spacing) * 1); - } - .px-2 { - padding-inline: calc(var(--spacing) * 2); - } .px-3 { padding-inline: calc(var(--spacing) * 3); } .px-4 { padding-inline: calc(var(--spacing) * 4); } - .px-6 { - padding-inline: calc(var(--spacing) * 6); - } - .py-1 { - padding-block: calc(var(--spacing) * 1); - } .py-2 { padding-block: calc(var(--spacing) * 2); } @@ -674,12 +350,6 @@ .py-12 { padding-block: calc(var(--spacing) * 12); } - .pb-2 { - padding-bottom: calc(var(--spacing) * 2); - } - .pl-6 { - padding-left: calc(var(--spacing) * 6); - } .text-center { text-align: center; } @@ -691,30 +361,10 @@ font-size: var(--text-4xl); line-height: var(--tw-leading, var(--text-4xl--line-height)); } - .text-base { - font-size: var(--text-base); - line-height: var(--tw-leading, var(--text-base--line-height)); - } - .text-lg { - font-size: var(--text-lg); - line-height: var(--tw-leading, var(--text-lg--line-height)); - } .text-sm { font-size: var(--text-sm); line-height: var(--tw-leading, var(--text-sm--line-height)); } - .text-xl { - font-size: var(--text-xl); - line-height: var(--tw-leading, var(--text-xl--line-height)); - } - .text-xs { - font-size: var(--text-xs); - line-height: var(--tw-leading, var(--text-xs--line-height)); - } - .leading-relaxed { - --tw-leading: var(--leading-relaxed); - line-height: var(--leading-relaxed); - } .font-bold { --tw-font-weight: var(--font-weight-bold); font-weight: var(--font-weight-bold); @@ -731,21 +381,9 @@ --tw-tracking: var(--tracking-tight); letter-spacing: var(--tracking-tight); } - .break-words { - overflow-wrap: break-word; - } - .break-all { - word-break: break-all; - } - .whitespace-pre-wrap { - white-space: pre-wrap; - } .text-blue-400 { color: var(--color-blue-400); } - .text-gray-100 { - color: var(--color-gray-100); - } .text-gray-200 { color: var(--color-gray-200); } @@ -761,22 +399,9 @@ .text-red-400 { color: var(--color-red-400); } - .text-red-500 { - color: var(--color-red-500); - } .text-white { color: var(--color-white); } - .lowercase { - text-transform: lowercase; - } - .opacity-50 { - opacity: 50%; - } - .shadow-lg { - --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); - box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); - } .shadow-md { --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); @@ -805,48 +430,20 @@ --tw-ring-color: color-mix(in oklab, var(--color-gray-700) 50%, transparent); } } - .outline { - outline-style: var(--tw-outline-style); - outline-width: 1px; - } - .blur { - --tw-blur: blur(8px); - filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); - } - .filter { - filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); - } .backdrop-blur-md { --tw-backdrop-blur: blur(var(--blur-md)); -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); } - .transition { - transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, visibility, content-visibility, overlay, pointer-events; - transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); - transition-duration: var(--tw-duration, var(--default-transition-duration)); - } .transition-all { transition-property: all; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } - .duration-200 { - --tw-duration: 200ms; - transition-duration: 200ms; - } .duration-300 { --tw-duration: 300ms; transition-duration: 300ms; } - .ease-in-out { - --tw-ease: var(--ease-in-out); - transition-timing-function: var(--ease-in-out); - } - .select-all { - -webkit-user-select: all; - user-select: all; - } .hover\:bg-blue-700 { &:hover { @media (hover: hover) { @@ -854,13 +451,6 @@ } } } - .hover\:bg-cyan-700 { - &:hover { - @media (hover: hover) { - background-color: var(--color-cyan-700); - } - } - } .hover\:bg-gray-600\/50 { &:hover { @media (hover: hover) { @@ -871,76 +461,6 @@ } } } - .hover\:bg-gray-700 { - &:hover { - @media (hover: hover) { - background-color: var(--color-gray-700); - } - } - } - .hover\:bg-green-700 { - &:hover { - @media (hover: hover) { - background-color: var(--color-green-700); - } - } - } - .hover\:bg-purple-700 { - &:hover { - @media (hover: hover) { - background-color: var(--color-purple-700); - } - } - } - .hover\:bg-red-700 { - &:hover { - @media (hover: hover) { - background-color: var(--color-red-700); - } - } - } - .hover\:bg-teal-700 { - &:hover { - @media (hover: hover) { - background-color: var(--color-teal-700); - } - } - } - .hover\:bg-yellow-700 { - &:hover { - @media (hover: hover) { - background-color: var(--color-yellow-700); - } - } - } - .hover\:text-blue-500 { - &:hover { - @media (hover: hover) { - color: var(--color-blue-500); - } - } - } - .hover\:text-red-700 { - &:hover { - @media (hover: hover) { - color: var(--color-red-700); - } - } - } - .hover\:text-white { - &:hover { - @media (hover: hover) { - color: var(--color-white); - } - } - } - .hover\:underline { - &:hover { - @media (hover: hover) { - text-decoration-line: underline; - } - } - } .hover\:shadow-lg { &:hover { @media (hover: hover) { @@ -959,41 +479,11 @@ --tw-ring-color: var(--color-blue-500); } } - .sm\:w-\[90\%\] { - @media (width >= 40rem) { - width: 90%; - } - } - .sm\:p-4 { - @media (width >= 40rem) { - padding: calc(var(--spacing) * 4); - } - } .sm\:px-6 { @media (width >= 40rem) { padding-inline: calc(var(--spacing) * 6); } } - .md\:w-\[85\%\] { - @media (width >= 48rem) { - width: 85%; - } - } - .md\:grid-cols-2 { - @media (width >= 48rem) { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - } - .md\:grid-cols-3 { - @media (width >= 48rem) { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } - } - .lg\:w-\[80\%\] { - @media (width >= 64rem) { - width: 80%; - } - } .lg\:px-8 { @media (width >= 64rem) { padding-inline: calc(var(--spacing) * 8); @@ -1037,45 +527,34 @@ -webkit-background-clip: text; background-clip: text; } -@property --tw-rotate-x { - syntax: "*"; - inherits: false; +.loading-spinner { + display: none; + border: 4px solid rgba(255, 255, 255, 0.2); + border-top: 4px solid #3B82F6; + border-radius: 50%; + width: 24px; + height: 24px; + animation: spin 1s linear infinite; + margin: 0 auto; } -@property --tw-rotate-y { - syntax: "*"; - inherits: false; -} -@property --tw-rotate-z { - syntax: "*"; - inherits: false; -} -@property --tw-skew-x { - syntax: "*"; - inherits: false; -} -@property --tw-skew-y { - syntax: "*"; - inherits: false; +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } } @property --tw-space-y-reverse { syntax: "*"; inherits: false; initial-value: 0; } -@property --tw-space-x-reverse { - syntax: "*"; - inherits: false; - initial-value: 0; -} @property --tw-border-style { syntax: "*"; inherits: false; initial-value: solid; } -@property --tw-leading { - syntax: "*"; - inherits: false; -} @property --tw-font-weight { syntax: "*"; inherits: false; @@ -1149,64 +628,6 @@ inherits: false; initial-value: 0 0 #0000; } -@property --tw-outline-style { - syntax: "*"; - inherits: false; - initial-value: solid; -} -@property --tw-blur { - syntax: "*"; - inherits: false; -} -@property --tw-brightness { - syntax: "*"; - inherits: false; -} -@property --tw-contrast { - syntax: "*"; - inherits: false; -} -@property --tw-grayscale { - syntax: "*"; - inherits: false; -} -@property --tw-hue-rotate { - syntax: "*"; - inherits: false; -} -@property --tw-invert { - syntax: "*"; - inherits: false; -} -@property --tw-opacity { - syntax: "*"; - inherits: false; -} -@property --tw-saturate { - syntax: "*"; - inherits: false; -} -@property --tw-sepia { - syntax: "*"; - inherits: false; -} -@property --tw-drop-shadow { - syntax: "*"; - inherits: false; -} -@property --tw-drop-shadow-color { - syntax: "*"; - inherits: false; -} -@property --tw-drop-shadow-alpha { - syntax: ""; - inherits: false; - initial-value: 100%; -} -@property --tw-drop-shadow-size { - syntax: "*"; - inherits: false; -} @property --tw-backdrop-blur { syntax: "*"; inherits: false; @@ -1247,10 +668,6 @@ syntax: "*"; inherits: false; } -@property --tw-ease { - syntax: "*"; - inherits: false; -} @keyframes spin { to { transform: rotate(360deg); @@ -1264,15 +681,8 @@ @layer properties { @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) { *, ::before, ::after, ::backdrop { - --tw-rotate-x: initial; - --tw-rotate-y: initial; - --tw-rotate-z: initial; - --tw-skew-x: initial; - --tw-skew-y: initial; --tw-space-y-reverse: 0; - --tw-space-x-reverse: 0; --tw-border-style: solid; - --tw-leading: initial; --tw-font-weight: initial; --tw-tracking: initial; --tw-shadow: 0 0 #0000; @@ -1289,20 +699,6 @@ --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; - --tw-outline-style: solid; - --tw-blur: initial; - --tw-brightness: initial; - --tw-contrast: initial; - --tw-grayscale: initial; - --tw-hue-rotate: initial; - --tw-invert: initial; - --tw-opacity: initial; - --tw-saturate: initial; - --tw-sepia: initial; - --tw-drop-shadow: initial; - --tw-drop-shadow-color: initial; - --tw-drop-shadow-alpha: 100%; - --tw-drop-shadow-size: initial; --tw-backdrop-blur: initial; --tw-backdrop-brightness: initial; --tw-backdrop-contrast: initial; @@ -1313,7 +709,6 @@ --tw-backdrop-saturate: initial; --tw-backdrop-sepia: initial; --tw-duration: initial; - --tw-ease: initial; } } } diff --git a/public/index.html b/public/index.html index a9c4a5d..364150e 100644 --- a/public/index.html +++ b/public/index.html @@ -45,6 +45,7 @@ style="animation-delay: 0.3s;"> Check Status +