{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "carousel", "title": "Carousel", "description": "Carrousel à défilement horizontal avec contrôles et scroll-snap.", "files": [ { "path": "registry/valraiso/carousel/carousel.astro", "content": "---\nimport styles from \"./carousel.module.css\";\n\n/**\n * Carousel — défilement horizontal de cartes (`
` placées en slot) avec\n * boutons de navigation qui s'activent/désactivent selon le débordement.\n *\n * Comportement : ResizeObserver + scroll-spy pour activer les contrôles,\n * scroll-snap, défilement fluide, nettoyage sur `astro:before-swap`.\n *\n * Personnalisation :\n * - `class` : classe(s) ajoutée(s) au conteneur racine.\n * - variables CSS : --carousel-inset-start / --carousel-inset-end (marges de\n * scroll), --ads-carousel-control-bg, --ads-carousel-control-disabled-bg,\n * --ads-carousel-control-color, --ads-carousel-control-size,\n * --ads-carousel-control-gap.\n */\ninterface Props {\n class?: string;\n}\n\nconst { class: className } = Astro.props;\n---\n\n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n \n
\n
\n\n\n", "type": "registry:file", "target": "src/components/valraiso/carousel/carousel.astro" }, { "path": "registry/valraiso/carousel/carousel.module.css", "content": ".carousel {\n position: relative;\n}\n\n.inner {\n position: relative;\n display: flex;\n overflow-x: auto;\n scrollbar-width: none;\n scroll-snap-type: x proximity;\n scroll-behavior: smooth;\n padding-inline-start: var(--carousel-inset-start, 0px);\n scroll-padding-inline-start: var(--carousel-inset-start, 0px);\n scroll-padding-inline-end: var(--carousel-inset-end, 0px);\n}\n\n/* Espaceur de fin : étend physiquement la zone scrollable pour que le scroll-padding-inline-end soit atteignable (contourne le bug flex+overflow qui ignore padding-inline-end) */\n.inner::after {\n content: \"\";\n flex: 0 0 var(--carousel-inset-end, 0px);\n}\n\n.inner::-webkit-scrollbar {\n display: none;\n}\n\n.inner :global(section) {\n scroll-snap-align: start;\n flex-shrink: 0;\n}\n\n/* Dernière carte : snap-end pour rester atteignable quand son snap \"start\" dépasserait maxScroll */\n.inner :global(section:last-child) {\n scroll-snap-align: end;\n}\n\n.controls {\n position: absolute;\n bottom: calc(100% - 16px);\n right: 16px;\n display: flex;\n gap: var(--ads-carousel-control-gap, 10px);\n\n @media (width >= 420px) {\n bottom: calc(100% + 16px);\n }\n\n @media (width >= 630px) {\n bottom: calc(100% + 32px);\n }\n}\n\n.control {\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(\n --ads-carousel-control-bg,\n hsl(var(--accent, 200 80% 45%))\n );\n cursor: pointer;\n padding: var(--ads-carousel-control-size, 10px);\n border: none;\n border-radius: 50%;\n}\n\n.control:disabled {\n background-color: var(\n --ads-carousel-control-disabled-bg,\n hsla(var(--light-grey, 0 0% 80%), 30%)\n );\n cursor: default;\n}\n\n.controlIcon {\n flex: 0 0 14px;\n height: 14px;\n width: 14px;\n color: var(--ads-carousel-control-color, hsl(var(--white, 0 0% 100%)));\n}\n", "type": "registry:file", "target": "src/components/valraiso/carousel/carousel.module.css" } ], "type": "registry:component" }