You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/src/uix/eidos/components/cropper/cropper.css

189 lines
5.1 KiB

/**
* Cropper recipe — the crop UI chrome: framed viewport, darken-outside mask,
* rule-of-thirds grid, and corner handles. The crop geometry is inline style on
* the Selection (set by soma); the image is the composed `<Image>`.
*
* Tokens: `--cropper-*` (public, themeable) from `recipes/base.ts`.
*/
[data-cropper] {
display: block;
inline-size: 100%;
}
[data-cropper][data-disabled] {
opacity: var(--opacity-disabled);
pointer-events: none;
}
[data-cropper-viewport] {
position: relative;
overflow: hidden;
inline-size: 100%;
/* aspect-ratio is set inline from the image's natural size. Fallback 1:1. */
aspect-ratio: 1;
border-radius: var(--cropper-viewport-radius);
background: var(--cropper-viewport-bg);
/* The image fills the viewport; no scrolling while dragging the selection. */
touch-action: none;
user-select: none;
}
.eidos-cropper-image {
position: absolute;
inset: 0;
inline-size: 100%;
block-size: 100%;
}
/* Stop the browser's native image drag-and-drop, which would cancel the pan. */
[data-cropper-viewport] img {
-webkit-user-drag: none;
user-select: none;
}
/* The crop rectangle. The huge box-shadow darkens everything outside it
(clipped by the viewport's overflow:hidden) — it follows border-radius, so a
round selection cuts a circular hole. */
[data-cropper-selection] {
position: absolute;
box-sizing: border-box;
border: var(--cropper-selection-border-width) solid var(--cropper-selection-border);
box-shadow: 0 0 0 9999px var(--cropper-mask-bg);
cursor: move;
touch-action: none;
}
[data-cropper-selection][data-shape='round'] {
border-radius: 50%;
}
[data-cropper-selection][data-dragging] {
cursor: grabbing;
}
/* When zoomed, the background image shows a `grab` cursor (drag it to pan / set
the focus). The selection keeps `move` — it repositions the crop area. */
.eidos-cropper-viewport.is-zoomed .eidos-cropper-image {
cursor: grab;
}
.eidos-cropper-viewport.is-zoomed .eidos-cropper-image:active {
cursor: grabbing;
}
/* Rule-of-thirds — four thin lines at 1/3 and 2/3 on each axis. */
[data-cropper-grid] {
position: absolute;
inset: 0;
pointer-events: none;
background:
linear-gradient(var(--cropper-grid-line), var(--cropper-grid-line)) 33.33% 0 / 1px 100% no-repeat,
linear-gradient(var(--cropper-grid-line), var(--cropper-grid-line)) 66.66% 0 / 1px 100% no-repeat,
linear-gradient(var(--cropper-grid-line), var(--cropper-grid-line)) 0 33.33% / 100% 1px no-repeat,
linear-gradient(var(--cropper-grid-line), var(--cropper-grid-line)) 0 66.66% / 100% 1px no-repeat;
}
/* The thirds grid reads as noise inside a circular crop — hide it there. */
[data-cropper-selection][data-shape='round'] [data-cropper-grid] {
display: none;
}
[data-cropper-handle] {
position: absolute;
box-sizing: border-box;
inline-size: var(--cropper-handle-size);
block-size: var(--cropper-handle-size);
border: var(--cropper-handle-border-width) solid var(--cropper-handle-border);
border-radius: 50%;
background: var(--cropper-handle-bg);
touch-action: none;
}
[data-cropper-handle][data-corner='nw'] {
inset-block-start: 0;
inset-inline-start: 0;
transform: translate(-50%, -50%);
cursor: nwse-resize;
}
[data-cropper-handle][data-corner='ne'] {
inset-block-start: 0;
inset-inline-end: 0;
transform: translate(50%, -50%);
cursor: nesw-resize;
}
[data-cropper-handle][data-corner='se'] {
inset-block-end: 0;
inset-inline-end: 0;
transform: translate(50%, 50%);
cursor: nwse-resize;
}
[data-cropper-handle][data-corner='sw'] {
inset-block-end: 0;
inset-inline-start: 0;
transform: translate(-50%, 50%);
cursor: nesw-resize;
}
/* Edge handles — centered on each side. */
[data-cropper-handle][data-corner='n'] {
inset-block-start: 0;
inset-inline-start: 50%;
transform: translate(-50%, -50%);
cursor: ns-resize;
}
[data-cropper-handle][data-corner='s'] {
inset-block-end: 0;
inset-inline-start: 50%;
transform: translate(-50%, 50%);
cursor: ns-resize;
}
[data-cropper-handle][data-corner='e'] {
inset-block-start: 50%;
inset-inline-end: 0;
transform: translate(50%, -50%);
cursor: ew-resize;
}
[data-cropper-handle][data-corner='w'] {
inset-block-start: 50%;
inset-inline-start: 0;
transform: translate(-50%, -50%);
cursor: ew-resize;
}
/* ── Zoom controls (− slider + reset) ───────────────────────────────── */
.eidos-cropper-zoom {
display: flex;
align-items: center;
gap: var(--cropper-zoom-gap);
margin-block-start: var(--space-2);
}
.eidos-cropper-zoom [data-slider] {
flex: 1 1 auto;
}
.eidos-cropper-zoom-btn {
display: inline-flex;
align-items: center;
justify-content: center;
flex: 0 0 auto;
inline-size: var(--cropper-zoom-btn-size);
block-size: var(--cropper-zoom-btn-size);
border: var(--border-width) solid var(--cropper-zoom-btn-border);
border-radius: var(--radius-md);
background: var(--cropper-zoom-btn-bg);
color: var(--cropper-zoom-btn-fg);
font-size: var(--font-size-md);
line-height: 1;
cursor: pointer;
}
.eidos-cropper-zoom-btn:hover {
background: var(--color-surface-default);
}
.eidos-cropper-zoom-btn:focus-visible {
fix(eidos): component-coherence audit FASE 2 — focus-ring, fields, segments, langs, API nits Bundles the uncommitted audit work on this branch (active-uix): - DIM 5A: focus-ring unified to `outline` across the control/field set (kills ~18 box-shadow rings; closes forced-colors a11y). NOTE: spin-field + drawer-close orphan-token loose ends from this migration still trip the eidos contract test — to clean when that migration settles. - DIM 5D: field/input backgrounds homogenized to surface-default; list-surface padding recalibrated 2/4/6/8/10; menu-dial internal vars privatized. - DIM 5E: date/time/color-field + date-range-picker segments delegate the active state to the shared field-segment-state layer; the input transition is reduced to `background` only so the focus border no longer flickers on keyboard increment (border-color is now instant; the ring is an outline). - Langs (cero-hardcodes): IconButton-cascade wrappers (carousel/combobox/ tree-grid/table/search-field/banner) + onion-menu + cropper + time-picker day-period now route aria-labels through morfo langs instead of hardcoded English (the hardcode was overriding soma's already-resolved label). Fixes 2 contract divergences (combobox Clear->Clear value, table toggle label). - DIM 5B: code-block/kbd variants aliased to ControlVariant (no duplicate literals); image-picker default size sm->md. Excludes words/palabras/chronos and the metrics/demos tracks (separate work). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4 months ago
outline: var(--focus-ring-width) solid var(--focus-ring-color);
outline-offset: 0;
}

Powered by TurnKey Linux.