react-confirm-lite 1.2.2 → 1.2.4

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Saad Nasir
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,39 +1,40 @@
1
1
  # react-confirm-lite
2
2
 
3
- **A lightweight, promise-based confirm dialog for React with built-in Tailwind CSS support**
3
+ **A lightweight, promise-based confirm dialog for React with built-in styling**
4
4
 
5
5
  ✨ **Features:**
6
6
  - Promise-based API like window.confirm
7
- - Built-in Tailwind CSS styling
7
+ - Built-in styling with multiple color schemes
8
8
  - Zero dependencies
9
9
  - Fully customizable
10
10
  - TypeScript support
11
11
  - Queue system for multiple dialogs
12
+ - Works with Next.js App Router (no 'use client' needed)
13
+ - Automatic CSS injection (no separate imports needed)
12
14
  ---
13
15
 
14
- ## Recomendations
15
- - There were some problems in old versions so I will suggest you to use the latest version. If you are not on latest versions then update it otherwise you may face some problems.
16
- - If you face any problem in the latest version then tell me your problem [@SaadNasir-git](https://github.com/SaadNasir-git).
16
+ ## Recommendations
17
+ - Always use the latest version for bug fixes and improvements
18
+ - If you face any issues, please report them on [GitHub](https://github.com/SaadNasir-git/react-confirm-lite/issues)
17
19
 
18
20
  ## Quick Comparison
19
21
 
20
22
  | Feature | react-confirm-lite | react-confirm | react-confirm-toast |
21
23
  |---------|-------------------|---------------|---------------------|
22
- | Built-in styling | ✅ Tailwind CSS | ❌ None | ✅ Toast style |
24
+ | Built-in styling | ✅ Multiple color schemes | ❌ None | ✅ Toast style |
23
25
  | Promise-based | ✅ | ✅ | ✅ |
24
26
  | Zero dependencies | ✅ | ✅ | ✅ |
25
27
  | Queue system | ✅ | ❌ | ❌ |
26
- | Fully customizeable | ✅ | | |
28
+ | Automatic CSS | ✅ No separate imports | | |
29
+ | Next.js App Router | ✅ Works out of the box | ❌ Needs 'use client' | ✅ |
27
30
 
28
31
  ## Why Choose react-confirm-lite?
29
32
 
30
- If you're using **Tailwind CSS** and want a **simple, lightweight** confirm dialog with **no configuration needed**, `react-confirm-lite` is perfect. You can also build custom confirm dialogs from scratch with ease.
31
-
32
- ![react-confirm-lite Sample](https://res.cloudinary.com/dhcqn5bmq/image/upload/v1765971775/Screencastfrom2025-12-1716-38-30-ezgif.com-optimize_ydzrow.gif)
33
+ If you want a **simple, lightweight** confirm dialog that **just works** without any configuration, `react-confirm-lite` is perfect. No separate CSS imports, no 'use client' directives needed in Next.js App Router, and fully customizable when you need it.
33
34
 
34
35
  ## 🔗 Live Demo
35
36
 
36
- [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/edit/vitejs-vite-bfthlpmw?embed=1&file=src%2FApp.tsx&hideExplorer=1)
37
+ [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/edit/vitejs-vite-bfthlpmw?file=src%2FApp.tsx)
37
38
 
38
39
  ## Getting Started
39
40
 
@@ -42,261 +43,336 @@ If you're using **Tailwind CSS** and want a **simple, lightweight** confirm dial
42
43
  npm install react-confirm-lite
43
44
  ```
44
45
 
45
- ### Step 2: import
46
- ```ts
47
- import { confirm, ConfirmContainer } from 'react-confirm-lite'
46
+ ### Step 2: Import in your component:
47
+ ```tsx
48
+ import { confirm, ConfirmContainer } from 'react-confirm-lite';
48
49
  ```
49
- ### Step 3: Use ConfirmContainer in your jsx or tsx file
50
+
51
+ ### Step 3: Add ConfirmContainer to your component tree:
50
52
  ```jsx
51
- return (
53
+ function App() {
54
+ return (
52
55
  <>
53
56
  <ConfirmContainer />
57
+ {/* Your app content */}
54
58
  </>
55
- )
56
- ```
57
- ### Step 4: Use confirm function
58
- ```ts
59
- const main = async () => {
60
- const isConfirmed = await confirm('Are you sure');
61
- if (isConfirmed) {
62
- console.log('you are confirmed')
63
- }
64
- }
59
+ );
60
+ }
65
61
  ```
66
- or
67
- ```ts
68
- const main = async () => {
69
- const isConfirmed = await confirm({
70
- title: "Delete Item",
71
- message:'Are you sure?',
72
- cancelText:'no',
73
- okText:'yes',
74
- colorSchema:'dark'
75
- });
76
- if (isConfirmed) {
77
- console.log('you are confirmed')
78
- }
62
+
63
+ ### Step 4: Use the confirm function:
64
+ ```tsx
65
+ const handleAction = async () => {
66
+ const isConfirmed = await confirm('Are you sure?');
67
+ if (isConfirmed) {
68
+ // Perform action
69
+ console.log('Confirmed!');
79
70
  }
71
+ };
80
72
  ```
81
- ## Complete Example
73
+
74
+ ### Complete Example:
82
75
 
83
76
  ```tsx
84
- 'use client' //If you are using nextjs then add this line
85
- import { confirm, ConfirmContainer } from 'react-confirm-lite'
77
+ import { confirm, ConfirmContainer } from 'react-confirm-lite';
86
78
 
87
- export default function Page() {
79
+ function App() {
88
80
  const handleDelete = async () => {
89
- const isConfirmed = await confirm('Are you sure you want to delete?')
81
+ const isConfirmed = await confirm('Are you sure you want to delete this item?');
90
82
  if (isConfirmed) {
91
- // Perform deletion
92
- console.log('Item deleted')
83
+ // Delete logic here
84
+ console.log('Item deleted');
93
85
  }
94
- }
86
+ };
95
87
 
96
88
  return (
97
89
  <div>
98
90
  <button onClick={handleDelete}>Delete Item</button>
99
91
  <ConfirmContainer />
100
92
  </div>
101
- )
93
+ );
102
94
  }
103
95
  ```
104
- ## How to customize
105
- If you just want to change the colorSchema then you can do this
106
- ```jsx
107
- <ConfirmContainer defaultColorSchema='light'/>
108
- ```
109
- There are multiple color schemas which are
110
-
111
- - light
112
- - dark
113
- - blue
114
- - red
115
- - green
116
- - purple
117
96
 
118
- You can customize it by giving classes like this
119
- ```jsx
120
- <ConfirmContainer classes={{button:'text-sm' , cancel:'bg-white-100' , ok:'bg-red-500' , message:'text-gray-600' , overlay:'bg-white-100' , title:'text-2xl' , wrapper:'bg-blue-500'}}/>
121
- ```
122
- If you want more customization then you can pass children like this
123
- ```jsx
124
- return (
125
- <div>
126
- <ConfirmContainer animationDuration={1000}>
127
- {({ isVisible, confirm, handleCancel, handleOk }) => (
128
- <div className={`bg-white rounded-lg shadow-xl p-6 w-full max-w-md mx-4 ${!isVisible ? 'ease-out duration-1000 opacity-0' : 'ease-in duration-1000 opacity-100'}
129
- `}>
130
- <h2 className="text-lg font-medium text-gray-900 mb-2 text-center">
131
- {confirm.title}
132
- </h2>
133
-
134
- <p className="text-gray-500 text-center mb-6">
135
- {confirm.message}
136
- </p>
137
-
138
- <div className="flex gap-3 w-full">
139
- <button
140
- className="flex-1 py-2 px-4 border border-gray-300 rounded-md text-gray-700 hover:bg-gray-50 transition-colors"
141
- onClick={handleCancel}
142
- >
143
- {confirm.cancelText || 'Cancel'}
144
- </button>
145
- <button
146
- className="flex-1 py-2 px-4 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors"
147
- onClick={handleOk}
148
- >
149
- {confirm.okText || 'Ok'}
150
- </button>
151
- </div>
152
- </div>
153
- )}
154
- </ConfirmContainer>
155
- </div>
156
- )
157
- ```
158
- ## Using with Next.js and want to add the ConfirmContainer in layout.tsx
159
- If you will directly add the ConfirmContainer in layout.tsx then it will throw an error this problem can be solve easily.
160
- Make the client side component and then add the ConfirmContainer in this client side component like this.
161
- ```jsx
162
- 'use client'
163
- import { ConfirmContainer } from "react-confirm-lite"
164
-
165
- const ClientSideConfirm = () => {
166
- return (
167
- <>
168
- <ConfirmContainer />
169
- </>
170
- )
171
- }
97
+ ## Advanced Usage
172
98
 
173
- export default ClientSideConfirm
99
+ ### Custom Options:
100
+ ```tsx
101
+ const handleCustomConfirm = async () => {
102
+ const isConfirmed = await confirm({
103
+ title: "Delete Item",
104
+ message: "This action cannot be undone. Are you sure?",
105
+ cancelText: 'No, keep it',
106
+ okText: 'Yes, delete',
107
+ colorSchema: 'red',
108
+ isDestructive: true
109
+ });
110
+
111
+ if (isConfirmed) {
112
+ // Delete item
113
+ }
114
+ };
174
115
  ```
175
- and then simply use this component in layout.tsx
176
116
 
177
- ## Installation
178
-
179
- ```bash
180
- npm install react-confirm-lite
181
- # or
182
- yarn add react-confirm-lite
183
- # or
184
- pnpm add react-confirm-lite
117
+ ### Custom Color Scheme:
118
+ ```jsx
119
+ <ConfirmContainer defaultColorSchema="light" />
120
+ // Available options: 'light', 'dark', 'blue', 'red', 'green', 'purple'
185
121
  ```
186
122
 
187
- ## Props
188
-
189
- ### ConfirmContainer
190
- - `animationDuration` (optional): Animation duration in milliseconds. Default: `300`
191
- - `defaultColorSchema` (optional): To change color schema. Default: `dark`
192
- - `classes` (optional): Custom CSS classes for styling
193
- - `children` (optional): Render prop for complete customization
194
-
195
- ## TypeScript Support
196
-
197
- Fully typed with TypeScript. Includes types for all props and the confirm function.
198
-
199
- ## More Examples
200
-
201
- ### Custom Styling with Classes
202
- ```tsx
203
- <ConfirmContainer
123
+ ### Custom Styling:
124
+ ```jsx
125
+ <ConfirmContainer
204
126
  classes={{
205
- overlay: "bg-black/70",
206
- wrapper: "rounded-xl border-2",
207
- title: "font-bold text-xl",
127
+ overlay: "bg-black/50",
128
+ wrapper: "rounded-xl shadow-2xl",
129
+ title: "text-2xl font-bold",
208
130
  message: "text-gray-600",
209
- button: "px-6 py-2 rounded-lg",
210
- cancel: "bg-gray-200 hover:bg-gray-300",
211
- ok: "bg-green-600 hover:bg-green-700 text-white"
131
+ button: "px-6 py-3 rounded-lg font-medium",
132
+ cancel: "border border-gray-300 hover:bg-gray-50",
133
+ ok: "bg-blue-600 hover:bg-blue-700 text-white"
212
134
  }}
213
135
  />
214
136
  ```
137
+
138
+ ### Fully Custom UI with Render Prop:
215
139
  ```jsx
216
- <ConfirmContainer>
140
+ <ConfirmContainer animationDuration={500}>
217
141
  {({ isVisible, confirm, handleCancel, handleOk }) => (
218
- <div className={`dialog ${isVisible ? 'show' : 'hide'}`}>
219
- <div className="icon">⚠️</div>
220
- <h3>{confirm.title}</h3>
221
- <p>{confirm.message}</p>
222
- <div className="buttons">
223
- <button onClick={handleCancel}>{confirm.cancelText || 'No'}</button>
224
- <button onClick={handleOk}>{confirm.okText || 'Yes'}</button>
142
+ <div className={`modal ${isVisible ? 'show' : 'hide'}`}>
143
+ <div className="modal-content">
144
+ <h2>{confirm.title}</h2>
145
+ <p>{confirm.message}</p>
146
+ <div className="modal-actions">
147
+ <button onClick={handleCancel}>
148
+ {confirm.cancelText || 'Cancel'}
149
+ </button>
150
+ <button onClick={handleOk}>
151
+ {confirm.okText || 'OK'}
152
+ </button>
153
+ </div>
225
154
  </div>
226
155
  </div>
227
156
  )}
228
157
  </ConfirmContainer>
229
158
  ```
159
+
160
+ ## Next.js App Router Support
161
+
162
+ Works automatically! No 'use client' directive needed for the library. The library handles everything internally.
163
+
164
+ ### Server Components Example:
165
+ ```tsx
166
+ // app/layout.tsx
167
+ import { ConfirmContainer } from 'react-confirm-lite';
168
+
169
+ export default function RootLayout({
170
+ children,
171
+ }: {
172
+ children: React.ReactNode;
173
+ }) {
174
+ return (
175
+ <html lang="en">
176
+ <body>
177
+ {children}
178
+ <ConfirmContainer />
179
+ </body>
180
+ </html>
181
+ );
182
+ }
183
+ ```
184
+ ```tsx
185
+ // app/page.tsx (server component)
186
+ import { confirm } from 'react-confirm-lite';
187
+
188
+ export default async function Page() {
189
+ // Server-side logic here
190
+
191
+ return (
192
+ <form action={async () => {
193
+ 'use server';
194
+ const isConfirmed = await confirm('Are you sure?');
195
+ if (isConfirmed) {
196
+ // Server action
197
+ }
198
+ }}>
199
+ <button>Submit</button>
200
+ </form>
201
+ );
202
+ }
203
+ ```
204
+
205
+ ### Client Component Example:
206
+ ```tsx
207
+ 'use client';
208
+ import { confirm, ConfirmContainer } from 'react-confirm-lite';
209
+
210
+ export default function ClientComponent() {
211
+ const handleClick = async () => {
212
+ const result = await confirm('Confirm action?');
213
+ if (result) {
214
+ // Handle confirmation
215
+ }
216
+ };
217
+
218
+ return (
219
+ <div>
220
+ <button onClick={handleClick}>Click me</button>
221
+ <ConfirmContainer />
222
+ </div>
223
+ );
224
+ }
225
+ ```
226
+
230
227
  ## API Reference
231
228
 
232
229
  ### `confirm(message: string | ConfirmOptions): Promise<boolean>`
233
230
 
234
- Displays a confirmation dialog and returns a promise that resolves to `true` (confirmed) or `false` (cancelled).
231
+ Displays a confirmation dialog. Returns a promise that resolves to `true` if confirmed, `false` if cancelled.
235
232
 
236
- **Parameters:**
237
- - `message`: String or object with `title` and `message` properties
238
- **Examples:**
233
+ **String usage:**
239
234
  ```ts
240
- // Simple string
241
- await confirm('Are you sure?')
235
+ await confirm('Simple message');
236
+ // Equivalent to: { title: 'Confirm', message: 'Simple message' }
237
+ ```
242
238
 
243
- // With custom title
239
+ **Object usage:**
240
+ ```ts
244
241
  await confirm({
245
242
  title: 'Warning',
246
243
  message: 'This action cannot be undone',
247
- cancelText:'no',
248
- okText:'yes',
249
- colorSchema:'dark'
250
- })
244
+ cancelText: 'Cancel',
245
+ okText: 'Delete',
246
+ colorSchema: 'red',
247
+ isDestructive: true
248
+ });
251
249
  ```
252
- ## Types
253
- You can also import types which I think you may need some times these are following:
254
250
 
255
- - ConfirmInput
256
- - ConfirmOptions
257
- - ConfirmClasses
258
- - ColorSchema
251
+ ### `ConfirmContainer` Props:
252
+
253
+ | Prop | Type | Default | Description |
254
+ |------|------|---------|-------------|
255
+ | `defaultColorSchema` | `ColorSchema` | `'dark'` | Default color scheme |
256
+ | `animationDuration` | `number` | `300` | Animation duration in ms |
257
+ | `classes` | `ConfirmClasses` | `{}` | Custom CSS classes |
258
+ | `children` | Render function | - | For complete UI customization |
259
+
260
+ ### Types:
261
+ ```ts
262
+ type ColorSchema = 'light' | 'dark' | 'blue' | 'red' | 'green' | 'purple';
263
+
264
+ interface ConfirmClasses {
265
+ overlay?: string;
266
+ wrapper?: string;
267
+ title?: string;
268
+ message?: string;
269
+ button?: string;
270
+ cancel?: string;
271
+ ok?: string;
272
+ }
273
+
274
+ interface ConfirmOptions {
275
+ title?: string;
276
+ message: string;
277
+ cancelText?: string;
278
+ okText?: string;
279
+ colorSchema?: ColorSchema;
280
+ isDestructive?: boolean;
281
+ }
282
+ ```
259
283
 
260
284
  ## Troubleshooting
261
285
 
262
- ### Dialog not showing?
263
- Make sure you've added `<ConfirmContainer />` to your component tree.
286
+ ### Dialog not appearing?
287
+ - Make sure `<ConfirmContainer />` is rendered in your component tree
288
+ - Check that you're not conditionally rendering it in a way that unmounts it
264
289
 
265
- ### Multiple confirms overlapping?
266
- The library includes a built-in queue system to handle multiple confirm requests.
290
+ ### Multiple dialogs overlapping?
291
+ - The library has a built-in queue system that handles multiple confirm requests sequentially
267
292
 
268
- ### Custom styling not working?
269
- When using the `classes` prop, make sure your CSS classes have higher specificity or use `!important` if needed.
293
+ ### Styling not working?
294
+ - If using custom classes, ensure they have proper CSS specificity
295
+ - Try using `!important` flag for custom styles if needed
296
+ - Make sure you're on the latest version
270
297
 
271
- ### Rendering again and again
272
- Yes this problem I were noticed in the early versions but I have fixed it. So, make sure that you have the latest version of this.
298
+ ### Animation issues with custom UI?
299
+ - When using the `children` render prop, use the `isVisible` prop for animations
300
+ - Set appropriate `animationDuration` to match your CSS transitions
273
301
 
274
- ### Dialog closing after some time
275
- If you are making your custom dialog then you can face this problem so make sure that you have added animationDuration like this
302
+ ### Next.js hydration errors?
303
+ - The library is designed to work with Next.js App Router
304
+ - If using in a layout, ensure it's placed after dynamic content
276
305
 
277
- ### Custom styling does not working
278
- This problem exists in old version so, make sure that you are using the latest version and if you are on latest version but it is not working yet then use !important flag in your css file
306
+ ## Features in Detail
279
307
 
280
- ```tsx
281
- <ConfirmContainer animationDuration={0}>
282
- {/*Your code*/}
283
- </ConfirmContainer>
284
- ```
308
+ ### 🎨 Multiple Color Schemes
309
+ Six built-in color schemes: light, dark, blue, red, green, purple. Set globally or per confirm dialog.
310
+
311
+ ### 🔄 Queue System
312
+ Multiple confirm requests are queued and shown one at a time, preventing overlapping dialogs.
313
+
314
+ ### 🎯 Zero Configuration
315
+ Works out of the box with default styling. No CSS imports needed.
316
+
317
+ ### 🔧 Fully Customizable
318
+ From simple class overrides to complete UI replacement with render props.
319
+
320
+ ### 📱 Responsive Design
321
+ Built-in responsive styling that works on all screen sizes.
322
+
323
+ ### 🔒 Type Safety
324
+ Full TypeScript support with comprehensive type definitions.
325
+
326
+ ## Performance
327
+
328
+ - **Zero dependencies**: Only React as a peer dependency
329
+ - **Tree-shakeable**: Only imports what you use
330
+ - **Small bundle size**: ~5KB gzipped (including styles)
331
+ - **Optimized renders**: Minimal re-renders with React.memo
332
+
333
+ ## Migration from Older Versions
334
+
335
+ If you're upgrading from version <1.3.0:
336
+
337
+ 1. **'use client' not needed**: The library handles this internally
338
+ 2. **Simpler API**: Same functions, better internals
339
+
340
+
341
+ ## Contributing
342
+
343
+ Contributions are welcome! Please:
344
+
345
+ 1. Fork the repository
346
+ 2. Create a feature branch
347
+ 3. Add tests for your changes
348
+ 4. Submit a pull request
285
349
 
286
350
  ## Author
287
351
 
288
- My name is **Saad Nasir**. I am a full stack web developer and I am alone who is working on this so please contribute with me to make it more better.
352
+ **Saad Nasir** - Full Stack Developer
289
353
  - GitHub: [@SaadNasir-git](https://github.com/SaadNasir-git)
290
- - Facebook: [@Saad Nasir](https://www.facebook.com/profile.php?id=61583190691187)
291
- ## Contributing
354
+ - For support: Open an issue on GitHub
355
+
356
+ ## License
292
357
 
293
- Contributions are welcome! Please feel free to submit a Pull Request.
358
+ MIT © Saad Nasir
294
359
 
360
+ ---
295
361
 
296
362
  ![npm version](https://img.shields.io/npm/v/react-confirm-lite)
297
363
  ![bundle size](https://img.shields.io/bundlephobia/minzip/react-confirm-lite)
298
364
  ![npm downloads](https://img.shields.io/npm/dm/react-confirm-lite)
299
365
  ![license](https://img.shields.io/npm/l/react-confirm-lite)
300
366
  ![typescript](https://img.shields.io/badge/types-TypeScript-blue)
301
- ![react](https://img.shields.io/badge/react-%3E%3D16.8-blue)
302
- ![maintenance](https://img.shields.io/badge/maintained-yes-brightgreen)
367
+ ![react](https://img.shields.io/badge/react-%3E%3D18-blue)
368
+ ![next.js](https://img.shields.io/badge/next.js-15+-black)
369
+
370
+ ## Support
371
+
372
+ If you find this library helpful, please consider:
373
+ - ⭐ Starring the repository on GitHub
374
+ - 📢 Sharing with your network
375
+ - 🐛 Reporting issues you encounter
376
+ - 💡 Suggesting new features
377
+
378
+ Happy coding! 🚀
package/dist/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Saad Nasir
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.