@skunkworksai/ui-kit 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +250 -0
- package/README.md +429 -0
- package/dist/assets/Service-applets-apps/audience-measurement.png +0 -0
- package/dist/assets/Service-applets-apps/coatro-app.png +0 -0
- package/dist/assets/Service-applets-apps/content-effectiveness.png +0 -0
- package/dist/assets/Service-applets-apps/hop-tracking.png +0 -0
- package/dist/assets/Service-applets-apps/index.ts +13 -0
- package/dist/assets/Service-applets-apps/journeys-app.png +0 -0
- package/dist/assets/Service-applets-apps/people-counting.png +0 -0
- package/dist/assets/Service-applets-apps/petra.png +0 -0
- package/dist/assets/Service-applets-apps/sam-generic.png +0 -0
- package/dist/assets/Service-applets-apps/sami-for-environment.png +0 -0
- package/dist/assets/Service-applets-apps/shelf-engagement.png +0 -0
- package/dist/assets/Service-applets-apps/traffic-management.png +0 -0
- package/dist/assets/Service-applets-apps/viana.png +0 -0
- package/dist/assets/Service-applets-apps/zone-engagement.png +0 -0
- package/dist/assets/icons/Dashboard-active.svg +29 -0
- package/dist/assets/icons/Dashboard.svg +25 -0
- package/dist/assets/icons/DashboardActiveIcon.tsx +35 -0
- package/dist/assets/icons/DashboardIcon.tsx +31 -0
- package/dist/assets/icons/Devices-active.svg +27 -0
- package/dist/assets/icons/Devices.svg +20 -0
- package/dist/assets/icons/DevicesActiveIcon.tsx +33 -0
- package/dist/assets/icons/DevicesIcon.tsx +26 -0
- package/dist/assets/icons/Installer-active.svg +29 -0
- package/dist/assets/icons/Installer.svg +17 -0
- package/dist/assets/icons/InstallerActiveIcon.tsx +35 -0
- package/dist/assets/icons/InstallerIcon.tsx +23 -0
- package/dist/assets/icons/Manifest-active.svg +49 -0
- package/dist/assets/icons/Manifest.svg +49 -0
- package/dist/assets/icons/ManifestActiveIcon.tsx +55 -0
- package/dist/assets/icons/ManifestIcon.tsx +55 -0
- package/dist/assets/icons/Sensor-active.svg +15 -0
- package/dist/assets/icons/Sensor.svg +11 -0
- package/dist/assets/icons/SensorActiveIcon.tsx +21 -0
- package/dist/assets/icons/SensorIcon.tsx +17 -0
- package/dist/assets/icons/Site-active.svg +14 -0
- package/dist/assets/icons/Site.svg +10 -0
- package/dist/assets/icons/SiteActiveIcon.tsx +20 -0
- package/dist/assets/icons/SiteIcon.tsx +16 -0
- package/dist/assets/icons/X-ray-active.svg +199 -0
- package/dist/assets/icons/X-ray.svg +47 -0
- package/dist/assets/icons/XrayActiveIcon.tsx +205 -0
- package/dist/assets/icons/XrayIcon.tsx +53 -0
- package/dist/assets/icons/index.ts +14 -0
- package/dist/assets/logos/DarkLogo.tsx +28 -0
- package/dist/assets/logos/DarkSymbol.tsx +9 -0
- package/dist/assets/logos/PrimaryLogo.tsx +28 -0
- package/dist/assets/logos/PrimarySymbol.tsx +9 -0
- package/dist/assets/logos/WhiteLogo.tsx +28 -0
- package/dist/assets/logos/WhiteSymbol.tsx +9 -0
- package/dist/assets/logos/dark_logo.svg +22 -0
- package/dist/assets/logos/dark_symbol.svg +3 -0
- package/dist/assets/logos/index.ts +6 -0
- package/dist/assets/logos/primary-logo.svg +22 -0
- package/dist/assets/logos/primary_logo.svg +22 -0
- package/dist/assets/logos/primary_symbol.svg +3 -0
- package/dist/assets/logos/white_symbol.svg +3 -0
- package/dist/index.cjs +160 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +45276 -0
- package/dist/index.js.map +1 -0
- package/dist/tokens-source.css +121 -0
- package/dist/types/assets/Service-applets-apps/index.d.ts +13 -0
- package/dist/types/assets/icons/DashboardActiveIcon.d.ts +2 -0
- package/dist/types/assets/icons/DashboardIcon.d.ts +2 -0
- package/dist/types/assets/icons/DevicesActiveIcon.d.ts +2 -0
- package/dist/types/assets/icons/DevicesIcon.d.ts +2 -0
- package/dist/types/assets/icons/InstallerActiveIcon.d.ts +2 -0
- package/dist/types/assets/icons/InstallerIcon.d.ts +2 -0
- package/dist/types/assets/icons/ManifestActiveIcon.d.ts +2 -0
- package/dist/types/assets/icons/ManifestIcon.d.ts +2 -0
- package/dist/types/assets/icons/SensorActiveIcon.d.ts +2 -0
- package/dist/types/assets/icons/SensorIcon.d.ts +2 -0
- package/dist/types/assets/icons/SiteActiveIcon.d.ts +2 -0
- package/dist/types/assets/icons/SiteIcon.d.ts +2 -0
- package/dist/types/assets/icons/XrayActiveIcon.d.ts +2 -0
- package/dist/types/assets/icons/XrayIcon.d.ts +2 -0
- package/dist/types/assets/icons/index.d.ts +14 -0
- package/dist/types/assets/logos/DarkLogo.d.ts +2 -0
- package/dist/types/assets/logos/DarkSymbol.d.ts +2 -0
- package/dist/types/assets/logos/PrimaryLogo.d.ts +2 -0
- package/dist/types/assets/logos/PrimarySymbol.d.ts +2 -0
- package/dist/types/assets/logos/WhiteLogo.d.ts +2 -0
- package/dist/types/assets/logos/WhiteSymbol.d.ts +2 -0
- package/dist/types/assets/logos/index.d.ts +6 -0
- package/dist/types/components/blocks/AppBentoMenu.d.ts +31 -0
- package/dist/types/components/blocks/AppDashboard.d.ts +121 -0
- package/dist/types/components/blocks/AppHeader.d.ts +198 -0
- package/dist/types/components/blocks/AppLocationTreeFilter.d.ts +44 -0
- package/dist/types/components/blocks/AppNotificationsMenu.d.ts +50 -0
- package/dist/types/components/blocks/AppPageTitle.d.ts +86 -0
- package/dist/types/components/blocks/AppProfile.d.ts +53 -0
- package/dist/types/components/blocks/TableManager.d.ts +194 -0
- package/dist/types/components/blocks/backgrounds/AppDashboardBackgroundDots.d.ts +14 -0
- package/dist/types/components/blocks/backgrounds/AppDashboardBackgroundWave.d.ts +14 -0
- package/dist/types/components/blocks/backgrounds/index.d.ts +3 -0
- package/dist/types/components/blocks/backgrounds/types.d.ts +13 -0
- package/dist/types/components/blocks/index.d.ts +9 -0
- package/dist/types/components/primitives/AppAccordion.d.ts +22 -0
- package/dist/types/components/primitives/AppAlert.d.ts +33 -0
- package/dist/types/components/primitives/AppAlertDialog.d.ts +79 -0
- package/dist/types/components/primitives/AppAspectRatio.d.ts +7 -0
- package/dist/types/components/primitives/AppAvatar.d.ts +17 -0
- package/dist/types/components/primitives/AppBadge.d.ts +9 -0
- package/dist/types/components/primitives/AppBreadcrumb.d.ts +45 -0
- package/dist/types/components/primitives/AppButton.d.ts +24 -0
- package/dist/types/components/primitives/AppButtonGroup.d.ts +10 -0
- package/dist/types/components/primitives/AppCalendar.d.ts +51 -0
- package/dist/types/components/primitives/AppCard.d.ts +41 -0
- package/dist/types/components/primitives/AppCarousel.d.ts +26 -0
- package/dist/types/components/primitives/AppChart.d.ts +27 -0
- package/dist/types/components/primitives/AppCheckbox.d.ts +9 -0
- package/dist/types/components/primitives/AppCollapsible.d.ts +20 -0
- package/dist/types/components/primitives/AppCombobox.d.ts +37 -0
- package/dist/types/components/primitives/AppCommand.d.ts +47 -0
- package/dist/types/components/primitives/AppContextMenu.d.ts +82 -0
- package/dist/types/components/primitives/AppDataTable.d.ts +23 -0
- package/dist/types/components/primitives/AppDatePicker.d.ts +26 -0
- package/dist/types/components/primitives/AppDialog.d.ts +40 -0
- package/dist/types/components/primitives/AppDrawer.d.ts +58 -0
- package/dist/types/components/primitives/AppDropdownMenu.d.ts +85 -0
- package/dist/types/components/primitives/AppEmpty.d.ts +35 -0
- package/dist/types/components/primitives/AppField.d.ts +65 -0
- package/dist/types/components/primitives/AppForm.d.ts +58 -0
- package/dist/types/components/primitives/AppHoverCard.d.ts +19 -0
- package/dist/types/components/primitives/AppInput.d.ts +21 -0
- package/dist/types/components/primitives/AppKbd.d.ts +18 -0
- package/dist/types/components/primitives/AppLabel.d.ts +8 -0
- package/dist/types/components/primitives/AppMenubar.d.ts +83 -0
- package/dist/types/components/primitives/AppNavigationMenu.d.ts +51 -0
- package/dist/types/components/primitives/AppPagination.d.ts +46 -0
- package/dist/types/components/primitives/AppPopover.d.ts +20 -0
- package/dist/types/components/primitives/AppProgress.d.ts +9 -0
- package/dist/types/components/primitives/AppRadioGroup.d.ts +15 -0
- package/dist/types/components/primitives/AppScrollArea.d.ts +12 -0
- package/dist/types/components/primitives/AppScrollText.d.ts +7 -0
- package/dist/types/components/primitives/AppSelect.d.ts +46 -0
- package/dist/types/components/primitives/AppSeparator.d.ts +8 -0
- package/dist/types/components/primitives/AppSheet.d.ts +32 -0
- package/dist/types/components/primitives/AppSidebar.d.ts +59 -0
- package/dist/types/components/primitives/AppSkeleton.d.ts +6 -0
- package/dist/types/components/primitives/AppSpinner.d.ts +13 -0
- package/dist/types/components/primitives/AppSwitch.d.ts +8 -0
- package/dist/types/components/primitives/AppTable.d.ts +53 -0
- package/dist/types/components/primitives/AppTabs.d.ts +10 -0
- package/dist/types/components/primitives/AppTextarea.d.ts +9 -0
- package/dist/types/components/primitives/AppThemeProvider.d.ts +46 -0
- package/dist/types/components/primitives/AppToaster.d.ts +7 -0
- package/dist/types/components/primitives/AppToggle.d.ts +9 -0
- package/dist/types/components/primitives/AppToggleGroup.d.ts +18 -0
- package/dist/types/components/primitives/AppTooltip.d.ts +26 -0
- package/dist/types/components/primitives/AppTypography.d.ts +80 -0
- package/dist/types/components/primitives/index.d.ts +57 -0
- package/dist/types/components/ui/accordion.d.ts +7 -0
- package/dist/types/components/ui/alert-dialog.d.ts +20 -0
- package/dist/types/components/ui/alert.d.ts +8 -0
- package/dist/types/components/ui/aspect-ratio.d.ts +4 -0
- package/dist/types/components/ui/avatar.d.ts +6 -0
- package/dist/types/components/ui/badge.d.ts +9 -0
- package/dist/types/components/ui/breadcrumb.d.ts +19 -0
- package/dist/types/components/ui/button.d.ts +13 -0
- package/dist/types/components/ui/calendar.d.ts +8 -0
- package/dist/types/components/ui/card.d.ts +11 -0
- package/dist/types/components/ui/carousel.d.ts +28 -0
- package/dist/types/components/ui/chart.d.ts +48 -0
- package/dist/types/components/ui/checkbox.d.ts +4 -0
- package/dist/types/components/ui/collapsible.d.ts +6 -0
- package/dist/types/components/ui/combobox.d.ts +83 -0
- package/dist/types/components/ui/command.d.ts +82 -0
- package/dist/types/components/ui/context-menu.d.ts +27 -0
- package/dist/types/components/ui/dialog.d.ts +19 -0
- package/dist/types/components/ui/drawer.d.ts +23 -0
- package/dist/types/components/ui/dropdown-menu.d.ts +27 -0
- package/dist/types/components/ui/empty.d.ts +14 -0
- package/dist/types/components/ui/field.d.ts +40 -0
- package/dist/types/components/ui/form.d.ts +22 -0
- package/dist/types/components/ui/hover-card.d.ts +6 -0
- package/dist/types/components/ui/input.d.ts +3 -0
- package/dist/types/components/ui/kbd.d.ts +4 -0
- package/dist/types/components/ui/label.d.ts +4 -0
- package/dist/types/components/ui/menubar.d.ts +30 -0
- package/dist/types/components/ui/navigation-menu.d.ts +12 -0
- package/dist/types/components/ui/pagination.d.ts +28 -0
- package/dist/types/components/ui/popover.d.ts +6 -0
- package/dist/types/components/ui/progress.d.ts +4 -0
- package/dist/types/components/ui/radio-group.d.ts +5 -0
- package/dist/types/components/ui/scroll-area.d.ts +5 -0
- package/dist/types/components/ui/scroll-text.d.ts +6 -0
- package/dist/types/components/ui/select.d.ts +13 -0
- package/dist/types/components/ui/separator.d.ts +4 -0
- package/dist/types/components/ui/sheet.d.ts +25 -0
- package/dist/types/components/ui/sidebar.d.ts +69 -0
- package/dist/types/components/ui/skeleton.d.ts +2 -0
- package/dist/types/components/ui/sonner.d.ts +2 -0
- package/dist/types/components/ui/switch.d.ts +4 -0
- package/dist/types/components/ui/table.d.ts +10 -0
- package/dist/types/components/ui/tabs.d.ts +19 -0
- package/dist/types/components/ui/textarea.d.ts +5 -0
- package/dist/types/components/ui/toggle-group.d.ts +15 -0
- package/dist/types/components/ui/toggle.d.ts +12 -0
- package/dist/types/components/ui/tooltip.d.ts +7 -0
- package/dist/types/hooks/use-mobile.d.ts +13 -0
- package/dist/types/hooks/use-page-title.d.ts +23 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/lib/utils.d.ts +2 -0
- package/dist/ui-kit.css +1 -0
- package/package.json +117 -0
- package/rules/accordion.md +60 -0
- package/rules/alert-dialog.md +62 -0
- package/rules/alert.md +61 -0
- package/rules/aspect-ratio.md +47 -0
- package/rules/avatar.md +52 -0
- package/rules/badge.md +55 -0
- package/rules/bento-menu.md +86 -0
- package/rules/breadcrumb.md +80 -0
- package/rules/button-group.md +58 -0
- package/rules/button.md +66 -0
- package/rules/calendar.md +97 -0
- package/rules/card.md +84 -0
- package/rules/carousel.md +113 -0
- package/rules/chart.md +125 -0
- package/rules/checkbox.md +49 -0
- package/rules/collapsible.md +57 -0
- package/rules/combobox.md +133 -0
- package/rules/command.md +73 -0
- package/rules/context-menu.md +65 -0
- package/rules/dashboard.md +368 -0
- package/rules/data-table.md +91 -0
- package/rules/date-picker.md +65 -0
- package/rules/dialog.md +60 -0
- package/rules/drawer.md +65 -0
- package/rules/dropdown-menu.md +72 -0
- package/rules/empty.md +110 -0
- package/rules/field.md +149 -0
- package/rules/form.md +60 -0
- package/rules/header.md +245 -0
- package/rules/hover-card.md +53 -0
- package/rules/icons.md +141 -0
- package/rules/input.md +66 -0
- package/rules/kbd.md +58 -0
- package/rules/label.md +30 -0
- package/rules/location-tree-filter.md +165 -0
- package/rules/logo.md +58 -0
- package/rules/menubar.md +75 -0
- package/rules/navigation-menu.md +68 -0
- package/rules/notifications-menu.md +137 -0
- package/rules/pagetitle.md +160 -0
- package/rules/pagination.md +71 -0
- package/rules/popover.md +48 -0
- package/rules/profile.md +125 -0
- package/rules/progress.md +41 -0
- package/rules/radio-group.md +44 -0
- package/rules/scroll-area.md +32 -0
- package/rules/scroll-text.md +40 -0
- package/rules/select.md +86 -0
- package/rules/separator.md +43 -0
- package/rules/sheet.md +76 -0
- package/rules/sidebar.md +442 -0
- package/rules/skeleton.md +46 -0
- package/rules/spinner.md +43 -0
- package/rules/switch.md +46 -0
- package/rules/table-manager.md +306 -0
- package/rules/table.md +177 -0
- package/rules/tabs.md +82 -0
- package/rules/text.md +3 -0
- package/rules/textarea.md +38 -0
- package/rules/toaster.md +58 -0
- package/rules/toggle-group.md +50 -0
- package/rules/toggle.md +40 -0
- package/rules/tokens.md +88 -0
- package/rules/tooltip.md +78 -0
- package/rules/typography.md +81 -0
- package/scripts/scaffold.mjs +28 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# AppPagination
|
|
2
|
+
|
|
3
|
+
> Docs: https://ui-kit.vercel.app/docs/components/pagination
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
import {
|
|
7
|
+
AppPagination,
|
|
8
|
+
AppPaginationContent,
|
|
9
|
+
AppPaginationItem,
|
|
10
|
+
AppPaginationLink,
|
|
11
|
+
AppPaginationPrevious,
|
|
12
|
+
AppPaginationNext,
|
|
13
|
+
AppPaginationEllipsis,
|
|
14
|
+
} from "@/components/primitives/AppPagination"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## AppPaginationLink
|
|
18
|
+
|
|
19
|
+
| Prop | Type | Default | Description |
|
|
20
|
+
| :--- | :--- | :--- | :--- |
|
|
21
|
+
| `isActive` | `boolean` | `false` | Whether the link represents the current page. |
|
|
22
|
+
| `size` | `"default" \| "sm" \| "lg" \| "icon"` | `"icon"` | The size of the link. |
|
|
23
|
+
|
|
24
|
+
## Usage
|
|
25
|
+
|
|
26
|
+
### Default Pagination
|
|
27
|
+
```tsx
|
|
28
|
+
<AppPagination>
|
|
29
|
+
<AppPaginationContent>
|
|
30
|
+
<AppPaginationItem>
|
|
31
|
+
<AppPaginationPrevious href="#" />
|
|
32
|
+
</AppPaginationItem>
|
|
33
|
+
<AppPaginationItem>
|
|
34
|
+
<AppPaginationLink href="#">1</AppPaginationLink>
|
|
35
|
+
</AppPaginationItem>
|
|
36
|
+
<AppPaginationItem>
|
|
37
|
+
<AppPaginationLink href="#" isActive>2</AppPaginationLink>
|
|
38
|
+
</AppPaginationItem>
|
|
39
|
+
<AppPaginationItem>
|
|
40
|
+
<AppPaginationEllipsis />
|
|
41
|
+
</AppPaginationItem>
|
|
42
|
+
<AppPaginationItem>
|
|
43
|
+
<AppPaginationNext href="#" />
|
|
44
|
+
</AppPaginationItem>
|
|
45
|
+
</AppPaginationContent>
|
|
46
|
+
</AppPagination>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Rules
|
|
50
|
+
|
|
51
|
+
- **Do** use `AppPagination` for navigating through paginated lists.
|
|
52
|
+
- **Do** mark the current page with `isActive`.
|
|
53
|
+
- **Don't** show too many page links; use `AppPaginationEllipsis` for collapsed ranges.
|
|
54
|
+
- If a prop you need is missing, stop and inform the design team.
|
|
55
|
+
|
|
56
|
+
## Responsive
|
|
57
|
+
|
|
58
|
+
`AppPaginationLink` (page numbers) and `AppPaginationEllipsis` are hidden below `sm` (640px) via `hidden sm:inline-flex` and `hidden sm:flex` respectively. Previous and next buttons are always visible. On mobile, show a "Page X of Y" label alongside prev/next if page context is needed.
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
// Mobile-friendly pagination with page label
|
|
62
|
+
<div className="flex items-center gap-2">
|
|
63
|
+
<AppPagination>
|
|
64
|
+
<AppPaginationContent>
|
|
65
|
+
<AppPaginationItem><AppPaginationPrevious href="#" /></AppPaginationItem>
|
|
66
|
+
<AppPaginationItem className="sm:hidden"><span className="text-sm">Page 2 of 10</span></AppPaginationItem>
|
|
67
|
+
<AppPaginationItem><AppPaginationNext href="#" /></AppPaginationItem>
|
|
68
|
+
</AppPaginationContent>
|
|
69
|
+
</AppPagination>
|
|
70
|
+
</div>
|
|
71
|
+
```
|
package/rules/popover.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# AppPopover
|
|
2
|
+
|
|
3
|
+
> Docs: https://ui-kit.vercel.app/docs/components/popover
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
import { AppPopover, AppPopoverTrigger, AppPopoverContent } from "@/components/primitives/AppPopover"
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## AppPopoverContent
|
|
10
|
+
|
|
11
|
+
| Prop | Type | Default | Description |
|
|
12
|
+
| :--- | :--- | :--- | :--- |
|
|
13
|
+
| `side` | `"top" \| "right" \| "bottom" \| "left"` | `"bottom"` | The preferred side of the trigger to render against when open. |
|
|
14
|
+
| `align` | `"start" \| "center" \| "end"` | `"center"` | The preferred alignment against the trigger. |
|
|
15
|
+
| `sideOffset` | `number` | `4` | The distance in pixels from the trigger. |
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
### Basic Popover
|
|
20
|
+
```tsx
|
|
21
|
+
<AppPopover>
|
|
22
|
+
<AppPopoverTrigger asChild>
|
|
23
|
+
<AppButton variant="outline">Open Popover</AppButton>
|
|
24
|
+
</AppPopoverTrigger>
|
|
25
|
+
<AppPopoverContent className="w-80">
|
|
26
|
+
<div className="grid gap-4">
|
|
27
|
+
<div className="space-y-2">
|
|
28
|
+
<h4 className="font-medium leading-none">Dimensions</h4>
|
|
29
|
+
<p className="text-sm text-muted-foreground">Set the dimensions for the layer.</p>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</AppPopoverContent>
|
|
33
|
+
</AppPopover>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Rules
|
|
37
|
+
|
|
38
|
+
- **Do** use `AppPopover` for rich content that should appear upon click.
|
|
39
|
+
- **Do** use `asChild` on `AppPopoverTrigger` to use an `AppButton`.
|
|
40
|
+
- **Do** always set width via `className` on `AppPopoverContent` (e.g. `className="w-64"`) — no default width.
|
|
41
|
+
- **Don't** use `AppPopover` if the content is just a simple text label; use `AppTooltip` instead.
|
|
42
|
+
- If a prop you need is missing, stop and inform the design team.
|
|
43
|
+
|
|
44
|
+
## Responsive
|
|
45
|
+
|
|
46
|
+
On mobile (<768px) `AppPopover` renders as a bottom `Drawer`; `AppPopoverTrigger` becomes a `DrawerTrigger` and `AppPopoverContent` becomes `DrawerContent`. The consumer API is unchanged across all viewport sizes.
|
|
47
|
+
|
|
48
|
+
> **Implementation note:** On mobile, `AppPopoverContent` wraps `{children}` in an inner `div` inside `DrawerContent`. Consumer `className` (e.g. `p-0`) applies to that inner div, preserving `DrawerContent`'s own padding. `AppNotificationsMenu` and `AppProfile` do not use `AppPopover` on mobile — they branch directly to `AppDrawer` for a purpose-built drawer header.
|
package/rules/profile.md
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# AppProfile
|
|
2
|
+
|
|
3
|
+
Avatar trigger that opens a user profile popover with name, role, and action items (Settings, Administrator, Log Out by default).
|
|
4
|
+
|
|
5
|
+
## Exports
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import {
|
|
9
|
+
AppProfile,
|
|
10
|
+
type AppProfileUser,
|
|
11
|
+
type AppProfileItem,
|
|
12
|
+
type AppProfileProps,
|
|
13
|
+
} from '@skunkworksai/ui-kit'
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Props
|
|
17
|
+
|
|
18
|
+
### `AppProfile`
|
|
19
|
+
|
|
20
|
+
| Prop | Type | Default | Description |
|
|
21
|
+
|------|------|---------|-------------|
|
|
22
|
+
| `user` | `AppProfileUser` | — | Required. User data for the header row and avatar. |
|
|
23
|
+
| `items` | `AppProfileItem[]` | Settings + Administrator + Log Out | Override the full menu item list. |
|
|
24
|
+
| `onSettings` | `() => void` | — | Called when Settings is clicked. |
|
|
25
|
+
| `onAdministrator` | `() => void` | — | Called when Administrator is clicked. |
|
|
26
|
+
| `onLogout` | `() => void` | — | Called when Log Out is clicked. |
|
|
27
|
+
| `open` | `boolean` | — | Controlled open state. |
|
|
28
|
+
| `onOpenChange` | `(open: boolean) => void` | — | Open state change handler. |
|
|
29
|
+
| `trigger` | `ReactNode` | avatar button | Replace the default avatar trigger. |
|
|
30
|
+
| `className` | `string` | — | Extra classes added to the popover content. |
|
|
31
|
+
|
|
32
|
+
### `AppProfileUser`
|
|
33
|
+
|
|
34
|
+
| Field | Type | Required | Description |
|
|
35
|
+
|-------|------|----------|-------------|
|
|
36
|
+
| `name` | `string` | ✓ | Full display name shown in the popover header. |
|
|
37
|
+
| `role` | `string` | — | Subtitle shown below the name. |
|
|
38
|
+
| `avatarSrc` | `string` | — | Image URL for the avatar. |
|
|
39
|
+
| `avatarFallback` | `string` | — | Initials override. Derived from `name` when omitted. |
|
|
40
|
+
|
|
41
|
+
### `AppProfileItem`
|
|
42
|
+
|
|
43
|
+
| Field | Type | Required | Description |
|
|
44
|
+
|-------|------|----------|-------------|
|
|
45
|
+
| `label` | `string` | ✓ | Display text. |
|
|
46
|
+
| `icon` | `ComponentType` | — | Lucide icon component. |
|
|
47
|
+
| `onClick` | `() => void` | — | Click handler. |
|
|
48
|
+
| `href` | `string` | — | Renders the item as an `<a>` tag. |
|
|
49
|
+
| `destructive` | `boolean` | — | Applies destructive color. |
|
|
50
|
+
|
|
51
|
+
## Usage
|
|
52
|
+
|
|
53
|
+
### Via AppDashboard (standard)
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
<AppDashboard
|
|
57
|
+
nav={nav}
|
|
58
|
+
header={{
|
|
59
|
+
profile: { name: "Joshua Intern", role: "Admin" },
|
|
60
|
+
onSettings: handleSettings,
|
|
61
|
+
onAdministrator: handleAdministrator,
|
|
62
|
+
onLogout: handleLogout,
|
|
63
|
+
}}
|
|
64
|
+
>
|
|
65
|
+
<PageContent />
|
|
66
|
+
</AppDashboard>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Standalone
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
<AppProfile
|
|
73
|
+
user={{ name: "Joshua Intern", role: "Admin" }}
|
|
74
|
+
onSettings={handleSettings}
|
|
75
|
+
onAdministrator={handleAdministrator}
|
|
76
|
+
onLogout={handleLogout}
|
|
77
|
+
/>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### With avatar image
|
|
81
|
+
|
|
82
|
+
```tsx
|
|
83
|
+
<AppProfile
|
|
84
|
+
user={{ name: "Joshua Intern", role: "Admin", avatarSrc: "https://..." }}
|
|
85
|
+
onLogout={handleLogout}
|
|
86
|
+
/>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Custom items
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
import { User, HelpCircle, LogOut } from "lucide-react"
|
|
93
|
+
|
|
94
|
+
<AppProfile
|
|
95
|
+
user={{ name: "Joshua Intern", role: "Admin" }}
|
|
96
|
+
items={[
|
|
97
|
+
{ label: "My Account", icon: User, onClick: handleAccount },
|
|
98
|
+
{ label: "Help", icon: HelpCircle, href: "/help" },
|
|
99
|
+
{ label: "Log Out", icon: LogOut, onClick: handleLogout, destructive: true },
|
|
100
|
+
]}
|
|
101
|
+
/>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Controlled open state
|
|
105
|
+
|
|
106
|
+
```tsx
|
|
107
|
+
const [open, setOpen] = React.useState(false)
|
|
108
|
+
|
|
109
|
+
<AppProfile
|
|
110
|
+
user={{ name: "Joshua Intern", role: "Admin" }}
|
|
111
|
+
open={open}
|
|
112
|
+
onOpenChange={setOpen}
|
|
113
|
+
onLogout={() => setOpen(false)}
|
|
114
|
+
/>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Rules
|
|
118
|
+
|
|
119
|
+
- Use `profile` + handler props on `AppDashboard`/`AppHeader` rather than dropping `AppProfile` directly into slots.
|
|
120
|
+
- The `avatar` prop on `AppHeader` takes precedence over `profile` — do not set both.
|
|
121
|
+
- The `actions` prop on `AppHeader` overrides everything; profile props are ignored when `actions` is set.
|
|
122
|
+
- Default initials are derived from `name` (first letter of each word, max 2). Supply `avatarFallback` to override.
|
|
123
|
+
- Each item closes the popover on click; `href` items also close on click.
|
|
124
|
+
- Mobile: `AppProfile` renders as a side `AppDrawer` on viewports below 768px, with user avatar, name, role, and a close button in the drawer header. Desktop uses `AppPopover`. The public API is unchanged across viewport sizes.
|
|
125
|
+
- If a prop you need is missing, stop and inform the design team.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# AppProgress
|
|
2
|
+
|
|
3
|
+
> Docs: https://ui-kit.vercel.app/docs/components/progress
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
import { AppProgress } from "@/components/primitives/AppProgress"
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## AppProgress
|
|
10
|
+
|
|
11
|
+
| Prop | Type | Default | Description |
|
|
12
|
+
| :--- | :--- | :--- | :--- |
|
|
13
|
+
| `value` | `number \| null` | - | The progress value. |
|
|
14
|
+
| `max` | `number` | `100` | The maximum progress value. |
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
> `AppProgress` has no default width. Set width on a parent wrapper or via `className` (e.g. `className="w-full"` or `className="w-64"`).
|
|
19
|
+
|
|
20
|
+
### Simple Progress Bar
|
|
21
|
+
```tsx
|
|
22
|
+
<AppProgress value={33} className="w-full" />
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Progress with Label
|
|
26
|
+
```tsx
|
|
27
|
+
<div className="w-full space-y-1.5">
|
|
28
|
+
<div className="flex justify-between text-sm">
|
|
29
|
+
<span>Uploading…</span>
|
|
30
|
+
<span>66%</span>
|
|
31
|
+
</div>
|
|
32
|
+
<AppProgress value={66} />
|
|
33
|
+
</div>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Rules
|
|
37
|
+
|
|
38
|
+
- **Do** use `AppProgress` to show completion status of a task.
|
|
39
|
+
- **Do** provide additional context (like percentages) for better clarity when needed.
|
|
40
|
+
- **Don't** use `AppProgress` for indeterminate loading states where time is unknown; use `AppSpinner` or a skeleton instead if appropriate.
|
|
41
|
+
- If a prop you need is missing, stop and inform the design team.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# AppRadioGroup
|
|
2
|
+
|
|
3
|
+
> Docs: https://ui-kit.vercel.app/docs/components/radio-group
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
import { AppRadioGroup, AppRadioGroupItem } from "@/components/primitives/AppRadioGroup"
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## AppRadioGroup
|
|
10
|
+
|
|
11
|
+
| Prop | Type | Default | Description |
|
|
12
|
+
| :--- | :--- | :--- | :--- |
|
|
13
|
+
| `defaultValue` | `string` | - | The value of the radio item that should be checked by default. |
|
|
14
|
+
| `onValueChange` | `(value: string) => void` | - | Event handler called when the value changes. |
|
|
15
|
+
|
|
16
|
+
## AppRadioGroupItem
|
|
17
|
+
|
|
18
|
+
| Prop | Type | Default | Description |
|
|
19
|
+
| :--- | :--- | :--- | :--- |
|
|
20
|
+
| `value` | `string` | - | The value given as data to the radio item when submitted in a form. |
|
|
21
|
+
| `id` | `string` | - | A unique ID for the radio item, used to link with a label. |
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
### Default Radio Group
|
|
26
|
+
```tsx
|
|
27
|
+
<AppRadioGroup defaultValue="option-one">
|
|
28
|
+
<div className="flex items-center gap-2">
|
|
29
|
+
<AppRadioGroupItem value="option-one" id="option-one" />
|
|
30
|
+
<AppLabel htmlFor="option-one">Option One</AppLabel>
|
|
31
|
+
</div>
|
|
32
|
+
<div className="flex items-center gap-2">
|
|
33
|
+
<AppRadioGroupItem value="option-two" id="option-two" />
|
|
34
|
+
<AppLabel htmlFor="option-two">Option Two</AppLabel>
|
|
35
|
+
</div>
|
|
36
|
+
</AppRadioGroup>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Rules
|
|
40
|
+
|
|
41
|
+
- **Do** use `AppRadioGroup` when only one option can be selected from a set.
|
|
42
|
+
- **Do** always provide a label for each `AppRadioGroupItem`.
|
|
43
|
+
- **Don't** use `AppRadioGroup` for multi-select; use `AppCheckbox` instead.
|
|
44
|
+
- If a prop you need is missing, stop and inform the design team.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# AppScrollArea
|
|
2
|
+
|
|
3
|
+
> Docs: https://ui-kit.vercel.app/docs/components/scroll-area
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
import { AppScrollArea, AppScrollBar } from "@/components/primitives/AppScrollArea"
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## AppScrollArea
|
|
10
|
+
|
|
11
|
+
| Prop | Type | Default | Description |
|
|
12
|
+
| :--- | :--- | :--- | :--- |
|
|
13
|
+
| `type` | `"auto" \| "always" \| "scroll" \| "hover"` | `"hover"` | Describes the nature of scrollbar visibility. |
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
### Simple Scroll Area
|
|
18
|
+
```tsx
|
|
19
|
+
<AppScrollArea className="h-[200px] w-[350px] rounded-md border p-4">
|
|
20
|
+
Jokester began sneaking into the castle in the middle of the night and leaving
|
|
21
|
+
jokes all over the place: under the king's pillow, in his soup, even in the
|
|
22
|
+
royal toilet. The king was furious, but he couldn't help but laugh at the
|
|
23
|
+
jokes.
|
|
24
|
+
</AppScrollArea>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Rules
|
|
28
|
+
|
|
29
|
+
- **Do** use `AppScrollArea` for custom-styled scrollbars that work across browsers.
|
|
30
|
+
- **Do** specify a height for the `AppScrollArea` container.
|
|
31
|
+
- **Don't** use `AppScrollArea` for the entire page; use native browser scrolling for better performance.
|
|
32
|
+
- If a prop you need is missing, stop and inform the design team.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# AppScrollText
|
|
2
|
+
|
|
3
|
+
> Docs: https://ui-kit.vercel.app/docs/components/scroll-text
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
import { AppScrollText } from "@/components/primitives/AppScrollText"
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## AppScrollText
|
|
10
|
+
|
|
11
|
+
| Prop | Type | Default | Description |
|
|
12
|
+
| :--- | :--- | :--- | :--- |
|
|
13
|
+
| `direction` | `"left" \| "right"` | `"left"` | The direction of the scrolling text. |
|
|
14
|
+
| `speed` | `number` | `50` | The speed of the scrolling animation. |
|
|
15
|
+
| `pauseOnHover` | `boolean` | `false` | Whether to pause the animation when hovered. |
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
### Left Scrolling Text
|
|
20
|
+
```tsx
|
|
21
|
+
<AppScrollText direction="left" className="text-2xl font-bold">
|
|
22
|
+
<span>Special Offer!</span>
|
|
23
|
+
<span>50% Off all items</span>
|
|
24
|
+
<span>Ends tonight!</span>
|
|
25
|
+
</AppScrollText>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Fast Right Scrolling Text
|
|
29
|
+
```tsx
|
|
30
|
+
<AppScrollText direction="right" speed={100} className="text-lg">
|
|
31
|
+
<span>Breaking News: New components released!</span>
|
|
32
|
+
</AppScrollText>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Rules
|
|
36
|
+
|
|
37
|
+
- **Do** use `AppScrollText` for marquee-like announcements.
|
|
38
|
+
- **Do** ensure the text remains readable at the chosen `speed`.
|
|
39
|
+
- **Don't** use `AppScrollText` for critical information that the user might miss.
|
|
40
|
+
- If a prop you need is missing, stop and inform the design team.
|
package/rules/select.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# AppSelect
|
|
2
|
+
|
|
3
|
+
> Docs: https://ui-kit.vercel.app/docs/components/select
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
import {
|
|
7
|
+
AppSelect,
|
|
8
|
+
AppSelectTrigger,
|
|
9
|
+
AppSelectValue,
|
|
10
|
+
AppSelectContent,
|
|
11
|
+
AppSelectGroup,
|
|
12
|
+
AppSelectItem,
|
|
13
|
+
AppSelectLabel,
|
|
14
|
+
} from "@/components/primitives/AppSelect"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## AppSelect
|
|
18
|
+
|
|
19
|
+
| Prop | Type | Default | Description |
|
|
20
|
+
| :--- | :--- | :--- | :--- |
|
|
21
|
+
| `defaultValue` | `string` | - | The value of the select that should be open by default. |
|
|
22
|
+
| `onValueChange` | `(value: string) => void` | - | Event handler called when the value changes. |
|
|
23
|
+
|
|
24
|
+
## AppSelectTrigger
|
|
25
|
+
|
|
26
|
+
| Prop | Type | Default | Description |
|
|
27
|
+
| :--- | :--- | :--- | :--- |
|
|
28
|
+
| `loading` | `boolean` | `false` | If true, shows a spinner and disables the trigger. |
|
|
29
|
+
|
|
30
|
+
## Usage
|
|
31
|
+
|
|
32
|
+
### Basic Select
|
|
33
|
+
```tsx
|
|
34
|
+
<AppSelect>
|
|
35
|
+
<AppSelectTrigger className="w-48">
|
|
36
|
+
<AppSelectValue placeholder="Select a fruit" />
|
|
37
|
+
</AppSelectTrigger>
|
|
38
|
+
<AppSelectContent>
|
|
39
|
+
<AppSelectItem value="apple">Apple</AppSelectItem>
|
|
40
|
+
<AppSelectItem value="banana">Banana</AppSelectItem>
|
|
41
|
+
<AppSelectItem value="blueberry">Blueberry</AppSelectItem>
|
|
42
|
+
</AppSelectContent>
|
|
43
|
+
</AppSelect>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Grouped options
|
|
47
|
+
```tsx
|
|
48
|
+
<AppSelect>
|
|
49
|
+
<AppSelectTrigger className="w-48">
|
|
50
|
+
<AppSelectValue placeholder="Select a fruit" />
|
|
51
|
+
</AppSelectTrigger>
|
|
52
|
+
<AppSelectContent>
|
|
53
|
+
<AppSelectGroup>
|
|
54
|
+
<AppSelectLabel>Fruits</AppSelectLabel>
|
|
55
|
+
<AppSelectItem value="apple">Apple</AppSelectItem>
|
|
56
|
+
<AppSelectItem value="banana">Banana</AppSelectItem>
|
|
57
|
+
</AppSelectGroup>
|
|
58
|
+
<AppSelectGroup>
|
|
59
|
+
<AppSelectLabel>Vegetables</AppSelectLabel>
|
|
60
|
+
<AppSelectItem value="carrot">Carrot</AppSelectItem>
|
|
61
|
+
<AppSelectItem value="broccoli">Broccoli</AppSelectItem>
|
|
62
|
+
</AppSelectGroup>
|
|
63
|
+
</AppSelectContent>
|
|
64
|
+
</AppSelect>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Loading State
|
|
68
|
+
```tsx
|
|
69
|
+
<AppSelect>
|
|
70
|
+
<AppSelectTrigger loading className="w-48">
|
|
71
|
+
<AppSelectValue placeholder="Loading options..." />
|
|
72
|
+
</AppSelectTrigger>
|
|
73
|
+
<AppSelectContent>
|
|
74
|
+
{/* Items would be here after loading */}
|
|
75
|
+
</AppSelectContent>
|
|
76
|
+
</AppSelect>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Rules
|
|
80
|
+
|
|
81
|
+
- **Do** use `AppSelect` for picking a single value from a list of options.
|
|
82
|
+
- **Do** use the `loading` prop on `AppSelectTrigger` when fetching data.
|
|
83
|
+
- **Do** use `AppSelectGroup` + `AppSelectLabel` to group related options.
|
|
84
|
+
- **Do** set trigger width explicitly via `className` (e.g. `className="w-48"`) — no default width.
|
|
85
|
+
- **Don't** use raw `<select>` elements.
|
|
86
|
+
- If a prop you need is missing, stop and inform the design team.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# AppSeparator
|
|
2
|
+
|
|
3
|
+
> Docs: https://ui-kit.vercel.app/docs/components/separator
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
import { AppSeparator } from "@/components/primitives/AppSeparator"
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## AppSeparator
|
|
10
|
+
|
|
11
|
+
| Prop | Type | Default | Description |
|
|
12
|
+
| :--- | :--- | :--- | :--- |
|
|
13
|
+
| `orientation` | `"horizontal" \| "vertical"` | `"horizontal"` | The orientation of the separator. |
|
|
14
|
+
| `decorative` | `boolean` | `true` | Whether the separator is purely decorative. If `false`, it's accessible to screen readers as a separator. |
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
### Horizontal Separator
|
|
19
|
+
```tsx
|
|
20
|
+
<div className="space-y-4">
|
|
21
|
+
<p>Top section</p>
|
|
22
|
+
<AppSeparator />
|
|
23
|
+
<p>Bottom section</p>
|
|
24
|
+
</div>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Vertical Separator
|
|
28
|
+
```tsx
|
|
29
|
+
<div className="flex h-5 items-center space-x-4">
|
|
30
|
+
<div>Item 1</div>
|
|
31
|
+
<AppSeparator orientation="vertical" />
|
|
32
|
+
<div>Item 2</div>
|
|
33
|
+
</div>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Rules
|
|
37
|
+
|
|
38
|
+
- **Do** use `AppSeparator` to visually divide content.
|
|
39
|
+
- **Do** set `orientation="vertical"` when used within flex containers for side-by-side items.
|
|
40
|
+
- **Don't** use raw `<hr />` tags for separation.
|
|
41
|
+
- **Don't** use `AppSeparator` for purely layout purposes if a border on a container is more appropriate.
|
|
42
|
+
|
|
43
|
+
If a prop you need is missing, stop and inform the design team.
|
package/rules/sheet.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# AppSheet
|
|
2
|
+
|
|
3
|
+
> Docs: https://ui-kit.vercel.app/docs/components/sheet
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
import {
|
|
7
|
+
AppSheet,
|
|
8
|
+
AppSheetTrigger,
|
|
9
|
+
AppSheetContent,
|
|
10
|
+
AppSheetHeader,
|
|
11
|
+
AppSheetTitle,
|
|
12
|
+
AppSheetDescription
|
|
13
|
+
} from "@/components/primitives/AppSheet"
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## AppSheet
|
|
17
|
+
|
|
18
|
+
| Prop | Type | Default | Description |
|
|
19
|
+
| :--- | :--- | :--- | :--- |
|
|
20
|
+
| `open` | `boolean` | - | Controlled open state. |
|
|
21
|
+
| `onOpenChange` | `(open: boolean) => void` | - | Callback for open state changes. |
|
|
22
|
+
| `defaultOpen` | `boolean` | - | Initial open state. |
|
|
23
|
+
|
|
24
|
+
## AppSheetTrigger
|
|
25
|
+
|
|
26
|
+
| Prop | Type | Default | Description |
|
|
27
|
+
| :--- | :--- | :--- | :--- |
|
|
28
|
+
| `asChild` | `boolean` | `false` | Change the rendered element to the child. |
|
|
29
|
+
|
|
30
|
+
## AppSheetContent
|
|
31
|
+
|
|
32
|
+
| Prop | Type | Default | Description |
|
|
33
|
+
| :--- | :--- | :--- | :--- |
|
|
34
|
+
| `side` | `"top" \| "bottom" \| "left" \| "right"` | `"right"` | The side the sheet slides from. |
|
|
35
|
+
|
|
36
|
+
## Usage
|
|
37
|
+
|
|
38
|
+
### Default Sheet
|
|
39
|
+
```tsx
|
|
40
|
+
<AppSheet>
|
|
41
|
+
<AppSheetTrigger asChild>
|
|
42
|
+
<AppButton variant="outline">Open Sheet</AppButton>
|
|
43
|
+
</AppSheetTrigger>
|
|
44
|
+
<AppSheetContent>
|
|
45
|
+
<AppSheetHeader>
|
|
46
|
+
<AppSheetTitle>Edit Profile</AppSheetTitle>
|
|
47
|
+
<AppSheetDescription>Make changes to your profile here.</AppSheetDescription>
|
|
48
|
+
</AppSheetHeader>
|
|
49
|
+
<div className="py-4">Profile edit form...</div>
|
|
50
|
+
</AppSheetContent>
|
|
51
|
+
</AppSheet>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Left Side Sheet
|
|
55
|
+
```tsx
|
|
56
|
+
<AppSheet>
|
|
57
|
+
<AppSheetTrigger asChild>
|
|
58
|
+
<AppButton variant="ghost">Menu</AppButton>
|
|
59
|
+
</AppSheetTrigger>
|
|
60
|
+
<AppSheetContent side="left">
|
|
61
|
+
<AppSheetHeader>
|
|
62
|
+
<AppSheetTitle>Navigation</AppSheetTitle>
|
|
63
|
+
</AppSheetHeader>
|
|
64
|
+
<nav>Links...</nav>
|
|
65
|
+
</AppSheetContent>
|
|
66
|
+
</AppSheet>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Rules
|
|
70
|
+
|
|
71
|
+
- **Do** use `AppSheet` for secondary information or forms that don't fit in a standard dialog.
|
|
72
|
+
- **Do** provide a clear `AppSheetTitle` and `AppSheetDescription` for accessibility.
|
|
73
|
+
- **Don't** overfill the sheet with complex multi-step workflows.
|
|
74
|
+
- **Don't** use `AppSheet` for small confirmation tasks; use `AppAlertDialog` instead.
|
|
75
|
+
|
|
76
|
+
If a prop you need is missing, stop and inform the design team.
|