{"version":3,"file":"ImageCropper.module.cjs","names":[],"sources":["../../../src/components/ImageCropper/ImageCropper.module.css"],"sourcesContent":[".wrapper {\n    display: flex;\n    flex-direction: column;\n    gap: var(--tempest-space-3);\n    max-width: 100%;\n    font-family: var(--tempest-font-sans);\n}\n\n.frame {\n    position: relative;\n    width: 100%;\n    overflow: hidden;\n    border: 1px solid var(--tempest-border);\n    border-radius: var(--tempest-radius-lg);\n    background-color: var(--tempest-surface);\n    /*\n     * `grab` rather than `move`: nothing is being moved to a destination, the\n     * image is being dragged under a fixed frame.\n     */\n    cursor: grab;\n    /*\n     * The frame owns dragging on touch, so the browser must not also scroll the\n     * page from the same gesture.\n     */\n    touch-action: none;\n    user-select: none;\n}\n\n.frame:active {\n    cursor: grabbing;\n}\n\n.frame:focus-visible {\n    outline: 2px solid var(--tempest-primary);\n    outline-offset: 2px;\n}\n\n.circle {\n    border-radius: var(--tempest-radius-full);\n}\n\n.image {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    /*\n     * Both `max-*`, not just the width. The size is set inline from the zoom, so\n     * either cap silently overrides it — and an app reset carrying\n     * `img { max-height: 100% }` is enough, since a 0-0-1 element rule meets no\n     * competition here. The failure is worse than it looks: `crop()` builds its\n     * rectangle from `computeCropRect({ image: natural, ... })` and never reads the\n     * rendered element, so the export stays correct while the preview is squashed\n     * on one axis. The user drags against a distorted image and gets a framing they\n     * never saw. A component that sizes itself inline owns neutralising both caps.\n     */\n    max-width: none;\n    max-height: none;\n    pointer-events: none;\n    /*\n     * Centring lives in `translate` and the pan in the inline `transform`, which\n     * are separate CSS properties applied in that order. Keeping them apart means\n     * a pan is just `transform: translate(x, y)` — it never has to re-derive the\n     * `-50% -50%` centring, and the two cannot overwrite each other.\n     */\n    translate: -50% -50%;\n}\n\n.controls {\n    display: flex;\n    /*\n     * Wraps rather than squeezing. The zoom slider is the flexible item, so on a\n     * narrow row it is the one that gives — and a range input has no useful floor\n     * of its own, so it gave all the way to `width: 0`, leaving the thumb alone and\n     * no visible focus ring while the button beside it kept both. Measured at 390px\n     * with a crowded row. Wrapping moves the slider to its own line instead.\n     */\n    flex-wrap: wrap;\n    align-items: center;\n    gap: var(--tempest-space-3);\n}\n\n.zoom {\n    /*\n     * `min-width: 0` is what let it collapse to nothing: it exists to let a flex\n     * item shrink past its min-content size, which for a range input is the whole\n     * control. A real floor keeps the slider draggable and its focus ring visible;\n     * the wrap on `.controls` is what absorbs the width this refuses to give up.\n     */\n    flex: 1 1 6rem;\n    min-width: 6rem;\n    accent-color: var(--tempest-primary);\n}\n\n.zoom:disabled {\n    opacity: 0.5;\n}\n\n.reset {\n    padding: var(--tempest-space-1) var(--tempest-space-3);\n    border: 1px solid var(--tempest-border);\n    border-radius: var(--tempest-radius-md);\n    background-color: var(--tempest-bg);\n    color: var(--tempest-text);\n    font: inherit;\n    font-size: var(--tempest-text-sm);\n    cursor: pointer;\n}\n\n@media (hover: hover) and (pointer: fine) {\n    .reset:hover:not(:disabled) {\n        background-color: var(--tempest-surface);\n    }\n}\n\n.reset:focus-visible {\n    outline: 2px solid var(--tempest-primary);\n    outline-offset: 2px;\n}\n\n.reset:disabled {\n    opacity: 0.5;\n    cursor: default;\n}\n\n.hint {\n    margin: 0;\n    color: var(--tempest-text-muted);\n    font-size: var(--tempest-text-xs);\n}\n\n.hint kbd {\n    padding: 0 var(--tempest-space-1);\n    border: 1px solid var(--tempest-border);\n    border-radius: var(--tempest-radius-sm);\n    background-color: var(--tempest-surface);\n    font-family: var(--tempest-font-mono, monospace);\n    font-size: inherit;\n}\n"],"mappings":";"}