defuss-shadcn / Website / Search & Navigation / sort-control
Built with: CSS
Sort ControlBLK
Changes the ordering of a collection - a labelled select, a segmented choice, or a button that opens a menu of options. Part of the Search & Navigation blocks.
On this page (4)
§Default
A visible "Sort by" label and a native Select.
§Segmented
data-variant='segmented': a radio group styled as segments.
data-variant='menu': a button (popovertarget) opens a popover of radios anchored to it - Escape or a click outside closes it; the choice is a real form value.
§CSS view file
/* -- Sort Control (website · Search & Navigation) ------------------------- Changes the ordering of a collection - a labelled select, a segmented choice, or a button that opens a menu of options. */@layer components { /* every box in the block measures border-box - the same on any page */ :where(.mk-sort-control, .mk-sort-control *, .mk-sort-control ::before, .mk-sort-control ::after) { box-sizing: border-box; } .mk-sort-control { display: inline-flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; & > label { color: var(--muted-foreground); white-space: nowrap; } & .select { width: auto; height: 2rem; font-size: 0.8125rem; } } .mk-sort-control[data-variant="segmented"] { padding: 0.1875rem; margin: 0; border: 0; border-radius: var(--radius-md); background: var(--muted); gap: 0; & legend { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); } & label { position: relative; padding: 0.3125rem 0.75rem; border-radius: calc(var(--radius-md) - 2px); color: var(--muted-foreground); font-size: 0.8125rem; font-weight: 500; cursor: pointer; } & input { position: absolute; inset: 0; margin: 0; opacity: 0; cursor: pointer; } & label:has(:checked) { background: var(--background); color: var(--foreground); box-shadow: var(--shadow-xs); } & label:has(:focus-visible) { outline: 2px solid var(--ring); outline-offset: 1px; } } .mk-sort-control-menu { margin: 0; padding: 0.25rem; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--popover); color: var(--popover-foreground); box-shadow: var(--shadow-lg); min-width: 12rem; & label { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 0.5rem 0.625rem; border-radius: var(--radius-sm); font-size: 0.875rem; cursor: pointer; } & label:hover, & label:has(:focus-visible) { background: var(--accent); } & input { position: absolute; opacity: 0; } & label::after { content: ""; width: 0.375rem; height: 0.625rem; border-block-end: 2px solid currentColor; border-inline-end: 2px solid currentColor; rotate: 45deg; translate: 0 -0.125rem; opacity: 0; } & label:has(:checked)::after { opacity: 1; } } @supports (position-anchor: --a) { .mk-sort-control-menu { inset: auto; margin-block-start: 0.375rem; position-area: bottom span-left; position-try-fallbacks: flip-block; } } /* -- Accessibility ------------------------------------------- */ @media (forced-colors: active) { .mk-sort-control[data-variant="segmented"] label:has(:checked) { outline: 2px solid Highlight; } }}Comments, ideas or improvements? Edit this page's source on GitHub