/* Base Feed Container */ .feed-block { max-width: var(--full); margin: 0 auto; } .feed-block > *:not(.feed-grid, h2) { max-width: var(--alignWide); margin: 1rem var(--mr) 1rem var(--ml); } .feed-block > h2 { max-width: var(--maxWidth); } .feed-block[data-loading="true"] { opacity: 0.7; } .feed-block:empty::before { content: "Looks like there's nothing here yet."; display: block; text-align: center; padding: 2rem; } /* Feed Grid Layout */ .feed-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: .5rem; margin-bottom: 2rem; } @media (min-width: 768px) { .feed-grid { grid-template-columns: repeat(4, 1fr); gap: 1rem; } .feed-empty-state { grid-column: 2/ span 2!important; } } @media (min-width: 1200px){ .feed-grid{ grid-template-columns: repeat(6, 1fr); } .feed-empty-state { grid-column: 2 / span 4!important; } } /* Feed Items */ .feed-item { position: relative; border-radius: 0.5rem; overflow: hidden; background: var(--base-50); box-shadow: 0 2px 4px rgba(0,0,0,0.1); opacity: 0; transition: opacity var(--transition-base) var(--delay); height: fit-content; padding: 0; } .feed-item[data-loaded] { opacity: 1; } .feed-item[data-loaded] + .feed-item[data-loaded] { --delay: var(--delay) + var(--increase); } .feed-item.artist { grid-column: span 2; } .feed-item.highlighted { animation: highlight 2s ease-out; } /* Feed Item Images */ .feed-image { display: block; aspect-ratio: 1; overflow: hidden; width: 100%; height: 100%; } .artist-tattoos img, .feed-image img { width: 100%; height: 100%; object-fit: cover; transition: transform var(--timing) var(--function); } .artist-tattoos a:hover img, .feed-image:hover img { transform: scale(1.05); } /* Item Information */ .item-info { padding: .25rem 1rem; } .item-info h3 { margin: 0!important; font-size: 1.1rem; font-family: var(--body); font-weight: var(--bWeight); text-align: center; } .item-info span { text-transform: uppercase; display: flex; align-items: center; } .item-info .icon { margin-right: 1em; } /* Taxonomy Lists */ .taxonomy-lists { margin: 0.5rem 0; } .taxonomy-group { display: flex; flex-direction: column; align-items: flex-start; gap: 0.5rem; margin-bottom: 0.25rem; } .taxonomy-group ul { list-style: none; margin: 0; padding: 0; } /* Labels */ .item-labels { margin-top: 0.5rem; display: flex; flex-wrap: wrap; gap: 0.5rem; } .label { display: flex; align-items: center; gap: 0.25rem; font-size: 0.9rem; } .label a { color: inherit; text-decoration: none; } .label a:hover { color: var(--action-0); } /* Favorite Button */ button.favourite { position: absolute; top: .5rem; right: .5rem; z-index: 10; background: var(--overlay-medium); border-radius: 50%; box-shadow: var(--subtle); border: none; cursor: pointer; width: 2rem; height: 2rem; display: flex; justify-content: center; align-items: center; backdrop-filter: blur(5px); transition: all var(--transition-base); } button.favourite:hover { transform: scale(1.1); color: var(--action-0); background: var(--base); box-shadow: 0 4px 8px rgba(0,0,0,0.15); } button.favourite.favourited { animation: favourite-pop 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); } /* Filters */ .feed-filters { margin: 2rem auto; position: relative; } .feed-filters .feed-controls { display: flex; justify-content: space-between; align-items: center; gap: 2rem; width: 100%; } .feed-filters details summary { justify-content: flex-start; padding: 2rem .5rem .5rem; /* display: flex;*/ /* border: 0;*/ /* flex-wrap: nowrap;*/ /* padding: 2rem .5rem .5rem;*/ /* gap: .125rem;*/ /* position: relative;*/ /* justify-content: flex-start;*/ /* gap: .5rem;*/ /* border-radius: var(--innerRadius);*/ } .feed-filters details[open] summary { background-color: var(--base-50); } .feed-filters summary:after { position:absolute; right: .5rem; top: .5rem; } .radio-group-label > label, .feed-filters .filter-toggle, .feed-filters .type-filter > label { display: flex; justify-content: center; align-items: center; padding: .35rem; white-space: nowrap; width: fit-content; height: fit-content; cursor: pointer; border: 1px solid var(--base-200); border-radius: 4px; font-size: .875rem; transition: border-color var(--transition-base); margin-bottom: .5rem; } .filter-toggle .icon { margin-right: .5rem; } .type-filter:hover { color: var(--action-0); border-color: var(--action-0); transition: var(--transition-color); } .feed-filters .type-filter > label { flex-direction: column; } .type-filter.favourites-toggle { margin-left: auto; } .type-filter.favourites-toggle label { position: relative; } .type-filter.favourites-toggle label .label { top: 100%; right: 0; } input[hidden] + label { display: none; } .feed-filters svg { width: 25px; height: 25px; } .order-options { position: relative; display: flex; justify-content: space-between; } .order-options .order-by { display: flex; } .order-options .order-direction, .order-options .order-by .radio-group-label{ display: flex; padding-top: 1.5rem; position: relative; } .order-options .order-by > .label { margin-right: 2rem; } .radio-group-label { display: flex; gap: .5rem; } .feed-filters .radio-group-label label .label { top: .5rem; right: .5rem; } .feed-filters .order-options label svg { width: 20px; height: 20px; } .radio-group-label input:checked + label, .feed-filters label:hover, .feed-filters input:checked + label { background-color: var(--light-0); border-color: var(--pink); color: var(--pink); } .feed-filters label .label { position: absolute; visibility: hidden; top: .5rem; right: 4rem; opacity: 0; transition: transform var(--timing) var(--function); transition-property: max-width, transform; } .feed-filters input:checked + label .label { visibility: visible; opacity: 1; } .feed-filters .filters { padding: 1rem; margin-top: 1rem; background-color: transparent; } .has-filters.filters { background-color: var(--base-50); } .filter-group { display: flex; gap: .5rem; flex-wrap: wrap; margin-bottom: .25rem; position: relative; } /* Loading States */ .feed-overlay { display: none; opacity: 0; visibility: hidden; } .loading .feed-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; margin: 0!important; max-width: none!important; width: 100%; height: 100%; background: var(--overlay-medium); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); display: flex; justify-content: center; align-items: center; z-index: 999999; opacity: 1; visibility: visible; transition: opacity 0.3s ease, visibility 0.3s ease; } .feed-overlay-content { background: var(--base); padding: 2rem; border-radius: 1rem; box-shadow: var(--shadow); text-align: center; width: min(400px, 60vw); } .loading .loading-icon-container { position: relative; margin-bottom: 1.5rem; animation: dance 1s ease-in-out infinite; transition: opacity 0.2s ease; will-change: transform, opacity; } .loading .loading-message .icon { width: 3em; height: 3em; } .loading .loading-message .icon svg { width: 100%; height: 100%; margin-right: 1rem; animation: dance 2s ease-in-out infinite; transition: color 0.3s ease; } /* Message Styling */ .loading .loading-message { will-change: opacity; font-size: 1rem; color: #666; text-align: center; min-height: 24px; transition: opacity 0.2s ease; margin-bottom: 1rem; } .loading .loading-dots { color: var(--action-0); width: 4px; aspect-ratio: 1; border-radius: 50%; box-shadow: 19px 0 0 7px, 38px 0 0 3px, 57px 0 0 0; transform: translateX(-38px) scale(.666); animation: bubble .5s infinite alternate linear; } /* Empty States */ .feed-empty-state { grid-column-start: 1; grid-column-end: 2; text-align: center; padding: 2rem; background: var(--base); border-radius: 1rem; margin: 0 auto; max-width: 600px; } .feed-empty-state h3 { text-align: center; font-family: var(--heading); font-size: clamp(1.5rem, 3vw, 2.5rem); margin: 0 0 2rem 0; color: var(--action-0); } .feed-empty-state p { font-family: var(--body); margin: 1rem 0; font-size: clamp(1rem, 2vw, 1.2rem); line-height: 1.4; } .feed-empty-state p:last-child { color: var(--action-0); margin-top: 2rem; } /* Animations */ @keyframes highlight { 0%, 100% { box-shadow: none; } 50% { box-shadow: 0 0 0 4px var(--action-0); } } @keyframes favourite-pop { 0% { transform: scale(1); } 50% { transform: scale(1.3); } 75% { transform: scale(0.9); } 100% { transform: scale(1); } } @keyframes bubble { 50% { box-shadow: 19px 0 0 3px, 38px 0 0 7px, 57px 0 0 3px } 100% { box-shadow: 19px 0 0 0, 38px 0 0 3px, 57px 0 0 7px } } /* Dancing Animation */ @keyframes dance { 0%, 100% { transform: rotate(-5deg) scale(1);} 50% { transform: rotate(5deg) scale(1.1); } } /* Artist Tattoos Grid */ .artist-tattoos { display: grid; grid-template-columns: repeat(3, 1fr); gap: .25em; } .artist-tattoos a:has(img) { overflow: hidden; background-color: var(--base-100); } .artist-tattoos a:not(.feed-image) img{ width: 100%; height: 100%; object-fit: cover; } .artist-tattoos a::before, .artist-tattoos a::after { display: none; } .artist-tattoos .feed-image { grid-row: span 2; grid-column: span 2; } /* Details & Summary */ .feed-item summary .handle { position: absolute; bottom: 0; left: 0; right: 0; background-color: var(--overlay-light); backdrop-filter: blur(5px); border-radius: var(--innerRadius); z-index: 1; padding: .25rem .25rem .25rem 1.1rem; } .feed-item:hover summary .handle, .feed-item[open] summary .handle { background-color: var(--overlay-action-medium); backdrop-filter: blur(5px); } .feed-item summary:after { z-index: 11; position: absolute; bottom: .35rem; right: .7rem; width: 1.5rem; height: 1.5rem; cursor: pointer; } /* Loading Title Animation */ .loading .feed-overlay h2 { width: fit-content; margin: 1rem auto!important; color: transparent; -webkit-text-stroke: 1px var(--contrast); --g: conic-gradient(var(--action-0) 0 0) no-repeat text; background: var(--g) 0, var(--g) 1ch, var(--g) 2ch, var(--g) 3ch, var(--g) 4ch, var(--g) 5ch, var(--g) 6ch; animation: l17-0 1s linear infinite alternate, l17-1 2s linear infinite; } @keyframes l17-0 { 0% { background-size: 1ch 0 } 100% { background-size: 1ch 100% } } @keyframes l17-1 { 0%,50% { background-position-y: 100%, 0 } 50.01%,to { background-position-y: 0, 100% } } /* Loading Message Transitions */ .loading .loading-message { display: flex; justify-content: center; align-items: center; overflow: hidden; } .loading .dots-wrapper { display: flex; justify-content: center; align-items: center; } .loading .loading-message p { opacity: 1; transform: scaleY(1); transform-origin: bottom; transition: opacity var(--transition-base), transform var(--transition-base); } .loading .changing .loading-message p { opacity: 0; transform: scaleY(0); transform-origin: top; } /* Shimmer Effect */ .loading .feed-overlay::after { content: ''; position: absolute; z-index: -1; inset: 0; background: linear-gradient( 90deg, var(--shimmer) ); animation: shimmer 3s ease-in-out infinite; } @keyframes shimmer { 0% { transform: translateX(-100%); } 50%, 100% { transform: translateX(100%); } } /* Media Queries */ @media (max-width: 768px) { .feed-filters .feed-controls { flex-direction: column; gap: 1rem; } .feed-empty-state { grid-column-end: none; padding: 2rem 1rem; margin: 1rem; } .feed-filters details summary { gap: .5rem; justify-content: flex-start; } } *[hidden], *[hidden] + label{ display: none; } .feed-loader { display: flex; flex-direction: column; align-items: center; gap: 1rem; margin: 2rem auto 0!important; } .load-more { opacity: 1; display: flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1.5rem; background: var(--base-200); color: var(--contrast-200); border: none; border-radius: 4px; font-size: var(--medium); cursor: pointer; transition: all var(--transition-base); } .load-more[hidden]{ opacity: 0; transition: all var(--transition-base); } .load-more:hover { background: var(--action-0); transform: translateY(-2px); } .load-more:focus-visible { outline: 2px solid var(--action-0); outline-offset: 2px; } .feed-filters:not(:has(details)){ display: flex; flex-direction: column; position: relative; } .feed-filters:not(:has(details)) .favourites-toggle { position: absolute; top: 1.5rem; left: -3.5rem; z-index: 10; } @media (min-width: 768px){ .feed-filters:not(:has(details)) .favourites-toggle { right: 0; left: auto; } } .icon.colour { background: rgb(183, 51, 46); background: linear-gradient(180deg, rgba(183, 51, 46,1) 0%, rgba(250,71,101,1) 14%, rgba(251,121,35,1) 28%, rgba(176,190,19,1) 42%, rgba(14,204,0,1) 56%, rgba(14,225,166,1) 70%, rgba(63,152,253,1) 84%, rgba(166,90,196,1) 100%); mask-image: var(--colour); -webkit-mask-image: var(--colour); -webkit-mask-repeat: no-repeat; -webkit-mask-size: contain; mask-repeat: no-repeat; mask-size: contain; width: 1.25rem; height: 1.25rem; } /* Accessibility-focused CSS */ /* Focus styles - make keyboard focus visible and consistent */ .feed-item:focus, .feed-item:focus-visible, button:focus, button:focus-visible, [role="button"]:focus, [role="button"]:focus-visible, a:focus, a:focus-visible, input:focus, input:focus-visible, select:focus, select:focus-visible, textarea:focus, textarea:focus-visible { outline: 2px solid #FF0080 !important; outline-offset: 2px !important; box-shadow: 0 0 0 4px rgba(183, 51, 46, 0.2) !important; } /* Remove focus outline for mouse users but keep it for keyboard users */ :focus:not(:focus-visible) { outline: none !important; box-shadow: none !important; } /* Skip link for keyboard navigation */ .skip-to-content { background: #FF0080; color: white; height: auto; left: 50%; padding: 8px; position: absolute; transform: translateY(-100%) translateX(-50%); transition: transform 0.3s; width: auto; z-index: 100; } .skip-to-content:focus { transform: translateY(0%) translateX(-50%); } /* Loading states - ensure they're accessible */ [aria-busy="true"] { cursor: progress; } /* Disabled states */ [aria-disabled="true"], [disabled] { cursor: not-allowed; opacity: 0.7; } /* High contrast mode support */ @media (forced-colors: active) { .feed-item { border: 1px solid CanvasText; } button, [role="button"] { border: 1px solid ButtonText; } button.favourite.favourited { background-color: Highlight; color: HighlightText; } } /* Reduce animations for users who prefer reduced motion */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } .feed-overlay-content, .loading-dots, .gallery-modal { animation: none !important; transition: none !important; } .feed-item { transition: none !important; } } /* Keyboard navigable feed items */ .feed-item[tabindex="0"] { cursor: pointer; position: relative; } .feed-item[tabindex="0"]::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; pointer-events: none; border: 2px solid transparent; transition: border-color 0.2s ease; } .feed-item[tabindex="0"]:focus::after { border-color: #FF0080; } /* Highlighted item */ .feed-item.highlighted { box-shadow: 0 0 0 4px #FF0080, 0 8px 16px rgba(0, 0, 0, 0.1); animation: highlight-pulse 2s ease-in-out; } @keyframes highlight-pulse { 0%, 100% { box-shadow: 0 0 0 4px #FF0080, 0 8px 16px rgba(0, 0, 0, 0.1); } 50% { box-shadow: 0 0 0 8px #FF0080, 0 12px 24px rgba(0, 0, 0, 0.15); } } /* Error states */ .error-state { padding: 2rem; border: 1px solid #FF0080; border-radius: 0.5rem; margin: 2rem 0; text-align: center; } .error-state h3 { color: #FF0080; margin-top: 0; } .error-state button { margin-top: 1rem; } /* Error feedback modal */ .error-feedback-modal { padding: 2rem; border: 2px solid #FF0080; border-radius: 0.5rem; max-width: 500px; width: 100%; } .error-feedback-modal h2 { margin-top: 0; color: #FF0080; } .error-feedback-modal textarea { width: 100%; min-height: 100px; margin: 1rem 0; padding: 0.5rem; border: 1px solid #ccc; border-radius: 0.25rem; } .error-feedback-modal .actions { display: flex; justify-content: flex-end; gap: 1rem; } .error-feedback-modal button { padding: 0.5rem 1rem; border: 1px solid #ccc; border-radius: 0.25rem; background: #f5f5f5; cursor: pointer; } .error-feedback-modal button.primary { background: #FF0080; color: white; border-color: #FF0080; } /* Dialog accessibility improvements */ dialog::backdrop { background-color: rgba(0, 0, 0, 0.5); } dialog.filter-dropdown { max-height: 80vh; overflow: auto; } dialog.filter-dropdown .close-modal { position: sticky; top: 0; z-index: 1; } /** Term Breadcrumbs */ .term-divider { position: relative; text-align: center; margin: 1rem 0; border-bottom: 1px solid var(--base-200); } .term-divider span { background: var(--base); padding: 0 1rem; color: var(--contrast); font-size: 0.9rem; position: relative; top: 0.5em; } .common-term { background: var(--base-50); border-radius: var(--innerRadius); } .loading-indicator { display: flex; align-items: center; justify-content: center; gap: 0.5rem; padding: 1rem; color: var(--contrast-100); font-size: 0.9rem; } .loading-indicator svg { animation: spin 1s linear infinite; } .pagination-info { text-align: center; padding: 0.5rem; font-size: 0.9rem; color: var(--contrast-100); border-top: 1px solid var(--base-100); } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .term-breadcrumb { margin-bottom: 1rem; padding: 0.5rem; background: var(--base-50); border-radius: 4px; } .back-to-parent { display: flex; align-items: center; gap: 0.5rem; border: none; background: none; color: var(--contrast); cursor: pointer; padding: 0.5rem; border-radius: 4px; font-size: var(--small); } .back-to-parent:hover { background: var(--base-100); } .term-row { display: flex; align-items: center; gap: 0.5rem; width: 100%; padding: 0.25rem 0; } .toggle-children { border: none; background: none; padding: 0.25rem; cursor: pointer; color: var(--contrast); display: flex; align-items: center; justify-content: center; margin-left: auto; border-radius: 4px; } .toggle-children:hover { background: var(--base-50); } .loading-indicator { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; } .loading-indicator .loading { width: 16px; height: 16px; border: 2px solid var(--base-100); border-top-color: var(--contrast); border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .term-breadcrumb { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 1rem; padding: 0.5rem; background: var(--base-50); border-radius: 4px; } .term-breadcrumb .path { display: flex; align-items: center; gap: 0.25rem; flex-wrap: wrap; } .term-breadcrumb button { border: none; background: none; padding: 0.25rem 0.5rem; border-radius: 4px; cursor: pointer; color: var(--contrast); font-size: var(--small); } .term-breadcrumb button:hover { background: var(--base-100); } .path-separator { color: var(--contrast-50); } .path-level { white-space: nowrap; } .create-term-section { margin-top: 2rem; padding-top: 1rem; border-top: 1px solid var(--base-100); } .suggestion-prompt { font-size: var(--small); color: var(--contrast-50); margin-bottom: 1rem; } .create-term-form { display: flex; flex-direction: column; gap: 0.5rem; } .form-row { display: flex; align-items: center; gap: 0.5rem; } .name-row { position: relative; } .name-row input { width: 100%; padding: 0.5rem; border: 2px solid var(--base-100); border-radius: 4px; background: var(--base); color: var(--contrast); } .name-row input:focus { border-color: var(--action-0); outline: none; } .parent-row { font-size: var(--small); } .parent-row label { display: flex; align-items: center; gap: 0.5rem; cursor: pointer; } dialog[open].gallery-modal { width: calc(100vw - var(--padding) * 2); height: 99vh; background: var(--base); display: flex; align-items: center; justify-content: center; } .gallery-content { position: relative; max-width: 100%; max-height: 100%; display: flex; align-items: center; justify-content: center; padding: 2rem; } .gallery-favourite button.favourite { top: unset; bottom: 1rem; right: 1rem; } .gallery-image { max-width: 100%; max-height: calc(100vh - 4rem); object-fit: contain; } .gallery-close { position: absolute; top: 1rem; right: 1rem; background: none; border: none; color: white; cursor: pointer; padding: 0.5rem; z-index: 10; transition: color 0.3s ease; } .gallery-close:hover { color: #FF0080; } .gallery-nav { position: absolute; top: 50%; height: 50%; z-index: 5; transform: translateY(-50%); border: none; color: var(--contrast); cursor: pointer; padding: 1rem; transition: color 0.3s ease; display: flex; justify-content: center; align-items: center; } .gallery-nav:hover { background-color: var(--overlay-heavy); } .gallery-nav:hover { color: #FF0080; } .gallery-prev { left: 1rem; } .gallery-next { right: 1rem; } .gallery-counter { position: absolute; top: 1rem; left: 1rem; color: white; font-size: 0.875rem; } .gallery-content details { position:absolute; bottom: 1rem; left: 2rem; width: calc(100% - 4rem); background-color: var(--overlay-light); padding: 0; } .gallery-content details:hover, .gallery-content details[open] { background-color: var(--overlay-heavy); backdrop-filter: blur(5px); }