.field { width: 100%; margin: .5em 0; padding: .5em 0; } .field + .field { border-top: 1px solid var(--base-200); } .field .wrapper { width: 100%; position: relative; } .field .validation { flex-shrink: 0; max-width: 0; transition: var(--trans-size); } .field.has-error .validation.error, .field.has-success .validation.success { max-width: var(--btn); } .field.has-error .error { color: var(--error); } .field.has-error input, .field.has-error textarea, .field.has-error select { border-color: var(--error); background-color: var(--errorBack); } .field.has-error input:focus, .field.has-error textarea:focus, .field.has-error select:focus { outline-color: var(--error); box-shadow: rgba(var(--error-rgb), .2); } .field.has-success .success { color: var(--success); } .validation-message { color: var(--errorText); font-size: var(--txt-small); margin-top: .25rem; display: block; } .field[data-field=post_status] .wrapper { --justify: flex-start; } .field[data-field=post_status] .btn + label { width: var(--chipchip); min-height: var(--chipchip); padding: 0; } .field[data-field=post_status] .btn:focus + label, .field[data-field=post_status] .btn + label:hover { color: var(--action-contrast); } /********************** DATE & TIME FIELDS **********************/ .date-wrapper { position: relative; display: inline-block; } input[type=date] { padding: 8px 36px 8px 8px; border-radius: 4px; } input[type=date]::-webkit-calendar-picker-indicator { opacity: 0; width: 100%; height: 100%; position: absolute; top: 0; left: 0; cursor: pointer; } input[type=date] + .icon { --w: 20px; position: absolute; right: 10px; top: 50%; transform: translateY(-50%); pointer-events: none; } input:is([type=time], [type=datetime-local], [type=date]) { padding: .5rem; border: 1px solid var(--contrast-200); border-radius: 4px; font-size: 14px; min-width: 180px; background: var(--base); color: var(--contrast); cursor: pointer; } .wrapper input:is([type=time], [type=datetime-local], [type=date]):focus, .time-wrapper input[type=time]:focus, .datetime-wrapper input[type=datetime-local]:focus, .date-wrapper input[type=date]:focus { border-color: var(--action-0); box-shadow: 0 0 0 2px rgba(var(--action-0), .1); } .wrapper .icon, .time-wrapper .icon, .datetime-wrapper .icon, .date-wrapper .icon { width: 18px; height: 18px; background-color: var(--contrast); opacity: .7; } /****************************************************************** QUANTITY FIELD ******************************************************************/ .quantity { margin: 0; display: inline-flex; width: fit-content; align-items: center; justify-content: center; border: 1px solid transparent; border-radius: 4px; position: relative; } .quantity:focus-within { border-color: var(--action-0); } .quantity label { margin: 0; font-size: var(--txt-small); } .quantity button { background: var(--base); padding: 0; width: var(--chip_); height: var(--chip_); min-height: 0; z-index: 0; position: relative; border: 1px solid var(--base-200); color: var(--contrast-200); } .quantity button:hover:not(:disabled) { color: var(--action-0); border-color: var(--action-0); background-color: var(--base); } .quantity button:active:not(:disabled) { background-color: var(--action-0); color: var(--light-0); transform: scale(.95); } .quantity button:disabled { opacity: .5; cursor: not-allowed; } .quantity input[type=number] { z-index: 1; border: 1px solid var(--base-200); background: var(--base); text-align: center; font-size: 1.1rem; width: 60px; height: 48px; margin: 0; padding: 0!important; appearance: textfield; } .quantity input[type=number]::-webkit-outer-spin-button, .quantity input[type=number]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } .quantity input[type=number]:focus { background-color: var(--base-50); } .quantity button.increase { left: -2px; border-radius: 0 4px 4px 0; } .quantity button.decrease { right: -2px; border-radius: 4px 0 0 4px; } /** UPLOADER **/ details.uploader .file-upload-container { margin: 1rem 0; max-width: 100%; } .field.upload { position: relative; } .field.upload .progress { display: none; } .field.upload.uploading .progress { display: block; } .field.upload .actions { position: absolute; top: 0; right: 0; } .preview-wrap .item-grid, .empty-group, .file-upload-wrapper { border: 2px dashed var(--action-0); border-radius: 4px; padding: 2rem; text-align: center; transition: all .3s ease; background: rgba(var(--action-0),var(--op-1)); position: relative; cursor: pointer; user-select: none; } .file-upload-wrapper { max-width: var(--content); margin: 1rem auto; } .file-upload-wrapper h2 { margin: 0; font-size: var(--txt-large); } .preview-wrap .item-grid:hover, .empty-group:hover, .file-upload-wrapper:hover, .dragover { background: rgba(var(--action-0),var(--op-2)); border-color: var(--action-0); } .preview-wrap:has(.item-grid:empty) .selection-controls { display: none; } .preview-wrap .item-grid { min-height: 20vh; } .preview-wrap .item-grid:empty::before { content: 'Unsorted images become their own posts.'; display: block; } .file-upload-wrapper input[type=file] { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; } .empty-group p, .file-upload-text { margin: 0; } .empty-group p strong, .file-upload-text strong { color: var(--action-0); text-decoration: underline; } /** UPLOAD GROUPS **/ .item-grid.groups { grid-template-columns: repeat(1, 1fr); } .item-grid.group { margin-bottom: 0; } .item-grid:is(.restore,.group,.preview) .item { display: block; --w: 1.1em; } .item-grid:is(.restore,.group,.preview) button { padding: .25rem .5rem; } .item-grid:is(.restore,.group,.preview) .preview > input[type=checkbox]:not(.label-button) + label { padding-left: 0; margin: 0; } /*.item-grid:is(.restore,.group,.preview) .preview > input[type=checkbox] + label::before {*/ /* transform: unset;*/ /* top: .5rem;*/ /* left: .5rem;*/ /*}*/ /*.item-grid:is(.restore,.group,.preview) .preview > input[type=checkbox] + label::after {*/ /* top: .5rem;*/ /* left: .75rem;*/ /* transform: translateY(20%) rotate(45deg);*/ /*}*/ .item-grid:is(.restore,.group,.preview) .item .item-actions { position: absolute; top: 0; right: 0; left: var(--chipchip); } .item-grid:is(.restore,.group,.preview) summary { padding: .5rem; } .item-grid:is(.restore,.group,.preview):has([type=checkbox]:checked){ padding: .5rem; background-color: rgba(var(--action-0), var(--op-4)); opacity: 1; } .item-grid:is(.restore,.group,.preview):has([type=checkbox]:checked) img { filter: none; } .item-grid:is(.restore,.group,.preview):has([type=checkbox]:checked) .item img { filter: var(--filter); } .item-grid:is(.restore,.group,.preview):has([type=checkbox]:checked) details, .item-grid.preview summary span { display: none; } [type=radio].featured:checked + label .icon-star, [type=radio].featured:not(:checked) + label .icon-star-fi { display: none; } [type=radio].featured:not(:checked) + label .icon-star, [type=radio].featured:checked + label .icon-star-fi { display: inline-block; } .item:is(.restore,.upload) { border-radius: var(--radius); aspect-ratio: unset; overflow: hidden; background: var(--base); border: 1px solid var(--base-200); } .item:is(.restore,.upload) [for="select-item"] { aspect-ratio: 1; } .item.upload:has(details[open]) { grid-column: 1 / -1; padding: .5rem 10%; margin: 1rem 0; background-color: transparent; border: 2px dashed var(--action-200); } .item.upload:has(details[open]) details[open] { background-color:transparent; } .item:is(.restore,.upload) img { transform: scale(1); transition: transform var(--trans-base); } .item:is(.upload,.restore):hover img { transform: scale(1.02); } .upload-group { padding: 5px; border-radius:var(--radius); background-color: rgba(var(--action-0), var(--op-1)); } .upload-group .selected .field { margin: 0; } .upload-group .selection-actions button { aspect-ratio: unset; } .submit-uploads { position: fixed; bottom: 0; left: var(--btn_); z-index: var(--z-6); height: var(--btn); box-shadow:rgba(var(--base),var(--op-45)) var(--shdw); border-radius: var(--radius); animation: pulse-color 5s infinite; animation-delay: 1s; background-color: var(--action-0); color: var(--action-contrast); } .submit-uploads:hover { background-color: var(--base-200); color: var(--contrast-200); } .empty-group { order: -1; grid-column: 1 / -1; padding: 20px; border-radius: var(--radius); margin: 10px 0; cursor: pointer; transition: all var(--trans-base); text-align: center; background-color: rgba(var(--action-0), var(--op-1)); } .group-display:not([hidden]) ~ .file-upload-container { display: none; } .upload.item.dragging, .dragging { opacity: .7; transform: scale(.95) rotate(3deg); z-index: var(--z-7); box-shadow: 0 8px 25px rgba(var(--contrast), var(--op-2)); } .dragover { background: rgba(var(--action-0), var(--op-3))!important; border-color: var(--action-0)!important; transform: scale(1.05); animation: drop-pulse .8s infinite ease-in-out; } .drag-preview { position: fixed; z-index: var(--z-9); width: fit-content; overflow: visible; pointer-events: none; opacity: .9; transform: scale(1.05); transition: transform .2s ease; } .drag-preview .drag-items { width: max-content; height: max-content; position: relative; } .drag-preview .drag-items .dragi-item { width: 120px; height: 120px; position: absolute; top: 0; left: 0; background: var(--base); border-radius: var(--radius-outer); box-shadow: rgba(var(--base),var(--op-45)) var(--shdw); } .drag-preview .drag-items .drag-item:nth-child(1) { transform: rotate(-3deg); z-index: 3; } .drag-preview .drag-items .drag-item:nth-child(2) { left: 8px; top: -4px; transform: rotate(4deg); z-index: 2; transition-delay: 0.03s; } .drag-preview .drag-items .drag-item:nth-child(3) { left: -6px; top: -8px; transform: rotate(-5deg); z-index: 1; transition-delay: 0.06s; } .drag-preview .drag-items .drag-item:nth-child(4) { left: 12px; top: -12px; transform: rotate(3deg); z-index: 0; transition-delay: 0.09s; } /* Additional items follow the pattern */ .drag-preview .drag-items .drag-item:nth-child(n+5) { left: -10px; top: -16px; transform: rotate(-4deg); z-index: 0; opacity: 0.8; } /* The actual image/video inside fills the wrapper */ .drag-preview .drag-items img, .drag-preview .drag-items video { width: 100%; height: 100%; object-fit: cover; display: block; } .drag-preview .drag-count { position: absolute; top: -8px; right: -8px; background: var(--base-200); color: var(--contrast); border-radius: 50%; width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: bold; box-shadow: rgba(var(--base),var(--op-45)) var(--shdw); z-index: var(--z-3); } /* Touch-specific offset positioning handled via transform in JS */ .drag-preview[data-source="touch"] { /* JS will apply appropriate offset transforms */ } /* Items being dragged - reduce opacity on originals */ .item.dragging { opacity: 0.5; transform: scale(0.95); filter: grayscale(50%); transition: opacity 0.2s ease, transform 0.2s ease, filter 0.2s ease; } @keyframes drop-pulse { 0%, 100% { background-color: rgba(var(--action-0),var(--op-3)); transform: scale(1.02); } 50% { background-color: var(rgba(var(--action-0),var(--op-4))); transform: scale(1.04); } } /****** Upload grouping ******/ .selection-actions { display: flex; gap: .25rem; } @media (max-width: 767px) { body:not(.uploading):has(.group-display:not([hidden])){ overflow:hidden; } body:not(.uploading):has(.group-display:not([hidden])) .qtoggle { z-index: var(--z-1); } .group-display.group-display { position: fixed; top: var(--btn); bottom: var(--btn); left: 0; right: 0; max-height: var(--maxHeight); overflow: hidden; z-index: var(--z-6); width: calc(100% - 1rem); height: calc(100% - 1rem); padding: 0 0 3rem; --justify: flex-start; --align: flex-start; --gap: 0; } .group-display::before { content: ''; display: block; z-index: -1; top: -.5rem; bottom: -.5rem; left: -.5rem; right: -.5rem; position: absolute; background-color: rgba(var(--base), var(--op-6)); filter: blur(5px); } .group-display .preview-wrap, .group-display .sidebar { --wrap: nowrap; height: 50%; overflow:hidden auto; position: relative; padding: .5rem; } .group-display .preview-wrap { top: 0; } .group-display .preview-wrap .selected { display: flex; justify-content: space-between; align-items: center; } .group-display .sidebar { bottom: 0; flex-wrap: nowrap; overflow: hidden auto; background-color: var(--contrast-200); color: var(--base); } .group-display .sidebar > .hint { color: var(--contrast); } .group-display .sidebar .header { display: none; } .group-display .preview-actions { top: 0; flex-shrink:0; } .group-display .preview-wrap > .hint, .group-display .sidebar > .hint { bottom: 0; margin: 0; text-align: center; } .group-display .preview-wrap > .hint, .group-display .sidebar > .hint, .group-display .preview-actions { position: absolute; left: 0; right: 0; background-color: rgba(var(--base), var(--op-6)); z-index: var(--z-3); box-shadow: rgba(var(--base),var(--op-45)) var(--shdw); } .group-display .item-grid { height: 100%; overflow: hidden auto; grid-template-columns: repeat(3, 1fr); padding: 2rem 0; } .group-display .sidebar > .item-grid { grid-template-columns: repeat(1, 1fr); gap: 1rem; padding: 0; } .group-display .sidebar .empty-group { order: 0; position: sticky; height: fit-content; top: 0; z-index: var(--z-3); background-color: rgba(var(--action-0), var(--op-6)); } .group-display .sidebar .upload-group { order: 1; } .group-display .sidebar .empty-group p { margin: 0; } .group-display .field label, .group-display .field { margin: 0; padding: 0; } .group-display .sidebar h4 { margin: .25rem; } .group-display .item { width:100%; height: max-content; } .submit-uploads { bottom: var(--btn); left: 0; right: 0; width: 100%; height: 3rem; } body.uploading .group-display.group-display { position: relative; top: unset; bottom: unset; right: unset; left: unset; } } @media (min-width: 768px) { .group-display.group-display { --wrap: nowrap; --dir: row; --gap: 1rem; --align: flex-start; } .group-display .preview-wrap, .group-display .sidebar { --justify: flex-start; --wrap: nowrap; max-height: calc(100vh - var(--btnbtn)); overflow: hidden auto; } .group-display .preview-wrap, .group-display .sidebar { width: 50%; } .preview-actions, .preview-wrap .hint { position: sticky; z-index: var(--z-3); box-shadow: rgba(var(--base),var(--op-45)) var(--shdw); background-color: var(--base); width: 100%; } .preview-actions { top: 0; left: 0; right: 0; } .preview-actions .field { margin: 0; } .sidebar > .hint, .preview-wrap .hint { bottom: -1rem; padding-bottom: 1rem; margin: 0; left: 0; right: 0; text-align: center; } } .item-grid.restore { grid-template-columns: repeat(1, 1fr); } /************************************************************ QUILL ************************************************************/ .editor-container .ql-toolbar { display: flex; background-color: var(--base-50); justify-content: flex-start; flex-wrap: wrap; padding: .25rem; gap: .5rem 1rem; border-top-left-radius: var(--radius); border-top-right-radius: var(--radius); border-bottom: 4px solid var(--base-50); } .ql-toolbar button { min-height: 0; padding: .5rem; } .ql-toolbar .ql-formats { display: flex; gap: .25rem; } .editor-container .ql-container { --padding: 1rem; background-color: var(--base); border-bottom-left-radius: var(--radius); border-bottom-right-radius: var(--radius); height: fit-content; padding: 2px; border: 1px solid var(--base-200); } .editor-container .ql-container .ql-editor { padding: var(--padding); width: 100%; height: 100%; } .ql-editor img { max-width: 50%; height: auto; } .ql-clipboard { left: -100000px; height: 1px; overflow-y: hidden; position: absolute; top: 50%; } .ql-hidden { display: none; } .ql-tooltip { position: absolute; transform: translateY(10px); background-color: var(--base-100); border: 1px solid var(--base); box-shadow: 0px 0px 5px rgba(var(--base),var(--op-6)); color: var(--contrast); padding: 5px 12px; white-space: nowrap; } /****************************************************** FIELDS ******************************************************/ [data-type=single] .item-grid { display: flex; } /****************************************************** REPEATER ******************************************************/ .repeater-row details summary::after { margin-left: 0; } .repeater-row details summary button { margin-left: auto; } .repeater .field-input-wrapper { flex-direction: column; } .repeater .repeater-items { width: 100%; } .remove-row, .add-repeater-row { margin-left: auto; min-height: 0; height: var(--chipchip); background-color: var(--action-0); } /****************************************************** TAGLIST TAG LIST ******************************************************/ .field.tag-list .row { margin-bottom: 1rem; } .field.tag-list .row .field { flex: 1; min-width: 150px; margin: 0; } .field.tag-list .tag .add-tag-item { flex-shrink: 0; white-space: nowrap; margin-top: calc(var(--txt-medium) + 1rem); } .field.tag-list .tag-items { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1rem; min-height: 2rem; } .field.tag-list .tag-item { background: var(--base-200); padding: 0.4rem 0.75rem; border-radius: 4px; display: inline-flex; align-items: center; gap: 0.5rem; font-size: 0.9rem; line-height: 1.2; } .field.tag-list .tag-item:hover { background: var(--base-100); } .field.tag-list .tag-label { max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .field.tag-list .remove-tag { min-height: 0; padding: .25rem; color: var(--contrast); transition: transform 0.2s; box-shadow: none; } .field.tag-list .remove-tag:hover { transform: scale(1.2); } @media (max-width: 768px) { .field.tag-list .tag { flex-direction: column; align-items: stretch; } .field.tag-list .tag .field { min-width: 100%; } } /* Progress Bar Styling */ .form-progress { padding: 0 1rem; } .form-progress .progress { background: var(--base-100); border-radius: var(--radius); padding: 1rem; } .form-progress .bar { height: 6px; background: var(--base-200); border-radius: 3px; overflow: hidden; margin-bottom: 0.5rem; } .form-progress .fill { height: 100%; background: linear-gradient(90deg, var(--action-0), var(--action-200)); width: 0%; transition: width 0.4s ease; border-radius: 3px; } .form-progress .step-text { font-size: var(--txt-small); font-weight: 600; color: var(--contrast-200); } /* Stepped Tabs Styling */ form nav.tabs { position: relative; top: 0; left: 0; right: 0; padding: 1rem 0; gap: 0; z-index: 0; } form nav.tabs button { position: relative; background: transparent; border: none; padding: 0.5rem 1rem .5rem 3rem; z-index: 1; } /* Step Number Circle */ form nav.tabs .step-number { width: 2.5rem; height: 100%; border-radius: 50% 0 0 50%; position: absolute; left: 0; top: 0; background: var(--base-200); color: var(--contrast-50); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: var(--txt-small); border: 3px solid var(--base); } /* Pending Step */ form nav.tabs button.pending .step-number { background: var(--base-100); color: var(--contrast-200); } /* Current Step */ form nav.tabs button.current .step-number, form nav.tabs button.active .step-number { background: var(--action-0); color: var(--action-contrast); border-color: var(--action-200); } /* Completed Step */ form nav.tabs button.completed .step-number { background: var(--successBack); color: var(--successBack); border-color: var(--successText); } form nav.tabs button.completed .step-number::before { content: '✓'; font-size: 1.2rem; color: var(--successText); position: absolute; } form nav.tabs button.completed h2 { color: var(--contrast-200); } /* Step Navigation Buttons */ .step-navigation { margin-top: 2rem; padding-top: 2rem; border-top: 1px solid var(--base-200); gap: 1rem; } .step-navigation .prev-step { background: var(--base-100); } .step-navigation .next-step, .step-navigation button[type="submit"] { margin-left: auto; } @media (max-width: 768px) { form nav.tabs button { min-width: 80px; font-size: var(--txt-small); } form nav.tabs button h2 { font-size: var(--txt-small); } form { --step-size: 2rem; } } /************************************************ FEEDBACK ERROR SUCCESS STATE ************************************************/ .field input.error, .field textarea.error, .field select.error { border-color: var(--errorBack); } .error-message { color: var(--errorText); font-size: var(--txt-small); margin-top: 0.25rem; display: block; } /************************************************************* Form Summary ************************************************************/ .form-summary { padding: 2rem; border-radius: 8px; margin-top: 2rem; border: 2px dashed var(--contrast-200); } .form-summary .message { margin-bottom: 2rem; } .form-summary .result + .result { position: relative; margin-top: 1.5rem; padding-top: 1.5rem; } .form-summary .result + .result::before { position: absolute; top: 0; left: 16.5%; content: ''; width: 67%; height: 1px; border-bottom: 1px solid var(--base-200); } .form-summary h2 { margin: 1rem 0; } .form-summary h4 { background-color: var(--base-100); padding: .5rem 2rem; position: relative; left: -2rem; color: var(--contrast-200); font-size: 0.875rem; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem; } .form-summary p { color: var(--text); margin: 0; } .repeater-summary, .group-summary { background: var(--base-100); padding: 1rem; border-radius: 4px; margin-top: 0.5rem; } .repeater-row { margin-bottom: 1rem; } .repeater-row:last-child { margin-bottom: 0; } .selected-item { border: 1px solid var(--base-200); border-radius: var(--radius); font-size: var(--txt-x-small); background-color: var(--base); padding: .25rem .5rem; } .selected-item button { --w: .5em; min-height: 1em; width: 1em; padding: 0; } .selector .selected-items, .selector .auto-wrapper { flex: 1; width: 100%; } /** STATUS **/ .fstatus { z-index: var(--z-5); background-color: rgba(var(--base), var(--op-6)); border-radius: var(--radius); padding: 0 .5rem; position: fixed; right: .5rem; top: var(--btnbtn); --w: 1em; box-shadow: rgba(var(--base),var(--op-6)) var(--shdw); --wrap: nowrap; --gap: 1rem; } .fstatus .spinner { display: none; } .fstatus.loading .spinner { display: inline-block; } .fstatus p { margin: 0; padding: .25rem; } /** RESTORE UPLOADS **/ .restore-uploads .item-grid.group .field.group, .restore-uploads .upload-group .selection-actions { display: none; } .upload-group .item-grid.group { grid-template-columns: repeat(2, 1fr); } .restore-uploads .item-grid.group { grid-template-columns: repeat(3, 1fr); } fieldset { width: 100%; border-color: var(--base-200); } /** RESTORE FORM **/ .restore-form.restore-form[hidden] { display: block!important; position: fixed; bottom: var(--offScreen); right: var(--btnbtn); transition: bottom var(--trans-base); transition-duration: 2s; } .restore-form.restore-form:not([hidden]) { width: 50vw; padding: 1rem; z-index: var(--z-7); background-color: rgba(var(--base), var(--op-6)); border-radius: var(--radius); box-shadow: rgba(var(--action-0), var(--op-6)) var(--shdw); position: fixed; right: var(--btnbtn); bottom: 0; transition: bottom var(--trans-base); } .restore-form h3 { font-size: var(--txt-medium); } body:has(nav.fixed.bottom) .restore-form.restore-form:not([hidden]) { bottom: var(--btn); } .restore-form .actions { display: flex; width: 100%; } .restore-form .actions button { min-height: var(--chip); font-size: var(--txt-x-small); width: 100%; }