laif-ds 0.2.74 → 0.2.76

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.
Files changed (155) hide show
  1. package/dist/CHANGELOG.md +446 -0
  2. package/dist/agent-docs/adoption-report.json +615 -0
  3. package/dist/agent-docs/components/Accordion.md +46 -16
  4. package/dist/agent-docs/components/Alert.md +90 -95
  5. package/dist/agent-docs/components/AlertDialog.md +132 -126
  6. package/dist/agent-docs/components/AppEditor.md +90 -90
  7. package/dist/agent-docs/components/AppRadioGroup.md +18 -18
  8. package/dist/agent-docs/components/AppSidebar.md +129 -122
  9. package/dist/agent-docs/components/AppStepper.md +81 -77
  10. package/dist/agent-docs/components/AspectRatio.md +70 -62
  11. package/dist/agent-docs/components/AudioVisualizer.md +5 -5
  12. package/dist/agent-docs/components/Avatar.md +112 -113
  13. package/dist/agent-docs/components/Badge.md +123 -118
  14. package/dist/agent-docs/components/Breadcrumb.md +8 -1
  15. package/dist/agent-docs/components/Button.md +131 -129
  16. package/dist/agent-docs/components/Card.md +172 -147
  17. package/dist/agent-docs/components/Carousel.md +148 -129
  18. package/dist/agent-docs/components/Chat.md +121 -109
  19. package/dist/agent-docs/components/ChatMessage.md +72 -61
  20. package/dist/agent-docs/components/Checkbox.md +150 -135
  21. package/dist/agent-docs/components/CircularProgress.md +53 -49
  22. package/dist/agent-docs/components/CodeHighlighter.md +4 -4
  23. package/dist/agent-docs/components/Collapsible.md +114 -95
  24. package/dist/agent-docs/components/Command.md +141 -142
  25. package/dist/agent-docs/components/Confirmer.md +182 -175
  26. package/dist/agent-docs/components/ContextMenu.md +196 -191
  27. package/dist/agent-docs/components/DataCrossTable.md +114 -94
  28. package/dist/agent-docs/components/DataTable.md +32 -24
  29. package/dist/agent-docs/components/Dialog.md +130 -125
  30. package/dist/agent-docs/components/Drawer.md +141 -127
  31. package/dist/agent-docs/components/FilePreviewer.md +138 -139
  32. package/dist/agent-docs/components/FileUploader.md +149 -129
  33. package/dist/agent-docs/components/Form.md +3 -1
  34. package/dist/agent-docs/components/FormComposer.md +163 -137
  35. package/dist/agent-docs/components/GanttChart.md +125 -122
  36. package/dist/agent-docs/components/HoverCard.md +1 -1
  37. package/dist/agent-docs/components/Icon.md +98 -99
  38. package/dist/agent-docs/components/Input.md +173 -138
  39. package/dist/agent-docs/components/InputOtp.md +6 -1
  40. package/dist/agent-docs/components/InputSelector.md +94 -97
  41. package/dist/agent-docs/components/InterruptPrompt.md +4 -4
  42. package/dist/agent-docs/components/MarkdownRenderer.md +5 -2
  43. package/dist/agent-docs/components/Menubar.md +60 -57
  44. package/dist/agent-docs/components/MessageInput.md +134 -131
  45. package/dist/agent-docs/components/MessageList.md +110 -96
  46. package/dist/agent-docs/components/MultipleSelector.md +147 -146
  47. package/dist/agent-docs/components/NavigationMenu.md +6 -2
  48. package/dist/agent-docs/components/Popover.md +112 -103
  49. package/dist/agent-docs/components/PromptSuggestions.md +5 -5
  50. package/dist/agent-docs/components/RadioGroup.md +97 -90
  51. package/dist/agent-docs/components/Resizable.md +4 -1
  52. package/dist/agent-docs/components/ResizePrompt.md +12 -13
  53. package/dist/agent-docs/components/ScrollArea.md +6 -2
  54. package/dist/agent-docs/components/SecurePdfViewer.md +10 -6
  55. package/dist/agent-docs/components/Select.md +131 -132
  56. package/dist/agent-docs/components/Sheet.md +8 -1
  57. package/dist/agent-docs/components/ShikiHighlighter.md +5 -5
  58. package/dist/agent-docs/components/Sidebar.md +94 -85
  59. package/dist/agent-docs/components/Slider.md +62 -58
  60. package/dist/agent-docs/components/Sonner.md +1 -0
  61. package/dist/agent-docs/components/Spinner.md +14 -14
  62. package/dist/agent-docs/components/Stepper.md +93 -67
  63. package/dist/agent-docs/components/Switch.md +41 -42
  64. package/dist/agent-docs/components/TableSkeleton.md +8 -8
  65. package/dist/agent-docs/components/Tabs.md +106 -86
  66. package/dist/agent-docs/components/TextArea.md +51 -52
  67. package/dist/agent-docs/components/ThemeSwitcher.md +72 -69
  68. package/dist/agent-docs/components/Toaster.md +1 -0
  69. package/dist/agent-docs/components/Tooltip.md +102 -91
  70. package/dist/agent-docs/components/Typo.md +68 -65
  71. package/dist/agent-docs/components/WeeklyCalendar.md +63 -64
  72. package/dist/agent-docs/components-list.md +1 -0
  73. package/dist/agent-docs/manifest.json +5981 -0
  74. package/dist/agent-docs/truncated-cell.md +342 -0
  75. package/dist/components/editor/editor-hooks/use-update-toolbar.js +6 -6
  76. package/dist/components/editor/plugins/actions/counter-character-plugin.js +6 -6
  77. package/dist/components/editor/plugins/toolbar/font-format-toolbar-plugin.js +18 -18
  78. package/dist/components/editor/plugins/toolbar/history-toolbar-plugin.js +10 -10
  79. package/dist/components/editor/plugins/toolbar/toolbar-plugin.js +9 -9
  80. package/dist/components/ui/app-checkbox.js +1 -1
  81. package/dist/components/ui/app-dialog.js +70 -64
  82. package/dist/components/ui/app-editor.js +51 -51
  83. package/dist/components/ui/app-form.js +81 -81
  84. package/dist/components/ui/app-multiple-select-dropdown.js +36 -36
  85. package/dist/components/ui/app-select.js +109 -104
  86. package/dist/components/ui/app-sidebar.js +41 -41
  87. package/dist/components/ui/app-stepper.js +1 -1
  88. package/dist/components/ui/app-time-picker.js +18 -18
  89. package/dist/components/ui/app-tooltip.js +1 -1
  90. package/dist/components/ui/async-select.js +5 -5
  91. package/dist/components/ui/audio-visualizer.js +61 -58
  92. package/dist/components/ui/card.js +1 -1
  93. package/dist/components/ui/carousel.js +2 -2
  94. package/dist/components/ui/chart.js +1 -1
  95. package/dist/components/ui/chat-message.js +8 -8
  96. package/dist/components/ui/chat.js +86 -88
  97. package/dist/components/ui/command.js +2 -2
  98. package/dist/components/ui/copy-button.js +4 -4
  99. package/dist/components/ui/date-picker.js +20 -20
  100. package/dist/components/ui/file-preview/index.js +13 -13
  101. package/dist/components/ui/file-previewer.js +12 -11
  102. package/dist/components/ui/file-uploader.js +86 -78
  103. package/dist/components/ui/form.js +2 -2
  104. package/dist/components/ui/gantt/components/Chart/Bars/Bars.js +56 -56
  105. package/dist/components/ui/gantt/components/Chart/Bars/BarsRow/BarItem/BarItem.js +12 -12
  106. package/dist/components/ui/gantt/components/Chart/Bars/BarsRow/BarsItems/BarItems.js +1 -1
  107. package/dist/components/ui/gantt/components/Chart/Bars/BarsRow/BarsRow.js +4 -4
  108. package/dist/components/ui/gantt/components/Chart/Bars/BarsRow/RepeteadBars/RepeteadBars.js +2 -2
  109. package/dist/components/ui/gantt/components/Chart/Chart.js +23 -23
  110. package/dist/components/ui/gantt/components/Chart/Scale/Scale.js +1 -1
  111. package/dist/components/ui/gantt/components/Chart/Tree/Tree.js +34 -34
  112. package/dist/components/ui/gantt/components/Controls/Controls.js +5 -5
  113. package/dist/components/ui/gantt/components/Gantt/Gantt.js +4 -4
  114. package/dist/components/ui/gantt/hooks/useGanttCalculate.js +25 -18
  115. package/dist/components/ui/input-selector.js +1 -1
  116. package/dist/components/ui/input.js +23 -23
  117. package/dist/components/ui/kanban.js +8 -9
  118. package/dist/components/ui/markdown-renderer.js +41 -35
  119. package/dist/components/ui/message-input.js +45 -44
  120. package/dist/components/ui/multiple-selector.js +91 -82
  121. package/dist/components/ui/secure-pdf-viewer.js +19 -7
  122. package/dist/components/ui/sidebar.js +1 -1
  123. package/dist/components/ui/slider.js +1 -1
  124. package/dist/components/ui/spinner.js +4 -4
  125. package/dist/components/ui/stepper.js +157 -138
  126. package/dist/components/ui/tables/data-cross-table/data-cross-table-buttons.js +29 -29
  127. package/dist/components/ui/tables/data-cross-table/data-cross-table.js +258 -246
  128. package/dist/components/ui/tables/data-table/components/data-table-advanced-filter.js +4 -1
  129. package/dist/components/ui/tables/data-table/components/data-table-body.js +211 -367
  130. package/dist/components/ui/tables/data-table/components/data-table-filter-inputs.js +114 -112
  131. package/dist/components/ui/tables/data-table/components/data-table-filters.js +116 -96
  132. package/dist/components/ui/tables/data-table/components/data-table-header.js +211 -0
  133. package/dist/components/ui/tables/data-table/components/data-table-searchbar.js +8 -8
  134. package/dist/components/ui/tables/data-table/components/data-table-skeleton-rows.js +33 -0
  135. package/dist/components/ui/tables/data-table/data-table.js +258 -250
  136. package/dist/components/ui/tables/data-table/data-table.service.js +112 -97
  137. package/dist/components/ui/tables/data-table/data-table.utils.js +25 -15
  138. package/dist/components/ui/textarea.js +2 -2
  139. package/dist/components/ui/theme-switcher.js +1 -1
  140. package/dist/components/ui/toggle-group.js +2 -2
  141. package/dist/components/ui/truncated-cell.js +100 -0
  142. package/dist/components/ui/weekly-calendar/appointment-card.js +16 -16
  143. package/dist/components/ui/weekly-calendar/calendar-context.js +6 -6
  144. package/dist/components/ui/weekly-calendar/calendar-header.js +12 -12
  145. package/dist/components/ui/weekly-calendar/day-column.js +16 -16
  146. package/dist/components/ui/weekly-calendar/time-column.js +4 -4
  147. package/dist/components/ui/weekly-calendar/weekly-calendar.js +4 -4
  148. package/dist/hooks/use-audio-recording.js +1 -1
  149. package/dist/hooks/use-auto-scroll.js +18 -18
  150. package/dist/hooks/use-autosize-textarea.js +12 -13
  151. package/dist/index.d.ts +100 -45
  152. package/dist/index.js +362 -360
  153. package/dist/lib/utils.js +6 -6
  154. package/dist/styles.v3.css +1 -1
  155. package/package.json +14 -4
@@ -1,118 +1,123 @@
1
- # Badge
2
-
3
- ## Overview
4
-
5
- Small, inline label for status and metadata. Supports many visual variants, optional icons, link mode, and disabled state.
6
-
7
- ---
8
-
9
- ## Props
10
-
11
- ### Badge (Root)
12
-
13
- | Prop | Type | Default | Description |
14
- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------------------------------------- |
15
- | `variant` | `"default" \| "destructive" \| "warning" \| "success" \| "outline" \| "outline-primary" \| "outline-destructive" \| "outline-warning" \| "outline-success" \| "secondary" \| "ghost" \| "ghost-destructive" \| "ghost-accent" \| "ghost-warning" \| "ghost-success" \| "link"` | `"default"` | Visual style of the badge. |
16
- | `asChild` | `boolean` | `false` | Renders the badge as its child element. |
17
- | `disabled` | `boolean` | `false` | Disables interactions and dims the badge. |
18
- | `iconLeft` | `IconName` | `undefined` | Optional left icon (uses `Icon` component). |
19
- | `iconRight` | `IconName` | `undefined` | Optional right icon (uses `Icon` component).|
20
- | `className` | `string` | `""` | Additional classes on the root element. |
21
- | `children` | `React.ReactNode` | **required** | Text or content inside the badge. |
22
-
23
- ---
24
-
25
- ## Behavior
26
-
27
- - **Variants**: Outline, ghost, and semantic variants available for flexible UIs.
28
- - **As child**: Use `asChild` to render as an anchor or any custom element.
29
- - **Icons**: `iconLeft`/`iconRight` render `Icon` with appropriate sizes.
30
- - **Disabled**: Applies `cursor-not-allowed` and reduces opacity.
31
-
32
- ---
33
-
34
- ## Examples
35
-
36
- ### Default
37
-
38
- ```tsx
39
- import { Badge } from "laif-ds";
40
-
41
- export function DefaultBadge() {
42
- return <Badge>Badge</Badge>;
43
- }
44
- ```
45
-
46
- ### Variants Grid
47
-
48
- ```tsx
49
- import { Badge, type BadgeProps } from "laif-ds";
50
-
51
- const variants: BadgeProps["variant"][] = [
52
- "default",
53
- "destructive",
54
- "warning",
55
- "success",
56
- "outline",
57
- "outline-primary",
58
- "outline-destructive",
59
- "outline-warning",
60
- "outline-success",
61
- "secondary",
62
- "ghost",
63
- "ghost-accent",
64
- "ghost-destructive",
65
- "ghost-warning",
66
- "ghost-success",
67
- "link",
68
- ];
69
-
70
- export function VariantsShowcase() {
71
- return (
72
- <div className="flex flex-wrap gap-2">
73
- {variants.map((v) => (
74
- <Badge key={v} variant={v}>
75
- {v}
76
- </Badge>
77
- ))}
78
- </div>
79
- );
80
- }
81
- ```
82
-
83
- ### With Icons
84
-
85
- ```tsx
86
- import { Badge } from "laif-ds";
87
-
88
- export function WithIcons() {
89
- return (
90
- <div className="flex gap-2">
91
- <Badge iconLeft="Check" iconRight="X">Approved</Badge>
92
- <Badge variant="outline-primary" iconLeft="Pencil">Edit</Badge>
93
- </div>
94
- );
95
- }
96
- ```
97
-
98
- ### As Link (asChild)
99
-
100
- ```tsx
101
- import { Badge } from "laif-ds";
102
-
103
- export function LinkBadge() {
104
- return (
105
- <Badge asChild>
106
- <a href="#" className="cursor-pointer">Clickable Badge</a>
107
- </Badge>
108
- );
109
- }
110
- ```
111
-
112
- ---
113
-
114
- ## Notes
115
-
116
- - **Icons**: Use `IconName` values supported by the design system.
117
- - **AsChild**: Useful to keep semantics (e.g., anchors) while styling as badges.
118
-
1
+ # Badge
2
+
3
+ ## Overview
4
+
5
+ Small, inline label for status and metadata. Supports many visual variants, optional icons, link mode, and disabled state.
6
+
7
+ ---
8
+
9
+ ## Props
10
+
11
+ ### Badge (Root)
12
+
13
+ | Prop | Type | Default | Description |
14
+ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------ | -------------------------------------------- |
15
+ | `variant` | `"default" \| "destructive" \| "warning" \| "success" \| "outline" \| "outline-primary" \| "outline-destructive" \| "outline-warning" \| "outline-success" \| "secondary" \| "ghost" \| "ghost-destructive" \| "ghost-accent" \| "ghost-warning" \| "ghost-success" \| "link"` | `"default"` | Visual style of the badge. |
16
+ | `asChild` | `boolean` | `false` | Renders the badge as its child element. |
17
+ | `disabled` | `boolean` | `false` | Disables interactions and dims the badge. |
18
+ | `iconLeft` | `IconName` | `undefined` | Optional left icon (uses `Icon` component). |
19
+ | `iconRight` | `IconName` | `undefined` | Optional right icon (uses `Icon` component). |
20
+ | `className` | `string` | `""` | Additional classes on the root element. |
21
+ | `children` | `React.ReactNode` | **required** | Text or content inside the badge. |
22
+
23
+ ---
24
+
25
+ ## Behavior
26
+
27
+ - **Variants**: Outline, ghost, and semantic variants available for flexible UIs.
28
+ - **As child**: Use `asChild` to render as an anchor or any custom element.
29
+ - **Icons**: `iconLeft`/`iconRight` render `Icon` with appropriate sizes.
30
+ - **Disabled**: Applies `cursor-not-allowed` and reduces opacity.
31
+
32
+ ---
33
+
34
+ ## Examples
35
+
36
+ ### Default
37
+
38
+ ```tsx
39
+ import { Badge } from "laif-ds";
40
+
41
+ export function DefaultBadge() {
42
+ return <Badge>Badge</Badge>;
43
+ }
44
+ ```
45
+
46
+ ### Variants Grid
47
+
48
+ ```tsx
49
+ import { Badge, type BadgeProps } from "laif-ds";
50
+
51
+ const variants: BadgeProps["variant"][] = [
52
+ "default",
53
+ "destructive",
54
+ "warning",
55
+ "success",
56
+ "outline",
57
+ "outline-primary",
58
+ "outline-destructive",
59
+ "outline-warning",
60
+ "outline-success",
61
+ "secondary",
62
+ "ghost",
63
+ "ghost-accent",
64
+ "ghost-destructive",
65
+ "ghost-warning",
66
+ "ghost-success",
67
+ "link",
68
+ ];
69
+
70
+ export function VariantsShowcase() {
71
+ return (
72
+ <div className="flex flex-wrap gap-2">
73
+ {variants.map((v) => (
74
+ <Badge key={v} variant={v}>
75
+ {v}
76
+ </Badge>
77
+ ))}
78
+ </div>
79
+ );
80
+ }
81
+ ```
82
+
83
+ ### With Icons
84
+
85
+ ```tsx
86
+ import { Badge } from "laif-ds";
87
+
88
+ export function WithIcons() {
89
+ return (
90
+ <div className="flex gap-2">
91
+ <Badge iconLeft="Check" iconRight="X">
92
+ Approved
93
+ </Badge>
94
+ <Badge variant="outline-primary" iconLeft="Pencil">
95
+ Edit
96
+ </Badge>
97
+ </div>
98
+ );
99
+ }
100
+ ```
101
+
102
+ ### As Link (asChild)
103
+
104
+ ```tsx
105
+ import { Badge } from "laif-ds";
106
+
107
+ export function LinkBadge() {
108
+ return (
109
+ <Badge asChild>
110
+ <a href="#" className="cursor-pointer">
111
+ Clickable Badge
112
+ </a>
113
+ </Badge>
114
+ );
115
+ }
116
+ ```
117
+
118
+ ---
119
+
120
+ ## Notes
121
+
122
+ - **Icons**: Use `IconName` values supported by the design system.
123
+ - **AsChild**: Useful to keep semantics (e.g., anchors) while styling as badges.
@@ -58,7 +58,14 @@ export function BasicBreadcrumb() {
58
58
  ### Custom Separator
59
59
 
60
60
  ```tsx
61
- import { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbSeparator, BreadcrumbPage } from "laif-ds";
61
+ import {
62
+ Breadcrumb,
63
+ BreadcrumbList,
64
+ BreadcrumbItem,
65
+ BreadcrumbLink,
66
+ BreadcrumbSeparator,
67
+ BreadcrumbPage,
68
+ } from "laif-ds";
62
69
 
63
70
  export function CustomSeparator() {
64
71
  return (
@@ -1,129 +1,131 @@
1
- # Button
2
-
3
- ## Overview
4
-
5
- Versatile button with multiple variants and sizes, optional leading/trailing icons, loading state, and support for rendering as a child element.
6
-
7
- ---
8
-
9
- ## Props
10
-
11
- ### Button (Root)
12
-
13
- | Prop | Type | Default | Description |
14
- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------- | -------------------------------------------------------- |
15
- | `variant` | `"default" | "destructive" | "outline" | "outline-primary" | "outline-destructive" | "secondary" | "ghost" | "ghost-destructive" | "ghost-accent" | "link"` | `"default"` | Visual style of the button. |
16
- | `size` | `"default" | "sm" | "lg" | "icon"` | `"default"` | Size of the button. |
17
- | `asChild` | `boolean` | `false` | Render as child (e.g., anchor) while preserving styles. |
18
- | `iconLeft` | `IconName` | `undefined` | Optional left icon name. |
19
- | `iconRight` | `IconName` | `undefined` | Optional right icon name. |
20
- | `isLoading` | `boolean` | `false` | Shows a loading spinner; overrides `iconLeft`. |
21
- | `className` | `string` | `""` | Additional classes for layout/width. |
22
- | `disabled` | `boolean` | `false` | Disables the button. |
23
- | `onClick` | `(e: React.MouseEvent<HTMLButtonElement>) => void` | `undefined` | Click handler. |
24
- | `children` | `React.ReactNode` | **required** | Button label or content. |
25
-
26
- ---
27
-
28
- ## Behavior
29
-
30
- - **Loading**: When `isLoading` is `true`, a spinner is shown and `iconLeft` is hidden.
31
- - **Icons**: Icon sizes adapt to the button size (`sm`, `default`, `lg`, `icon`).
32
- - **As Child**: Use `asChild` to render the button as a link or custom element while keeping button styles.
33
- - **Accessibility**: Keyboard-focus ring and proper semantics are included.
34
-
35
- ---
36
-
37
- ## Examples
38
-
39
- ### Default
40
-
41
- ```tsx
42
- import { Button } from "laif-ds";
43
-
44
- export function DefaultButton() {
45
- return <Button>Button</Button>;
46
- }
47
- ```
48
-
49
- ### Showcase (Variants × Sizes)
50
-
51
- ```tsx
52
- import { Button, type ButtonProps } from "laif-ds";
53
-
54
- const variants: ButtonProps["variant"][] = [
55
- "default",
56
- "destructive",
57
- "outline",
58
- "outline-primary",
59
- "outline-destructive",
60
- "secondary",
61
- "ghost",
62
- "ghost-accent",
63
- "ghost-destructive",
64
- "link",
65
- ];
66
-
67
- const sizes: ButtonProps["size"][] = ["lg", "default", "sm", "icon"];
68
-
69
- export function ButtonsGrid() {
70
- return (
71
- <div className="flex flex-col gap-4">
72
- {variants.map((variant) => (
73
- <div key={variant} className="flex items-center gap-2 flex-wrap">
74
- {sizes.map((size) => (
75
- size === "icon" ? (
76
- <Button key={`${variant}-${size}`} variant={variant} size={size} iconLeft="BadgeInfo" />
77
- ) : (
78
- <Button key={`${variant}-${size}`} variant={variant} size={size}>
79
- {variant} - {size}
80
- </Button>
81
- )
82
- ))}
83
- </div>
84
- ))}
85
- </div>
86
- );
87
- }
88
- ```
89
-
90
- ### Full Width
91
-
92
- ```tsx
93
- import { Button } from "laif-ds";
94
-
95
- export function FullWidthButton() {
96
- return (
97
- <Button className="w-full">Full Width Button</Button>
98
- );
99
- }
100
- ```
101
-
102
- ### With Icon
103
-
104
- ```tsx
105
- import { Button } from "laif-ds";
106
-
107
- export function WithIcon() {
108
- return <Button iconLeft="Check">Button with Icon</Button>;
109
- }
110
- ```
111
-
112
- ### Loading
113
-
114
- ```tsx
115
- import { Button } from "laif-ds";
116
-
117
- export function LoadingButton() {
118
- return <Button isLoading>Loading Button</Button>;
119
- }
120
- ```
121
-
122
- ---
123
-
124
- ## Notes
125
-
126
- - **Disabled**: Applies reduced opacity and prevents interactions.
127
- - **Icon-only**: Use `size="icon"` for square icon buttons.
128
- - **Theming**: Use variants to match semantic meaning (primary, destructive, etc.).
129
-
1
+ # Button
2
+
3
+ ## Overview
4
+
5
+ Versatile button with multiple variants and sizes, optional leading/trailing icons, loading state, and support for rendering as a child element.
6
+
7
+ ---
8
+
9
+ ## Props
10
+
11
+ ### Button (Root)
12
+
13
+ | Prop | Type | Default | Description |
14
+ | ----------- | -------------------------------------------------- | ------------- | ------------------------------------------------------- | ----------------- | --------------------- | ------------------- | ------- | ------------------- | -------------- | ------- | ----------- | --------------------------- |
15
+ | `variant` | `"default" | "destructive" | "outline" | "outline-primary" | "outline-destructive" | "secondary" | "ghost" | "ghost-destructive" | "ghost-accent" | "link"` | `"default"` | Visual style of the button. |
16
+ | `size` | `"default" | "sm" | "lg" | "icon"` | `"default"` | Size of the button. |
17
+ | `asChild` | `boolean` | `false` | Render as child (e.g., anchor) while preserving styles. |
18
+ | `iconLeft` | `IconName` | `undefined` | Optional left icon name. |
19
+ | `iconRight` | `IconName` | `undefined` | Optional right icon name. |
20
+ | `isLoading` | `boolean` | `false` | Shows a loading spinner; overrides `iconLeft`. |
21
+ | `className` | `string` | `""` | Additional classes for layout/width. |
22
+ | `disabled` | `boolean` | `false` | Disables the button. |
23
+ | `onClick` | `(e: React.MouseEvent<HTMLButtonElement>) => void` | `undefined` | Click handler. |
24
+ | `children` | `React.ReactNode` | **required** | Button label or content. |
25
+
26
+ ---
27
+
28
+ ## Behavior
29
+
30
+ - **Loading**: When `isLoading` is `true`, a spinner is shown and `iconLeft` is hidden.
31
+ - **Icons**: Icon sizes adapt to the button size (`sm`, `default`, `lg`, `icon`).
32
+ - **As Child**: Use `asChild` to render the button as a link or custom element while keeping button styles.
33
+ - **Accessibility**: Keyboard-focus ring and proper semantics are included.
34
+
35
+ ---
36
+
37
+ ## Examples
38
+
39
+ ### Default
40
+
41
+ ```tsx
42
+ import { Button } from "laif-ds";
43
+
44
+ export function DefaultButton() {
45
+ return <Button>Button</Button>;
46
+ }
47
+ ```
48
+
49
+ ### Showcase (Variants × Sizes)
50
+
51
+ ```tsx
52
+ import { Button, type ButtonProps } from "laif-ds";
53
+
54
+ const variants: ButtonProps["variant"][] = [
55
+ "default",
56
+ "destructive",
57
+ "outline",
58
+ "outline-primary",
59
+ "outline-destructive",
60
+ "secondary",
61
+ "ghost",
62
+ "ghost-accent",
63
+ "ghost-destructive",
64
+ "link",
65
+ ];
66
+
67
+ const sizes: ButtonProps["size"][] = ["lg", "default", "sm", "icon"];
68
+
69
+ export function ButtonsGrid() {
70
+ return (
71
+ <div className="flex flex-col gap-4">
72
+ {variants.map((variant) => (
73
+ <div key={variant} className="flex flex-wrap items-center gap-2">
74
+ {sizes.map((size) =>
75
+ size === "icon" ? (
76
+ <Button
77
+ key={`${variant}-${size}`}
78
+ variant={variant}
79
+ size={size}
80
+ iconLeft="BadgeInfo"
81
+ />
82
+ ) : (
83
+ <Button key={`${variant}-${size}`} variant={variant} size={size}>
84
+ {variant} - {size}
85
+ </Button>
86
+ ),
87
+ )}
88
+ </div>
89
+ ))}
90
+ </div>
91
+ );
92
+ }
93
+ ```
94
+
95
+ ### Full Width
96
+
97
+ ```tsx
98
+ import { Button } from "laif-ds";
99
+
100
+ export function FullWidthButton() {
101
+ return <Button className="w-full">Full Width Button</Button>;
102
+ }
103
+ ```
104
+
105
+ ### With Icon
106
+
107
+ ```tsx
108
+ import { Button } from "laif-ds";
109
+
110
+ export function WithIcon() {
111
+ return <Button iconLeft="Check">Button with Icon</Button>;
112
+ }
113
+ ```
114
+
115
+ ### Loading
116
+
117
+ ```tsx
118
+ import { Button } from "laif-ds";
119
+
120
+ export function LoadingButton() {
121
+ return <Button isLoading>Loading Button</Button>;
122
+ }
123
+ ```
124
+
125
+ ---
126
+
127
+ ## Notes
128
+
129
+ - **Disabled**: Applies reduced opacity and prevents interactions.
130
+ - **Icon-only**: Use `size="icon"` for square icon buttons.
131
+ - **Theming**: Use variants to match semantic meaning (primary, destructive, etc.).