@rfdtech/components 1.7.0 → 1.12.0
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/README.md +454 -17
- package/dist/components/app-header/AppHeader.d.ts +5 -0
- package/dist/components/app-header/AppHeader.d.ts.map +1 -0
- package/dist/components/app-header/AppHeader.test.d.ts +2 -0
- package/dist/components/app-header/AppHeader.test.d.ts.map +1 -0
- package/dist/components/app-header/AppHeaderNotifications.d.ts +3 -0
- package/dist/components/app-header/AppHeaderNotifications.d.ts.map +1 -0
- package/dist/components/app-header/AppHeaderProfile.d.ts +3 -0
- package/dist/components/app-header/AppHeaderProfile.d.ts.map +1 -0
- package/dist/components/app-header/AppHeaderSearch.d.ts +4 -0
- package/dist/components/app-header/AppHeaderSearch.d.ts.map +1 -0
- package/dist/components/app-header/index.d.ts +6 -0
- package/dist/components/app-header/index.d.ts.map +1 -0
- package/dist/components/app-layout/AppBody.d.ts +7 -0
- package/dist/components/app-layout/AppBody.d.ts.map +1 -0
- package/dist/components/app-layout/AppLayout.d.ts +8 -0
- package/dist/components/app-layout/AppLayout.d.ts.map +1 -0
- package/dist/components/app-layout/AppLayout.test.d.ts +2 -0
- package/dist/components/app-layout/AppLayout.test.d.ts.map +1 -0
- package/dist/components/app-layout/AppSidebar.d.ts +8 -0
- package/dist/components/app-layout/AppSidebar.d.ts.map +1 -0
- package/dist/components/app-layout/index.d.ts +7 -0
- package/dist/components/app-layout/index.d.ts.map +1 -0
- package/dist/components/bulk-import-modal/BulkImportModal.d.ts.map +1 -1
- package/dist/components/bulk-import-modal/hooks/useBulkImportFlow.d.ts.map +1 -1
- package/dist/components/bulk-import-modal/steps/MatchColumnsStep.d.ts.map +1 -1
- package/dist/components/bulk-import-modal/steps/ValidateDataStep.d.ts.map +1 -1
- package/dist/components/card/Card.d.ts +4 -0
- package/dist/components/card/Card.d.ts.map +1 -0
- package/dist/components/card/Card.test.d.ts +2 -0
- package/dist/components/card/Card.test.d.ts.map +1 -0
- package/dist/components/card/index.d.ts +3 -0
- package/dist/components/card/index.d.ts.map +1 -0
- package/dist/components/command/Command.d.ts.map +1 -1
- package/dist/components/country-selector/CountrySelector.d.ts +4 -0
- package/dist/components/country-selector/CountrySelector.d.ts.map +1 -0
- package/dist/components/country-selector/CountrySelector.test.d.ts +2 -0
- package/dist/components/country-selector/CountrySelector.test.d.ts.map +1 -0
- package/dist/components/country-selector/index.d.ts +3 -0
- package/dist/components/country-selector/index.d.ts.map +1 -0
- package/dist/components/date-range-selector/DateRangeSelector.d.ts +5 -0
- package/dist/components/date-range-selector/DateRangeSelector.d.ts.map +1 -0
- package/dist/components/date-range-selector/DateRangeSelector.test.d.ts +2 -0
- package/dist/components/date-range-selector/DateRangeSelector.test.d.ts.map +1 -0
- package/dist/components/date-range-selector/index.d.ts +3 -0
- package/dist/components/date-range-selector/index.d.ts.map +1 -0
- package/dist/components/date-selector/DateSelector.d.ts +4 -0
- package/dist/components/date-selector/DateSelector.d.ts.map +1 -0
- package/dist/components/date-selector/DateSelector.test.d.ts +2 -0
- package/dist/components/date-selector/DateSelector.test.d.ts.map +1 -0
- package/dist/components/date-selector/index.d.ts +3 -0
- package/dist/components/date-selector/index.d.ts.map +1 -0
- package/dist/components/dialog/Dialog.d.ts +4 -1
- package/dist/components/dialog/Dialog.d.ts.map +1 -1
- package/dist/components/dialog/index.d.ts +2 -2
- package/dist/components/dialog/index.d.ts.map +1 -1
- package/dist/components/draggable/Draggable.d.ts +5 -0
- package/dist/components/draggable/Draggable.d.ts.map +1 -0
- package/dist/components/draggable/Draggable.test.d.ts +2 -0
- package/dist/components/draggable/Draggable.test.d.ts.map +1 -0
- package/dist/components/draggable/DraggableContext.d.ts +16 -0
- package/dist/components/draggable/DraggableContext.d.ts.map +1 -0
- package/dist/components/draggable/hooks/clampPosition.d.ts +10 -0
- package/dist/components/draggable/hooks/clampPosition.d.ts.map +1 -0
- package/dist/components/draggable/hooks/clampPosition.test.d.ts +2 -0
- package/dist/components/draggable/hooks/clampPosition.test.d.ts.map +1 -0
- package/dist/components/draggable/hooks/useDraggable.d.ts +3 -0
- package/dist/components/draggable/hooks/useDraggable.d.ts.map +1 -0
- package/dist/components/draggable/index.d.ts +6 -0
- package/dist/components/draggable/index.d.ts.map +1 -0
- package/dist/components/dropdown/Dropdown.d.ts +1 -1
- package/dist/components/dropdown/Dropdown.d.ts.map +1 -1
- package/dist/components/field/Field.d.ts +8 -0
- package/dist/components/field/Field.d.ts.map +1 -0
- package/dist/components/field/Field.test.d.ts +2 -0
- package/dist/components/field/Field.test.d.ts.map +1 -0
- package/dist/components/field/FieldContext.d.ts +4 -0
- package/dist/components/field/FieldContext.d.ts.map +1 -0
- package/dist/components/field/index.d.ts +3 -0
- package/dist/components/field/index.d.ts.map +1 -0
- package/dist/components/form/Form.d.ts +6 -0
- package/dist/components/form/Form.d.ts.map +1 -0
- package/dist/components/form/Form.test.d.ts +2 -0
- package/dist/components/form/Form.test.d.ts.map +1 -0
- package/dist/components/form/FormFieldContext.d.ts +5 -0
- package/dist/components/form/FormFieldContext.d.ts.map +1 -0
- package/dist/components/form/index.d.ts +3 -0
- package/dist/components/form/index.d.ts.map +1 -0
- package/dist/components/input/Input.d.ts +4 -0
- package/dist/components/input/Input.d.ts.map +1 -0
- package/dist/components/input/Input.test.d.ts +2 -0
- package/dist/components/input/Input.test.d.ts.map +1 -0
- package/dist/components/input/index.d.ts +3 -0
- package/dist/components/input/index.d.ts.map +1 -0
- package/dist/components/metric-card/MetricCard.d.ts +4 -0
- package/dist/components/metric-card/MetricCard.d.ts.map +1 -0
- package/dist/components/metric-card/MetricCard.test.d.ts +2 -0
- package/dist/components/metric-card/MetricCard.test.d.ts.map +1 -0
- package/dist/components/metric-card/index.d.ts +3 -0
- package/dist/components/metric-card/index.d.ts.map +1 -0
- package/dist/components/network-operator/NetworkOperator.d.ts +4 -0
- package/dist/components/network-operator/NetworkOperator.d.ts.map +1 -0
- package/dist/components/network-operator/NetworkOperator.test.d.ts +2 -0
- package/dist/components/network-operator/NetworkOperator.test.d.ts.map +1 -0
- package/dist/components/network-operator/index.d.ts +3 -0
- package/dist/components/network-operator/index.d.ts.map +1 -0
- package/dist/components/otp-input/OtpInput.d.ts +4 -0
- package/dist/components/otp-input/OtpInput.d.ts.map +1 -0
- package/dist/components/otp-input/OtpInput.test.d.ts +2 -0
- package/dist/components/otp-input/OtpInput.test.d.ts.map +1 -0
- package/dist/components/otp-input/index.d.ts +3 -0
- package/dist/components/otp-input/index.d.ts.map +1 -0
- package/dist/components/phone-number-input/PhoneNumberInput.d.ts +4 -0
- package/dist/components/phone-number-input/PhoneNumberInput.d.ts.map +1 -0
- package/dist/components/phone-number-input/PhoneNumberInput.test.d.ts +2 -0
- package/dist/components/phone-number-input/PhoneNumberInput.test.d.ts.map +1 -0
- package/dist/components/phone-number-input/index.d.ts +3 -0
- package/dist/components/phone-number-input/index.d.ts.map +1 -0
- package/dist/components/sidebar/Sidebar.d.ts +2 -1
- package/dist/components/sidebar/Sidebar.d.ts.map +1 -1
- package/dist/components/sidebar/index.d.ts +2 -2
- package/dist/components/sidebar/index.d.ts.map +1 -1
- package/dist/components/sortable/Sortable.d.ts +7 -0
- package/dist/components/sortable/Sortable.d.ts.map +1 -0
- package/dist/components/sortable/Sortable.test.d.ts +2 -0
- package/dist/components/sortable/Sortable.test.d.ts.map +1 -0
- package/dist/components/sortable/SortableContext.d.ts +32 -0
- package/dist/components/sortable/SortableContext.d.ts.map +1 -0
- package/dist/components/sortable/hooks/useSortableDragEnd.d.ts +3 -0
- package/dist/components/sortable/hooks/useSortableDragEnd.d.ts.map +1 -0
- package/dist/components/sortable/hooks/useSortableDragEnd.test.d.ts +2 -0
- package/dist/components/sortable/hooks/useSortableDragEnd.test.d.ts.map +1 -0
- package/dist/components/sortable/index.d.ts +4 -0
- package/dist/components/sortable/index.d.ts.map +1 -0
- package/dist/components/table/Table.d.ts +26 -0
- package/dist/components/table/Table.d.ts.map +1 -0
- package/dist/components/table/Table.test.d.ts +2 -0
- package/dist/components/table/Table.test.d.ts.map +1 -0
- package/dist/components/table/TableBulkActions.d.ts +3 -0
- package/dist/components/table/TableBulkActions.d.ts.map +1 -0
- package/dist/components/table/TableContext.d.ts +6 -0
- package/dist/components/table/TableContext.d.ts.map +1 -0
- package/dist/components/table/TableHeader.d.ts +10 -0
- package/dist/components/table/TableHeader.d.ts.map +1 -0
- package/dist/components/table/TablePagination.d.ts +4 -0
- package/dist/components/table/TablePagination.d.ts.map +1 -0
- package/dist/components/table/index.d.ts +6 -0
- package/dist/components/table/index.d.ts.map +1 -0
- package/dist/components/textarea/Textarea.d.ts +4 -0
- package/dist/components/textarea/Textarea.d.ts.map +1 -0
- package/dist/components/textarea/Textarea.test.d.ts +2 -0
- package/dist/components/textarea/Textarea.test.d.ts.map +1 -0
- package/dist/components/textarea/index.d.ts +3 -0
- package/dist/components/textarea/index.d.ts.map +1 -0
- package/dist/components/toast/Toast.test.d.ts +2 -0
- package/dist/components/toast/Toast.test.d.ts.map +1 -0
- package/dist/components/toast/ToastProvider.d.ts +4 -0
- package/dist/components/toast/ToastProvider.d.ts.map +1 -0
- package/dist/components/toast/Toaster.d.ts +4 -0
- package/dist/components/toast/Toaster.d.ts.map +1 -0
- package/dist/components/toast/hooks/useToast.d.ts +3 -0
- package/dist/components/toast/hooks/useToast.d.ts.map +1 -0
- package/dist/components/toast/index.d.ts +5 -0
- package/dist/components/toast/index.d.ts.map +1 -0
- package/dist/components/upload-field/UploadField.d.ts +4 -0
- package/dist/components/upload-field/UploadField.d.ts.map +1 -0
- package/dist/components/upload-field/UploadField.test.d.ts +2 -0
- package/dist/components/upload-field/UploadField.test.d.ts.map +1 -0
- package/dist/components/upload-field/index.d.ts +3 -0
- package/dist/components/upload-field/index.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +7 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/useDebounce.d.ts +2 -0
- package/dist/hooks/useDebounce.d.ts.map +1 -0
- package/dist/hooks/useTableFilter.d.ts +19 -0
- package/dist/hooks/useTableFilter.d.ts.map +1 -0
- package/dist/hooks/useTablePagination.d.ts +20 -0
- package/dist/hooks/useTablePagination.d.ts.map +1 -0
- package/dist/hooks/useTablePagination.test.d.ts +2 -0
- package/dist/hooks/useTablePagination.test.d.ts.map +1 -0
- package/dist/hooks/useTableState.d.ts +38 -0
- package/dist/hooks/useTableState.d.ts.map +1 -0
- package/dist/hooks/useTableState.test.d.ts +2 -0
- package/dist/hooks/useTableState.test.d.ts.map +1 -0
- package/dist/index.cjs +138 -48
- package/dist/index.css +1 -1
- package/dist/index.d.ts +20 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20046 -11207
- package/dist/types/app-header.d.ts +58 -0
- package/dist/types/app-header.d.ts.map +1 -0
- package/dist/types/bulk-import-modal.d.ts +1 -0
- package/dist/types/bulk-import-modal.d.ts.map +1 -1
- package/dist/types/card.d.ts +12 -0
- package/dist/types/card.d.ts.map +1 -0
- package/dist/types/country-selector.d.ts +21 -0
- package/dist/types/country-selector.d.ts.map +1 -0
- package/dist/types/date-range-selector.d.ts +31 -0
- package/dist/types/date-range-selector.d.ts.map +1 -0
- package/dist/types/date-selector.d.ts +37 -0
- package/dist/types/date-selector.d.ts.map +1 -0
- package/dist/types/dialog.d.ts +19 -0
- package/dist/types/dialog.d.ts.map +1 -1
- package/dist/types/draggable.d.ts +49 -0
- package/dist/types/draggable.d.ts.map +1 -0
- package/dist/types/dropdown.d.ts +1 -0
- package/dist/types/dropdown.d.ts.map +1 -1
- package/dist/types/field.d.ts +45 -0
- package/dist/types/field.d.ts.map +1 -0
- package/dist/types/form.d.ts +23 -0
- package/dist/types/form.d.ts.map +1 -0
- package/dist/types/input.d.ts +10 -0
- package/dist/types/input.d.ts.map +1 -0
- package/dist/types/metric-card.d.ts +27 -0
- package/dist/types/metric-card.d.ts.map +1 -0
- package/dist/types/network-operator.d.ts +25 -0
- package/dist/types/network-operator.d.ts.map +1 -0
- package/dist/types/otp-input.d.ts +16 -0
- package/dist/types/otp-input.d.ts.map +1 -0
- package/dist/types/phone-number-input.d.ts +17 -0
- package/dist/types/phone-number-input.d.ts.map +1 -0
- package/dist/types/sidebar.d.ts +7 -0
- package/dist/types/sidebar.d.ts.map +1 -1
- package/dist/types/sortable.d.ts +36 -0
- package/dist/types/sortable.d.ts.map +1 -0
- package/dist/types/table.d.ts +109 -0
- package/dist/types/table.d.ts.map +1 -0
- package/dist/types/textarea.d.ts +10 -0
- package/dist/types/textarea.d.ts.map +1 -0
- package/dist/types/toast.d.ts +52 -0
- package/dist/types/toast.d.ts.map +1 -0
- package/dist/types/upload-field.d.ts +25 -0
- package/dist/types/upload-field.d.ts.map +1 -0
- package/dist/utils/countries.d.ts +764 -0
- package/dist/utils/countries.d.ts.map +1 -0
- package/dist/utils/slot.d.ts +7 -0
- package/dist/utils/slot.d.ts.map +1 -0
- package/package.json +24 -3
package/README.md
CHANGED
|
@@ -92,6 +92,65 @@ openWith({ userId: "42" });
|
|
|
92
92
|
Exports: `useSearchParamOverlay`, `useDialogSearchParam`, `useModalSearchParam`, `createSearchParamAdapter`, `createBrowserSearchParamAdapter`, `readOverlayData`, `writeOverlayData`, `clearOverlayData`, `getDataPrefix`. Types: `SearchParamOverlayState`, `SearchParamOverlayData`, `SearchParamAdapter`, `UseSearchParamOverlayOptions`, `UseSearchParamOverlayReturn`.
|
|
93
93
|
|
|
94
94
|
|
|
95
|
+
## AppHeader
|
|
96
|
+
|
|
97
|
+
Compound header bar with `AppHeader`, `AppHeaderSearch`, `AppHeaderActions`, `AppHeaderNotifications`, and `AppHeaderProfile`. Nest search on the left and group switcher, notifications, and profile inside `AppHeaderActions` on the right.
|
|
98
|
+
|
|
99
|
+
See the [AppHeader](/docs/app-header) docs page for props and exported types.
|
|
100
|
+
|
|
101
|
+
```tsx
|
|
102
|
+
import {
|
|
103
|
+
AppHeader,
|
|
104
|
+
AppHeaderActions,
|
|
105
|
+
AppHeaderSearch,
|
|
106
|
+
AppHeaderNotifications,
|
|
107
|
+
AppHeaderProfile,
|
|
108
|
+
AppSwitcher,
|
|
109
|
+
} from "@rfdtech/components";
|
|
110
|
+
|
|
111
|
+
<AppHeader>
|
|
112
|
+
<AppHeaderSearch onSearch={setQuery} data={results} />
|
|
113
|
+
<AppHeaderActions>
|
|
114
|
+
<AppSwitcher apps={apps} />
|
|
115
|
+
<AppHeaderNotifications loading={loading}>
|
|
116
|
+
{notifications.map((n) => (
|
|
117
|
+
<div key={n.id} className="gsl-notif-popover__item">
|
|
118
|
+
<div className="gsl-notif-popover__body-text">{n.text}</div>
|
|
119
|
+
<div className="gsl-notif-popover__body-time">{n.time}</div>
|
|
120
|
+
</div>
|
|
121
|
+
))}
|
|
122
|
+
</AppHeaderNotifications>
|
|
123
|
+
<AppHeaderProfile user={{ name: "Kwame", role: "Admin", initials: "KA" }} variant="basic">
|
|
124
|
+
<button className="gsl-profile-popover__action">Settings</button>
|
|
125
|
+
</AppHeaderProfile>
|
|
126
|
+
</AppHeaderActions>
|
|
127
|
+
</AppHeader>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Props: `AppHeader` — `className`, `children`. `AppHeaderActions` — `className`, `children`. Exported types: `AppHeaderProps`, `AppHeaderActionsProps`, `AppHeaderSearchProps`, `AppHeaderSearchDataGroup`, `AppHeaderSearchItem`, `AppHeaderNotificationsProps`, `AppHeaderProfileProps`, `AppUser`.
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
## AppLayout
|
|
134
|
+
|
|
135
|
+
Application layout container that auto-positions `AppHeader`, `AppSidebar`, and `AppBody` by component type. Sidebar on the left, header sticky at the top, main content filling the rest. See the [AppLayout](/docs/app-layout) docs page for props and exported types.
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
import { AppLayout, AppSidebar, AppBody } from "@rfdtech/components";
|
|
139
|
+
|
|
140
|
+
<AppLayout>
|
|
141
|
+
<AppHeader>
|
|
142
|
+
<AppHeaderActions>
|
|
143
|
+
<AppSwitcher apps={apps} />
|
|
144
|
+
</AppHeaderActions>
|
|
145
|
+
</AppHeader>
|
|
146
|
+
<AppSidebar>{/* sidebar */}</AppSidebar>
|
|
147
|
+
<AppBody>{/* page */}</AppBody>
|
|
148
|
+
</AppLayout>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Props: `AppLayout` — `children`, `className`. `AppSidebar` — `children`, `className`. `AppBody` — `children`, `className`. Exported types: `AppLayoutProps`, `AppSidebarProps`, `AppBodyProps`.
|
|
152
|
+
|
|
153
|
+
|
|
95
154
|
## AppSwitcher
|
|
96
155
|
|
|
97
156
|
Google Apps–style 9-dot launcher for switching between GSL systems. Drop it into your header to let users jump between products. Pass `apps` directly from your own data layer; use `loading` while data is being fetched.
|
|
@@ -173,7 +232,7 @@ Four-step modal wizard for importing spreadsheet data (.xlsx, .xls, .csv). Parsi
|
|
|
173
232
|
### Usage
|
|
174
233
|
|
|
175
234
|
```tsx
|
|
176
|
-
import { BulkImportModal } from "@rfdtech/components";
|
|
235
|
+
import { BulkImportModal, useModalSearchParam } from "@rfdtech/components";
|
|
177
236
|
|
|
178
237
|
const fields = [
|
|
179
238
|
{ key: "email", label: "Email", required: true },
|
|
@@ -181,13 +240,18 @@ const fields = [
|
|
|
181
240
|
{ key: "student_id", label: "Student ID" },
|
|
182
241
|
];
|
|
183
242
|
|
|
243
|
+
const { open, onOpenChange, openWith } = useModalSearchParam("bulk-import");
|
|
244
|
+
|
|
245
|
+
<button type="button" onClick={() => openWith()}>Import students</button>
|
|
246
|
+
|
|
184
247
|
<BulkImportModal
|
|
185
248
|
open={open}
|
|
186
|
-
onOpenChange={
|
|
249
|
+
onOpenChange={onOpenChange}
|
|
187
250
|
title="Import students"
|
|
188
251
|
fields={fields}
|
|
189
252
|
onComplete={(result) => {
|
|
190
253
|
console.log(result.rows, result.errors);
|
|
254
|
+
onOpenChange(false);
|
|
191
255
|
}}
|
|
192
256
|
/>
|
|
193
257
|
```
|
|
@@ -343,6 +407,21 @@ import { Button } from "@rfdtech/components";
|
|
|
343
407
|
Props: `variant`, `size`, `loading`, `loadingLabel`, `classNames`, and standard `button` attributes. Exported types: `ButtonProps`, `ButtonClassNames`, `ButtonVariant`, `ButtonSize`.
|
|
344
408
|
|
|
345
409
|
|
|
410
|
+
## Card
|
|
411
|
+
|
|
412
|
+
Surface card wrapper with optional header and design tokens for padding and background. Uses `--gsl-surface-card` for background and `--gsl-card-padding` for inner spacing. See the [Card](/docs/card) docs page for props and exported types.
|
|
413
|
+
|
|
414
|
+
```tsx
|
|
415
|
+
import { Card } from "@rfdtech/components";
|
|
416
|
+
|
|
417
|
+
<Card header="Profile">
|
|
418
|
+
<p>Content goes here.</p>
|
|
419
|
+
</Card>
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
Props: `header`, `children`, `classNames`, `className`, plus standard `div` attributes. Exported types: `CardProps`, `CardClassNames`.
|
|
423
|
+
|
|
424
|
+
|
|
346
425
|
## Checkbox
|
|
347
426
|
|
|
348
427
|
Accessible checkbox with optional label and part-level `classNames`. See the [Checkbox](/docs/checkbox) docs page for props and exported types.
|
|
@@ -366,6 +445,57 @@ import { Checkbox } from "@rfdtech/components";
|
|
|
366
445
|
Props: `checked`, `defaultChecked`, `onCheckedChange`, `label`, `disabled`, `required`, `name`, `value`, `id`, `aria-label`, `classNames`, `className`. Exported types: `CheckboxProps`, `CheckboxClassNames`.
|
|
367
446
|
|
|
368
447
|
|
|
448
|
+
## CountrySelector
|
|
449
|
+
|
|
450
|
+
Country selector dropdown with flag emoji, country name, search filtering, and keyboard navigation. Built on `@radix-ui/react-popover`. See the [CountrySelector](/docs/country-selector) docs page for props and exported types.
|
|
451
|
+
|
|
452
|
+
```tsx
|
|
453
|
+
import { CountrySelector } from "@rfdtech/components";
|
|
454
|
+
|
|
455
|
+
<CountrySelector onChange={(code) => console.log(code)} />
|
|
456
|
+
|
|
457
|
+
<CountrySelector defaultValue="US" />
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
Props: `value`, `defaultValue`, `onChange`, `placeholder`, `invalid`, `disabled`, `classNames`, `className`. Exported types: `CountrySelectorProps`, `CountrySelectorClassNames`.
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
## DateRangeSelector
|
|
464
|
+
|
|
465
|
+
Date range picker with a single trigger showing the selected range, a calendar popover for two-click range selection, and auto-swap to keep start before end. See the [DateRangeSelector](/docs/date-range-selector) docs page for props and exported types.
|
|
466
|
+
|
|
467
|
+
```tsx
|
|
468
|
+
import { DateRangeSelector } from "@rfdtech/components";
|
|
469
|
+
|
|
470
|
+
<DateRangeSelector onChange={(range) => console.log(range)} />
|
|
471
|
+
|
|
472
|
+
<DateRangeSelector
|
|
473
|
+
defaultValue={{ start: new Date(2026, 5, 1), end: new Date(2026, 5, 18) }}
|
|
474
|
+
/>
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
Props: `value`, `defaultValue`, `onChange`, `placeholder`, `formatOptions`, `invalid`, `disabled`, `min`, `max`, `classNames`, `className`. Exported types: `DateRangeSelectorProps`, `DateRangeSelectorClassNames`, `DateRangeValue`.
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
## DateSelector
|
|
481
|
+
|
|
482
|
+
Date picker for choosing a single date from a calendar grid. Built on `@radix-ui/react-popover`. See the [DateSelector](/docs/date-selector) docs page for props and exported types.
|
|
483
|
+
|
|
484
|
+
```tsx
|
|
485
|
+
import { DateSelector } from "@rfdtech/components";
|
|
486
|
+
|
|
487
|
+
<DateSelector onChange={(date) => console.log(date)} />
|
|
488
|
+
|
|
489
|
+
<DateSelector
|
|
490
|
+
placeholder="Pick a date"
|
|
491
|
+
min={new Date(2025, 0, 1)}
|
|
492
|
+
max={new Date(2026, 11, 31)}
|
|
493
|
+
/>
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
Props: `value`, `defaultValue`, `onChange`, `placeholder`, `formatOptions`, `invalid`, `disabled`, `min`, `max`, `classNames`, `className`. Exported types: `DateSelectorProps`, `DateSelectorClassNames`.
|
|
497
|
+
|
|
498
|
+
|
|
369
499
|
## Command
|
|
370
500
|
|
|
371
501
|
Compound command menu primitives for searchable, keyboard-navigable action lists. Supports inline pickers and modal palettes via `CommandDialog`. See the [Command](/docs/command) docs page for props and exported types.
|
|
@@ -380,7 +510,7 @@ import {
|
|
|
380
510
|
CommandItem,
|
|
381
511
|
CommandList,
|
|
382
512
|
CommandShortcut,
|
|
383
|
-
|
|
513
|
+
useDialogSearchParam,
|
|
384
514
|
} from "@rfdtech/components";
|
|
385
515
|
|
|
386
516
|
<Command label="Field picker">
|
|
@@ -395,7 +525,11 @@ import {
|
|
|
395
525
|
</CommandList>
|
|
396
526
|
</Command>
|
|
397
527
|
|
|
398
|
-
|
|
528
|
+
const { open, onOpenChange, openWith } = useDialogSearchParam("command-menu");
|
|
529
|
+
|
|
530
|
+
<Button onClick={() => openWith()}>Open command menu</Button>
|
|
531
|
+
|
|
532
|
+
<CommandDialog open={open} onOpenChange={onOpenChange} shortcut label="Command menu">
|
|
399
533
|
<CommandInput placeholder="Type a command..." />
|
|
400
534
|
<CommandList>
|
|
401
535
|
<CommandItem onSelect={() => go("/dashboard")}>Dashboard</CommandItem>
|
|
@@ -457,6 +591,89 @@ import { Dropdown } from "@rfdtech/components";
|
|
|
457
591
|
Props: `value`, `onValueChange`, `options`, `placeholder`, `clearable`, `disabled`, `aria-label`, `classNames`, `className`. Exported types: `DropdownProps`, `DropdownOption`, `DropdownClassNames`.
|
|
458
592
|
|
|
459
593
|
|
|
594
|
+
## Form
|
|
595
|
+
|
|
596
|
+
Field, Input, and Textarea primitives for accessible form layouts. See the [Form](/docs/form) docs page for props and exported types.
|
|
597
|
+
|
|
598
|
+
```tsx
|
|
599
|
+
import {
|
|
600
|
+
Field,
|
|
601
|
+
FieldControl,
|
|
602
|
+
FieldDescription,
|
|
603
|
+
FieldLabel,
|
|
604
|
+
Input,
|
|
605
|
+
Textarea,
|
|
606
|
+
} from "@rfdtech/components";
|
|
607
|
+
|
|
608
|
+
<Field>
|
|
609
|
+
<FieldLabel>Email</FieldLabel>
|
|
610
|
+
<FieldControl>
|
|
611
|
+
<Input type="email" placeholder="you@example.com" />
|
|
612
|
+
</FieldControl>
|
|
613
|
+
<FieldDescription>We will never share your email.</FieldDescription>
|
|
614
|
+
</Field>
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
Exports: `Field`, `FieldLabel`, `FieldDescription`, `FieldError`, `FieldControl`, `Input`, `Textarea`. Types: `FieldProps`, `FieldClassNames`, `InputProps`, `TextareaProps`.
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
## FormField
|
|
621
|
+
|
|
622
|
+
react-hook-form adapters with Zod validation support. See the [FormField](/docs/form-field) docs page for props and exported types.
|
|
623
|
+
|
|
624
|
+
```bash
|
|
625
|
+
npm install react-hook-form zod @hookform/resolvers
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
```tsx
|
|
629
|
+
import { zodResolver } from "@hookform/resolvers/zod";
|
|
630
|
+
import { useForm } from "react-hook-form";
|
|
631
|
+
import { z } from "zod";
|
|
632
|
+
import {
|
|
633
|
+
Button,
|
|
634
|
+
Field,
|
|
635
|
+
FieldControl,
|
|
636
|
+
FieldError,
|
|
637
|
+
FieldLabel,
|
|
638
|
+
Form,
|
|
639
|
+
FormField,
|
|
640
|
+
Input,
|
|
641
|
+
} from "@rfdtech/components";
|
|
642
|
+
|
|
643
|
+
const formSchema = z.object({
|
|
644
|
+
email: z.string().min(1, "Email is required").email("Enter a valid email address"),
|
|
645
|
+
});
|
|
646
|
+
|
|
647
|
+
type FormValues = z.infer<typeof formSchema>;
|
|
648
|
+
|
|
649
|
+
const form = useForm<FormValues>({
|
|
650
|
+
resolver: zodResolver(formSchema),
|
|
651
|
+
defaultValues: { email: "" },
|
|
652
|
+
});
|
|
653
|
+
|
|
654
|
+
<Form {...form}>
|
|
655
|
+
<form onSubmit={form.handleSubmit(onSubmit)}>
|
|
656
|
+
<FormField
|
|
657
|
+
control={form.control}
|
|
658
|
+
name="email"
|
|
659
|
+
render={({ field, fieldState }) => (
|
|
660
|
+
<Field invalid={!!fieldState.error}>
|
|
661
|
+
<FieldLabel>Email</FieldLabel>
|
|
662
|
+
<FieldControl>
|
|
663
|
+
<Input type="email" {...field} />
|
|
664
|
+
</FieldControl>
|
|
665
|
+
<FieldError>{fieldState.error?.message}</FieldError>
|
|
666
|
+
</Field>
|
|
667
|
+
)}
|
|
668
|
+
/>
|
|
669
|
+
<Button type="submit">Save</Button>
|
|
670
|
+
</form>
|
|
671
|
+
</Form>
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
Exports: `Form`, `FormField`, `useFormField`. Types: `FormProps`, `FormFieldProps`, `UseFormFieldReturn`.
|
|
675
|
+
|
|
676
|
+
|
|
460
677
|
## Dialog
|
|
461
678
|
|
|
462
679
|
Compound dialog primitives for modal overlays. See the [Dialog](/docs/dialog) docs page for props and exported types.
|
|
@@ -470,18 +687,25 @@ import {
|
|
|
470
687
|
DialogOverlay,
|
|
471
688
|
DialogPortal,
|
|
472
689
|
DialogTitle,
|
|
473
|
-
|
|
690
|
+
useDialogSearchParam,
|
|
474
691
|
} from "@rfdtech/components";
|
|
475
692
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
693
|
+
const { open, data, onOpenChange, openWith } = useDialogSearchParam<{
|
|
694
|
+
userId: string;
|
|
695
|
+
}>("edit-profile");
|
|
696
|
+
|
|
697
|
+
<Button variant="secondary" onClick={() => openWith({ userId: "42" })}>
|
|
698
|
+
Edit profile
|
|
699
|
+
</Button>
|
|
700
|
+
|
|
701
|
+
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
480
702
|
<DialogPortal>
|
|
481
703
|
<DialogOverlay />
|
|
482
704
|
<DialogContent showCloseButton>
|
|
483
705
|
<DialogTitle>Edit profile</DialogTitle>
|
|
484
|
-
<DialogDescription>
|
|
706
|
+
<DialogDescription>
|
|
707
|
+
Make changes here. Editing user {data?.userId}.
|
|
708
|
+
</DialogDescription>
|
|
485
709
|
</DialogContent>
|
|
486
710
|
</DialogPortal>
|
|
487
711
|
</Dialog>
|
|
@@ -490,6 +714,45 @@ import {
|
|
|
490
714
|
Props: `Dialog` — `open`, `defaultOpen`, `onOpenChange`. `DialogContent` — `showCloseButton`, `classNames`, `className`. Styled parts also support part-level `classNames`. Exported types: `DialogOverlayProps`, `DialogContentProps`, `DialogTitleProps`, `DialogDescriptionProps`, and related `*ClassNames` interfaces.
|
|
491
715
|
|
|
492
716
|
|
|
717
|
+
## Draggable
|
|
718
|
+
|
|
719
|
+
Repositionable panel primitive with optional handle and bounded pointer dragging. See the [Draggable](/docs/draggable) docs page for props and exported types.
|
|
720
|
+
|
|
721
|
+
```tsx
|
|
722
|
+
import { Draggable, DraggableHandle } from "@rfdtech/components";
|
|
723
|
+
|
|
724
|
+
<div style={{ position: "relative", height: 240 }}>
|
|
725
|
+
<Draggable defaultPosition={{ x: 24, y: 24 }} bounds="parent">
|
|
726
|
+
<DraggableHandle aria-label="Drag card" />
|
|
727
|
+
<div>Drag me</div>
|
|
728
|
+
</Draggable>
|
|
729
|
+
</div>
|
|
730
|
+
```
|
|
731
|
+
|
|
732
|
+
Exports: `Draggable`, `DraggableHandle`, `useDraggable`, `clampPosition`. Types: `DraggableProps`, `DraggableHandleProps`, `DraggablePosition`, `DraggableBounds`, `DraggableAxis`, `UseDraggableOptions`, `UseDraggableReturn`.
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
## MetricCard
|
|
736
|
+
|
|
737
|
+
Compact dashboard card for displaying a metric value, label, trend indicator, and optional icon or description. Variants (`default`, `primary`, `success`, `warning`, `error`) only affect the trend color — background and text stay neutral. Use the `color` prop for custom accent colors.
|
|
738
|
+
|
|
739
|
+
See the [MetricCard](/docs/metric-card) docs page for props and exported types.
|
|
740
|
+
|
|
741
|
+
```tsx
|
|
742
|
+
import { MetricCard } from "@rfdtech/components";
|
|
743
|
+
|
|
744
|
+
<MetricCard
|
|
745
|
+
label="Revenue"
|
|
746
|
+
value="$128.4k"
|
|
747
|
+
trend="up"
|
|
748
|
+
trendValue="+12.5%"
|
|
749
|
+
description="Total revenue this quarter"
|
|
750
|
+
/>
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
Props: `label`, `value`, `icon`, `description`, `trend`, `trendValue`, `variant`, `color`, `classNames`, `className`, plus standard `div` attributes. Exported types: `MetricCardProps`, `MetricCardClassNames`, `MetricCardVariant`, `MetricTrend`.
|
|
754
|
+
|
|
755
|
+
|
|
493
756
|
## Modal
|
|
494
757
|
|
|
495
758
|
Compound modal primitives for near full-viewport overlays with header, body, and footer slots. See the [Modal](/docs/modal) docs page for props and exported types.
|
|
@@ -506,13 +769,16 @@ import {
|
|
|
506
769
|
ModalOverlay,
|
|
507
770
|
ModalPortal,
|
|
508
771
|
ModalTitle,
|
|
509
|
-
|
|
772
|
+
useModalSearchParam,
|
|
510
773
|
} from "@rfdtech/components";
|
|
511
774
|
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
775
|
+
const { open, onOpenChange, openWith } = useModalSearchParam("review-changes");
|
|
776
|
+
|
|
777
|
+
<Button variant="secondary" onClick={() => openWith()}>
|
|
778
|
+
Review changes
|
|
779
|
+
</Button>
|
|
780
|
+
|
|
781
|
+
<Modal open={open} onOpenChange={onOpenChange}>
|
|
516
782
|
<ModalPortal>
|
|
517
783
|
<ModalOverlay />
|
|
518
784
|
<ModalContent showCloseButton>
|
|
@@ -522,8 +788,8 @@ import {
|
|
|
522
788
|
</ModalHeader>
|
|
523
789
|
<ModalBody>{children}</ModalBody>
|
|
524
790
|
<ModalFooter>
|
|
525
|
-
<Button variant="ghost" onClick={() =>
|
|
526
|
-
<Button onClick={() =>
|
|
791
|
+
<Button variant="ghost" onClick={() => onOpenChange(false)}>Cancel</Button>
|
|
792
|
+
<Button onClick={() => onOpenChange(false)}>Publish</Button>
|
|
527
793
|
</ModalFooter>
|
|
528
794
|
</ModalContent>
|
|
529
795
|
</ModalPortal>
|
|
@@ -533,6 +799,51 @@ import {
|
|
|
533
799
|
Props: `Modal` — `open`, `defaultOpen`, `onOpenChange`. `ModalContent` — `showCloseButton`, `classNames`, `className`. Layout parts (`ModalHeader`, `ModalBody`, `ModalFooter`) support part-level `classNames`. Exported types: `ModalOverlayProps`, `ModalContentProps`, `ModalHeaderProps`, `ModalTitleProps`, `ModalDescriptionProps`, `ModalBodyProps`, `ModalFooterProps`, and related `*ClassNames` interfaces.
|
|
534
800
|
|
|
535
801
|
|
|
802
|
+
## NetworkOperator
|
|
803
|
+
|
|
804
|
+
Network operator selector with operator image thumbnails (MTN, Vodafone, AirtelTigo, Glo), search filtering, and keyboard navigation. Built on `@radix-ui/react-popover`. See the [NetworkOperator](/docs/network-operator) docs page for props and exported types.
|
|
805
|
+
|
|
806
|
+
```tsx
|
|
807
|
+
import { NetworkOperator } from "@rfdtech/components";
|
|
808
|
+
|
|
809
|
+
<NetworkOperator onChange={(value) => console.log(value)} />
|
|
810
|
+
|
|
811
|
+
<NetworkOperator defaultValue="mtn" />
|
|
812
|
+
```
|
|
813
|
+
|
|
814
|
+
Props: `value`, `defaultValue`, `onChange`, `options`, `placeholder`, `invalid`, `disabled`, `classNames`, `className`. Exported types: `NetworkOperatorProps`, `NetworkOperatorOption`, `NetworkOperatorClassNames`.
|
|
815
|
+
|
|
816
|
+
|
|
817
|
+
## OtpInput
|
|
818
|
+
|
|
819
|
+
One-time password input with configurable digit length, paste support, keyboard navigation (arrow keys, backspace), auto-focus advancement, and `onComplete` callback. See the [OtpInput](/docs/otp-input) docs page for props and exported types.
|
|
820
|
+
|
|
821
|
+
```tsx
|
|
822
|
+
import { OtpInput } from "@rfdtech/components";
|
|
823
|
+
|
|
824
|
+
<OtpInput onChange={(val) => console.log(val)} />
|
|
825
|
+
|
|
826
|
+
<OtpInput length={4} onComplete={(val) => console.log("Done:", val)} />
|
|
827
|
+
```
|
|
828
|
+
|
|
829
|
+
Props: `length`, `value`, `onChange`, `onComplete`, `invalid`, `disabled`, `name`, `classNames`, `className`. Exported types: `OtpInputProps`, `OtpInputClassNames`.
|
|
830
|
+
|
|
831
|
+
|
|
832
|
+
## PhoneNumberInput
|
|
833
|
+
|
|
834
|
+
Phone number input with a country code selector (flag + dial code prefix) that auto-detects the country from the number prefix as the user types. Built on `@radix-ui/react-popover`. See the [PhoneNumberInput](/docs/phone-number-input) docs page for props and exported types.
|
|
835
|
+
|
|
836
|
+
```tsx
|
|
837
|
+
import { PhoneNumberInput } from "@rfdtech/components";
|
|
838
|
+
|
|
839
|
+
<PhoneNumberInput defaultCountry="GH" onChange={(val) => console.log(val)} />
|
|
840
|
+
|
|
841
|
+
<PhoneNumberInput value="+2332054321022" />
|
|
842
|
+
```
|
|
843
|
+
|
|
844
|
+
Props: `value`, `defaultValue`, `onChange`, `invalid`, `disabled`, `classNames`, `className`. Exported types: `PhoneNumberInputProps`, `PhoneNumberInputClassNames`.
|
|
845
|
+
|
|
846
|
+
|
|
536
847
|
## Popover
|
|
537
848
|
|
|
538
849
|
Compound popover primitives for floating panels. See the [Popover](/docs/popover) docs page for props and exported types.
|
|
@@ -687,6 +998,84 @@ import {
|
|
|
687
998
|
Props: `Sheet` — `open`, `defaultOpen`, `onOpenChange`. `SheetContent` — `side`, `showCloseButton`, `classNames`, `className`. Layout parts support part-level `classNames`. Exported types: `SheetSide`, `SheetOverlayProps`, `SheetContentProps`, `SheetHeaderProps`, `SheetTitleProps`, `SheetDescriptionProps`, `SheetBodyProps`, `SheetFooterProps`, and related `*ClassNames` interfaces.
|
|
688
999
|
|
|
689
1000
|
|
|
1001
|
+
## Sortable
|
|
1002
|
+
|
|
1003
|
+
Reorderable list primitive with optional drag handles and keyboard support. See the [Sortable](/docs/sortable) docs page for props and exported types.
|
|
1004
|
+
|
|
1005
|
+
```tsx
|
|
1006
|
+
import { useState } from "react";
|
|
1007
|
+
import {
|
|
1008
|
+
Sortable,
|
|
1009
|
+
SortableHandle,
|
|
1010
|
+
SortableItem,
|
|
1011
|
+
SortableList,
|
|
1012
|
+
} from "@rfdtech/components";
|
|
1013
|
+
|
|
1014
|
+
const [items, setItems] = useState(["alpha", "beta", "gamma"]);
|
|
1015
|
+
|
|
1016
|
+
<Sortable items={items} onReorder={setItems}>
|
|
1017
|
+
<SortableList>
|
|
1018
|
+
{items.map((id) => (
|
|
1019
|
+
<SortableItem key={id} id={id}>
|
|
1020
|
+
<SortableHandle aria-label={`Reorder ${id}`} />
|
|
1021
|
+
<span>{id}</span>
|
|
1022
|
+
</SortableItem>
|
|
1023
|
+
))}
|
|
1024
|
+
</SortableList>
|
|
1025
|
+
</Sortable>
|
|
1026
|
+
```
|
|
1027
|
+
|
|
1028
|
+
Exports: `Sortable`, `SortableList`, `SortableItem`, `SortableHandle`, `reorderItems`. Types: `SortableProps`, `SortableListProps`, `SortableItemProps`, `SortableHandleProps`, `SortableId`, `SortableStrategy`, `SortableClassNames`.
|
|
1029
|
+
|
|
1030
|
+
|
|
1031
|
+
## Table
|
|
1032
|
+
|
|
1033
|
+
Compound table with URL-driven search, pagination, filter, sort, row selection, bulk actions, and loading skeletons. See the [Table](/docs/table) docs page for props and exported types.
|
|
1034
|
+
|
|
1035
|
+
```tsx
|
|
1036
|
+
import { useState } from "react";
|
|
1037
|
+
import {
|
|
1038
|
+
Table,
|
|
1039
|
+
TableHeader,
|
|
1040
|
+
TableSearch,
|
|
1041
|
+
TableContent,
|
|
1042
|
+
TableBulkActions,
|
|
1043
|
+
TableFooter,
|
|
1044
|
+
TablePagination,
|
|
1045
|
+
} from "@rfdtech/components";
|
|
1046
|
+
|
|
1047
|
+
const [selected, setSelected] = useState<Set<string | number>>(new Set());
|
|
1048
|
+
|
|
1049
|
+
<Table paramPrefix="users">
|
|
1050
|
+
<TableHeader>
|
|
1051
|
+
<TableSearch placeholder="Search users..." />
|
|
1052
|
+
</TableHeader>
|
|
1053
|
+
<TableContent
|
|
1054
|
+
selectable
|
|
1055
|
+
selectedIds={selected}
|
|
1056
|
+
onSelectionChange={setSelected}
|
|
1057
|
+
columns={[
|
|
1058
|
+
{ id: "name", header: "Name", accessorKey: "name", sortable: true },
|
|
1059
|
+
{ id: "email", header: "Email", accessorKey: "email", sortable: true },
|
|
1060
|
+
]}
|
|
1061
|
+
data={users}
|
|
1062
|
+
rowKey={(u) => u.id}
|
|
1063
|
+
/>
|
|
1064
|
+
<TableBulkActions
|
|
1065
|
+
selectedIds={selected}
|
|
1066
|
+
actions={[
|
|
1067
|
+
{ id: "delete", label: "Delete", icon: <Trash2 size={14} />, onClick: (ids) => handleDelete(ids), destructive: true },
|
|
1068
|
+
]}
|
|
1069
|
+
/>
|
|
1070
|
+
<TableFooter>
|
|
1071
|
+
<TablePagination totalPages={5} totalItems={50} />
|
|
1072
|
+
</TableFooter>
|
|
1073
|
+
</Table>
|
|
1074
|
+
```
|
|
1075
|
+
|
|
1076
|
+
Props: `paramPrefix`, `classNames`, `className`. Exports: `Table`, `TableHeader`, `TableSearch`, `TableFilter`, `TableContent`, `TableBulkActions`, `TableFooter`, `TablePagination`. Types: `TableProps`, `TableHeaderProps`, `TableContentProps`, `TableFooterProps`, `TableSearchProps`, `TableFilterProps`, `TableBulkActionsProps`, `TableBulkAction`, `TableBulkActionsClassNames`, `TableClassNames`, `PaginationControlsProps`, `TableColumn`.
|
|
1077
|
+
|
|
1078
|
+
|
|
690
1079
|
## Tabs
|
|
691
1080
|
|
|
692
1081
|
Compound tabs primitives for switching between related panels. See the [Tabs](/docs/tabs) docs page for props and exported types.
|
|
@@ -706,6 +1095,54 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@rfdtech/components";
|
|
|
706
1095
|
|
|
707
1096
|
Exports: `Tabs`, `TabsList`, `TabsTrigger`, `TabsContent`. Props: `Tabs` — `value`, `defaultValue`, `onValueChange`, `orientation`, `activationMode`, `variant`, `classNames`, `className`, `children`. `TabsTrigger` — `value`, `disabled`, `classNames`, `className`. Exported types: `TabsProps`, `TabsListProps`, `TabsTriggerProps`, `TabsContentProps`, `TabsVariant`, `TabsClassNames`, `TabsListClassNames`, `TabsTriggerClassNames`, `TabsContentClassNames`.
|
|
708
1097
|
|
|
1098
|
+
|
|
1099
|
+
## Toast
|
|
1100
|
+
|
|
1101
|
+
Transient notifications with an imperative `useToast` hook, powered by Sonner. See the [Toast](/docs/toast) docs page for props and exported types.
|
|
1102
|
+
|
|
1103
|
+
```tsx
|
|
1104
|
+
import { CheckCircle2 } from "lucide-react";
|
|
1105
|
+
import { ToastProvider, Toaster, useToast } from "@rfdtech/components";
|
|
1106
|
+
|
|
1107
|
+
<ToastProvider>
|
|
1108
|
+
<App />
|
|
1109
|
+
<Toaster />
|
|
1110
|
+
</ToastProvider>
|
|
1111
|
+
|
|
1112
|
+
const { toast } = useToast();
|
|
1113
|
+
|
|
1114
|
+
toast({
|
|
1115
|
+
title: "Profile saved",
|
|
1116
|
+
description: "Your changes were applied.",
|
|
1117
|
+
variant: "success",
|
|
1118
|
+
icon: <CheckCircle2 size={18} strokeWidth={2} aria-hidden />,
|
|
1119
|
+
});
|
|
1120
|
+
```
|
|
1121
|
+
|
|
1122
|
+
Exports: `ToastProvider`, `Toaster`, `useToast`. Types: `ToastOptions`, `ToastVariant`, `ToastProviderProps`, `ToasterProps`, `UseToastReturn`, `ToastClassNames`, `ToastAction`, `ToastReturn`.
|
|
1123
|
+
|
|
1124
|
+
|
|
1125
|
+
## UploadField
|
|
1126
|
+
|
|
1127
|
+
File upload with dashed-border dropzone, cloud upload icon, auto-generated file type/size support text, file cards with type icons, and a primary action button. See the [UploadField](/docs/upload-field) docs page for props and exported types.
|
|
1128
|
+
|
|
1129
|
+
```tsx
|
|
1130
|
+
import { UploadField } from "@rfdtech/components";
|
|
1131
|
+
|
|
1132
|
+
<UploadField
|
|
1133
|
+
accept=".csv"
|
|
1134
|
+
maxSize={10 * 1024 * 1024}
|
|
1135
|
+
onChange={(file) => console.log(file)}
|
|
1136
|
+
/>
|
|
1137
|
+
|
|
1138
|
+
<UploadField accept="image/*" maxSize={5 * 1024 * 1024} />
|
|
1139
|
+
```
|
|
1140
|
+
|
|
1141
|
+
Props: `accept`, `multiple`, `maxSize`, `value`, `onChange`, `invalid`, `disabled`, `name`, `classNames`, `className`. Exported types: `UploadFieldProps`, `UploadFieldClassNames`.
|
|
1142
|
+
|
|
1143
|
+
Props: `accept`, `multiple`, `maxSize`, `value`, `onChange`, `invalid`, `disabled`, `placeholder`, `classNames`, `className`. Exported types: `UploadFieldProps`, `UploadFieldClassNames`.
|
|
1144
|
+
|
|
1145
|
+
|
|
709
1146
|
## Development
|
|
710
1147
|
|
|
711
1148
|
```bash
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AppHeaderProps, AppHeaderActionsProps } from "../../types/app-header";
|
|
2
|
+
import "./styles/app-header.css";
|
|
3
|
+
export declare const AppHeader: import("react").ForwardRefExoticComponent<AppHeaderProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
4
|
+
export declare const AppHeaderActions: import("react").ForwardRefExoticComponent<AppHeaderActionsProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
5
|
+
//# sourceMappingURL=AppHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppHeader.d.ts","sourceRoot":"","sources":["../../../src/components/app-header/AppHeader.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpF,OAAO,yBAAyB,CAAC;AAEjC,eAAO,MAAM,SAAS,2GAQrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,kHAQ5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppHeader.test.d.ts","sourceRoot":"","sources":["../../../src/components/app-header/AppHeader.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { AppHeaderNotificationsProps } from "../../types/app-header";
|
|
2
|
+
export declare const AppHeaderNotifications: import("react").ForwardRefExoticComponent<AppHeaderNotificationsProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
3
|
+
//# sourceMappingURL=AppHeaderNotifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppHeaderNotifications.d.ts","sourceRoot":"","sources":["../../../src/components/app-header/AppHeaderNotifications.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAK1E,eAAO,MAAM,sBAAsB,2HA8ClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppHeaderProfile.d.ts","sourceRoot":"","sources":["../../../src/components/app-header/AppHeaderProfile.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAW,MAAM,wBAAwB,CAAC;AAK7E,eAAO,MAAM,gBAAgB,kHAmG3B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AppHeaderSearchProps } from "../../types/app-header";
|
|
2
|
+
import "./styles/app-header.css";
|
|
3
|
+
export declare const AppHeaderSearch: import("react").ForwardRefExoticComponent<AppHeaderSearchProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
4
|
+
//# sourceMappingURL=AppHeaderSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppHeaderSearch.d.ts","sourceRoot":"","sources":["../../../src/components/app-header/AppHeaderSearch.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,yBAAyB,CAAC;AAEjC,eAAO,MAAM,eAAe,mHAyE1B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { AppHeader, AppHeaderActions } from "./AppHeader";
|
|
2
|
+
export { AppHeaderSearch } from "./AppHeaderSearch";
|
|
3
|
+
export { AppHeaderNotifications } from "./AppHeaderNotifications";
|
|
4
|
+
export { AppHeaderProfile } from "./AppHeaderProfile";
|
|
5
|
+
export type { AppHeaderProps, AppHeaderActionsProps, AppHeaderSearchProps, AppHeaderSearchDataGroup, AppHeaderSearchItem, AppHeaderNotificationsProps, AppHeaderProfileProps, AppUser, } from "../../types/app-header";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/app-header/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,2BAA2B,EAC3B,qBAAqB,EACrB,OAAO,GACR,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
export interface AppBodyProps {
|
|
3
|
+
children?: ReactNode;
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const AppBody: import("react").ForwardRefExoticComponent<AppBodyProps & import("react").RefAttributes<HTMLElement>>;
|
|
7
|
+
//# sourceMappingURL=AppBody.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppBody.d.ts","sourceRoot":"","sources":["../../../src/components/app-layout/AppBody.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGnD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,OAAO,sGAQnB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import "./styles/app-layout.css";
|
|
3
|
+
export interface AppLayoutProps {
|
|
4
|
+
children?: ReactNode;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const AppLayout: import("react").ForwardRefExoticComponent<AppLayoutProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
8
|
+
//# sourceMappingURL=AppLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppLayout.d.ts","sourceRoot":"","sources":["../../../src/components/app-layout/AppLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,yBAAyB,CAAC;AAEjC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,2GA4BrB,CAAC"}
|