Docs Components Overlays

Sheet

React example follows below.
ts
import * as React from "react";
const sheetFixture = {
id: "sheet",
trigger: "Edit service",
side: "right",
eyebrow: "Service",
title: "ledger-api",
field: { label: "Replicas", value: "6" },
dismissable: true,
} satisfies {
id: string;
trigger: string;
side: "left" | "right";
eyebrow: string;
title: string;
field: { label: string; value: string };
dismissable: boolean;
};
import { Button, Input, Sheet } from "@grassroot/ui-react";
export default function SheetDemo() {
const [open, setOpen] = React.useState(false);
return (
<div>
<Button variant="secondary" onClick={() => setOpen(true)}>
{sheetFixture.trigger}
</Button>
<Sheet
open={open}
onOpenChange={setOpen}
side={sheetFixture.side}
eyebrow={sheetFixture.eyebrow}
title={sheetFixture.title}
dismissable={sheetFixture.dismissable}
>
<Input label={sheetFixture.field.label} mono defaultValue={sheetFixture.field.value} />
</Sheet>
</div>
);
}
ts
<script setup lang="ts">
import { ref } from "vue";
import { Button, Sheet, Input } from "@grassroot/ui-vue";
const sheetFixture = {
id: "sheet",
trigger: "Edit service",
side: "right",
eyebrow: "Service",
title: "ledger-api",
field: { label: "Replicas", value: "6" },
dismissable: true,
} satisfies {
id: string;
trigger: string;
side: "left" | "right";
eyebrow: string;
title: string;
field: { label: string; value: string };
dismissable: boolean;
};
const open = ref(false);
</script>
<template>
<div>
<Button variant="secondary" @click="open = true">{{ sheetFixture.trigger }}</Button>
<Sheet
v-model:open="open"
:side="sheetFixture.side"
:eyebrow="sheetFixture.eyebrow"
:dismissable="sheetFixture.dismissable"
>
<template #title>{{ sheetFixture.title }}</template>
<Input :label="sheetFixture.field.label" mono :default-value="sheetFixture.field.value" />
</Sheet>
</div>
</template>
ts
import { Component, signal } from "@angular/core";
import {
GrassrootButton,
GrassrootSheet,
GrassrootSheetTitle,
GrassrootInput,
} from "@grassroot/ui-angular";
const sheetFixture = {
id: "sheet",
trigger: "Edit service",
side: "right",
eyebrow: "Service",
title: "ledger-api",
field: { label: "Replicas", value: "6" },
dismissable: true,
} satisfies {
id: string;
trigger: string;
side: "left" | "right";
eyebrow: string;
title: string;
field: { label: string; value: string };
dismissable: boolean;
};
@Component({
selector: "app-sheet-demo",
standalone: true,
imports: [GrassrootButton, GrassrootSheet, GrassrootSheetTitle, GrassrootInput],
template: `
<div>
<grassroot-button variant="secondary" (click)="open.set(true)">{{
fixture.trigger
}}</grassroot-button>
<grassroot-sheet
[open]="open()"
(openChange)="open.set($event)"
[side]="fixture.side"
[eyebrow]="fixture.eyebrow"
[dismissable]="fixture.dismissable"
>
<h4 grassrootSheetTitle>{{ fixture.title }}</h4>
<grassroot-input
[label]="fixture.field.label"
[mono]="true"
[defaultValue]="fixture.field.value"
/>
</grassroot-sheet>
</div>
`,
})
export class SheetDemoComponent {
readonly open = signal(false);
protected readonly fixture = sheetFixture;
}
export default SheetDemoComponent;
ts
<script lang="ts">
import { Button, Sheet, Input } from "@grassroot/ui-svelte";
const sheetFixture = {
id: "sheet",
trigger: "Edit service",
side: "right",
eyebrow: "Service",
title: "ledger-api",
field: { label: "Replicas", value: "6" },
dismissable: true,
} satisfies {
id: string;
trigger: string;
side: "left" | "right";
eyebrow: string;
title: string;
field: { label: string; value: string };
dismissable: boolean;
};
let open = $state(false);
</script>
{#snippet title()}{sheetFixture.title}{/snippet}
{#snippet children()}<Input
label={sheetFixture.field.label}
mono
defaultValue={sheetFixture.field.value}
/>{/snippet}
<div>
<Button variant="secondary" onClick={() => (open = true)}>{sheetFixture.trigger}</Button>
<Sheet
{open}
onOpenChange={(next) => (open = next)}
side={sheetFixture.side}
eyebrow={sheetFixture.eyebrow}
dismissable={sheetFixture.dismissable}
{title}
{children}
/>
</div>
ts
/** @jsxImportSource solid-js */
import { createSignal } from "solid-js";
import { Button, Sheet, Input } from "@grassroot/ui-solid";
const sheetFixture = {
id: "sheet",
trigger: "Edit service",
side: "right",
eyebrow: "Service",
title: "ledger-api",
field: { label: "Replicas", value: "6" },
dismissable: true,
} satisfies {
id: string;
trigger: string;
side: "left" | "right";
eyebrow: string;
title: string;
field: { label: string; value: string };
dismissable: boolean;
};
export default function SheetDemo() {
const [open, setOpen] = createSignal(false);
return (
<div>
<Button variant="secondary" onClick={() => setOpen(true)}>
{sheetFixture.trigger}
</Button>
<Sheet
open={open()}
onOpenChange={setOpen}
side={sheetFixture.side}
eyebrow={sheetFixture.eyebrow}
title={sheetFixture.title}
dismissable={sheetFixture.dismissable}
>
<Input label={sheetFixture.field.label} mono value={sheetFixture.field.value} />
</Sheet>
</div>
);
}

Installation

API Reference

Import

import * as React from "react";
import { Button, Input, Sheet } from "@grassroot/ui-react";

Props

Prop
Type
Default
Requirement
open
boolean
required
onOpenChange
(open: boolean) => void
required
side
"right" | "left" | undefined
optional
eyebrow
string | undefined
optional
dismissable
boolean | undefined
optional
className
string | undefined
optional
Prop
open
Type
boolean
Default
Requirement
required
Prop
onOpenChange
Type
(open: boolean) => void
Default
Requirement
required
Prop
side
Type
"right" | "left" | undefined
Default
Requirement
optional
Prop
eyebrow
Type
string | undefined
Default
Requirement
optional
Prop
dismissable
Type
boolean | undefined
Default
Requirement
optional
Prop
className
Type
string | undefined
Default
Requirement
optional

Events

EventPayload
onOpenChange(open: boolean) => void

Content regions

  • children
  • title

Import

import { ref } from "vue";
import { Button, Sheet, Input } from "@grassroot/ui-vue";

Props

Prop
Type
Default
Requirement
open
boolean
required
side
"left" | "right"
"right"
optional
eyebrow
string
optional
dismissable
boolean
true
optional
Prop
open
Type
boolean
Default
Requirement
required
Prop
side
Type
"left" | "right"
Default
"right"
Requirement
optional
Prop
eyebrow
Type
string
Default
Requirement
optional
Prop
dismissable
Type
boolean
Default
true
Requirement
optional

Events

EventPayload
update:open(_open: boolean) => true

Content regions

  • default
  • title

Import

import { Component, signal } from "@angular/core";
import {
  GrassrootButton,
  GrassrootSheet,
  GrassrootSheetTitle,
  GrassrootInput,
} from "@grassroot/ui-angular";

Props

Prop
Type
Default
Requirement
open
boolean
required
side
"left" | "right"
"right"
optional
eyebrow
string | undefined
undefined
optional
dismissable
boolean
true
optional
className
string
optional
Prop
open
Type
boolean
Default
Requirement
required
Prop
side
Type
"left" | "right"
Default
"right"
Requirement
optional
Prop
eyebrow
Type
string | undefined
Default
undefined
Requirement
optional
Prop
dismissable
Type
boolean
Default
true
Requirement
optional
Prop
className
Type
string
Default
Requirement
optional

Events

EventPayload
openChangeboolean

Content regions

  • default
  • title

Import

import { Button, Sheet, Input } from "@grassroot/ui-svelte";

Props

Prop
Type
Default
Requirement
open
boolean
required
side
"left" | "right"
"right"
optional
eyebrow
string
optional
dismissable
boolean
true
optional
onOpenChange
(open: boolean) => void
required
className
string
optional
Prop
open
Type
boolean
Default
Requirement
required
Prop
side
Type
"left" | "right"
Default
"right"
Requirement
optional
Prop
eyebrow
Type
string
Default
Requirement
optional
Prop
dismissable
Type
boolean
Default
true
Requirement
optional
Prop
onOpenChange
Type
(open: boolean) => void
Default
Requirement
required
Prop
className
Type
string
Default
Requirement
optional

Events

EventPayload
onOpenChange(open: boolean) => void

Content regions

  • children
  • title

Import

import { createSignal } from "solid-js";
import { Button, Sheet, Input } from "@grassroot/ui-solid";

Props

Prop
Type
Default
Requirement
open
boolean
required
onOpenChange
(open: boolean) => void
required
side
"left" | "right"
"right"
optional
eyebrow
string
optional
dismissable
boolean
true
optional
className
string
optional
Prop
open
Type
boolean
Default
Requirement
required
Prop
onOpenChange
Type
(open: boolean) => void
Default
Requirement
required
Prop
side
Type
"left" | "right"
Default
"right"
Requirement
optional
Prop
eyebrow
Type
string
Default
Requirement
optional
Prop
dismissable
Type
boolean
Default
true
Requirement
optional
Prop
className
Type
string
Default
Requirement
optional

Events

EventPayload
onOpenChange(open: boolean) => void

Content regions

  • children
  • title