torch-glare 2.5.6 → 2.6.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 +4 -3
- package/dist/bin/index.js +9 -24
- package/dist/bin/index.js.map +1 -1
- package/dist/src/commands/add.d.ts +2 -2
- package/dist/src/commands/add.d.ts.map +1 -1
- package/dist/src/commands/add.js +4 -70
- package/dist/src/commands/add.js.map +1 -1
- package/dist/src/commands/hook.d.ts +5 -4
- package/dist/src/commands/hook.d.ts.map +1 -1
- package/dist/src/commands/hook.js +7 -75
- package/dist/src/commands/hook.js.map +1 -1
- package/dist/src/commands/init.js +1 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/layout.d.ts +5 -4
- package/dist/src/commands/layout.d.ts.map +1 -1
- package/dist/src/commands/layout.js +7 -75
- package/dist/src/commands/layout.js.map +1 -1
- package/dist/src/commands/provider.d.ts +5 -4
- package/dist/src/commands/provider.d.ts.map +1 -1
- package/dist/src/commands/provider.js +7 -75
- package/dist/src/commands/provider.js.map +1 -1
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +78 -43
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/utils.d.ts +5 -4
- package/dist/src/commands/utils.d.ts.map +1 -1
- package/dist/src/commands/utils.js +7 -80
- package/dist/src/commands/utils.js.map +1 -1
- package/dist/src/shared/addFromRegistry.d.ts +16 -0
- package/dist/src/shared/addFromRegistry.d.ts.map +1 -0
- package/dist/src/shared/addFromRegistry.js +88 -0
- package/dist/src/shared/addFromRegistry.js.map +1 -0
- package/dist/src/shared/getInstallCommand.d.ts.map +1 -1
- package/dist/src/shared/getInstallCommand.js +5 -0
- package/dist/src/shared/getInstallCommand.js.map +1 -1
- package/dist/src/shared/installDependencies.d.ts +0 -10
- package/dist/src/shared/installDependencies.d.ts.map +1 -1
- package/dist/src/shared/installDependencies.js +0 -17
- package/dist/src/shared/installDependencies.js.map +1 -1
- package/dist/src/shared/installFromPlan.d.ts +7 -5
- package/dist/src/shared/installFromPlan.d.ts.map +1 -1
- package/dist/src/shared/installFromPlan.js +103 -36
- package/dist/src/shared/installFromPlan.js.map +1 -1
- package/dist/src/shared/loadRegistry.d.ts +12 -3
- package/dist/src/shared/loadRegistry.d.ts.map +1 -1
- package/dist/src/shared/loadRegistry.js +19 -20
- package/dist/src/shared/loadRegistry.js.map +1 -1
- package/dist/src/shared/registryClient.d.ts +19 -0
- package/dist/src/shared/registryClient.d.ts.map +1 -0
- package/dist/src/shared/registryClient.js +128 -0
- package/dist/src/shared/registryClient.js.map +1 -0
- package/dist/src/shared/resolveEntry.d.ts +10 -7
- package/dist/src/shared/resolveEntry.d.ts.map +1 -1
- package/dist/src/shared/resolveEntry.js +18 -13
- package/dist/src/shared/resolveEntry.js.map +1 -1
- package/dist/src/shared/suggestOtherCommand.d.ts +7 -1
- package/dist/src/shared/suggestOtherCommand.d.ts.map +1 -1
- package/dist/src/shared/suggestOtherCommand.js +29 -23
- package/dist/src/shared/suggestOtherCommand.js.map +1 -1
- package/dist/src/types/main.d.ts +31 -2
- package/dist/src/types/main.d.ts.map +1 -1
- package/package.json +6 -11
- package/apps/lib/components/ActionButton.tsx +0 -93
- package/apps/lib/components/ActionsGroup.tsx +0 -27
- package/apps/lib/components/AlertDialog.tsx +0 -204
- package/apps/lib/components/Avatar.tsx +0 -46
- package/apps/lib/components/Badge.tsx +0 -250
- package/apps/lib/components/BadgeField.tsx +0 -403
- package/apps/lib/components/Breadcrumb.tsx +0 -280
- package/apps/lib/components/Button.tsx +0 -325
- package/apps/lib/components/ButtonGroup.tsx +0 -190
- package/apps/lib/components/Calendar.tsx +0 -115
- package/apps/lib/components/Card.tsx +0 -95
- package/apps/lib/components/Checkbox.tsx +0 -42
- package/apps/lib/components/ColorPicker.tsx +0 -441
- package/apps/lib/components/ConclusionHeader.tsx +0 -148
- package/apps/lib/components/ContextMenu.tsx +0 -571
- package/apps/lib/components/CountBadge.tsx +0 -52
- package/apps/lib/components/DataTable.tsx +0 -213
- package/apps/lib/components/DataViews/badge.ts +0 -49
- package/apps/lib/components/DataViews/cell.tsx +0 -324
- package/apps/lib/components/DataViews/context.ts +0 -144
- package/apps/lib/components/DataViews/data-views.tsx +0 -395
- package/apps/lib/components/DataViews/filters/children.tsx +0 -98
- package/apps/lib/components/DataViews/filters/custom.tsx +0 -34
- package/apps/lib/components/DataViews/filters/filters.tsx +0 -157
- package/apps/lib/components/DataViews/filters/index.ts +0 -4
- package/apps/lib/components/DataViews/filters/labelled.tsx +0 -20
- package/apps/lib/components/DataViews/filters/presets.tsx +0 -65
- package/apps/lib/components/DataViews/filters/sync.tsx +0 -35
- package/apps/lib/components/DataViews/filters/values.ts +0 -173
- package/apps/lib/components/DataViews/header.tsx +0 -220
- package/apps/lib/components/DataViews/hooks/index.ts +0 -5
- package/apps/lib/components/DataViews/hooks/useActiveRow.ts +0 -22
- package/apps/lib/components/DataViews/hooks/useControllable.ts +0 -52
- package/apps/lib/components/DataViews/index.ts +0 -88
- package/apps/lib/components/DataViews/panel/columns.tsx +0 -153
- package/apps/lib/components/DataViews/panel/controls.tsx +0 -106
- package/apps/lib/components/DataViews/panel/index.ts +0 -3
- package/apps/lib/components/DataViews/panel/panel.tsx +0 -164
- package/apps/lib/components/DataViews/panel/saved-views.tsx +0 -67
- package/apps/lib/components/DataViews/panel/section.tsx +0 -81
- package/apps/lib/components/DataViews/panel/sort.tsx +0 -42
- package/apps/lib/components/DataViews/panel/tab.tsx +0 -31
- package/apps/lib/components/DataViews/slots.ts +0 -72
- package/apps/lib/components/DataViews/states.tsx +0 -73
- package/apps/lib/components/DataViews/types.ts +0 -510
- package/apps/lib/components/DataViews/views/board-view.tsx +0 -381
- package/apps/lib/components/DataViews/views/card-rows.tsx +0 -36
- package/apps/lib/components/DataViews/views/inbox-view.tsx +0 -260
- package/apps/lib/components/DataViews/views/pane-views.tsx +0 -196
- package/apps/lib/components/DataViews/views/table-view.tsx +0 -493
- package/apps/lib/components/DataViews/views/tree-view.tsx +0 -367
- package/apps/lib/components/DatePicker.tsx +0 -232
- package/apps/lib/components/Dialog.tsx +0 -116
- package/apps/lib/components/Divider.tsx +0 -28
- package/apps/lib/components/Drawer.tsx +0 -451
- package/apps/lib/components/DropdownMenu.tsx +0 -554
- package/apps/lib/components/FieldHint.tsx +0 -69
- package/apps/lib/components/Form.tsx +0 -182
- package/apps/lib/components/FormBuilder/context.ts +0 -85
- package/apps/lib/components/FormBuilder/field-kind.ts +0 -28
- package/apps/lib/components/FormBuilder/fields/ChoiceFields.tsx +0 -60
- package/apps/lib/components/FormBuilder/fields/ColorField.tsx +0 -59
- package/apps/lib/components/FormBuilder/fields/CustomField.tsx +0 -11
- package/apps/lib/components/FormBuilder/fields/DateField.tsx +0 -32
- package/apps/lib/components/FormBuilder/fields/FieldArray.tsx +0 -74
- package/apps/lib/components/FormBuilder/fields/FieldShell.tsx +0 -168
- package/apps/lib/components/FormBuilder/fields/FileField.tsx +0 -39
- package/apps/lib/components/FormBuilder/fields/OptionListFields.tsx +0 -132
- package/apps/lib/components/FormBuilder/fields/OtpField.tsx +0 -31
- package/apps/lib/components/FormBuilder/fields/PhoneField.tsx +0 -109
- package/apps/lib/components/FormBuilder/fields/RichTextEditorField.tsx +0 -31
- package/apps/lib/components/FormBuilder/fields/SelectField.tsx +0 -114
- package/apps/lib/components/FormBuilder/fields/SignatureField.tsx +0 -157
- package/apps/lib/components/FormBuilder/fields/SliderField.tsx +0 -67
- package/apps/lib/components/FormBuilder/fields/SwitchBoxField.tsx +0 -41
- package/apps/lib/components/FormBuilder/fields/TableField.tsx +0 -336
- package/apps/lib/components/FormBuilder/fields/TextField.tsx +0 -213
- package/apps/lib/components/FormBuilder/fields/TreeSelectField.tsx +0 -43
- package/apps/lib/components/FormBuilder/fields/countries.ts +0 -303
- package/apps/lib/components/FormBuilder/fields/index.ts +0 -25
- package/apps/lib/components/FormBuilder/form-builder.tsx +0 -198
- package/apps/lib/components/FormBuilder/index.ts +0 -31
- package/apps/lib/components/FormBuilder/numberFormat.ts +0 -16
- package/apps/lib/components/FormBuilder/submit.tsx +0 -67
- package/apps/lib/components/FormBuilder/types.ts +0 -316
- package/apps/lib/components/FormRenderer/FormDrawer.tsx +0 -250
- package/apps/lib/components/FormRenderer/detail.tsx +0 -256
- package/apps/lib/components/FormRenderer/form-renderer.tsx +0 -358
- package/apps/lib/components/FormRenderer/header.tsx +0 -88
- package/apps/lib/components/FormRenderer/index.ts +0 -17
- package/apps/lib/components/FormRenderer/notch-action.tsx +0 -64
- package/apps/lib/components/FormRenderer/section.tsx +0 -39
- package/apps/lib/components/FormRenderer/stepper.tsx +0 -393
- package/apps/lib/components/FormRenderer/types.ts +0 -115
- package/apps/lib/components/FormSummary.tsx +0 -282
- package/apps/lib/components/HeaderBar.tsx +0 -117
- package/apps/lib/components/ImageAttachment.tsx +0 -209
- package/apps/lib/components/InnerLabelField.tsx +0 -154
- package/apps/lib/components/Input.tsx +0 -224
- package/apps/lib/components/InputField.tsx +0 -147
- package/apps/lib/components/InputOTP.tsx +0 -84
- package/apps/lib/components/Label.tsx +0 -129
- package/apps/lib/components/LabelField.tsx +0 -76
- package/apps/lib/components/LabeledCheckBox.tsx +0 -51
- package/apps/lib/components/LabeledRadio.tsx +0 -51
- package/apps/lib/components/LinkButton.tsx +0 -94
- package/apps/lib/components/LoginButton.tsx +0 -51
- package/apps/lib/components/PasswordLevel.tsx +0 -58
- package/apps/lib/components/Popover.tsx +0 -312
- package/apps/lib/components/ProfileMenu.tsx +0 -85
- package/apps/lib/components/Radio.tsx +0 -59
- package/apps/lib/components/RadioCard.tsx +0 -50
- package/apps/lib/components/ScrollArea.tsx +0 -54
- package/apps/lib/components/SearchField.tsx +0 -62
- package/apps/lib/components/SearchableSelect.tsx +0 -318
- package/apps/lib/components/SearchableTable.tsx +0 -344
- package/apps/lib/components/SearchableTree.tsx +0 -485
- package/apps/lib/components/SearchableTreeDialog.tsx +0 -502
- package/apps/lib/components/SectionBlock.tsx +0 -168
- package/apps/lib/components/Select.tsx +0 -347
- package/apps/lib/components/SimpleSelect.tsx +0 -225
- package/apps/lib/components/Skeleton.tsx +0 -12
- package/apps/lib/components/SlideDatePicker.tsx +0 -255
- package/apps/lib/components/SpinLoading.tsx +0 -174
- package/apps/lib/components/Stepper.tsx +0 -480
- package/apps/lib/components/Switch.tsx +0 -82
- package/apps/lib/components/TabFormItem.tsx +0 -153
- package/apps/lib/components/TabSwitch.tsx +0 -172
- package/apps/lib/components/Table.tsx +0 -597
- package/apps/lib/components/TextEditor/ChartBlockTool.ts +0 -676
- package/apps/lib/components/TextEditor/RichTextField.tsx +0 -46
- package/apps/lib/components/TextEditor/TableDnDWrapper.ts +0 -462
- package/apps/lib/components/TextEditor/TextEditor.tsx +0 -1164
- package/apps/lib/components/TextEditor/TextEditorToolbar.tsx +0 -429
- package/apps/lib/components/TextEditor/editor-tools/AlignmentTune.ts +0 -70
- package/apps/lib/components/TextEditor/editor-tools/ColorInlineTool.ts +0 -50
- package/apps/lib/components/TextEditor/editor-tools/StrikethroughInlineTool.ts +0 -48
- package/apps/lib/components/TextEditor/editor-tools/inlineFormat.ts +0 -98
- package/apps/lib/components/TextEditor/editorjs.d.ts +0 -60
- package/apps/lib/components/TextEditor/index.ts +0 -7
- package/apps/lib/components/TextEditor/markdownParser.ts +0 -346
- package/apps/lib/components/Textarea.tsx +0 -117
- package/apps/lib/components/Timeline.tsx +0 -263
- package/apps/lib/components/Toast.tsx +0 -87
- package/apps/lib/components/Toggle.tsx +0 -125
- package/apps/lib/components/ToggleButton.tsx +0 -140
- package/apps/lib/components/Tooltip.tsx +0 -116
- package/apps/lib/components/TransparentLabel.tsx +0 -71
- package/apps/lib/components/TreeDropDown.tsx +0 -115
- package/apps/lib/components/TreeFolder/TreeFolder.tsx +0 -380
- package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +0 -75
- package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +0 -354
- package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +0 -60
- package/apps/lib/components/TreeFolder/icons.tsx +0 -60
- package/apps/lib/components/TreeFolder/index.ts +0 -24
- package/apps/lib/components/TreeFolder/treeFolderUtils.ts +0 -109
- package/apps/lib/components/TreeFolder/types.ts +0 -77
- package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +0 -118
- package/apps/lib/hooks/useActiveTreeItem.ts +0 -61
- package/apps/lib/hooks/useClickOutside.ts +0 -27
- package/apps/lib/hooks/useDragDrop.tsx +0 -365
- package/apps/lib/hooks/useHtmlDir.ts +0 -31
- package/apps/lib/hooks/useInfiniteScroll.ts +0 -108
- package/apps/lib/hooks/useIsMobile.ts +0 -21
- package/apps/lib/hooks/useResize.ts +0 -67
- package/apps/lib/hooks/useTagSelection.ts +0 -300
- package/apps/lib/layouts/CNLayout.tsx +0 -372
- package/apps/lib/layouts/DataViewCard.tsx +0 -62
- package/apps/lib/layouts/FieldSection.tsx +0 -91
- package/apps/lib/layouts/TreeSubLayout.tsx +0 -173
- package/apps/lib/providers/ThemeProvider.tsx +0 -84
- package/apps/lib/registry.json +0 -1217
- package/apps/lib/tsconfig.json +0 -9
- package/apps/lib/tsconfig.tsbuildinfo +0 -1
- package/apps/lib/utils/cn.ts +0 -6
- package/apps/lib/utils/color.ts +0 -175
- package/apps/lib/utils/dataViews/path.ts +0 -67
- package/apps/lib/utils/dataViews/query.ts +0 -73
- package/apps/lib/utils/dataViews/types.ts +0 -187
- package/apps/lib/utils/dateFormat.ts +0 -108
- package/apps/lib/utils/resize.ts +0 -31
- package/apps/lib/utils/scroller.ts +0 -26
- package/apps/lib/utils/types.ts +0 -16
- package/docs/BLOCKS.md +0 -129
- package/docs/CHANGELOG-1.1.16.md +0 -108
- package/docs/Cover.png +0 -0
- package/docs/README.md +0 -215
- package/docs/components/action-button.md +0 -638
- package/docs/components/actions-group.md +0 -708
- package/docs/components/alert-dialog.md +0 -920
- package/docs/components/avatar.md +0 -709
- package/docs/components/badge-field.md +0 -738
- package/docs/components/badge.md +0 -301
- package/docs/components/breadcrumb.md +0 -930
- package/docs/components/button-group.md +0 -650
- package/docs/components/button.md +0 -639
- package/docs/components/calendar.md +0 -555
- package/docs/components/card.md +0 -622
- package/docs/components/chart-block-tool.md +0 -129
- package/docs/components/checkbox.md +0 -699
- package/docs/components/cn-layout.md +0 -854
- package/docs/components/color-picker.md +0 -101
- package/docs/components/conclusion-header.md +0 -80
- package/docs/components/context-menu.md +0 -483
- package/docs/components/count-badge.md +0 -560
- package/docs/components/data-table.md +0 -854
- package/docs/components/data-views/backend-response.md +0 -324
- package/docs/components/data-views/examples/a11y-rtl.md +0 -250
- package/docs/components/data-views/examples/api-orders-route.md +0 -130
- package/docs/components/data-views/examples/fields.md +0 -362
- package/docs/components/data-views/examples/filters.md +0 -307
- package/docs/components/data-views/examples/inbox-routing.md +0 -218
- package/docs/components/data-views/examples/index.md +0 -29
- package/docs/components/data-views/examples/overview.md +0 -244
- package/docs/components/data-views/examples/panel.md +0 -212
- package/docs/components/data-views/examples/scale.md +0 -231
- package/docs/components/data-views/examples/server-side.md +0 -210
- package/docs/components/data-views/examples/state.md +0 -250
- package/docs/components/data-views/examples/tree-custom.md +0 -388
- package/docs/components/data-views/examples/view-registry.md +0 -313
- package/docs/components/data-views/examples/views.md +0 -534
- package/docs/components/data-views/guide.md +0 -405
- package/docs/components/data-views/index.md +0 -1521
- package/docs/components/data-views/migration.md +0 -81
- package/docs/components/date-picker.md +0 -857
- package/docs/components/dialog.md +0 -929
- package/docs/components/divider.md +0 -766
- package/docs/components/drawer.md +0 -654
- package/docs/components/dropdown-menu.md +0 -668
- package/docs/components/field-hint.md +0 -898
- package/docs/components/field-section.md +0 -781
- package/docs/components/form-builder.md +0 -284
- package/docs/components/form-renderer.md +0 -396
- package/docs/components/form-summary.md +0 -138
- package/docs/components/form.md +0 -785
- package/docs/components/header-bar.md +0 -188
- package/docs/components/image-attachment.md +0 -906
- package/docs/components/inner-label-field.md +0 -819
- package/docs/components/input-field.md +0 -623
- package/docs/components/input-otp.md +0 -756
- package/docs/components/input.md +0 -634
- package/docs/components/label-field.md +0 -770
- package/docs/components/label.md +0 -761
- package/docs/components/labeled-check-box.md +0 -642
- package/docs/components/labeled-radio.md +0 -796
- package/docs/components/link-button.md +0 -685
- package/docs/components/login-button.md +0 -872
- package/docs/components/password-level.md +0 -803
- package/docs/components/popover.md +0 -649
- package/docs/components/profile-menu.md +0 -656
- package/docs/components/radio-card.md +0 -801
- package/docs/components/radio.md +0 -735
- package/docs/components/scroll-area.md +0 -691
- package/docs/components/search-field.md +0 -702
- package/docs/components/searchable-select.md +0 -368
- package/docs/components/searchable-table.md +0 -438
- package/docs/components/searchable-tree-dialog.md +0 -190
- package/docs/components/searchable-tree.md +0 -200
- package/docs/components/section-block.md +0 -483
- package/docs/components/select.md +0 -709
- package/docs/components/simple-select.md +0 -741
- package/docs/components/skeleton.md +0 -706
- package/docs/components/slide-date-picker.md +0 -837
- package/docs/components/spin-loading.md +0 -696
- package/docs/components/stepper.md +0 -316
- package/docs/components/switch.md +0 -770
- package/docs/components/tab-form-item.md +0 -773
- package/docs/components/tab-switch.md +0 -170
- package/docs/components/table-dnd-wrapper.md +0 -107
- package/docs/components/table.md +0 -1088
- package/docs/components/text-editor.md +0 -735
- package/docs/components/textarea.md +0 -681
- package/docs/components/timeline.md +0 -254
- package/docs/components/toast.md +0 -773
- package/docs/components/toggle-button.md +0 -643
- package/docs/components/toggle.md +0 -882
- package/docs/components/tooltip.md +0 -513
- package/docs/components/transparent-label.md +0 -721
- package/docs/components/tree-drop-down.md +0 -740
- package/docs/components/tree-folder.md +0 -110
- package/docs/components/tree-sub-layout.md +0 -707
- package/docs/explanation/architecture.md +0 -54
- package/docs/explanation/design-system.md +0 -52
- package/docs/how-to/form-and-list-recipes.md +0 -386
- package/docs/how-to/forms-with-form-builder.md +0 -472
- package/docs/how-to/guides.md +0 -1027
- package/docs/migration/changelog.md +0 -60
- package/docs/migration/form-builder-2.5.2.md +0 -113
- package/docs/reference/cli.md +0 -112
- package/docs/reference/components.md +0 -572
- package/docs/reference/hooks.md +0 -1523
- package/docs/reference/providers.md +0 -866
- package/docs/reference/tailwind-plugins.md +0 -942
- package/docs/reference/theme.md +0 -85
- package/docs/reference/types.md +0 -1016
- package/docs/reference/utilities.md +0 -726
- package/docs/tutorials/building-first-form.md +0 -846
- package/docs/tutorials/component-composition.md +0 -882
- package/docs/tutorials/getting-started.md +0 -302
- package/docs/tutorials/theming-basics.md +0 -785
package/docs/components/card.md
DELETED
|
@@ -1,622 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Card
|
|
3
|
-
version: 2.4.5
|
|
4
|
-
status: stable
|
|
5
|
-
category: components/layout
|
|
6
|
-
tags: [container, layout, card, content, polymorphic]
|
|
7
|
-
last-reviewed: 2024-11-05
|
|
8
|
-
bundle-size: 1.8kb
|
|
9
|
-
dependencies:
|
|
10
|
-
- "@radix-ui/react-slot": "^1.0.0"
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# Card
|
|
14
|
-
|
|
15
|
-
> A flexible container component for grouping and displaying content. Supports compound architecture with header, description, and content sections, and polymorphic rendering. Static by default — opt into hover states with `variant="clickable"`.
|
|
16
|
-
|
|
17
|
-
## Installation
|
|
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
|
-
|
|
22
|
-
```bash
|
|
23
|
-
npx torch-glare@latest init
|
|
24
|
-
npx torch-glare@latest add Card
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
`add` also copies any components, hooks, and utilities that `Card` depends on.
|
|
28
|
-
|
|
29
|
-
## Import
|
|
30
|
-
|
|
31
|
-
Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
|
|
32
|
-
|
|
33
|
-
```tsx
|
|
34
|
-
import { Card } from "@/components/Card";
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Quick Examples
|
|
38
|
-
|
|
39
|
-
### Basic Usage
|
|
40
|
-
|
|
41
|
-
```typescript
|
|
42
|
-
import { Card, CardHeader, CardContent } from '@/components/Card'
|
|
43
|
-
|
|
44
|
-
function Example() {
|
|
45
|
-
return (
|
|
46
|
-
<Card>
|
|
47
|
-
<CardHeader>Card Title</CardHeader>
|
|
48
|
-
<CardContent>
|
|
49
|
-
<p>This is the card content.</p>
|
|
50
|
-
</CardContent>
|
|
51
|
-
</Card>
|
|
52
|
-
)
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### With Description
|
|
57
|
-
|
|
58
|
-
```typescript
|
|
59
|
-
<Card>
|
|
60
|
-
<CardHeader>Features</CardHeader>
|
|
61
|
-
<CardDescription>
|
|
62
|
-
Explore our latest features and improvements
|
|
63
|
-
</CardDescription>
|
|
64
|
-
<CardContent>
|
|
65
|
-
<ul className="space-y-2">
|
|
66
|
-
<li>✓ Feature one</li>
|
|
67
|
-
<li>✓ Feature two</li>
|
|
68
|
-
<li>✓ Feature three</li>
|
|
69
|
-
</ul>
|
|
70
|
-
</CardContent>
|
|
71
|
-
</Card>
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Clickable Card
|
|
75
|
-
|
|
76
|
-
```typescript
|
|
77
|
-
// `variant="clickable"` gives the hover highlight + pointer cursor.
|
|
78
|
-
<Card
|
|
79
|
-
as="button"
|
|
80
|
-
variant="clickable"
|
|
81
|
-
onClick={() => console.log('Card clicked')}
|
|
82
|
-
>
|
|
83
|
-
<CardHeader>Interactive Card</CardHeader>
|
|
84
|
-
<CardDescription>Click me to perform an action</CardDescription>
|
|
85
|
-
<CardContent>
|
|
86
|
-
<span>This entire card is clickable</span>
|
|
87
|
-
</CardContent>
|
|
88
|
-
</Card>
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### Card as Link
|
|
92
|
-
|
|
93
|
-
```typescript
|
|
94
|
-
import Link from 'next/link'
|
|
95
|
-
|
|
96
|
-
// Using asChild pattern
|
|
97
|
-
<Card asChild>
|
|
98
|
-
<Link href="/details">
|
|
99
|
-
<CardHeader>Product Name</CardHeader>
|
|
100
|
-
<CardDescription>$99.99</CardDescription>
|
|
101
|
-
<CardContent>
|
|
102
|
-
<p>Product description goes here...</p>
|
|
103
|
-
</CardContent>
|
|
104
|
-
</Link>
|
|
105
|
-
</Card>
|
|
106
|
-
|
|
107
|
-
// Using as prop
|
|
108
|
-
<Card as="a" href="/details">
|
|
109
|
-
<CardHeader>Article Title</CardHeader>
|
|
110
|
-
<CardDescription>5 min read</CardDescription>
|
|
111
|
-
<CardContent>
|
|
112
|
-
<p>Article preview text...</p>
|
|
113
|
-
</CardContent>
|
|
114
|
-
</Card>
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
### Card Grid Layout
|
|
118
|
-
|
|
119
|
-
```typescript
|
|
120
|
-
function CardGrid() {
|
|
121
|
-
const items = [
|
|
122
|
-
{ title: 'Card 1', description: 'Description 1' },
|
|
123
|
-
{ title: 'Card 2', description: 'Description 2' },
|
|
124
|
-
{ title: 'Card 3', description: 'Description 3' },
|
|
125
|
-
]
|
|
126
|
-
|
|
127
|
-
return (
|
|
128
|
-
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
129
|
-
{items.map((item, index) => (
|
|
130
|
-
<Card key={index}>
|
|
131
|
-
<CardHeader>{item.title}</CardHeader>
|
|
132
|
-
<CardDescription>{item.description}</CardDescription>
|
|
133
|
-
<CardContent>
|
|
134
|
-
<p>Content for {item.title}</p>
|
|
135
|
-
</CardContent>
|
|
136
|
-
</Card>
|
|
137
|
-
))}
|
|
138
|
-
</div>
|
|
139
|
-
)
|
|
140
|
-
}
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
### Card with Form
|
|
144
|
-
|
|
145
|
-
```typescript
|
|
146
|
-
import { Input } from '@/components/Input'
|
|
147
|
-
import { Button } from '@/components/Button'
|
|
148
|
-
|
|
149
|
-
function LoginCard() {
|
|
150
|
-
return (
|
|
151
|
-
<Card className="max-w-md mx-auto">
|
|
152
|
-
<CardHeader>Sign In</CardHeader>
|
|
153
|
-
<CardDescription>
|
|
154
|
-
Enter your credentials to access your account
|
|
155
|
-
</CardDescription>
|
|
156
|
-
<CardContent>
|
|
157
|
-
<form className="space-y-4">
|
|
158
|
-
<Input.Group>
|
|
159
|
-
<Input
|
|
160
|
-
type="email"
|
|
161
|
-
placeholder="Email address"
|
|
162
|
-
required
|
|
163
|
-
/>
|
|
164
|
-
</Input.Group>
|
|
165
|
-
<Input.Group>
|
|
166
|
-
<Input
|
|
167
|
-
type="password"
|
|
168
|
-
placeholder="Password"
|
|
169
|
-
required
|
|
170
|
-
/>
|
|
171
|
-
</Input.Group>
|
|
172
|
-
<Button variant="PrimeStyle" className="w-full">
|
|
173
|
-
Sign In
|
|
174
|
-
</Button>
|
|
175
|
-
</form>
|
|
176
|
-
</CardContent>
|
|
177
|
-
</Card>
|
|
178
|
-
)
|
|
179
|
-
}
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
### Card with Image
|
|
183
|
-
|
|
184
|
-
```typescript
|
|
185
|
-
function ImageCard() {
|
|
186
|
-
return (
|
|
187
|
-
<Card className="overflow-hidden">
|
|
188
|
-
<img
|
|
189
|
-
src="/image.jpg"
|
|
190
|
-
alt="Card image"
|
|
191
|
-
className="w-full h-48 object-cover -m-4 mb-0"
|
|
192
|
-
/>
|
|
193
|
-
<CardHeader>Beautiful Landscape</CardHeader>
|
|
194
|
-
<CardDescription>Photography by John Doe</CardDescription>
|
|
195
|
-
<CardContent>
|
|
196
|
-
<p>Captured in the mountains during sunset...</p>
|
|
197
|
-
</CardContent>
|
|
198
|
-
</Card>
|
|
199
|
-
)
|
|
200
|
-
}
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
## API Reference
|
|
204
|
-
|
|
205
|
-
### Card Props
|
|
206
|
-
|
|
207
|
-
| Prop | Type | Default | Description |
|
|
208
|
-
|------|------|---------|-------------|
|
|
209
|
-
| `variant` | `'default' \| 'clickable'` | `'default'` | `'default'` is a static container with **no hover effect**. `'clickable'` adds the hover border highlight + pointer cursor — use it when the whole card is an interactive target. |
|
|
210
|
-
| `as` | `React.ElementType` | `'section'` | Element type to render as |
|
|
211
|
-
| `asChild` | `boolean` | `false` | Merge props onto child element |
|
|
212
|
-
| `htmlFor` | `string` | - | For label association when as="label" |
|
|
213
|
-
| `className` | `string` | - | Additional CSS classes |
|
|
214
|
-
| `onClick` | `(e: MouseEvent) => void` | - | Click handler |
|
|
215
|
-
| `children` | `React.ReactNode` | - | Card content |
|
|
216
|
-
|
|
217
|
-
### CardHeader Props
|
|
218
|
-
|
|
219
|
-
| Prop | Type | Default | Description |
|
|
220
|
-
|------|------|---------|-------------|
|
|
221
|
-
| `className` | `string` | - | Additional CSS classes |
|
|
222
|
-
| `children` | `React.ReactNode` | - | Header content |
|
|
223
|
-
|
|
224
|
-
### CardDescription Props
|
|
225
|
-
|
|
226
|
-
| Prop | Type | Default | Description |
|
|
227
|
-
|------|------|---------|-------------|
|
|
228
|
-
| `className` | `string` | - | Additional CSS classes |
|
|
229
|
-
| `children` | `React.ReactNode` | - | Description content |
|
|
230
|
-
|
|
231
|
-
### CardContent Props
|
|
232
|
-
|
|
233
|
-
| Prop | Type | Default | Description |
|
|
234
|
-
|------|------|---------|-------------|
|
|
235
|
-
| `className` | `string` | - | Additional CSS classes |
|
|
236
|
-
| `children` | `React.ReactNode` | - | Main content |
|
|
237
|
-
|
|
238
|
-
### TypeScript
|
|
239
|
-
|
|
240
|
-
```typescript
|
|
241
|
-
// Card component types
|
|
242
|
-
interface CardProps extends Omit<
|
|
243
|
-
HTMLAttributes<HTMLDivElement | HTMLHeadingElement | HTMLParagraphElement | HTMLLabelElement>,
|
|
244
|
-
'htmlFor'
|
|
245
|
-
> {
|
|
246
|
-
as?: React.ElementType
|
|
247
|
-
asChild?: boolean
|
|
248
|
-
htmlFor?: string
|
|
249
|
-
className?: string
|
|
250
|
-
children?: React.ReactNode
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
// Sub-component types
|
|
254
|
-
interface CardHeaderProps extends HTMLAttributes<HTMLHeadingElement> {
|
|
255
|
-
className?: string
|
|
256
|
-
children?: React.ReactNode
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
interface CardDescriptionProps extends HTMLAttributes<HTMLHeadingElement> {
|
|
260
|
-
className?: string
|
|
261
|
-
children?: React.ReactNode
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
interface CardContentProps extends HTMLAttributes<HTMLHeadingElement> {
|
|
265
|
-
className?: string
|
|
266
|
-
children?: React.ReactNode
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// Compound component export
|
|
270
|
-
export const Card: React.FC<CardProps> & {
|
|
271
|
-
Header: React.FC<CardHeaderProps>
|
|
272
|
-
Description: React.FC<CardDescriptionProps>
|
|
273
|
-
Content: React.FC<CardContentProps>
|
|
274
|
-
}
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
## Common Patterns
|
|
278
|
-
|
|
279
|
-
### Stats Card
|
|
280
|
-
|
|
281
|
-
```typescript
|
|
282
|
-
function StatsCard({ title, value, change, icon }) {
|
|
283
|
-
return (
|
|
284
|
-
<Card>
|
|
285
|
-
<CardContent className="flex items-center justify-between">
|
|
286
|
-
<div>
|
|
287
|
-
<CardDescription>{title}</CardDescription>
|
|
288
|
-
<CardHeader className="text-2xl">{value}</CardHeader>
|
|
289
|
-
<span className={`text-sm ${change >= 0 ? 'text-green-500' : 'text-red-500'}`}>
|
|
290
|
-
{change >= 0 ? '↑' : '↓'} {Math.abs(change)}%
|
|
291
|
-
</span>
|
|
292
|
-
</div>
|
|
293
|
-
<div className="text-3xl text-gray-400">
|
|
294
|
-
{icon}
|
|
295
|
-
</div>
|
|
296
|
-
</CardContent>
|
|
297
|
-
</Card>
|
|
298
|
-
)
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// Usage
|
|
302
|
-
<StatsCard
|
|
303
|
-
title="Total Users"
|
|
304
|
-
value="1,234"
|
|
305
|
-
change={12.5}
|
|
306
|
-
icon="👥"
|
|
307
|
-
/>
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
### Profile Card
|
|
311
|
-
|
|
312
|
-
```typescript
|
|
313
|
-
import { Avatar } from '@/components/Avatar'
|
|
314
|
-
import { Badge } from '@/components/Badge'
|
|
315
|
-
|
|
316
|
-
function ProfileCard({ user }) {
|
|
317
|
-
return (
|
|
318
|
-
<Card>
|
|
319
|
-
<CardContent className="flex items-center space-x-4">
|
|
320
|
-
<Avatar src={user.avatar} alt={user.name} />
|
|
321
|
-
<div className="flex-1">
|
|
322
|
-
<CardHeader>{user.name}</CardHeader>
|
|
323
|
-
<CardDescription>{user.role}</CardDescription>
|
|
324
|
-
<div className="flex gap-2 mt-2">
|
|
325
|
-
{user.skills.map(skill => (
|
|
326
|
-
<Badge key={skill} variant="secondary">
|
|
327
|
-
{skill}
|
|
328
|
-
</Badge>
|
|
329
|
-
))}
|
|
330
|
-
</div>
|
|
331
|
-
</div>
|
|
332
|
-
</CardContent>
|
|
333
|
-
</Card>
|
|
334
|
-
)
|
|
335
|
-
}
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
### Notification Card
|
|
339
|
-
|
|
340
|
-
```typescript
|
|
341
|
-
function NotificationCard({ notification, onDismiss }) {
|
|
342
|
-
return (
|
|
343
|
-
<Card className="relative">
|
|
344
|
-
<button
|
|
345
|
-
onClick={onDismiss}
|
|
346
|
-
className="absolute top-2 right-2 p-1"
|
|
347
|
-
>
|
|
348
|
-
✕
|
|
349
|
-
</button>
|
|
350
|
-
<CardHeader>{notification.title}</CardHeader>
|
|
351
|
-
<CardDescription>
|
|
352
|
-
{notification.timestamp}
|
|
353
|
-
</CardDescription>
|
|
354
|
-
<CardContent>
|
|
355
|
-
<p>{notification.message}</p>
|
|
356
|
-
</CardContent>
|
|
357
|
-
</Card>
|
|
358
|
-
)
|
|
359
|
-
}
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
### Product Card
|
|
363
|
-
|
|
364
|
-
```typescript
|
|
365
|
-
function ProductCard({ product }) {
|
|
366
|
-
return (
|
|
367
|
-
<Card className="group">
|
|
368
|
-
<div className="aspect-square bg-gray-100 rounded-lg mb-4 overflow-hidden">
|
|
369
|
-
<img
|
|
370
|
-
src={product.image}
|
|
371
|
-
alt={product.name}
|
|
372
|
-
className="w-full h-full object-cover group-hover:scale-105 transition-transform"
|
|
373
|
-
/>
|
|
374
|
-
</div>
|
|
375
|
-
<CardHeader>{product.name}</CardHeader>
|
|
376
|
-
<CardDescription>${product.price}</CardDescription>
|
|
377
|
-
<CardContent>
|
|
378
|
-
<p className="text-sm text-gray-600 line-clamp-2">
|
|
379
|
-
{product.description}
|
|
380
|
-
</p>
|
|
381
|
-
<Button variant="PrimeStyle" className="w-full mt-4">
|
|
382
|
-
Add to Cart
|
|
383
|
-
</Button>
|
|
384
|
-
</CardContent>
|
|
385
|
-
</Card>
|
|
386
|
-
)
|
|
387
|
-
}
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
## Testing
|
|
391
|
-
|
|
392
|
-
### Unit Test Example
|
|
393
|
-
|
|
394
|
-
```typescript
|
|
395
|
-
import { render, screen, fireEvent } from '@testing-library/react'
|
|
396
|
-
import { Card, CardHeader, CardContent } from '@/components/Card'
|
|
397
|
-
|
|
398
|
-
describe('Card', () => {
|
|
399
|
-
it('renders card content', () => {
|
|
400
|
-
render(
|
|
401
|
-
<Card>
|
|
402
|
-
<CardHeader>Test Header</CardHeader>
|
|
403
|
-
<CardContent>Test Content</CardContent>
|
|
404
|
-
</Card>
|
|
405
|
-
)
|
|
406
|
-
|
|
407
|
-
expect(screen.getByText('Test Header')).toBeInTheDocument()
|
|
408
|
-
expect(screen.getByText('Test Content')).toBeInTheDocument()
|
|
409
|
-
})
|
|
410
|
-
|
|
411
|
-
it('handles click events', () => {
|
|
412
|
-
const handleClick = jest.fn()
|
|
413
|
-
render(
|
|
414
|
-
<Card onClick={handleClick}>
|
|
415
|
-
<CardHeader>Clickable Card</CardHeader>
|
|
416
|
-
</Card>
|
|
417
|
-
)
|
|
418
|
-
|
|
419
|
-
fireEvent.click(screen.getByText('Clickable Card'))
|
|
420
|
-
expect(handleClick).toHaveBeenCalledTimes(1)
|
|
421
|
-
})
|
|
422
|
-
|
|
423
|
-
it('renders as different element with as prop', () => {
|
|
424
|
-
const { container } = render(
|
|
425
|
-
<Card as="article">
|
|
426
|
-
<CardHeader>Article Card</CardHeader>
|
|
427
|
-
</Card>
|
|
428
|
-
)
|
|
429
|
-
|
|
430
|
-
expect(container.querySelector('article')).toBeInTheDocument()
|
|
431
|
-
})
|
|
432
|
-
})
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
### Accessibility Test
|
|
436
|
-
|
|
437
|
-
```typescript
|
|
438
|
-
import { axe } from '@axe-core/react'
|
|
439
|
-
|
|
440
|
-
test('Card meets WCAG standards', async () => {
|
|
441
|
-
const { container } = render(
|
|
442
|
-
<Card>
|
|
443
|
-
<CardHeader>Accessible Card</CardHeader>
|
|
444
|
-
<CardDescription>Card description</CardDescription>
|
|
445
|
-
<CardContent>
|
|
446
|
-
<p>Card content with proper semantic structure</p>
|
|
447
|
-
</CardContent>
|
|
448
|
-
</Card>
|
|
449
|
-
)
|
|
450
|
-
|
|
451
|
-
const results = await axe(container)
|
|
452
|
-
expect(results).toHaveNoViolations()
|
|
453
|
-
})
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
## Accessibility
|
|
457
|
-
|
|
458
|
-
### Semantic HTML
|
|
459
|
-
|
|
460
|
-
- Default renders as `<section>` for proper document structure
|
|
461
|
-
- Can be rendered as other semantic elements via `as` prop
|
|
462
|
-
- Proper heading hierarchy with CardHeader
|
|
463
|
-
|
|
464
|
-
### Keyboard Support
|
|
465
|
-
|
|
466
|
-
- Focusable when interactive (button/link)
|
|
467
|
-
- Proper focus ring styling
|
|
468
|
-
- Tab navigation support
|
|
469
|
-
|
|
470
|
-
### ARIA Support
|
|
471
|
-
|
|
472
|
-
```typescript
|
|
473
|
-
// Interactive card with proper ARIA
|
|
474
|
-
<Card
|
|
475
|
-
as="button"
|
|
476
|
-
role="button"
|
|
477
|
-
aria-label="View details"
|
|
478
|
-
aria-pressed={selected}
|
|
479
|
-
>
|
|
480
|
-
<CardHeader>Interactive Card</CardHeader>
|
|
481
|
-
</Card>
|
|
482
|
-
|
|
483
|
-
// Card as form label
|
|
484
|
-
<Card as="label" htmlFor="input-id">
|
|
485
|
-
<CardHeader>Form Label Card</CardHeader>
|
|
486
|
-
<CardContent>
|
|
487
|
-
<input id="input-id" />
|
|
488
|
-
</CardContent>
|
|
489
|
-
</Card>
|
|
490
|
-
```
|
|
491
|
-
|
|
492
|
-
### Screen Reader Support
|
|
493
|
-
|
|
494
|
-
- Semantic structure aids navigation
|
|
495
|
-
- Proper heading announcements
|
|
496
|
-
- Interactive states communicated
|
|
497
|
-
|
|
498
|
-
## Styling
|
|
499
|
-
|
|
500
|
-
### Custom Styles
|
|
501
|
-
|
|
502
|
-
```typescript
|
|
503
|
-
<Card className="bg-blue-50 border-blue-200 shadow-lg">
|
|
504
|
-
<CardHeader className="text-blue-900">
|
|
505
|
-
Custom Styled Card
|
|
506
|
-
</CardHeader>
|
|
507
|
-
<CardContent className="text-blue-700">
|
|
508
|
-
Content with custom colors
|
|
509
|
-
</CardContent>
|
|
510
|
-
</Card>
|
|
511
|
-
```
|
|
512
|
-
|
|
513
|
-
### Animation
|
|
514
|
-
|
|
515
|
-
```typescript
|
|
516
|
-
<Card className="transform transition-all duration-300 hover:scale-105 hover:shadow-xl">
|
|
517
|
-
<CardHeader>Animated Card</CardHeader>
|
|
518
|
-
<CardContent>Hover for animation</CardContent>
|
|
519
|
-
</Card>
|
|
520
|
-
```
|
|
521
|
-
|
|
522
|
-
### Dark Mode
|
|
523
|
-
|
|
524
|
-
```typescript
|
|
525
|
-
<Card className="dark:bg-gray-800 dark:border-gray-700">
|
|
526
|
-
<CardHeader className="dark:text-white">
|
|
527
|
-
Dark Mode Card
|
|
528
|
-
</CardHeader>
|
|
529
|
-
<CardContent className="dark:text-gray-300">
|
|
530
|
-
Automatically adapts to dark mode
|
|
531
|
-
</CardContent>
|
|
532
|
-
</Card>
|
|
533
|
-
```
|
|
534
|
-
|
|
535
|
-
## Performance
|
|
536
|
-
|
|
537
|
-
| Metric | Value |
|
|
538
|
-
|--------|-------|
|
|
539
|
-
| Bundle size (gzip) | 1.8kb |
|
|
540
|
-
| First render | <6ms |
|
|
541
|
-
| Re-render | <2ms |
|
|
542
|
-
| Tree-shakeable | ✅ |
|
|
543
|
-
|
|
544
|
-
### Optimization Tips
|
|
545
|
-
|
|
546
|
-
1. Use `React.memo()` for cards in lists
|
|
547
|
-
2. Lazy load images in cards
|
|
548
|
-
3. Virtualize long card lists
|
|
549
|
-
4. Optimize re-renders with proper keys
|
|
550
|
-
|
|
551
|
-
## Migration
|
|
552
|
-
|
|
553
|
-
### From v1.0.x
|
|
554
|
-
|
|
555
|
-
```diff
|
|
556
|
-
// Import path changed
|
|
557
|
-
- import Card from 'torch-glare/Card'
|
|
558
|
-
+ import { Card, CardHeader, CardContent } from '@/components/Card'
|
|
559
|
-
|
|
560
|
-
// Structure changed to compound
|
|
561
|
-
- <Card title="Title" description="Description">
|
|
562
|
-
- Content
|
|
563
|
-
- </Card>
|
|
564
|
-
+ <Card>
|
|
565
|
-
+ <CardHeader>Title</CardHeader>
|
|
566
|
-
+ <CardDescription>Description</CardDescription>
|
|
567
|
-
+ <CardContent>Content</CardContent>
|
|
568
|
-
+ </Card>
|
|
569
|
-
```
|
|
570
|
-
|
|
571
|
-
## Troubleshooting
|
|
572
|
-
|
|
573
|
-
### Card not hovering
|
|
574
|
-
|
|
575
|
-
**Solution:** Ensure hover classes aren't overridden
|
|
576
|
-
|
|
577
|
-
```typescript
|
|
578
|
-
// Check for conflicting classes
|
|
579
|
-
<Card className="hover:border-blue-500"> // This works
|
|
580
|
-
```
|
|
581
|
-
|
|
582
|
-
### Content overflow
|
|
583
|
-
|
|
584
|
-
**Solution:** Add overflow handling
|
|
585
|
-
|
|
586
|
-
```typescript
|
|
587
|
-
<Card className="overflow-hidden">
|
|
588
|
-
<CardContent className="overflow-auto max-h-96">
|
|
589
|
-
{/* Long content */}
|
|
590
|
-
</CardContent>
|
|
591
|
-
</Card>
|
|
592
|
-
```
|
|
593
|
-
|
|
594
|
-
## Related Components
|
|
595
|
-
|
|
596
|
-
- [Dialog](/docs/components/dialog.md) - Modal overlays
|
|
597
|
-
- [Alert](/docs/components/alert.md) - Alert messages
|
|
598
|
-
- [Badge](/docs/components/badge.md) - Status indicators
|
|
599
|
-
- [Button](/docs/components/button.md) - Interactive elements
|
|
600
|
-
|
|
601
|
-
## Browser Support
|
|
602
|
-
|
|
603
|
-
- Chrome 90+ ✅
|
|
604
|
-
- Firefox 88+ ✅
|
|
605
|
-
- Safari 14+ ✅
|
|
606
|
-
- Edge 90+ ✅
|
|
607
|
-
- Mobile browsers ✅
|
|
608
|
-
|
|
609
|
-
## Changelog
|
|
610
|
-
|
|
611
|
-
### v1.1.15
|
|
612
|
-
- Added compound component architecture
|
|
613
|
-
- Improved hover states
|
|
614
|
-
- Enhanced TypeScript types
|
|
615
|
-
|
|
616
|
-
### v1.1.14
|
|
617
|
-
- Added polymorphic rendering
|
|
618
|
-
- Fixed border transitions
|
|
619
|
-
- Performance improvements
|
|
620
|
-
|
|
621
|
-
### v1.1.0
|
|
622
|
-
- Initial release
|