sheet
fulldev-ui/sheetFreeComponent
fulldev/ui publishes no description for this item.
Live preview
live · rendered by the registry
Rendered by fulldev/ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://ui.full.dev/r/sheet.jsonSource
1---2import type { HTMLAttributes } from "astro/types"34type Props = HTMLAttributes<"div"> & {5 defaultOpen?: boolean6 closeOnClickOutside?: boolean7 closeOnEscape?: boolean8 lockScroll?: boolean9}1011const {12 class: className,13 defaultOpen,14 closeOnClickOutside,15 closeOnEscape,16 lockScroll,17 ...props18} = Astro.props1920const manageScrollLock = lockScroll !== false21---2223<div24 data-slot="dialog"25 data-sheet-lock-scroll={manageScrollLock ? "" : undefined}26 class={className}27 data-default-open={defaultOpen}28 data-close-on-click-outside={closeOnClickOutside}29 data-close-on-escape={closeOnEscape}30 data-lock-scroll="false"31 {...props}32>33 <slot />34</div>3536<script>37 import { create } from "@data-slot/dialog"3839 create()4041 declare global {42 interface Window {43 __fulldevSheetScrollLock?: {44 roots: Set<HTMLElement>45 savedHtmlOverflow: string46 savedHtmlScrollbarGutter: string47 savedBodyPaddingRight: string48 }49 __fulldevSheetScrollLockBound?: boolean50 }51 }5253 const state =54 window.__fulldevSheetScrollLock ??55 (window.__fulldevSheetScrollLock = {56 roots: new Set<HTMLElement>(),57 savedHtmlOverflow: "",58 savedHtmlScrollbarGutter: "",59 savedBodyPaddingRight: "",60 })6162 const applyScrollLock = () => {63 const html = document.documentElement64 const body = document.body6566 if (state.roots.size === 0) {67 html.style.overflow = state.savedHtmlOverflow68 html.style.scrollbarGutter = state.savedHtmlScrollbarGutter69 body.style.paddingRight = state.savedBodyPaddingRight70 return71 }7273 if (state.roots.size === 1) {74 state.savedHtmlOverflow = html.style.overflow75 state.savedHtmlScrollbarGutter = html.style.scrollbarGutter76 state.savedBodyPaddingRight = body.style.paddingRight77 }7879 const scrollbarWidth = window.innerWidth - html.clientWidth80 const bodyPaddingRight = Number.parseFloat(81 window.getComputedStyle(body).paddingRight || "0"82 )8384 html.style.overflow = "hidden"85 html.style.scrollbarGutter = "auto"86 body.style.paddingRight = `${bodyPaddingRight + Math.max(scrollbarWidth, 0)}px`87 }8889 const syncRoot = (root: HTMLElement, open: boolean) => {90 const hasRoot = state.roots.has(root)91 if (open === hasRoot) return9293 if (open) state.roots.add(root)94 else state.roots.delete(root)9596 applyScrollLock()97 }9899 if (!window.__fulldevSheetScrollLockBound) {100 window.__fulldevSheetScrollLockBound = true101102// … truncated
What it pulls in
Other registry items
Files it writes
More from fulldev/ui
All 144 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| accordionaccordion | fulldev/ui | Components | Free | 1 dep · 5 files | |
| alertalert | fulldev/ui | Components | Free | no deps · 5 files | |
| alert-dialogalert-dialog | fulldev/ui | Components | Free | 1 dep · 13 files | |
| avataravatar | fulldev/ui | Components | Free | no deps · 7 files | |
| badgebadge | fulldev/ui | Components | Free | no deps · 3 files | |
| bannerbanner | fulldev/ui | Components | Free | no deps · 3 files | |
| breadcrumbbreadcrumb | fulldev/ui | Components | Free | no deps · 8 files | |
| buttonbutton | fulldev/ui | Components | Free | no deps · 3 files |
