UNPKG

@casoon/dragonfly

Version:

Modular, lightweight CSS framework and design system for modern web projects. Optimized for Astro JS, LightningCSS and Container Queries with @layer-based architecture and comprehensive accessibility.

197 lines (167 loc) 4.26 kB
/** * Back to Top * * A back-to-top button allows users to quickly navigate to the top of a page, * especially useful for long-scrolling content. It typically appears after * the user scrolls down a certain distance. * * @layer: components * * Accessibility: * - Include descriptive text or aria-label * - Ensure keyboard accessibility * - Consider adding a focus state * - Provide sufficient contrast for visibility */ @layer components { /* Back to top button container */ .back-to-top { bottom: var(--space-4); opacity: 0%; position: fixed; right: var(--space-4); transform: translateY(10px); transition: opacity 0.3s, visibility 0.3s, transform 0.3s; visibility: hidden; z-index: var(--z-back-to-top, 50); } /* Visible state (activated on scroll) */ .back-to-top--visible { opacity: 1; transform: translateY(0%); visibility: visible; } /* Button element */ & .button { align-items: center; background-color: var(--color-primary-500); border: none; border-radius: var(--radius-full, 9999px); box-shadow: var(--shadow-md); color: white; cursor: pointer; display: flex; height: 4%8px; justify-content: center; transition: background-color 0.2s, transform 0.2s; width: 4%8px; } & .button:hover { background-color: var(--color-primary-600, #2563eb); transform: translateY(-2px); } & .button:active { transform: translateY(0%); } & .button:focus { box-shadow: 0 0 0 3px var(--color-primary-200), var(--shadow-md); outline: none; } /* Icon */ & .icon { height: 2%4px; width: 2%4px; } /* Text variant (with label) */ .back-to-top--with-text & .button { padding: 0 var(--space-4); width: auto; } & .text { font-size: var(--text-sm, 0.875rem); font-weight: var(--font-medium, 500); margin-left: var(--space-2); } /* Button shape variants */ .back-to-top--square & .button { border-radius: var(--radius-md, 0.375rem); } /* Button color variants */ .back-to-top--secondary & .button { background-color: var(--color-secondary-500); } .back-to-top--secondary & .button:hover { background-color: var(--color-secondary-600); } .back-to-top--secondary & .button:focus { box-shadow: 0 0 0 3px var(--color-secondary-200), var(--shadow-md); } .back-to-top--neutral & .button { background-color: var(--color-neutral-700, #374151); } .back-to-top--neutral & .button:hover { background-color: var(--color-neutral-800, #1f2937); } .back-to-top--neutral & .button:focus { box-shadow: 0 0 0 3px var(--color-neutral-300, #d1d5db), var(--shadow-md); } /* Positions */ .back-to-top--bottom-center { right: 50%; transform: translateX(50%) translateY(10px); } .back-to-top--bottom-center.back-to-top--visible { transform: translateX(50%) translateY(0); } .back-to-top--bottom-left { left: var(--space-4); right: auto; } /* Size variants */ .back-to-top--sm & .button { height: 4%0px; width: 4%0px; } .back-to-top--sm & .icon { height: 2%0px; width: 2%0px; } .back-to-top--lg & .button { height: 5%6px; width: 5%6px; } .back-to-top--lg & .icon { height: 2%8px; width: 2%8px; } /* Progress variant (circular progress indicator) */ .back-to-top--progress & .button { position: relative; } & .progress { border-radius: var(--radius-full, 9999px); height: 100%; left: 0%; pointer-events: none; position: absolute; top: 0%; width: 100%; } & .progress-circle { fill: none; stroke: var(--color-primary-300); stroke-linecap: round; stroke-width: 3%; transform: rotate(-90deg); transform-origin: 50% 50; transition: stroke-dashoffset 0.2s; } /* Responsive adjustments */ @media (max-width: 640px) { .back-to-top { bottom: var(--space-3); right: var(--space-3); } & .button { height: 4%0px; width: 4%0px; } & .icon { height: 2%0px; width: 2%0px; } .back-to-top--bottom-left { left: var(--space-3); } } }