cleanplate 0.3.28 → 0.3.30
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/CHANGELOG.md +1 -0
- package/README.md +1 -0
- package/dist/components/app-shell/AppShell.d.ts.map +1 -1
- package/dist/components/drawer/Drawer.d.ts +65 -0
- package/dist/components/drawer/Drawer.d.ts.map +1 -0
- package/dist/components/drawer/index.d.ts +4 -0
- package/dist/components/drawer/index.d.ts.map +1 -0
- package/dist/components/form-controls/Select.d.ts +7 -3
- package/dist/components/form-controls/Select.d.ts.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.css +1 -1
- package/dist/index.es.js +4 -4
- package/dist/index.js +4 -4
- package/dist/utils/use-media-query.d.ts +2 -0
- package/dist/utils/use-media-query.d.ts.map +1 -0
- package/docs/Drawer.md +219 -0
- package/docs/FormControls.md +4 -1
- package/llms.txt +10 -2
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-media-query.d.ts","sourceRoot":"","sources":["../../src/utils/use-media-query.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CA4B3D"}
|
package/docs/Drawer.md
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# Drawer Component
|
|
2
|
+
|
|
3
|
+
Purpose: A slide-in overlay panel for navigation, filters, settings, or detail views. On desktop (≥768px), slides from a configurable edge (`left`, `right`, `top`, or `bottom`). Below 768px, always renders as a bottom sheet (max height 90dvh). Includes fade/slide transitions, focus management, and Modal-like optional chrome (title, close button, footer primary / secondary / tertiary actions).
|
|
4
|
+
|
|
5
|
+
## Props / Inputs
|
|
6
|
+
|
|
7
|
+
| Prop | Type | Required | Default | Description |
|
|
8
|
+
| --- | --- | --- | --- | --- |
|
|
9
|
+
| children | React.ReactNode | yes | — | Drawer body content. |
|
|
10
|
+
| isOpen | boolean | no | false | Whether the drawer is visible. |
|
|
11
|
+
| onClose | () => void | no | — | Called when the drawer should close (close button, overlay, or Escape). |
|
|
12
|
+
| placement | "left" \| "right" \| "top" \| "bottom" | no | "right" | Edge the drawer slides from on desktop; ignored on mobile (always bottom sheet). |
|
|
13
|
+
| size | "small" \| "medium" \| "large" \| "full" | no | "medium" | Panel size preset (width for side drawers, height for top/bottom). |
|
|
14
|
+
| title | string | no | "" | Title displayed in the drawer header. |
|
|
15
|
+
| showCloseButton | boolean | no | true | Whether to show the X close button in the header. |
|
|
16
|
+
| closeOnOverlayClick | boolean | no | true | Whether clicking the overlay closes the drawer. |
|
|
17
|
+
| closeOnEscape | boolean | no | true | Whether pressing Escape closes the drawer. |
|
|
18
|
+
| margin | string \| SpacingOption[] | no | "0" | Margin spacing (suffix or array of suffixes; component adds `m-` prefix). |
|
|
19
|
+
| className | string | no | "" | Additional class names for the drawer panel. |
|
|
20
|
+
| overlayClassName | string | no | "" | Additional class names for the overlay. |
|
|
21
|
+
| contentClassName | string | no | "" | Additional class names for the content wrapper. |
|
|
22
|
+
| headerClassName | string | no | "" | Additional class names for the header row. |
|
|
23
|
+
| bodyClassName | string | no | "" | Additional class names for the body region. |
|
|
24
|
+
| footerClassName | string | no | "" | Additional class names for the footer row. |
|
|
25
|
+
| ariaLabel | string | no | — | Accessible name when no `title` is provided. Required for a11y when `title` is omitted. |
|
|
26
|
+
| primaryButtonLabel | string | no | "" | Label for the primary footer button; empty hides it. |
|
|
27
|
+
| onPrimaryButtonClick | () => void | no | — | Called when the primary footer button is clicked. |
|
|
28
|
+
| secondaryButtonLabel | string | no | "" | Label for the secondary footer button; empty hides it. |
|
|
29
|
+
| onSecondaryButtonClick | () => void | no | — | Called when the secondary footer button is clicked. |
|
|
30
|
+
| tertiaryButtonLabel | string | no | "" | Label for the tertiary footer button (ghost variant); empty hides it. |
|
|
31
|
+
| onTertiaryButtonClick | () => void | no | — | Called when the tertiary footer button is clicked. |
|
|
32
|
+
| dataTestId | string | no | — | Root `data-testid` on the dialog panel; suffixed ids: `-overlay`, `-header`, `-title`, `-close`, `-body`, `-footer`, `-primary`, `-secondary`, `-tertiary` (see **E2E / test selectors**). |
|
|
33
|
+
|
|
34
|
+
## Size presets
|
|
35
|
+
|
|
36
|
+
| Size | Side drawer width (`left` / `right`) | Top / bottom drawer height |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| `small` | `min(280px, 100vw − 56px)` | `30dvh` |
|
|
39
|
+
| `medium` | `min(360px, 100vw − 56px)` | `50dvh` |
|
|
40
|
+
| `large` | `min(480px, 100vw − 56px)` | `70dvh` |
|
|
41
|
+
| `full` | `100vw` | `100dvh` |
|
|
42
|
+
|
|
43
|
+
On mobile (≤768px), `size` height/width presets are overridden by the bottom sheet shell (`max-height: 90dvh`, full width).
|
|
44
|
+
|
|
45
|
+
## Types
|
|
46
|
+
|
|
47
|
+
### SpacingOption
|
|
48
|
+
```typescript
|
|
49
|
+
type SpacingOption = (typeof SPACING_OPTIONS)[number];
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### DrawerPlacement
|
|
53
|
+
```typescript
|
|
54
|
+
type DrawerPlacement = "left" | "right" | "top" | "bottom";
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### DrawerSize
|
|
58
|
+
```typescript
|
|
59
|
+
type DrawerSize = "small" | "medium" | "large" | "full";
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### DrawerMargin
|
|
63
|
+
```typescript
|
|
64
|
+
type DrawerMargin = string | SpacingOption[];
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### DrawerProps
|
|
68
|
+
```typescript
|
|
69
|
+
interface DrawerProps {
|
|
70
|
+
children: React.ReactNode;
|
|
71
|
+
isOpen?: boolean;
|
|
72
|
+
onClose?: () => void;
|
|
73
|
+
placement?: DrawerPlacement;
|
|
74
|
+
size?: DrawerSize;
|
|
75
|
+
title?: string;
|
|
76
|
+
showCloseButton?: boolean;
|
|
77
|
+
closeOnOverlayClick?: boolean;
|
|
78
|
+
closeOnEscape?: boolean;
|
|
79
|
+
margin?: DrawerMargin;
|
|
80
|
+
className?: string;
|
|
81
|
+
overlayClassName?: string;
|
|
82
|
+
contentClassName?: string;
|
|
83
|
+
headerClassName?: string;
|
|
84
|
+
bodyClassName?: string;
|
|
85
|
+
footerClassName?: string;
|
|
86
|
+
ariaLabel?: string;
|
|
87
|
+
primaryButtonLabel?: string;
|
|
88
|
+
onPrimaryButtonClick?: () => void;
|
|
89
|
+
secondaryButtonLabel?: string;
|
|
90
|
+
onSecondaryButtonClick?: () => void;
|
|
91
|
+
tertiaryButtonLabel?: string;
|
|
92
|
+
onTertiaryButtonClick?: () => void;
|
|
93
|
+
dataTestId?: string;
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## E2E / test selectors
|
|
98
|
+
|
|
99
|
+
Pass `dataTestId="filters-drawer"` to get stable Playwright / Testing Library hooks:
|
|
100
|
+
|
|
101
|
+
| Suffix | Element |
|
|
102
|
+
| --- | --- |
|
|
103
|
+
| *(root)* | Dialog panel (`role="dialog"`) |
|
|
104
|
+
| `-overlay` | Backdrop overlay |
|
|
105
|
+
| `-header` | Header row (title + close button) |
|
|
106
|
+
| `-title` | Title text |
|
|
107
|
+
| `-close` | Header close (X) button |
|
|
108
|
+
| `-body` | Main content area |
|
|
109
|
+
| `-footer` | Footer action row |
|
|
110
|
+
| `-primary` | Primary footer button (solid) |
|
|
111
|
+
| `-secondary` | Secondary footer button (outline) |
|
|
112
|
+
| `-tertiary` | Tertiary footer button (ghost) |
|
|
113
|
+
|
|
114
|
+
Header, title, close, footer, and button suffixes are omitted when those regions are not rendered.
|
|
115
|
+
|
|
116
|
+
### Playwright example
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
await page.getByRole("button", { name: "Open filters" }).click();
|
|
120
|
+
await expect(page.getByTestId("filters-drawer")).toBeVisible();
|
|
121
|
+
await page.getByTestId("filters-drawer-body").getByLabel("Category").selectOption("books");
|
|
122
|
+
await page.getByTestId("filters-drawer-primary").click();
|
|
123
|
+
await expect(page.getByTestId("filters-drawer")).toBeHidden();
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Usage Examples
|
|
127
|
+
|
|
128
|
+
### Basic
|
|
129
|
+
|
|
130
|
+
```jsx
|
|
131
|
+
import { Drawer, Button, Typography } from "cleanplate";
|
|
132
|
+
import { useState } from "react";
|
|
133
|
+
|
|
134
|
+
const App = () => {
|
|
135
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
136
|
+
return (
|
|
137
|
+
<>
|
|
138
|
+
<Button onClick={() => setIsOpen(true)}>Open Drawer</Button>
|
|
139
|
+
<Drawer
|
|
140
|
+
isOpen={isOpen}
|
|
141
|
+
onClose={() => setIsOpen(false)}
|
|
142
|
+
title="Filters"
|
|
143
|
+
placement="right"
|
|
144
|
+
>
|
|
145
|
+
<Typography variant="p">Filter options go here.</Typography>
|
|
146
|
+
</Drawer>
|
|
147
|
+
</>
|
|
148
|
+
);
|
|
149
|
+
};
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Placements (desktop)
|
|
153
|
+
|
|
154
|
+
```jsx
|
|
155
|
+
<Drawer placement="left" title="Navigation" isOpen={isOpen} onClose={onClose}>...</Drawer>
|
|
156
|
+
<Drawer placement="right" title="Details" isOpen={isOpen} onClose={onClose}>...</Drawer>
|
|
157
|
+
<Drawer placement="top" title="Announcements" isOpen={isOpen} onClose={onClose}>...</Drawer>
|
|
158
|
+
<Drawer placement="bottom" title="Actions" isOpen={isOpen} onClose={onClose}>...</Drawer>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### With footer buttons
|
|
162
|
+
|
|
163
|
+
Footer actions render in a row: **tertiary** (ghost, left), **secondary** (outline), **primary** (solid, right). Omit any label to hide that button.
|
|
164
|
+
|
|
165
|
+
```jsx
|
|
166
|
+
<Drawer
|
|
167
|
+
isOpen={isOpen}
|
|
168
|
+
onClose={() => setIsOpen(false)}
|
|
169
|
+
title="Apply Filters"
|
|
170
|
+
tertiaryButtonLabel="Learn more"
|
|
171
|
+
onTertiaryButtonClick={handleLearnMore}
|
|
172
|
+
secondaryButtonLabel="Reset"
|
|
173
|
+
onSecondaryButtonClick={handleReset}
|
|
174
|
+
primaryButtonLabel="Apply"
|
|
175
|
+
onPrimaryButtonClick={handleApply}
|
|
176
|
+
>
|
|
177
|
+
<Typography variant="p">Choose filter criteria.</Typography>
|
|
178
|
+
</Drawer>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Custom class names
|
|
182
|
+
|
|
183
|
+
```jsx
|
|
184
|
+
<Drawer
|
|
185
|
+
isOpen={isOpen}
|
|
186
|
+
onClose={onClose}
|
|
187
|
+
title="Settings"
|
|
188
|
+
className="my-drawer-panel"
|
|
189
|
+
overlayClassName="my-drawer-overlay"
|
|
190
|
+
contentClassName="my-drawer-content"
|
|
191
|
+
headerClassName="my-drawer-header"
|
|
192
|
+
bodyClassName="my-drawer-body"
|
|
193
|
+
footerClassName="my-drawer-footer"
|
|
194
|
+
dataTestId="settings-drawer"
|
|
195
|
+
>
|
|
196
|
+
...
|
|
197
|
+
</Drawer>
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Behavior Notes
|
|
201
|
+
|
|
202
|
+
- **Desktop (≥768px):** Panel slides from the configured `placement` edge with subtle opacity fade. Side drawers use full viewport height; top/bottom drawers use full viewport width.
|
|
203
|
+
- **Mobile (<768px):** Always renders as a bottom sheet regardless of `placement`. Max height is **90dvh** with rounded top corners and safe-area padding at the bottom.
|
|
204
|
+
- **Rendering:** Mounts when `isOpen` is true and stays mounted briefly after close so the exit transition can finish.
|
|
205
|
+
- **Close:** `onClose` is called when the user clicks the X button (if `showCloseButton`), the overlay (if `closeOnOverlayClick`), or Escape (if `closeOnEscape`). Footer buttons do not auto-close; call `onClose` in their handlers if desired.
|
|
206
|
+
- **Footer buttons:** `primaryButtonLabel` (solid), `secondaryButtonLabel` (outline), and `tertiaryButtonLabel` (ghost). Tertiary aligns to the start of the footer row; secondary and primary align to the end.
|
|
207
|
+
- **Body scroll:** Locked while open and restored on close.
|
|
208
|
+
- **Focus:** Trapped while open; returned to the previously focused element on close.
|
|
209
|
+
- **ARIA:** `role="dialog"`, `aria-modal="true"`, `aria-labelledby` when `title` is present, or `aria-label` via `ariaLabel`. Provide **`title` or `ariaLabel`** — a dev warning is logged when the drawer opens without either.
|
|
210
|
+
- **Spacing:** `margin` uses the suffix API (e.g. `"0"`, `"b-2"`); component adds `m-` prefix.
|
|
211
|
+
- **Reduced motion:** Respects `prefers-reduced-motion: reduce` (transitions minimized in CSS).
|
|
212
|
+
|
|
213
|
+
## Related Components / Links
|
|
214
|
+
|
|
215
|
+
- Modal (centered overlay dialog)
|
|
216
|
+
- BottomSheet (drag gestures and snap points from bottom only)
|
|
217
|
+
- ConfirmDialog (simple confirmation overlay)
|
|
218
|
+
- Button (open trigger and footer actions)
|
|
219
|
+
- Typography (title and body content)
|
package/docs/FormControls.md
CHANGED
|
@@ -83,8 +83,10 @@ interface SelectProps {
|
|
|
83
83
|
searchable?: boolean;
|
|
84
84
|
/** Panel search field placeholder. @default "Search" */
|
|
85
85
|
searchPlaceholder?: string;
|
|
86
|
-
/**
|
|
86
|
+
/** Persistent footer “add” action; callback receives trimmed search text or `""`. */
|
|
87
87
|
onAddOption?: (value: string) => void;
|
|
88
|
+
/** Footer button label. @default "Add option" */
|
|
89
|
+
addOptionLabel?: string;
|
|
88
90
|
/** @default true */
|
|
89
91
|
closeOnAddOption?: boolean;
|
|
90
92
|
placeholder?: string;
|
|
@@ -289,6 +291,7 @@ Pass **`dataTestId="fruit-select"`** on the field. The **root** id is on the fie
|
|
|
289
291
|
| `-search-clear` | Clear panel search |
|
|
290
292
|
| `-listbox` | Options list |
|
|
291
293
|
| `-option-{value}` | Option row |
|
|
294
|
+
| `-add-option` | Footer add action (`onAddOption`) |
|
|
292
295
|
| `-input` | Hidden `name` field (form submit) |
|
|
293
296
|
| `-error` | Validation message |
|
|
294
297
|
|
package/llms.txt
CHANGED
|
@@ -151,6 +151,13 @@ All component documentation is located in the `docs/` folder. The following docu
|
|
|
151
151
|
- Types: ModalProps, ModalSize, ModalMargin, SpacingOption
|
|
152
152
|
- Related Components: ConfirmDialog (simpler confirm-only), Button, Typography, Icon (used internally)
|
|
153
153
|
|
|
154
|
+
### Drawer Component
|
|
155
|
+
- File: `docs/Drawer.md`
|
|
156
|
+
- Purpose: Slide-in overlay panel from a configurable edge (left, right, top, bottom) on desktop; below 768px always renders as a bottom sheet (max 90dvh). Optional title, close button, footer primary/secondary/tertiary actions; fade/slide transitions, focus trap, scroll lock.
|
|
157
|
+
- Key Features: placement (left, right, top, bottom), size (small, medium, large, full), showCloseButton, closeOnOverlayClick, closeOnEscape, margin (suffix API), className/overlayClassName/contentClassName/headerClassName/bodyClassName/footerClassName, footer buttons (primary solid, secondary outline, tertiary ghost), dataTestId with suffixed E2E hooks (`-primary`, `-secondary`, `-tertiary`), ariaLabel (dev warning when title and ariaLabel both omitted), mobile safe-area padding
|
|
158
|
+
- Types: DrawerProps, DrawerPlacement, DrawerSize, DrawerMargin, SpacingOption
|
|
159
|
+
- Related Components: Modal (centered dialog), BottomSheet (drag/snap from bottom), Button, Typography, Icon (used internally)
|
|
160
|
+
|
|
154
161
|
### Pagination Component
|
|
155
162
|
- File: `docs/Pagination.md`
|
|
156
163
|
- Purpose: Navigate large content sets by pages. Shows total count, prev/next and page-number buttons with ellipsis, and optional rows-per-page select. Controlled via currentPage and rowsPerPage.
|
|
@@ -189,7 +196,7 @@ All component documentation is located in the `docs/` folder. The following docu
|
|
|
189
196
|
### FormControls
|
|
190
197
|
- File: `docs/FormControls.md`
|
|
191
198
|
- Purpose: Set of form primitives: Input, TextArea, Select, Date, Checkbox, Radio, File, Toggle, **FormControls.Stepper** (numeric +/− only; wizard step UI is the separate **`Stepper`** export — `docs/Stepper.md`). Access via `FormControls.Input`, `FormControls.Select`, etc.
|
|
192
|
-
- Key Features: Input (supports text/search/number + prefix/suffix; number maps to numeric text input, strips non-digits on change, optional `phoneDigits` trims autofill to last N digits for phone fields, clamps via `min`/`max` on blur; search adds icon + clear button), TextArea, **Select** (Floating UI: portalled combobox on desktop with flip/shift positioning; **viewport ≤768px** uses a **bottom sheet** shell with `role="dialog"` / `aria-modal` when a label exists; **sync** `options` with in-panel **search filter**, or **async** via `options={null}` + `onSearch` (debounced); **groups** (`Option.group` sticky headers); **multi** chips with `triggerMaxItems` **+N** overflow, **Select all / Clear all**, **`maxSelect`** cap; optional **`onAddOption
|
|
199
|
+
- Key Features: Input (supports text/search/number + prefix/suffix; number maps to numeric text input, strips non-digits on change, optional `phoneDigits` trims autofill to last N digits for phone fields, clamps via `min`/`max` on blur; search adds icon + clear button), TextArea, **Select** (Floating UI: portalled combobox on desktop with flip/shift positioning; **viewport ≤768px** uses a **bottom sheet** shell with `role="dialog"` / `aria-modal` when a label exists; **sync** `options` with in-panel **search filter**, or **async** via `options={null}` + `onSearch` (debounced); **groups** (`Option.group` sticky headers); **multi** chips with `triggerMaxItems` **+N** overflow, **Select all / Clear all**, **`maxSelect`** cap; optional **`onAddOption`** + **`addOptionLabel`** (persistent footer below scrollable list); combobox + listbox ARIA, **`aria-invalid`** on error, **`aria-controls`** on trigger/search only while open; `name` + hidden input for forms — multi posts comma-joined **`value`s**), **Date** (calendar **`Date | null`** + **Cancel/OK** staging; `date-fns` **Locale** + **`dateFormat`**; **Floating UI** desktop popover **~max 400px** wide (viewport-capped) with **`popoverPlacement`**; **≤768px** **bottom sheet** + backdrop/body lock like Select; **month/year subviews** with back + **“Select a month of {yyyy}”** / **“Select a year for {MMMM}”** titles; trigger **`calendar_month`** icon + optional clear; **`minDate`/`maxDate`/`disabledDates`/`disabledDaysOfWeek`**, **`weekStartsOn`**, **`readOnly`**, **`clearable`**, **`name`** → hidden **`yyyy-MM-dd`**, **`onOpen`/`onClose`**), Checkbox (group-first: options[], CheckboxValue[] for multi-select, onChange(values, e); each option supports `description` and `icon`; `variant="card"` for tile-style options), Radio (group-first: options[], single value, onChange(value, e); each option supports `description` and `icon`; `variant="card"` for tile-style options), File (`variant="button" | "card"`; card variant has dashed drop zone with drag-and-drop; `value: File[]` + `onChange(files, e)`; renders a removable file list with type-aware thumbnail, name, and size), Toggle (switch semantics via checkbox + role="switch"), **FormControls.Stepper** (numeric integer only: inner field is `type="text"` + `inputMode="numeric"` with − / +; `min`, `max`, `step`; **`layout`**: `"default"` | `"split-controls"` | `"trailing-stacked-chevrons"`; no **`type`** prop — use **Input** for other field kinds; − / + clicks do not move focus into the field, avoiding unwanted mobile keyboard); common props label, isRequired, isFluid, error
|
|
193
200
|
- Types: InputProps, **Option** (preferred), **SelectOption** (deprecated alias of Option), **SelectValue**, SelectProps, TextAreaProps, CheckboxProps, CheckboxOption, CheckboxValue, FileProps, FileVariant, RadioProps, RadioOption, RadioValue, ToggleProps, DateProps, FormControlsStepperProps, **FormControlsStepperLayout**
|
|
194
201
|
- Theming: Public CSS custom property `--cp-form-control-radius` (default `var(--radius-large)` = 12px) controls corner radius for Input, TextArea, **FormControls.Stepper** shell, Select trigger + open dropdown corners, Date trigger + calendar panel shell, File (outline trigger, drop zone, in-card CTA span, file list rows), and Radio/Checkbox `variant="card"` tiles. Override on `:root` (or any wrapper / inline `style`) after importing `cleanplate/dist/index.css` to retheme just form fields. Prefer this over overriding the underlying `--radius-large` design token, which affects every "large radius" surface in the framework.
|
|
195
202
|
- Related Components: Pills (Input), Pagination (Select), Container, Button
|
|
@@ -273,6 +280,7 @@ All documentation files follow a consistent format:
|
|
|
273
280
|
| Accordion | `docs/Accordion.md` | Collapsible panels and FAQ sections |
|
|
274
281
|
| ConfirmDialog | `docs/ConfirmDialog.md` | Confirmation modals and destructive actions |
|
|
275
282
|
| Modal | `docs/Modal.md` | Forms, long content, and custom dialogs |
|
|
283
|
+
| Drawer | `docs/Drawer.md` | Edge slide-in panel; bottom sheet on mobile |
|
|
276
284
|
| Pagination | `docs/Pagination.md` | Page navigation for tables and lists |
|
|
277
285
|
| Table | `docs/Table.md` | Structured tabular data with optional pagination and mobile view |
|
|
278
286
|
| Badge | `docs/Badge.md` | Status labels, tags, and counts with colored variants |
|
|
@@ -304,5 +312,5 @@ npm install cleanplate
|
|
|
304
312
|
## Usage
|
|
305
313
|
|
|
306
314
|
```jsx
|
|
307
|
-
import { Button, Typography, Icon, MediaObject, Avatar, Container, Dropdown, Alert, FeedbackState, Spinner, Stepper, BreadCrumb, Accordion, ConfirmDialog, Modal, Pagination, Table, Badge, Pills, Animated, FormControls, Toast, MenuList, Header, PageHeader, BottomSheet, Footer, AppShell } from "cleanplate";
|
|
315
|
+
import { Button, Typography, Icon, MediaObject, Avatar, Container, Dropdown, Alert, FeedbackState, Spinner, Stepper, BreadCrumb, Accordion, ConfirmDialog, Modal, Drawer, Pagination, Table, Badge, Pills, Animated, FormControls, Toast, MenuList, Header, PageHeader, BottomSheet, Footer, AppShell } from "cleanplate";
|
|
308
316
|
```
|