diff --git a/src/client/public/css/main.css b/src/client/public/css/main.css index 446b61f..6ee3d7e 100644 --- a/src/client/public/css/main.css +++ b/src/client/public/css/main.css @@ -191,3 +191,63 @@ hs-accordion-toggle w-full text-start flex items-center gap-x-3.5 py-2 px-2.5 te } /* End Guild Header */ + +/* Form Controls */ + +.text-input-label { + @apply block text-sm font-medium mb-2 dark:text-white +} + +.text-input { + @apply + py-3 + px-4 + block + w-full + rounded-md + text-sm + disabled:opacity-50 + disabled:pointer-events-none + border-gray-200 + focus:border-blue-500 + focus:ring-blue-500 + dark:bg-neutral-900 + dark:border-neutral-700 + dark:text-neutral-400 + dark:placeholder-neutral-500 + dark:focus:ring-neutral-600 +} + +.text-input-help { + @apply mt-2 text-sm text-gray-500 dark:text-neutral-500 +} + +.select-input { + @apply + relative + py-3 + ps-4 + pe-9 + flex + gap-x-2 + text-nowrap + w-full + cursor-pointer + bg-white + border + border-gray-200 + rounded-md + text-start + text-sm + focus:outline-none + focus:ring-2 + focus:ring-blue-500 + dark:bg-neutral-900 + dark:border-neutral-700 + dark:text-neutral-400 + dark:focus:outline-none + dark:focus:ring-1 + dark:focus:ring-neutral-600 +} + +/* End Form Controls */ \ No newline at end of file diff --git a/src/client/public/css/tailwind.css b/src/client/public/css/tailwind.css index 7bddc74..e267da6 100644 --- a/src/client/public/css/tailwind.css +++ b/src/client/public/css/tailwind.css @@ -1576,10 +1576,6 @@ video { border-radius: 0.25rem; } -.rounded-2xl { - border-radius: 1rem; -} - .rounded-full { border-radius: 9999px; } @@ -2487,6 +2483,138 @@ hs-accordion-toggle w-full text-start flex items-center gap-x-3.5 py-2 px-2.5 te /* End Guild Header */ +/* Form Controls */ + +.text-input-label { + margin-bottom: 0.5rem; + display: block; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 500; +} + +.text-input-label:where(.dark, .dark *) { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.text-input { + display: block; + width: 100%; + border-radius: 0.375rem; + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); + padding-top: 0.75rem; + padding-bottom: 0.75rem; + padding-left: 1rem; + padding-right: 1rem; + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-input:focus { + --tw-border-opacity: 1; + border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); + --tw-ring-opacity: 1; + --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1)); +} + +.text-input:disabled { + pointer-events: none; + opacity: 0.5; +} + +.text-input:where(.dark, .dark *) { + --tw-border-opacity: 1; + border-color: rgb(64 64 64 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(23 23 23 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(163 163 163 / var(--tw-text-opacity, 1)); +} + +.text-input:where(.dark, .dark *)::-moz-placeholder { + --tw-placeholder-opacity: 1; + color: rgb(115 115 115 / var(--tw-placeholder-opacity, 1)); +} + +.text-input:where(.dark, .dark *)::placeholder { + --tw-placeholder-opacity: 1; + color: rgb(115 115 115 / var(--tw-placeholder-opacity, 1)); +} + +.text-input:focus:where(.dark, .dark *) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(82 82 82 / var(--tw-ring-opacity, 1)); +} + +.text-input-help { + margin-top: 0.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity, 1)); +} + +.text-input-help:where(.dark, .dark *) { + --tw-text-opacity: 1; + color: rgb(115 115 115 / var(--tw-text-opacity, 1)); +} + +.select-input { + position: relative; + display: flex; + width: 100%; + cursor: pointer; + -moz-column-gap: 0.5rem; + column-gap: 0.5rem; + text-wrap: nowrap; + border-radius: 0.375rem; + border-width: 1px; + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + padding-top: 0.75rem; + padding-bottom: 0.75rem; + padding-inline-start: 1rem; + padding-inline-end: 2.25rem; + text-align: start; + font-size: 0.875rem; + line-height: 1.25rem; +} + +.select-input:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --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); + --tw-ring-opacity: 1; + --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1)); +} + +.select-input:where(.dark, .dark *) { + --tw-border-opacity: 1; + border-color: rgb(64 64 64 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(23 23 23 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(163 163 163 / var(--tw-text-opacity, 1)); +} + +.select-input:focus:where(.dark, .dark *) { + outline: 2px solid transparent; + outline-offset: 2px; + --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, 0 0 #0000); + --tw-ring-opacity: 1; + --tw-ring-color: rgb(82 82 82 / var(--tw-ring-opacity, 1)); +} + +/* End Form Controls */ + .before\:absolute::before { content: var(--tw-content); position: absolute; @@ -2792,6 +2920,50 @@ hs-accordion-toggle w-full text-start flex items-center gap-x-3.5 py-2 px-2.5 te opacity: 0.5; } +.group:invalid .group-invalid\:pointer-events-none { + pointer-events: none; +} + +.group:invalid .group-invalid\:opacity-30 { + opacity: 0.3; +} + +.group.submitted .group-\[\.submitted\]\:invalid\:border-red-500:invalid { + --tw-border-opacity: 1; + border-color: rgb(239 68 68 / var(--tw-border-opacity, 1)); +} + +.group.submitted .group-\[\.submitted\]\:invalid\:ring-red-500:invalid { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1)); +} + +.group.submitted .peer:invalid ~ .group-\[\.submitted\]\:peer-\[\:invalid\]\:block { + display: block; +} + +.group.submitted .peer:invalid ~ .group-\[\.submitted\]\:peer-\[\:invalid\]\:hidden { + display: none; +} + +.group.submitted .peer:invalid ~ .group-\[\.submitted\]\:peer-\[\:invalid\]\:border-red-500 { + --tw-border-opacity: 1; + border-color: rgb(239 68 68 / var(--tw-border-opacity, 1)); +} + +.group.submitted .peer:invalid ~ .group-\[\.submitted\]\:peer-\[\:invalid\]\:ring-red-500 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1)); +} + +.group.submitted .peer:has(:invalid) ~ .group-\[\.submitted\]\:peer-has-\[\:invalid\]\:block { + display: block; +} + +.group.submitted .peer:has(:invalid) ~ .group-\[\.submitted\]\:peer-has-\[\:invalid\]\:hidden { + display: none; +} + .hs-dropdown.open > .hs-dropdown-open\:block { display: block; } @@ -3082,11 +3254,6 @@ hs-accordion-toggle w-full text-start flex items-center gap-x-3.5 py-2 px-2.5 te gap: 1.5rem; } - .sm\:gap-x-10 { - -moz-column-gap: 2.5rem; - column-gap: 2.5rem; - } - .sm\:gap-x-3 { -moz-column-gap: 0.75rem; column-gap: 0.75rem; @@ -3107,8 +3274,8 @@ hs-accordion-toggle w-full text-start flex items-center gap-x-3.5 py-2 px-2.5 te margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); } - .sm\:rounded-3xl { - border-radius: 1.5rem; + .sm\:rounded-lg { + border-radius: 0.5rem; } .sm\:p-5 { @@ -3185,6 +3352,11 @@ hs-accordion-toggle w-full text-start flex items-center gap-x-3.5 py-2 px-2.5 te justify-content: space-between; } + .md\:gap-x-10 { + -moz-column-gap: 2.5rem; + column-gap: 2.5rem; + } + .md\:gap-x-3 { -moz-column-gap: 0.75rem; column-gap: 0.75rem; @@ -3543,17 +3715,6 @@ hs-accordion-toggle w-full text-start flex items-center gap-x-3.5 py-2 px-2.5 te color: rgb(115 115 115 / var(--tw-text-opacity, 1)); } -.dark\:focus\:outline-none:focus:where(.dark, .dark *) { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.dark\:focus\:ring-1:focus:where(.dark, .dark *) { - --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, 0 0 #0000); -} - .dark\:focus\:ring-neutral-600:focus:where(.dark, .dark *) { --tw-ring-opacity: 1; --tw-ring-color: rgb(82 82 82 / var(--tw-ring-opacity, 1)); @@ -3613,4 +3774,4 @@ hs-accordion-toggle w-full text-start flex items-center gap-x-3.5 py-2 px-2.5 te .\[\&\:\:-webkit-scrollbar\]\:w-2::-webkit-scrollbar { width: 0.5rem; -} +} \ No newline at end of file diff --git a/src/client/public/js/guild/subscriptions.js b/src/client/public/js/guild/subscriptions.js index 4fdd5e7..ea41a11 100644 --- a/src/client/public/js/guild/subscriptions.js +++ b/src/client/public/js/guild/subscriptions.js @@ -274,6 +274,7 @@ $("input[name='filterActive']").on("change", () => { }) const openSubForm = async () => { + $("#subForm").removeClass("submitted"); HSOverlay.open($("#subModal").get(0)) } @@ -282,6 +283,14 @@ $(document).on("click", ".openSubModal-js", openSubForm); const submitForm = async event => { event.preventDefault(); + const form = $("#subForm").get(0); + $(form).addClass("submitted"); + + if (!form.checkValidity()) { + alert("form invalid"); + return; + } + await $.ajax({ url: `/guild/${guildId}/subscriptions/api`, method: "post", diff --git a/src/client/views/guild/subscriptions.ejs b/src/client/views/guild/subscriptions.ejs index b5f0c38..6c3f1cf 100644 --- a/src/client/views/guild/subscriptions.ejs +++ b/src/client/views/guild/subscriptions.ejs @@ -250,38 +250,48 @@ --> -