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,142 +1,141 @@
1
- # Command
2
-
3
- ## Overview
4
-
5
- Command palette and command list built on `cmdk`. Provides an input for filtering, groups, items, separators, and a dialog wrapper for modal usage.
6
-
7
- ---
8
-
9
- ## Props
10
-
11
- ### Command (Root)
12
-
13
- | Prop | Type | Default | Description |
14
- | ----------- | ----------------- | ----------- | -------------------------------------------------- |
15
- | `className` | `string` | `""` | Additional classes for layout/size. |
16
- | `children` | `React.ReactNode` | **required**| Compose with input, list, groups, items, etc. |
17
-
18
- ### CommandDialog
19
-
20
- Wraps a `Dialog` and renders a `Command` inside.
21
-
22
- | Prop | Type | Default | Description |
23
- | -------------- | ------------------------ | -------------------------------------- | -------------------------------- |
24
- | `open` | `boolean` | `undefined` | Controlled open state. |
25
- | `onOpenChange` | `(open: boolean) => any` | `undefined` | Called when dialog state changes.|
26
- | `title` | `string` | `"Command Palette"` | Accessible dialog title. |
27
- | `description` | `string` | `"Search for a command to run..."` | Accessible dialog description. |
28
-
29
- ### Subcomponents
30
-
31
- - `CommandInput`: Search input with a leading search icon.
32
- - `CommandList`: Scrollable list container.
33
- - `CommandEmpty`: Empty state when no results match.
34
- - `CommandGroup`: Group with optional `heading` prop.
35
- - `CommandItem`: Selectable item (supports disabled state).
36
- - `CommandSeparator`: Visual separator between groups.
37
- - `CommandShortcut`: Right-aligned shortcut hint (e.g., `⌘K`).
38
-
39
- ---
40
-
41
- ## Behavior
42
-
43
- - **Filtering**: Typing in `CommandInput` filters visible items.
44
- - **Keyboard**: Arrow keys navigate, Enter selects, Esc can close the dialog.
45
- - **Accessibility**: Proper roles/aria set by `cmdk` and dialog wrapper.
46
-
47
- ---
48
-
49
- ## Examples
50
-
51
- ### Basic List
52
-
53
- ```tsx
54
- import {
55
- Command,
56
- CommandEmpty,
57
- CommandGroup,
58
- CommandInput,
59
- CommandItem,
60
- CommandList,
61
- CommandSeparator,
62
- CommandShortcut,
63
- } from "laif-ds";
64
-
65
- export function BasicCommand() {
66
- return (
67
- <Command className="border-d-border w-[400px] rounded-lg border shadow-md">
68
- <CommandInput placeholder="Type a command or search..." />
69
- <CommandList>
70
- <CommandEmpty>No results found.</CommandEmpty>
71
- <CommandGroup heading="Suggestions">
72
- <CommandItem>Calendar</CommandItem>
73
- <CommandItem>Search</CommandItem>
74
- <CommandItem>Settings</CommandItem>
75
- </CommandGroup>
76
- <CommandSeparator />
77
- <CommandGroup heading="User">
78
- <CommandItem>
79
- Profile
80
- <CommandShortcut>⌘P</CommandShortcut>
81
- </CommandItem>
82
- <CommandItem>Billing</CommandItem>
83
- <CommandItem>Logout</CommandItem>
84
- </CommandGroup>
85
- </CommandList>
86
- </Command>
87
- );
88
- }
89
- ```
90
-
91
- ### Command Dialog
92
-
93
- ```tsx
94
- import { useState } from "react";
95
- import { Button } from "laif-ds";
96
- import {
97
- CommandDialog,
98
- CommandInput,
99
- CommandList,
100
- CommandEmpty,
101
- CommandGroup,
102
- CommandItem,
103
- CommandSeparator,
104
- } from "laif-ds";
105
-
106
- export function CommandDialogExample() {
107
- const [open, setOpen] = useState(false);
108
- return (
109
- <>
110
- <Button onClick={() => setOpen(true)} variant="outline">
111
- Open Command Dialog
112
- </Button>
113
- <CommandDialog open={open} onOpenChange={setOpen}>
114
- <CommandInput placeholder="Type a command or search..." />
115
- <CommandList>
116
- <CommandEmpty>No results found.</CommandEmpty>
117
- <CommandGroup heading="Suggestions">
118
- <CommandItem>Calendar</CommandItem>
119
- <CommandItem>Search</CommandItem>
120
- <CommandItem>Settings</CommandItem>
121
- </CommandGroup>
122
- <CommandSeparator />
123
- <CommandGroup heading="User">
124
- <CommandItem>Profile</CommandItem>
125
- <CommandItem>Billing</CommandItem>
126
- <CommandItem>Logout</CommandItem>
127
- </CommandGroup>
128
- </CommandList>
129
- </CommandDialog>
130
- </>
131
- );
132
- }
133
- ```
134
-
135
- ---
136
-
137
- ## Notes
138
-
139
- - **Shortcuts**: Use `CommandShortcut` for right-aligned hints within `CommandItem`.
140
- - **Layout**: Set explicit width on `Command` (e.g., `w-[400px]`) when used inline.
141
- - **Dialog**: `CommandDialog` hides its title/description visually but preserves accessibility.
142
-
1
+ # Command
2
+
3
+ ## Overview
4
+
5
+ Command palette and command list built on `cmdk`. Provides an input for filtering, groups, items, separators, and a dialog wrapper for modal usage.
6
+
7
+ ---
8
+
9
+ ## Props
10
+
11
+ ### Command (Root)
12
+
13
+ | Prop | Type | Default | Description |
14
+ | ----------- | ----------------- | ------------ | --------------------------------------------- |
15
+ | `className` | `string` | `""` | Additional classes for layout/size. |
16
+ | `children` | `React.ReactNode` | **required** | Compose with input, list, groups, items, etc. |
17
+
18
+ ### CommandDialog
19
+
20
+ Wraps a `Dialog` and renders a `Command` inside.
21
+
22
+ | Prop | Type | Default | Description |
23
+ | -------------- | ------------------------ | ---------------------------------- | --------------------------------- |
24
+ | `open` | `boolean` | `undefined` | Controlled open state. |
25
+ | `onOpenChange` | `(open: boolean) => any` | `undefined` | Called when dialog state changes. |
26
+ | `title` | `string` | `"Command Palette"` | Accessible dialog title. |
27
+ | `description` | `string` | `"Search for a command to run..."` | Accessible dialog description. |
28
+
29
+ ### Subcomponents
30
+
31
+ - `CommandInput`: Search input with a leading search icon.
32
+ - `CommandList`: Scrollable list container.
33
+ - `CommandEmpty`: Empty state when no results match.
34
+ - `CommandGroup`: Group with optional `heading` prop.
35
+ - `CommandItem`: Selectable item (supports disabled state).
36
+ - `CommandSeparator`: Visual separator between groups.
37
+ - `CommandShortcut`: Right-aligned shortcut hint (e.g., `⌘K`).
38
+
39
+ ---
40
+
41
+ ## Behavior
42
+
43
+ - **Filtering**: Typing in `CommandInput` filters visible items.
44
+ - **Keyboard**: Arrow keys navigate, Enter selects, Esc can close the dialog.
45
+ - **Accessibility**: Proper roles/aria set by `cmdk` and dialog wrapper.
46
+
47
+ ---
48
+
49
+ ## Examples
50
+
51
+ ### Basic List
52
+
53
+ ```tsx
54
+ import {
55
+ Command,
56
+ CommandEmpty,
57
+ CommandGroup,
58
+ CommandInput,
59
+ CommandItem,
60
+ CommandList,
61
+ CommandSeparator,
62
+ CommandShortcut,
63
+ } from "laif-ds";
64
+
65
+ export function BasicCommand() {
66
+ return (
67
+ <Command className="border-d-border w-[400px] rounded-lg border shadow-md">
68
+ <CommandInput placeholder="Type a command or search..." />
69
+ <CommandList>
70
+ <CommandEmpty>No results found.</CommandEmpty>
71
+ <CommandGroup heading="Suggestions">
72
+ <CommandItem>Calendar</CommandItem>
73
+ <CommandItem>Search</CommandItem>
74
+ <CommandItem>Settings</CommandItem>
75
+ </CommandGroup>
76
+ <CommandSeparator />
77
+ <CommandGroup heading="User">
78
+ <CommandItem>
79
+ Profile
80
+ <CommandShortcut>⌘P</CommandShortcut>
81
+ </CommandItem>
82
+ <CommandItem>Billing</CommandItem>
83
+ <CommandItem>Logout</CommandItem>
84
+ </CommandGroup>
85
+ </CommandList>
86
+ </Command>
87
+ );
88
+ }
89
+ ```
90
+
91
+ ### Command Dialog
92
+
93
+ ```tsx
94
+ import { useState } from "react";
95
+ import { Button } from "laif-ds";
96
+ import {
97
+ CommandDialog,
98
+ CommandInput,
99
+ CommandList,
100
+ CommandEmpty,
101
+ CommandGroup,
102
+ CommandItem,
103
+ CommandSeparator,
104
+ } from "laif-ds";
105
+
106
+ export function CommandDialogExample() {
107
+ const [open, setOpen] = useState(false);
108
+ return (
109
+ <>
110
+ <Button onClick={() => setOpen(true)} variant="outline">
111
+ Open Command Dialog
112
+ </Button>
113
+ <CommandDialog open={open} onOpenChange={setOpen}>
114
+ <CommandInput placeholder="Type a command or search..." />
115
+ <CommandList>
116
+ <CommandEmpty>No results found.</CommandEmpty>
117
+ <CommandGroup heading="Suggestions">
118
+ <CommandItem>Calendar</CommandItem>
119
+ <CommandItem>Search</CommandItem>
120
+ <CommandItem>Settings</CommandItem>
121
+ </CommandGroup>
122
+ <CommandSeparator />
123
+ <CommandGroup heading="User">
124
+ <CommandItem>Profile</CommandItem>
125
+ <CommandItem>Billing</CommandItem>
126
+ <CommandItem>Logout</CommandItem>
127
+ </CommandGroup>
128
+ </CommandList>
129
+ </CommandDialog>
130
+ </>
131
+ );
132
+ }
133
+ ```
134
+
135
+ ---
136
+
137
+ ## Notes
138
+
139
+ - **Shortcuts**: Use `CommandShortcut` for right-aligned hints within `CommandItem`.
140
+ - **Layout**: Set explicit width on `Command` (e.g., `w-[400px]`) when used inline.
141
+ - **Dialog**: `CommandDialog` hides its title/description visually but preserves accessibility.
@@ -1,175 +1,182 @@
1
- # Confirmer
2
-
3
- ## Overview
4
-
5
- Promise-based confirmation dialog utility built on top of `AlertDialog`. Mount the `Confirmer` component once, then call `confirm()` to open a dialog and await the user decision.
6
-
7
- ---
8
-
9
- ## API
10
-
11
- ### `Confirmer` (Component)
12
-
13
- Mount this once at app root (or Story scope) to enable dialogs.
14
-
15
- ```tsx
16
- import { Confirmer } from "laif-ds";
17
-
18
- export function AppRoot() {
19
- return (
20
- <>
21
- {/* ...your app... */}
22
- <Confirmer />
23
- </>
24
- );
25
- }
26
- ```
27
-
28
- ### `confirm(options)`
29
-
30
- Returns a Promise that resolves when the user confirms and rejects when the user cancels.
31
-
32
- ```ts
33
- type ConfirmOptions = {
34
- title?: React.ReactNode;
35
- description?: React.ReactNode;
36
- cancelText?: React.ReactNode;
37
- actionText?: React.ReactNode;
38
- CancelProps?: React.ComponentProps<typeof AlertDialogCancel>;
39
- ActionProps?: React.ComponentProps<typeof Button>;
40
- variant?: "default" | "destructive";
41
- };
42
-
43
- declare function confirm(options: ConfirmOptions): Promise<boolean>;
44
- declare function safeConfirm(options: ConfirmOptions): Promise<boolean | undefined>;
45
- ```
46
-
47
- - `variant`: when set to `"destructive"`, shows a destructive style and warning icon.
48
- - `safeConfirm`: resolves `undefined` instead of throwing on cancel.
49
-
50
- ---
51
-
52
- ## Behavior
53
-
54
- - **Resolve/Reject**: `confirm()` resolves on action click, rejects on cancel or close.
55
- - **Destructive mode**: Adds an alert icon and uses destructive button variant.
56
- - **Custom buttons**: Pass `ActionProps` and `CancelProps` to customize.
57
-
58
- ---
59
-
60
- ## Examples
61
-
62
- ### Destructive
63
-
64
- ```tsx
65
- import { Button } from "laif-ds";
66
- import { Confirmer, confirm } from "laif-ds";
67
-
68
- export function DeleteFile() {
69
- const onClick = async () => {
70
- try {
71
- await confirm({
72
- variant: "destructive",
73
- title: "Permanently delete file?",
74
- description: "This action cannot be undone. The file will be removed permanently.",
75
- cancelText: "Cancel",
76
- actionText: "Delete",
77
- });
78
- console.log("File deleted");
79
- } catch {
80
- console.log("Deletion cancelled");
81
- }
82
- };
83
-
84
- return (
85
- <>
86
- <Button variant="destructive" onClick={onClick}>Delete File</Button>
87
- <Confirmer />
88
- </>
89
- );
90
- }
91
- ```
92
-
93
- ### Custom Text and Buttons
94
-
95
- ```tsx
96
- import { Button } from "laif-ds";
97
- import { Confirmer, confirm } from "laif-ds";
98
-
99
- export function PublishArticle() {
100
- const onClick = async () => {
101
- try {
102
- await confirm({
103
- title: "Publish article?",
104
- description: "This will make your article visible to the public.",
105
- cancelText: "Save as draft",
106
- actionText: "Publish now",
107
- ActionProps: {
108
- variant: "default",
109
- },
110
- });
111
- console.log("Article published");
112
- } catch {
113
- console.log("Article saved as draft");
114
- }
115
- };
116
-
117
- return (
118
- <>
119
- <Button onClick={onClick}>Publish Article</Button>
120
- <Confirmer />
121
- </>
122
- );
123
- }
124
- ```
125
-
126
- ### Multiple Confirmers (independent flows)
127
-
128
- ```tsx
129
- import { Button } from "laif-ds";
130
- import { Confirmer, confirm } from "laif-ds";
131
-
132
- export function MultipleActions() {
133
- const accept1 = async () => {
134
- try {
135
- await confirm({ title: "Confirm action 1", description: "This is the first confirmation dialog." });
136
- console.log("Action 1 confirmed");
137
- } catch {
138
- console.log("Action 1 cancelled");
139
- }
140
- };
141
-
142
- const accept2 = async () => {
143
- try {
144
- await confirm({
145
- title: "Confirm action 2",
146
- description: "This is the second confirmation dialog.",
147
- cancelText: "Reject",
148
- actionText: "Accept",
149
- });
150
- console.log("Action 2 confirmed");
151
- } catch {
152
- console.log("Action 2 cancelled");
153
- }
154
- };
155
-
156
- return (
157
- <>
158
- <div className="flex gap-4">
159
- <Button onClick={accept1}>Action 1</Button>
160
- <Button onClick={accept2}>Action 2</Button>
161
- </div>
162
- <Confirmer />
163
- </>
164
- );
165
- }
166
- ```
167
-
168
- ---
169
-
170
- ## Notes
171
-
172
- - **Mount once**: Add a single `<Confirmer />` near app root.
173
- - **Error handling**: Use `try/catch` with `confirm()`; or `safeConfirm()` to avoid throwing.
174
- - **Theming**: `variant="destructive"` changes icon and button styling accordingly.
175
-
1
+ # Confirmer
2
+
3
+ ## Overview
4
+
5
+ Promise-based confirmation dialog utility built on top of `AlertDialog`. Mount the `Confirmer` component once, then call `confirm()` to open a dialog and await the user decision.
6
+
7
+ ---
8
+
9
+ ## API
10
+
11
+ ### `Confirmer` (Component)
12
+
13
+ Mount this once at app root (or Story scope) to enable dialogs.
14
+
15
+ ```tsx
16
+ import { Confirmer } from "laif-ds";
17
+
18
+ export function AppRoot() {
19
+ return (
20
+ <>
21
+ {/* ...your app... */}
22
+ <Confirmer />
23
+ </>
24
+ );
25
+ }
26
+ ```
27
+
28
+ ### `confirm(options)`
29
+
30
+ Returns a Promise that resolves when the user confirms and rejects when the user cancels.
31
+
32
+ ```ts
33
+ type ConfirmOptions = {
34
+ title?: React.ReactNode;
35
+ description?: React.ReactNode;
36
+ cancelText?: React.ReactNode;
37
+ actionText?: React.ReactNode;
38
+ CancelProps?: React.ComponentProps<typeof AlertDialogCancel>;
39
+ ActionProps?: React.ComponentProps<typeof Button>;
40
+ variant?: "default" | "destructive";
41
+ };
42
+
43
+ declare function confirm(options: ConfirmOptions): Promise<boolean>;
44
+ declare function safeConfirm(
45
+ options: ConfirmOptions,
46
+ ): Promise<boolean | undefined>;
47
+ ```
48
+
49
+ - `variant`: when set to `"destructive"`, shows a destructive style and warning icon.
50
+ - `safeConfirm`: resolves `undefined` instead of throwing on cancel.
51
+
52
+ ---
53
+
54
+ ## Behavior
55
+
56
+ - **Resolve/Reject**: `confirm()` resolves on action click, rejects on cancel or close.
57
+ - **Destructive mode**: Adds an alert icon and uses destructive button variant.
58
+ - **Custom buttons**: Pass `ActionProps` and `CancelProps` to customize.
59
+
60
+ ---
61
+
62
+ ## Examples
63
+
64
+ ### Destructive
65
+
66
+ ```tsx
67
+ import { Button } from "laif-ds";
68
+ import { Confirmer, confirm } from "laif-ds";
69
+
70
+ export function DeleteFile() {
71
+ const onClick = async () => {
72
+ try {
73
+ await confirm({
74
+ variant: "destructive",
75
+ title: "Permanently delete file?",
76
+ description:
77
+ "This action cannot be undone. The file will be removed permanently.",
78
+ cancelText: "Cancel",
79
+ actionText: "Delete",
80
+ });
81
+ console.log("File deleted");
82
+ } catch {
83
+ console.log("Deletion cancelled");
84
+ }
85
+ };
86
+
87
+ return (
88
+ <>
89
+ <Button variant="destructive" onClick={onClick}>
90
+ Delete File
91
+ </Button>
92
+ <Confirmer />
93
+ </>
94
+ );
95
+ }
96
+ ```
97
+
98
+ ### Custom Text and Buttons
99
+
100
+ ```tsx
101
+ import { Button } from "laif-ds";
102
+ import { Confirmer, confirm } from "laif-ds";
103
+
104
+ export function PublishArticle() {
105
+ const onClick = async () => {
106
+ try {
107
+ await confirm({
108
+ title: "Publish article?",
109
+ description: "This will make your article visible to the public.",
110
+ cancelText: "Save as draft",
111
+ actionText: "Publish now",
112
+ ActionProps: {
113
+ variant: "default",
114
+ },
115
+ });
116
+ console.log("Article published");
117
+ } catch {
118
+ console.log("Article saved as draft");
119
+ }
120
+ };
121
+
122
+ return (
123
+ <>
124
+ <Button onClick={onClick}>Publish Article</Button>
125
+ <Confirmer />
126
+ </>
127
+ );
128
+ }
129
+ ```
130
+
131
+ ### Multiple Confirmers (independent flows)
132
+
133
+ ```tsx
134
+ import { Button } from "laif-ds";
135
+ import { Confirmer, confirm } from "laif-ds";
136
+
137
+ export function MultipleActions() {
138
+ const accept1 = async () => {
139
+ try {
140
+ await confirm({
141
+ title: "Confirm action 1",
142
+ description: "This is the first confirmation dialog.",
143
+ });
144
+ console.log("Action 1 confirmed");
145
+ } catch {
146
+ console.log("Action 1 cancelled");
147
+ }
148
+ };
149
+
150
+ const accept2 = async () => {
151
+ try {
152
+ await confirm({
153
+ title: "Confirm action 2",
154
+ description: "This is the second confirmation dialog.",
155
+ cancelText: "Reject",
156
+ actionText: "Accept",
157
+ });
158
+ console.log("Action 2 confirmed");
159
+ } catch {
160
+ console.log("Action 2 cancelled");
161
+ }
162
+ };
163
+
164
+ return (
165
+ <>
166
+ <div className="flex gap-4">
167
+ <Button onClick={accept1}>Action 1</Button>
168
+ <Button onClick={accept2}>Action 2</Button>
169
+ </div>
170
+ <Confirmer />
171
+ </>
172
+ );
173
+ }
174
+ ```
175
+
176
+ ---
177
+
178
+ ## Notes
179
+
180
+ - **Mount once**: Add a single `<Confirmer />` near app root.
181
+ - **Error handling**: Use `try/catch` with `confirm()`; or `safeConfirm()` to avoid throwing.
182
+ - **Theming**: `variant="destructive"` changes icon and button styling accordingly.