torch-glare 2.4.0 → 2.4.1
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 +8 -0
- package/apps/lib/components/ActionButton.tsx +7 -12
- package/apps/lib/components/ActionsGroup.tsx +4 -15
- package/apps/lib/components/AlertDialog.tsx +173 -191
- package/apps/lib/components/Avatar.tsx +13 -16
- package/apps/lib/components/Badge.tsx +1 -3
- package/apps/lib/components/BadgeField.tsx +76 -71
- package/apps/lib/components/Breadcrumb.tsx +49 -85
- package/apps/lib/components/Button.tsx +20 -19
- package/apps/lib/components/ButtonGroup.tsx +31 -41
- package/apps/lib/components/Calendar.tsx +51 -29
- package/apps/lib/components/Card.tsx +2 -13
- package/apps/lib/components/ChartBlockTool.ts +17 -52
- package/apps/lib/components/Checkbox.tsx +9 -16
- package/apps/lib/components/ContextMenu.tsx +97 -96
- package/apps/lib/components/CountBadge.tsx +4 -6
- package/apps/lib/components/DataTable.tsx +196 -216
- package/apps/lib/components/DataViews/DataViewRadio.tsx +1 -6
- package/apps/lib/components/DataViews/DataViewsConfigPanel.tsx +13 -47
- package/apps/lib/components/DataViews/DataViewsHeader.tsx +1 -3
- package/apps/lib/components/DataViews/DataViewsLayout.tsx +5 -12
- package/apps/lib/components/DataViews/FilterPanel.tsx +155 -149
- package/apps/lib/components/DataViews/HeaderSearch.tsx +1 -5
- package/apps/lib/components/DataViews/InboxView.tsx +22 -68
- package/apps/lib/components/DataViews/InboxViewCard.tsx +68 -77
- package/apps/lib/components/DataViews/KanbanView.tsx +8 -25
- package/apps/lib/components/DataViews/PanelControls.tsx +3 -13
- package/apps/lib/components/DataViews/SettingsPanel.tsx +83 -89
- package/apps/lib/components/DataViews/TableView.tsx +8 -28
- package/apps/lib/components/DataViews/TreeView.tsx +12 -40
- package/apps/lib/components/DataViews/badgeAdapter.ts +32 -28
- package/apps/lib/components/DataViews/fieldRenderers.tsx +106 -141
- package/apps/lib/components/DataViews/filters/DatePickerRangeFilter.tsx +30 -23
- package/apps/lib/components/DataViews/filters/DateRangePopover.tsx +39 -32
- package/apps/lib/components/DataViews/filters/PresetChips.tsx +15 -15
- package/apps/lib/components/DataViews/filters/RangeSliderWithInputs.tsx +69 -58
- package/apps/lib/components/DataViews/index.ts +26 -26
- package/apps/lib/components/DataViews/tree/TreeDrawer.tsx +12 -16
- package/apps/lib/components/DataViews/tree/TreeSidebar.tsx +28 -31
- package/apps/lib/components/DataViews/types.ts +104 -115
- package/apps/lib/components/DatePicker.tsx +198 -196
- package/apps/lib/components/Dialog.tsx +92 -105
- package/apps/lib/components/Divider.tsx +21 -24
- package/apps/lib/components/Drawer.tsx +79 -139
- package/apps/lib/components/DropdownMenu.tsx +131 -171
- package/apps/lib/components/FieldHint.tsx +4 -11
- package/apps/lib/components/Form.tsx +146 -155
- package/apps/lib/components/FormStepper.tsx +9 -39
- package/apps/lib/components/HeaderBar.tsx +1 -9
- package/apps/lib/components/ImageAttachment.tsx +111 -73
- package/apps/lib/components/InnerLabelField.tsx +20 -16
- package/apps/lib/components/Input.tsx +171 -172
- package/apps/lib/components/InputField.tsx +44 -45
- package/apps/lib/components/InputOTP.tsx +68 -69
- package/apps/lib/components/Label.tsx +31 -35
- package/apps/lib/components/LabelField.tsx +4 -5
- package/apps/lib/components/LabeledCheckBox.tsx +8 -12
- package/apps/lib/components/LabeledRadio.tsx +7 -5
- package/apps/lib/components/LinkButton.tsx +2 -9
- package/apps/lib/components/LoginButton.tsx +4 -9
- package/apps/lib/components/PasswordLevel.tsx +5 -5
- package/apps/lib/components/Popover.tsx +15 -33
- package/apps/lib/components/ProfileMenu.tsx +67 -72
- package/apps/lib/components/Radio.tsx +1 -5
- package/apps/lib/components/RadioCard.tsx +9 -28
- package/apps/lib/components/ScrollArea.tsx +45 -43
- package/apps/lib/components/SearchField.tsx +49 -39
- package/apps/lib/components/SearchableSelect.tsx +8 -14
- package/apps/lib/components/SearchableTable.tsx +108 -118
- package/apps/lib/components/SearchableTree.tsx +469 -0
- package/apps/lib/components/SearchableTreeDialog.tsx +493 -0
- package/apps/lib/components/SectionBlock.tsx +4 -16
- package/apps/lib/components/Select.tsx +53 -80
- package/apps/lib/components/SimpleSelect.tsx +196 -187
- package/apps/lib/components/Skeleton.tsx +9 -12
- package/apps/lib/components/SlideDatePicker.tsx +215 -166
- package/apps/lib/components/SpinLoading.tsx +33 -49
- package/apps/lib/components/Stepper.tsx +13 -56
- package/apps/lib/components/Switch.tsx +8 -10
- package/apps/lib/components/TabFormItem.tsx +3 -12
- package/apps/lib/components/TabSwitch.tsx +7 -34
- package/apps/lib/components/Table.tsx +60 -75
- package/apps/lib/components/TableDnDWrapper.ts +15 -48
- package/apps/lib/components/TextEditor.tsx +93 -104
- package/apps/lib/components/Textarea.tsx +8 -12
- package/apps/lib/components/Timeline.tsx +21 -41
- package/apps/lib/components/Toast.tsx +83 -83
- package/apps/lib/components/Toggle.tsx +112 -114
- package/apps/lib/components/ToggleButton.tsx +1 -1
- package/apps/lib/components/Tooltip.tsx +24 -19
- package/apps/lib/components/TransparentLabel.tsx +61 -62
- package/apps/lib/components/TreeDropDown.tsx +86 -52
- package/apps/lib/components/TreeFolder/TreeFolder.tsx +15 -48
- package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +16 -21
- package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +9 -20
- package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +3 -3
- package/apps/lib/components/TreeFolder/icons.tsx +14 -17
- package/apps/lib/components/TreeFolder/index.ts +15 -8
- package/apps/lib/components/TreeFolder/treeFolderUtils.ts +47 -52
- package/apps/lib/components/TreeFolder/types.ts +32 -32
- package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +117 -123
- package/apps/lib/hooks/useActiveTreeItem.ts +52 -55
- package/apps/lib/hooks/useClickOutside.ts +21 -20
- package/apps/lib/hooks/useDataViewsState.ts +86 -80
- package/apps/lib/hooks/useIsMobile.ts +12 -12
- package/apps/lib/hooks/useResize.ts +54 -65
- package/apps/lib/hooks/useTagSelection.ts +201 -201
- package/apps/lib/layouts/CNLayout.tsx +181 -140
- package/apps/lib/layouts/DataViewCard.tsx +4 -18
- package/apps/lib/layouts/FieldSection.tsx +2 -6
- package/apps/lib/layouts/TreeSubLayout.tsx +24 -38
- package/apps/lib/providers/ThemeProvider.tsx +8 -23
- package/apps/lib/registry.json +1004 -0
- package/apps/lib/tsconfig.json +9 -0
- package/apps/lib/utils/cn.ts +1 -1
- package/apps/lib/utils/dataViews/columnUtils.ts +46 -44
- package/apps/lib/utils/dataViews/fieldUtils.ts +70 -71
- package/apps/lib/utils/dataViews/nestedDataUtils.tsx +129 -122
- package/apps/lib/utils/dataViews/pathUtils.ts +74 -67
- package/apps/lib/utils/dataViews/rangeUtils.ts +121 -112
- package/apps/lib/utils/dataViews/treeUtils.ts +204 -211
- package/apps/lib/utils/dateFormat.ts +64 -54
- package/apps/lib/utils/markdownParser.ts +2 -7
- package/apps/lib/utils/resize.ts +21 -25
- package/apps/lib/utils/types.ts +13 -13
- package/dist/bin/index.js +8 -2
- package/dist/bin/index.js.map +1 -1
- package/dist/src/shared/getAvailableFiles.d.ts.map +1 -1
- package/dist/src/shared/getAvailableFiles.js +6 -1
- package/dist/src/shared/getAvailableFiles.js.map +1 -1
- package/dist/src/shared/loadRegistry.d.ts +7 -0
- package/dist/src/shared/loadRegistry.d.ts.map +1 -0
- package/dist/src/shared/loadRegistry.js +31 -0
- package/dist/src/shared/loadRegistry.js.map +1 -0
- package/dist/src/shared/resolveInstallPlan.d.ts +12 -0
- package/dist/src/shared/resolveInstallPlan.d.ts.map +1 -0
- package/dist/src/shared/resolveInstallPlan.js +39 -0
- package/dist/src/shared/resolveInstallPlan.js.map +1 -0
- package/dist/src/types/main.d.ts +24 -0
- package/dist/src/types/main.d.ts.map +1 -1
- package/docs/README.md +10 -2
- package/docs/components/action-button.md +30 -24
- package/docs/components/actions-group.md +26 -20
- package/docs/components/alert-dialog.md +45 -45
- package/docs/components/avatar.md +6 -2
- package/docs/components/badge-field.md +6 -2
- package/docs/components/badge.md +7 -1
- package/docs/components/breadcrumb.md +15 -40
- package/docs/components/button-group.md +13 -10
- package/docs/components/button.md +58 -33
- package/docs/components/calendar.md +26 -19
- package/docs/components/card.md +19 -16
- package/docs/components/chart-block-tool.md +128 -0
- package/docs/components/checkbox.md +16 -8
- package/docs/components/cn-layout.md +7 -1
- package/docs/components/context-menu.md +18 -25
- package/docs/components/count-badge.md +7 -1
- package/docs/components/data-table.md +45 -33
- package/docs/components/data-views-config-panel.md +15 -11
- package/docs/components/data-views-layout.md +13 -16
- package/docs/components/date-picker.md +30 -23
- package/docs/components/dialog.md +43 -42
- package/docs/components/divider.md +10 -4
- package/docs/components/drawer.md +8 -33
- package/docs/components/dropdown-menu.md +25 -34
- package/docs/components/field-hint.md +37 -25
- package/docs/components/field-section.md +9 -3
- package/docs/components/form-stepper.md +6 -0
- package/docs/components/form.md +17 -20
- package/docs/components/header-bar.md +6 -0
- package/docs/components/image-attachment.md +33 -41
- package/docs/components/inbox-view.md +16 -5
- package/docs/components/inner-label-field.md +34 -24
- package/docs/components/input-field.md +18 -10
- package/docs/components/input-otp.md +14 -11
- package/docs/components/input.md +22 -16
- package/docs/components/kanban-view.md +15 -5
- package/docs/components/label-field.md +32 -22
- package/docs/components/label.md +43 -32
- package/docs/components/labeled-check-box.md +16 -8
- package/docs/components/labeled-radio.md +18 -11
- package/docs/components/link-button.md +7 -1
- package/docs/components/login-button.md +8 -2
- package/docs/components/password-level.md +37 -24
- package/docs/components/popover.md +26 -23
- package/docs/components/profile-menu.md +38 -27
- package/docs/components/radio-card.md +16 -9
- package/docs/components/radio.md +16 -8
- package/docs/components/scroll-area.md +6 -2
- package/docs/components/search-field.md +14 -6
- package/docs/components/searchable-select.md +19 -14
- package/docs/components/searchable-table.md +18 -13
- package/docs/components/searchable-tree-dialog.md +190 -0
- package/docs/components/searchable-tree.md +200 -0
- package/docs/components/section-block.md +12 -4
- package/docs/components/select.md +23 -18
- package/docs/components/simple-select.md +14 -10
- package/docs/components/skeleton.md +43 -33
- package/docs/components/slide-date-picker.md +37 -29
- package/docs/components/spin-loading.md +32 -23
- package/docs/components/stepper.md +6 -0
- package/docs/components/switch.md +14 -6
- package/docs/components/tab-form-item.md +7 -1
- package/docs/components/tab-switch.md +13 -6
- package/docs/components/table-dnd-wrapper.md +105 -0
- package/docs/components/table-view.md +15 -5
- package/docs/components/table.md +28 -28
- package/docs/components/text-editor.md +19 -13
- package/docs/components/textarea.md +15 -7
- package/docs/components/timeline.md +6 -0
- package/docs/components/toast.md +35 -26
- package/docs/components/toggle-button.md +24 -21
- package/docs/components/toggle.md +23 -15
- package/docs/components/tooltip.md +42 -30
- package/docs/components/transparent-label.md +29 -20
- package/docs/components/tree-drop-down.md +31 -23
- package/docs/components/tree-sub-layout.md +6 -2
- package/docs/components/tree-view.md +16 -5
- package/docs/explanation/architecture.md +54 -0
- package/docs/explanation/design-system.md +52 -0
- package/docs/how-to/data-views-from-backend-response.md +6 -4
- package/docs/how-to/guides.md +24 -18
- package/docs/migration/changelog.md +38 -0
- package/docs/reference/cli.md +87 -0
- package/docs/reference/components.md +11 -12
- package/docs/reference/hooks.md +8 -8
- package/docs/reference/providers.md +22 -22
- package/docs/reference/tailwind-plugins.md +2 -2
- package/docs/reference/theme.md +85 -0
- package/docs/reference/types.md +4 -4
- package/docs/reference/utilities.md +19 -26
- package/docs/tutorials/building-first-form.md +20 -13
- package/docs/tutorials/component-composition.md +34 -50
- package/docs/tutorials/getting-started.md +2 -2
- package/docs/tutorials/theming-basics.md +13 -10
- package/package.json +31 -3
- package/dist/src/commands/block.d.ts +0 -5
- package/dist/src/commands/block.d.ts.map +0 -1
- package/dist/src/commands/block.js +0 -255
- package/dist/src/commands/block.js.map +0 -1
- package/dist/src/shared/configureFonts.d.ts +0 -6
- package/dist/src/shared/configureFonts.d.ts.map +0 -1
- package/dist/src/shared/configureFonts.js +0 -106
- package/dist/src/shared/configureFonts.js.map +0 -1
- package/dist/src/shared/configureGlobalCss.d.ts +0 -6
- package/dist/src/shared/configureGlobalCss.d.ts.map +0 -1
- package/dist/src/shared/configureGlobalCss.js +0 -154
- package/dist/src/shared/configureGlobalCss.js.map +0 -1
- package/dist/src/shared/configureTailwind.d.ts +0 -7
- package/dist/src/shared/configureTailwind.d.ts.map +0 -1
- package/dist/src/shared/configureTailwind.js +0 -163
- package/dist/src/shared/configureTailwind.js.map +0 -1
- package/dist/src/shared/detectFramework.d.ts +0 -23
- package/dist/src/shared/detectFramework.d.ts.map +0 -1
- package/dist/src/shared/detectFramework.js +0 -119
- package/dist/src/shared/detectFramework.js.map +0 -1
- package/dist/src/shared/installBaseUtils.d.ts +0 -5
- package/dist/src/shared/installBaseUtils.d.ts.map +0 -1
- package/dist/src/shared/installBaseUtils.js +0 -79
- package/dist/src/shared/installBaseUtils.js.map +0 -1
- package/dist/src/shared/resolveAliases.d.ts +0 -24
- package/dist/src/shared/resolveAliases.d.ts.map +0 -1
- package/dist/src/shared/resolveAliases.js +0 -98
- package/dist/src/shared/resolveAliases.js.map +0 -1
|
@@ -11,12 +11,22 @@ keywords: [profile-menu, user-menu, avatar-menu, account-menu, popover]
|
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
15
|
+
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx torch-glare@latest init
|
|
19
|
+
npx torch-glare@latest add ProfileMenu
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`add` also copies any components, hooks, and utilities that `ProfileMenu` depends on.
|
|
15
23
|
|
|
16
24
|
## Import
|
|
17
25
|
|
|
18
|
-
|
|
19
|
-
|
|
26
|
+
Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
20
30
|
```
|
|
21
31
|
|
|
22
32
|
## Quick Examples
|
|
@@ -24,7 +34,7 @@ import { ProfileMenu } from '@torch-ui/components'
|
|
|
24
34
|
### Basic Usage
|
|
25
35
|
|
|
26
36
|
```typescript
|
|
27
|
-
import { ProfileMenu } from
|
|
37
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
28
38
|
|
|
29
39
|
function Example() {
|
|
30
40
|
return (
|
|
@@ -39,8 +49,8 @@ function Example() {
|
|
|
39
49
|
### With Dropdown Content
|
|
40
50
|
|
|
41
51
|
```typescript
|
|
42
|
-
import { ProfileMenu } from
|
|
43
|
-
import { PopoverItem } from
|
|
52
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
53
|
+
import { PopoverItem } from "@/components/Popover";
|
|
44
54
|
|
|
45
55
|
function ProfileDropdown() {
|
|
46
56
|
return (
|
|
@@ -62,7 +72,7 @@ function ProfileDropdown() {
|
|
|
62
72
|
### Selected State
|
|
63
73
|
|
|
64
74
|
```typescript
|
|
65
|
-
import { ProfileMenu } from
|
|
75
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
66
76
|
import { useState } from 'react'
|
|
67
77
|
|
|
68
78
|
function SelectedProfile() {
|
|
@@ -81,8 +91,8 @@ function SelectedProfile() {
|
|
|
81
91
|
### With Overlay Blur
|
|
82
92
|
|
|
83
93
|
```typescript
|
|
84
|
-
import { ProfileMenu } from
|
|
85
|
-
import { PopoverItem } from
|
|
94
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
95
|
+
import { PopoverItem } from "@/components/Popover";
|
|
86
96
|
|
|
87
97
|
function BlurredProfileMenu() {
|
|
88
98
|
return (
|
|
@@ -105,8 +115,8 @@ function BlurredProfileMenu() {
|
|
|
105
115
|
### Complete User Menu
|
|
106
116
|
|
|
107
117
|
```typescript
|
|
108
|
-
import { ProfileMenu } from
|
|
109
|
-
import { PopoverItem } from
|
|
118
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
119
|
+
import { PopoverItem } from "@/components/Popover";
|
|
110
120
|
import { useRouter } from 'next/navigation'
|
|
111
121
|
|
|
112
122
|
function UserMenu({ user }: { user: User }) {
|
|
@@ -162,8 +172,8 @@ function UserMenu({ user }: { user: User }) {
|
|
|
162
172
|
### With Status Indicator
|
|
163
173
|
|
|
164
174
|
```typescript
|
|
165
|
-
import { ProfileMenu } from
|
|
166
|
-
import { PopoverItem } from
|
|
175
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
176
|
+
import { PopoverItem } from "@/components/Popover";
|
|
167
177
|
|
|
168
178
|
function OnlineProfileMenu() {
|
|
169
179
|
return (
|
|
@@ -190,8 +200,9 @@ function OnlineProfileMenu() {
|
|
|
190
200
|
### With Role Badge
|
|
191
201
|
|
|
192
202
|
```typescript
|
|
193
|
-
import { ProfileMenu } from
|
|
194
|
-
import {
|
|
203
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
204
|
+
import { Badge } from "@/components/Badge";
|
|
205
|
+
import { PopoverItem } from "@/components/Popover";
|
|
195
206
|
|
|
196
207
|
function AdminProfileMenu({ user }: { user: User }) {
|
|
197
208
|
return (
|
|
@@ -199,7 +210,7 @@ function AdminProfileMenu({ user }: { user: User }) {
|
|
|
199
210
|
label={
|
|
200
211
|
<div className="flex flex-col items-start">
|
|
201
212
|
<span>{user.name}</span>
|
|
202
|
-
<Badge
|
|
213
|
+
<Badge color="purple" size="XS" label={user.role} />
|
|
203
214
|
</div>
|
|
204
215
|
}
|
|
205
216
|
icon={user.avatar}
|
|
@@ -218,8 +229,8 @@ function AdminProfileMenu({ user }: { user: User }) {
|
|
|
218
229
|
### Dark Theme
|
|
219
230
|
|
|
220
231
|
```typescript
|
|
221
|
-
import { ProfileMenu } from
|
|
222
|
-
import { PopoverItem } from
|
|
232
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
233
|
+
import { PopoverItem } from "@/components/Popover";
|
|
223
234
|
|
|
224
235
|
function DarkProfileMenu() {
|
|
225
236
|
return (
|
|
@@ -241,8 +252,8 @@ function DarkProfileMenu() {
|
|
|
241
252
|
### Multiple Profile Switcher
|
|
242
253
|
|
|
243
254
|
```typescript
|
|
244
|
-
import { ProfileMenu } from
|
|
245
|
-
import { PopoverItem } from
|
|
255
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
256
|
+
import { PopoverItem } from "@/components/Popover";
|
|
246
257
|
import { useState } from 'react'
|
|
247
258
|
|
|
248
259
|
function ProfileSwitcher() {
|
|
@@ -290,8 +301,8 @@ function ProfileSwitcher() {
|
|
|
290
301
|
### With Custom Actions
|
|
291
302
|
|
|
292
303
|
```typescript
|
|
293
|
-
import { ProfileMenu } from
|
|
294
|
-
import { PopoverItem } from
|
|
304
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
305
|
+
import { PopoverItem } from "@/components/Popover";
|
|
295
306
|
|
|
296
307
|
function ActionsProfileMenu() {
|
|
297
308
|
return (
|
|
@@ -322,8 +333,8 @@ function ActionsProfileMenu() {
|
|
|
322
333
|
### With Keyboard Shortcuts
|
|
323
334
|
|
|
324
335
|
```typescript
|
|
325
|
-
import { ProfileMenu } from
|
|
326
|
-
import { PopoverItem } from
|
|
336
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
337
|
+
import { PopoverItem } from "@/components/Popover";
|
|
327
338
|
|
|
328
339
|
function ShortcutProfileMenu() {
|
|
329
340
|
return (
|
|
@@ -390,7 +401,7 @@ export const ProfileMenu: React.FC<ProfileMenuProps>
|
|
|
390
401
|
### Usage with TypeScript
|
|
391
402
|
|
|
392
403
|
```typescript
|
|
393
|
-
import { ProfileMenu } from
|
|
404
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
394
405
|
|
|
395
406
|
interface User {
|
|
396
407
|
name: string
|
|
@@ -514,8 +525,8 @@ function SidebarProfile({ user }: { user: User }) {
|
|
|
514
525
|
|
|
515
526
|
```typescript
|
|
516
527
|
import { render, screen, fireEvent } from '@testing-library/react'
|
|
517
|
-
import { ProfileMenu } from
|
|
518
|
-
import { PopoverItem } from
|
|
528
|
+
import { ProfileMenu } from "@/components/ProfileMenu";
|
|
529
|
+
import { PopoverItem } from "@/components/Popover";
|
|
519
530
|
|
|
520
531
|
describe('ProfileMenu', () => {
|
|
521
532
|
it('renders user name and avatar', () => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: RadioCard
|
|
3
|
-
version:
|
|
3
|
+
version: 2.4.0
|
|
4
4
|
status: stable
|
|
5
5
|
category: components/forms
|
|
6
6
|
tags: [form, radio, card, selection, compound, accessible]
|
|
@@ -17,15 +17,22 @@ dependencies:
|
|
|
17
17
|
|
|
18
18
|
## Installation
|
|
19
19
|
|
|
20
|
+
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
21
|
+
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
22
|
+
|
|
20
23
|
```bash
|
|
21
|
-
|
|
24
|
+
npx torch-glare@latest init
|
|
25
|
+
npx torch-glare@latest add RadioCard
|
|
22
26
|
```
|
|
23
27
|
|
|
28
|
+
`add` also copies any components, hooks, and utilities that `RadioCard` depends on.
|
|
29
|
+
|
|
24
30
|
## Import
|
|
25
31
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
import { RadioCard } from "@/components/RadioCard";
|
|
29
36
|
```
|
|
30
37
|
|
|
31
38
|
## Quick Examples
|
|
@@ -33,8 +40,8 @@ import { RadioGroup } from 'torch-glare/lib/components/Radio'
|
|
|
33
40
|
### Basic Usage
|
|
34
41
|
|
|
35
42
|
```typescript
|
|
36
|
-
import { RadioCard } from '
|
|
37
|
-
import { RadioGroup } from '
|
|
43
|
+
import { RadioCard } from '@/components/RadioCard'
|
|
44
|
+
import { RadioGroup } from '@/components/Radio'
|
|
38
45
|
|
|
39
46
|
function Example() {
|
|
40
47
|
const [selected, setSelected] = useState('option1')
|
|
@@ -534,8 +541,8 @@ function DeploymentOptions() {
|
|
|
534
541
|
|
|
535
542
|
```typescript
|
|
536
543
|
import { render, screen, fireEvent } from '@testing-library/react'
|
|
537
|
-
import { RadioCard } from '
|
|
538
|
-
import { RadioGroup } from '
|
|
544
|
+
import { RadioCard } from '@/components/RadioCard'
|
|
545
|
+
import { RadioGroup } from '@/components/Radio'
|
|
539
546
|
|
|
540
547
|
describe('RadioCard', () => {
|
|
541
548
|
it('renders card with header and description', () => {
|
package/docs/components/radio.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Radio
|
|
3
|
-
version:
|
|
3
|
+
version: 2.4.0
|
|
4
4
|
status: stable
|
|
5
5
|
category: components/forms
|
|
6
6
|
tags: [form, radio, selection, radix-ui, accessible, group, controlled]
|
|
@@ -17,14 +17,22 @@ dependencies:
|
|
|
17
17
|
|
|
18
18
|
## Installation
|
|
19
19
|
|
|
20
|
+
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
21
|
+
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
22
|
+
|
|
20
23
|
```bash
|
|
21
|
-
|
|
24
|
+
npx torch-glare@latest init
|
|
25
|
+
npx torch-glare@latest add Radio
|
|
22
26
|
```
|
|
23
27
|
|
|
28
|
+
`add` also copies any components, hooks, and utilities that `Radio` depends on.
|
|
29
|
+
|
|
24
30
|
## Import
|
|
25
31
|
|
|
26
|
-
|
|
27
|
-
|
|
32
|
+
Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
import { Radio } from "@/components/Radio";
|
|
28
36
|
```
|
|
29
37
|
|
|
30
38
|
## Quick Examples
|
|
@@ -32,7 +40,7 @@ import { Radio, RadioGroup } from 'torch-glare/lib/components/Radio'
|
|
|
32
40
|
### Basic Radio Group
|
|
33
41
|
|
|
34
42
|
```typescript
|
|
35
|
-
import { Radio, RadioGroup } from '
|
|
43
|
+
import { Radio, RadioGroup } from '@/components/Radio'
|
|
36
44
|
|
|
37
45
|
function Example() {
|
|
38
46
|
const [value, setValue] = useState('option1')
|
|
@@ -442,7 +450,7 @@ function ConditionalForm() {
|
|
|
442
450
|
|
|
443
451
|
```typescript
|
|
444
452
|
import { render, screen, fireEvent } from '@testing-library/react'
|
|
445
|
-
import { Radio, RadioGroup } from '
|
|
453
|
+
import { Radio, RadioGroup } from '@/components/Radio'
|
|
446
454
|
|
|
447
455
|
describe('Radio', () => {
|
|
448
456
|
it('handles selection changes', () => {
|
|
@@ -659,10 +667,10 @@ Radix UI automatically handles:
|
|
|
659
667
|
```diff
|
|
660
668
|
// Import path
|
|
661
669
|
- import Radio from 'torch-glare/Radio'
|
|
662
|
-
+ import { Radio, RadioGroup } from '
|
|
670
|
+
+ import { Radio, RadioGroup } from '@/components/Radio'
|
|
663
671
|
|
|
664
672
|
// Size prop values
|
|
665
|
-
- <Radio size="
|
|
673
|
+
- <Radio size="M" />
|
|
666
674
|
+ <Radio size="S" />
|
|
667
675
|
```
|
|
668
676
|
|
|
@@ -12,11 +12,15 @@ A customizable scrollable container component with styled scrollbars. Built on R
|
|
|
12
12
|
|
|
13
13
|
## Installation
|
|
14
14
|
|
|
15
|
+
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
16
|
+
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
17
|
+
|
|
15
18
|
```bash
|
|
16
|
-
npx torch-
|
|
19
|
+
npx torch-glare@latest init
|
|
20
|
+
npx torch-glare@latest add ScrollArea
|
|
17
21
|
```
|
|
18
22
|
|
|
19
|
-
|
|
23
|
+
`add` also copies any components, hooks, and utilities that `ScrollArea` depends on.
|
|
20
24
|
|
|
21
25
|
## Imports
|
|
22
26
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: SearchField
|
|
3
|
-
version:
|
|
3
|
+
version: 2.4.0
|
|
4
4
|
status: stable
|
|
5
5
|
category: components/forms
|
|
6
6
|
tags: [form, search, input, field, system-style, glassmorphism]
|
|
@@ -16,14 +16,22 @@ dependencies:
|
|
|
16
16
|
|
|
17
17
|
## Installation
|
|
18
18
|
|
|
19
|
+
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
20
|
+
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
21
|
+
|
|
19
22
|
```bash
|
|
20
|
-
|
|
23
|
+
npx torch-glare@latest init
|
|
24
|
+
npx torch-glare@latest add SearchField
|
|
21
25
|
```
|
|
22
26
|
|
|
27
|
+
`add` also copies any components, hooks, and utilities that `SearchField` depends on.
|
|
28
|
+
|
|
23
29
|
## Import
|
|
24
30
|
|
|
25
|
-
|
|
26
|
-
|
|
31
|
+
Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
import { SearchField } from "@/components/SearchField";
|
|
27
35
|
```
|
|
28
36
|
|
|
29
37
|
## Quick Examples
|
|
@@ -31,7 +39,7 @@ import { SearchField } from 'torch-glare/lib/components/SearchField'
|
|
|
31
39
|
### Basic Usage
|
|
32
40
|
|
|
33
41
|
```typescript
|
|
34
|
-
import { SearchField } from '
|
|
42
|
+
import { SearchField } from '@/components/SearchField'
|
|
35
43
|
|
|
36
44
|
function Example() {
|
|
37
45
|
const [search, setSearch] = useState('')
|
|
@@ -471,7 +479,7 @@ function NavigationSearch() {
|
|
|
471
479
|
|
|
472
480
|
```typescript
|
|
473
481
|
import { render, screen, fireEvent } from '@testing-library/react'
|
|
474
|
-
import { SearchField } from '
|
|
482
|
+
import { SearchField } from '@/components/SearchField'
|
|
475
483
|
|
|
476
484
|
describe('SearchField', () => {
|
|
477
485
|
it('displays placeholder text when empty', () => {
|
|
@@ -11,17 +11,22 @@ keywords: [searchable-select, combobox, select, search, async, infinite-scroll,
|
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
14
|
+
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
15
|
+
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
16
|
+
|
|
14
17
|
```bash
|
|
15
|
-
|
|
18
|
+
npx torch-glare@latest init
|
|
19
|
+
npx torch-glare@latest add SearchableSelect
|
|
16
20
|
```
|
|
17
21
|
|
|
18
|
-
|
|
22
|
+
`add` also copies any components, hooks, and utilities that `SearchableSelect` depends on.
|
|
19
23
|
|
|
20
24
|
## Import
|
|
21
25
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
import { SearchableSelect } from "@/components/SearchableSelect";
|
|
25
30
|
```
|
|
26
31
|
|
|
27
32
|
## Quick Examples
|
|
@@ -31,8 +36,8 @@ import type { SearchableSelectOption } from '@torch-ui/components'
|
|
|
31
36
|
Pass a static `options` array and control the selection with `value` / `onValueChange`. Options may include an `icon`. Filtering happens locally by default.
|
|
32
37
|
|
|
33
38
|
```typescript
|
|
34
|
-
import { SearchableSelect } from
|
|
35
|
-
import type { SearchableSelectOption } from
|
|
39
|
+
import { SearchableSelect } from "@/components/SearchableSelect";
|
|
40
|
+
import type { SearchableSelectOption } from "@/components/SearchableSelect";
|
|
36
41
|
import { useState } from 'react'
|
|
37
42
|
|
|
38
43
|
const options: SearchableSelectOption[] = [
|
|
@@ -62,8 +67,8 @@ function FrameworkPicker() {
|
|
|
62
67
|
For large or remote datasets, set `filterClientSide={false}` and drive everything from controlled props: refetch in `onSearchChange` (debounced), append pages in `onLoadMore`, and report `hasMore` / `loading`. Options are rendered as-is — the component does not filter them locally in this mode.
|
|
63
68
|
|
|
64
69
|
```typescript
|
|
65
|
-
import { SearchableSelect } from
|
|
66
|
-
import type { SearchableSelectOption } from
|
|
70
|
+
import { SearchableSelect } from "@/components/SearchableSelect";
|
|
71
|
+
import type { SearchableSelectOption } from "@/components/SearchableSelect";
|
|
67
72
|
import { useEffect, useState } from 'react'
|
|
68
73
|
|
|
69
74
|
const PAGE_SIZE = 20
|
|
@@ -125,7 +130,7 @@ function UserPicker() {
|
|
|
125
130
|
The list shows up to `maxVisibleItems` rows (default `5`) before it scrolls internally.
|
|
126
131
|
|
|
127
132
|
```typescript
|
|
128
|
-
import { SearchableSelect } from
|
|
133
|
+
import { SearchableSelect } from "@/components/SearchableSelect";
|
|
129
134
|
|
|
130
135
|
function CompactList({ options, value, onValueChange }) {
|
|
131
136
|
return (
|
|
@@ -144,7 +149,7 @@ function CompactList({ options, value, onValueChange }) {
|
|
|
144
149
|
Pass `dir="rtl"` to lay out the input, chevron, and dropdown right-to-left.
|
|
145
150
|
|
|
146
151
|
```typescript
|
|
147
|
-
import { SearchableSelect } from
|
|
152
|
+
import { SearchableSelect } from "@/components/SearchableSelect";
|
|
148
153
|
|
|
149
154
|
function ArabicPicker({ options, value, onValueChange }) {
|
|
150
155
|
return (
|
|
@@ -236,8 +241,8 @@ export function SearchableSelect(props: SearchableSelectProps): JSX.Element
|
|
|
236
241
|
React Query's `useInfiniteQuery` maps cleanly onto the controlled async props. Track the debounced query in state, flatten pages into `options`, and wire `fetchNextPage`/`hasNextPage`/`isFetching` to `onLoadMore`/`hasMore`/`loading`.
|
|
237
242
|
|
|
238
243
|
```typescript
|
|
239
|
-
import { SearchableSelect } from
|
|
240
|
-
import type { SearchableSelectOption } from
|
|
244
|
+
import { SearchableSelect } from "@/components/SearchableSelect";
|
|
245
|
+
import type { SearchableSelectOption } from "@/components/SearchableSelect";
|
|
241
246
|
import { useInfiniteQuery } from '@tanstack/react-query'
|
|
242
247
|
import { useMemo, useState } from 'react'
|
|
243
248
|
|
|
@@ -283,7 +288,7 @@ function UserPicker() {
|
|
|
283
288
|
The same shape works with SWR's `useSWRInfinite` — increment `size` in `onLoadMore`, flatten the page array into `options`, and derive `hasMore` from the last page length.
|
|
284
289
|
|
|
285
290
|
```typescript
|
|
286
|
-
import { SearchableSelect } from
|
|
291
|
+
import { SearchableSelect } from "@/components/SearchableSelect";
|
|
287
292
|
import useSWRInfinite from 'swr/infinite'
|
|
288
293
|
import { useState } from 'react'
|
|
289
294
|
|
|
@@ -11,17 +11,22 @@ keywords: [searchable-table, dialog, table, search, async, infinite-scroll, pagi
|
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
15
|
+
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
15
16
|
|
|
16
17
|
```bash
|
|
17
|
-
|
|
18
|
+
npx torch-glare@latest init
|
|
19
|
+
npx torch-glare@latest add SearchableTable
|
|
18
20
|
```
|
|
19
21
|
|
|
22
|
+
`add` also copies any components, hooks, and utilities that `SearchableTable` depends on.
|
|
23
|
+
|
|
20
24
|
## Import
|
|
21
25
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
import { SearchableTable } from "@/components/SearchableTable";
|
|
25
30
|
```
|
|
26
31
|
|
|
27
32
|
## Quick Examples
|
|
@@ -31,8 +36,8 @@ import type { SearchableTableColumn } from '@torch-ui/components'
|
|
|
31
36
|
Provide a `columns` config and a `rows` array. Single-select is controlled via `value` / `onSelect`. Use `getLabel` to control the text shown in the input after selection, and `getRowId` to give each row a stable key.
|
|
32
37
|
|
|
33
38
|
```typescript
|
|
34
|
-
import { SearchableTable } from
|
|
35
|
-
import type { SearchableTableColumn } from
|
|
39
|
+
import { SearchableTable } from "@/components/SearchableTable";
|
|
40
|
+
import type { SearchableTableColumn } from "@/components/SearchableTable";
|
|
36
41
|
import { useState } from 'react'
|
|
37
42
|
|
|
38
43
|
type User = { id: string; name: string; role: string; email: string }
|
|
@@ -97,8 +102,8 @@ const columns: SearchableTableColumn<User>[] = [
|
|
|
97
102
|
Set `filterClientSide={false}` and treat `rows` as already-filtered server data. `onSearchChange` fires (debounced by `searchDebounceMs`, default 300ms) whenever the query settles — refetch there. As the list nears the bottom, `onLoadMore` fires while `hasMore && !loading`; a loading row renders whenever `loading` is true.
|
|
98
103
|
|
|
99
104
|
```typescript
|
|
100
|
-
import { SearchableTable } from
|
|
101
|
-
import type { SearchableTableColumn } from
|
|
105
|
+
import { SearchableTable } from "@/components/SearchableTable";
|
|
106
|
+
import type { SearchableTableColumn } from "@/components/SearchableTable";
|
|
102
107
|
import { useEffect, useState } from 'react'
|
|
103
108
|
|
|
104
109
|
type User = { id: string; name: string; role: string; email: string }
|
|
@@ -244,7 +249,7 @@ export interface SearchableTableColumn<T> {
|
|
|
244
249
|
### Component signature
|
|
245
250
|
|
|
246
251
|
```typescript
|
|
247
|
-
import { Themes } from
|
|
252
|
+
import { Themes } from "@/utils/types";
|
|
248
253
|
|
|
249
254
|
interface SearchableTableProps<T> {
|
|
250
255
|
columns: SearchableTableColumn<T>[]
|
|
@@ -287,8 +292,8 @@ Always pass the type argument explicitly (`<SearchableTable<User> … />`) so `c
|
|
|
287
292
|
Wire pagination through `useInfiniteQuery`, flatten the pages into `rows`, and map the query's state onto `hasMore` / `loading` / `onLoadMore`.
|
|
288
293
|
|
|
289
294
|
```typescript
|
|
290
|
-
import { SearchableTable } from
|
|
291
|
-
import type { SearchableTableColumn } from
|
|
295
|
+
import { SearchableTable } from "@/components/SearchableTable";
|
|
296
|
+
import type { SearchableTableColumn } from "@/components/SearchableTable";
|
|
292
297
|
import { useInfiniteQuery } from '@tanstack/react-query'
|
|
293
298
|
import { useState } from 'react'
|
|
294
299
|
|
|
@@ -354,7 +359,7 @@ function UserPicker() {
|
|
|
354
359
|
### SWR — `useSWRInfinite`
|
|
355
360
|
|
|
356
361
|
```typescript
|
|
357
|
-
import { SearchableTable } from
|
|
362
|
+
import { SearchableTable } from "@/components/SearchableTable";
|
|
358
363
|
import useSWRInfinite from 'swr/infinite'
|
|
359
364
|
import { useState } from 'react'
|
|
360
365
|
|