@lax-wp/design-system 0.1.0 → 0.1.2
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 +526 -16
- package/dist/components/data-display/badge/Badge.d.ts +44 -0
- package/dist/components/data-display/banner/Banner.d.ts +41 -0
- package/dist/components/data-display/code-editor/CodeEditor.d.ts +4 -0
- package/dist/components/data-display/code-editor/JsonGrid.d.ts +14 -0
- package/dist/components/data-display/code-editor/Tabs.d.ts +12 -0
- package/dist/components/data-display/pdf-viewer/PdfViewer.d.ts +45 -0
- package/dist/components/data-display/popper/Popper.d.ts +57 -0
- package/dist/components/data-display/status-color-mapping/StatusColorMapping.d.ts +29 -0
- package/dist/components/data-display/typography/Typography.d.ts +15 -0
- package/dist/components/feedback/toast/Toast.d.ts +29 -0
- package/dist/components/forms/checkbox/Checkbox.d.ts +55 -0
- package/dist/components/forms/color-picker/ColorPicker.d.ts +60 -0
- package/dist/components/forms/creatable-select/CreatableSelect.d.ts +92 -0
- package/dist/components/forms/currency-input/CurrencyInputField.d.ts +73 -0
- package/dist/components/forms/currency-input/currency.constant.d.ts +6 -0
- package/dist/components/forms/date-range/DateRange.d.ts +72 -0
- package/dist/components/forms/debounce-input/DebounceInputField.d.ts +76 -0
- package/dist/components/forms/input-field/InputField.d.ts +62 -0
- package/dist/components/forms/percentage-input/PercentageInputField.d.ts +75 -0
- package/dist/components/forms/text-field/TextField.d.ts +48 -0
- package/dist/components/forms/toggle/Toggle.d.ts +71 -0
- package/dist/components/tooltip/Tooltip.d.ts +13 -0
- package/dist/design-system.css +1 -0
- package/dist/hooks/useOutsideClick.d.ts +28 -0
- package/dist/hooks/usePythonSyntax.d.ts +28 -0
- package/dist/hooks/useTheme.d.ts +6 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.es.js +25703 -4806
- package/dist/index.umd.js +225 -31
- package/dist/services/monacoManager.d.ts +28 -0
- package/dist/types/index.d.ts +66 -0
- package/dist/utils/messageConstants.d.ts +16 -0
- package/dist/utils/utilities.d.ts +13 -0
- package/package.json +40 -13
package/README.md
CHANGED
|
@@ -1,11 +1,521 @@
|
|
|
1
|
-
#
|
|
1
|
+
# LAX Web Portal Design System
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A comprehensive React + TypeScript design system built with Vite, providing reusable UI components for the LAX web portal applications. Features a complete set of form components, data display elements, and interactive controls with full TypeScript support, accessibility features, and dark mode compatibility.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 🎨 Features
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
7
|
+
- **📦 Comprehensive Component Library**: Form inputs, toggles, date ranges, currency fields, and more
|
|
8
|
+
- **📚 Storybook Documentation**: Interactive component documentation with live examples
|
|
9
|
+
- **🎯 TypeScript Support**: Full type safety with comprehensive interfaces and JSDoc
|
|
10
|
+
- **⚡ Fast Development**: Vite + HMR for lightning-fast development experience
|
|
11
|
+
- **🌙 Dark Mode**: Complete dark theme support across all components
|
|
12
|
+
- **♿ Accessibility**: ARIA attributes, keyboard navigation, and screen reader support
|
|
13
|
+
- **🎭 Animations**: Smooth transitions using Framer Motion
|
|
14
|
+
- **🔧 ESLint Configuration**: Consistent code quality and formatting
|
|
15
|
+
- **📱 Responsive Design**: Mobile-first responsive components
|
|
16
|
+
- **🎪 Interactive Stories**: Comprehensive Storybook examples with playgrounds
|
|
17
|
+
|
|
18
|
+
## 📚 Component Library
|
|
19
|
+
|
|
20
|
+
### Form Components
|
|
21
|
+
|
|
22
|
+
- **InputField**: Basic text input with validation
|
|
23
|
+
- **TextField**: Enhanced text input with additional features
|
|
24
|
+
- **CurrencyInputField**: Currency input with multi-currency support
|
|
25
|
+
- **PercentageInputField**: Percentage input with constraints and validation
|
|
26
|
+
- **DebounceInputField**: Debounced input for search and real-time scenarios
|
|
27
|
+
- **DateRange**: Date range picker with validation
|
|
28
|
+
- **Checkbox**: Customizable checkbox with multiple variants
|
|
29
|
+
- **Toggle**: Switch component with icons and flexible positioning
|
|
30
|
+
- **ColorPicker**: Color selection with multiple format support
|
|
31
|
+
- **CreatableSelect**: Enhanced select with creation capabilities
|
|
32
|
+
|
|
33
|
+
### Data Display
|
|
34
|
+
|
|
35
|
+
- **Typography**: Consistent text styling component
|
|
36
|
+
|
|
37
|
+
## 🚀 Getting Started
|
|
38
|
+
|
|
39
|
+
### Prerequisites
|
|
40
|
+
|
|
41
|
+
- Node.js 18+
|
|
42
|
+
- npm or yarn package manager
|
|
43
|
+
|
|
44
|
+
### Installation
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# Clone the repository
|
|
48
|
+
git clone <repository-url>
|
|
49
|
+
cd lax-wp-design-system
|
|
50
|
+
|
|
51
|
+
# Install dependencies
|
|
52
|
+
npm install
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Development
|
|
56
|
+
|
|
57
|
+
Start the development server with hot module replacement:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npm run dev
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
This will start the Vite development server at `http://localhost:5173`
|
|
64
|
+
|
|
65
|
+
### Storybook
|
|
66
|
+
|
|
67
|
+
Run Storybook for interactive component documentation:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npm run storybook
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Storybook will be available at `http://localhost:6006`
|
|
74
|
+
|
|
75
|
+
### Build
|
|
76
|
+
|
|
77
|
+
Build the library for production:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npm run build
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
This generates:
|
|
84
|
+
|
|
85
|
+
- `dist/` - Built library files
|
|
86
|
+
- Type declarations for TypeScript support
|
|
87
|
+
|
|
88
|
+
## 🔧 Local Development with Yalc
|
|
89
|
+
|
|
90
|
+
[Yalc](https://github.com/wclr/yalc) is a tool for working with npm packages locally. It's perfect for testing your design system changes in other React applications before publishing.
|
|
91
|
+
|
|
92
|
+
### Installing Yalc
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Install yalc globally
|
|
96
|
+
npm install -g yalc
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Setting Up the Design System for Local Development
|
|
100
|
+
|
|
101
|
+
1. **Build and publish locally:**
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# In the design system directory
|
|
105
|
+
npm run build
|
|
106
|
+
yalc publish
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
2. **Watch for changes (optional):**
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# Run this in a separate terminal for auto-rebuild on changes
|
|
113
|
+
npm run build --watch
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Using the Design System in Another React App
|
|
117
|
+
|
|
118
|
+
1. **Add the local package:**
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# In your React app directory
|
|
122
|
+
yalc add @lax-wp/design-system
|
|
123
|
+
npm install
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
2. **Import and use components:**
|
|
127
|
+
|
|
128
|
+
```tsx
|
|
129
|
+
// In your React app
|
|
130
|
+
import {
|
|
131
|
+
CurrencyInputField,
|
|
132
|
+
Toggle,
|
|
133
|
+
DateRange,
|
|
134
|
+
DebounceInputField,
|
|
135
|
+
PercentageInputField,
|
|
136
|
+
ColorPicker,
|
|
137
|
+
Checkbox,
|
|
138
|
+
CreatableSelectField,
|
|
139
|
+
} from "@lax-wp/design-system";
|
|
140
|
+
|
|
141
|
+
function App() {
|
|
142
|
+
const [currency, setCurrency] = useState<number | null>(null);
|
|
143
|
+
const [isEnabled, setIsEnabled] = useState(false);
|
|
144
|
+
|
|
145
|
+
return (
|
|
146
|
+
<div className="p-6">
|
|
147
|
+
<CurrencyInputField
|
|
148
|
+
id="price"
|
|
149
|
+
label="Product Price"
|
|
150
|
+
value={currency}
|
|
151
|
+
onChange={(value, currencyCode) => setCurrency(value)}
|
|
152
|
+
allowCurrencyChange
|
|
153
|
+
required
|
|
154
|
+
/>
|
|
155
|
+
|
|
156
|
+
<Toggle
|
|
157
|
+
id="notifications"
|
|
158
|
+
label="Enable Notifications"
|
|
159
|
+
checked={isEnabled}
|
|
160
|
+
onChange={setIsEnabled}
|
|
161
|
+
/>
|
|
162
|
+
</div>
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
3. **Include Tailwind CSS:**
|
|
168
|
+
The design system uses Tailwind CSS. Make sure your React app has Tailwind configured with the same classes. Add to your `tailwind.config.js`:
|
|
169
|
+
|
|
170
|
+
```js
|
|
171
|
+
module.exports = {
|
|
172
|
+
content: [
|
|
173
|
+
"./src/**/*.{js,jsx,ts,tsx}",
|
|
174
|
+
"./node_modules/@lax-wp/design-system/dist/**/*.{js,jsx,ts,tsx}",
|
|
175
|
+
],
|
|
176
|
+
theme: {
|
|
177
|
+
extend: {
|
|
178
|
+
colors: {
|
|
179
|
+
primary: {
|
|
180
|
+
50: "#eff6ff",
|
|
181
|
+
500: "#3b82f6",
|
|
182
|
+
600: "#2563eb",
|
|
183
|
+
// ... add your color palette
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Updating the Local Package
|
|
192
|
+
|
|
193
|
+
When you make changes to the design system:
|
|
194
|
+
|
|
195
|
+
1. **Rebuild and update:**
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
# In the design system directory
|
|
199
|
+
npm run build
|
|
200
|
+
yalc push
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
2. **The changes will be automatically updated in your React app!**
|
|
204
|
+
|
|
205
|
+
### Removing the Local Package
|
|
206
|
+
|
|
207
|
+
When you're done with local development:
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# In your React app directory
|
|
211
|
+
yalc remove @lax-wp/design-system
|
|
212
|
+
npm install @lax-wp/design-system # Install from npm registry
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## 📱 Usage Examples
|
|
216
|
+
|
|
217
|
+
### Basic Form with Validation
|
|
218
|
+
|
|
219
|
+
```tsx
|
|
220
|
+
import { useState } from "react";
|
|
221
|
+
import {
|
|
222
|
+
CurrencyInputField,
|
|
223
|
+
PercentageInputField,
|
|
224
|
+
DateRange,
|
|
225
|
+
Toggle,
|
|
226
|
+
type DateRangeValue,
|
|
227
|
+
} from "@lax-wp/design-system";
|
|
228
|
+
|
|
229
|
+
function PricingForm() {
|
|
230
|
+
const [price, setPrice] = useState<number | null>(null);
|
|
231
|
+
const [discount, setDiscount] = useState<number | null>(null);
|
|
232
|
+
const [dateRange, setDateRange] = useState<DateRangeValue>({
|
|
233
|
+
startDate: null,
|
|
234
|
+
endDate: null,
|
|
235
|
+
});
|
|
236
|
+
const [isActive, setIsActive] = useState(false);
|
|
237
|
+
|
|
238
|
+
const isValid =
|
|
239
|
+
price && price > 0 && dateRange.startDate && dateRange.endDate;
|
|
240
|
+
|
|
241
|
+
return (
|
|
242
|
+
<form className="space-y-4 max-w-md">
|
|
243
|
+
<CurrencyInputField
|
|
244
|
+
id="price"
|
|
245
|
+
label="Product Price"
|
|
246
|
+
value={price}
|
|
247
|
+
onChange={(value) => setPrice(value)}
|
|
248
|
+
currencyCode="USD"
|
|
249
|
+
allowCurrencyChange
|
|
250
|
+
required
|
|
251
|
+
message={price === null ? "Price is required" : undefined}
|
|
252
|
+
messageType={price === null ? "error" : "default"}
|
|
253
|
+
/>
|
|
254
|
+
|
|
255
|
+
<PercentageInputField
|
|
256
|
+
id="discount"
|
|
257
|
+
label="Discount Rate"
|
|
258
|
+
value={discount}
|
|
259
|
+
onChange={setDiscount}
|
|
260
|
+
min={0}
|
|
261
|
+
max={50}
|
|
262
|
+
helpText="Maximum discount allowed is 50%"
|
|
263
|
+
/>
|
|
264
|
+
|
|
265
|
+
<DateRange
|
|
266
|
+
id="validity"
|
|
267
|
+
label="Validity Period"
|
|
268
|
+
value={dateRange}
|
|
269
|
+
onChange={setDateRange}
|
|
270
|
+
required
|
|
271
|
+
minDate={new Date()}
|
|
272
|
+
/>
|
|
273
|
+
|
|
274
|
+
<Toggle
|
|
275
|
+
id="active"
|
|
276
|
+
label="Activate Pricing"
|
|
277
|
+
checked={isActive}
|
|
278
|
+
onChange={setIsActive}
|
|
279
|
+
disabled={!isValid}
|
|
280
|
+
message={isValid ? "Ready to activate" : "Complete all fields first"}
|
|
281
|
+
messageType={isValid ? "success" : "info"}
|
|
282
|
+
/>
|
|
283
|
+
|
|
284
|
+
<button
|
|
285
|
+
type="submit"
|
|
286
|
+
disabled={!isValid || !isActive}
|
|
287
|
+
className="w-full py-2 px-4 bg-blue-600 text-white rounded disabled:opacity-50"
|
|
288
|
+
>
|
|
289
|
+
Save Pricing
|
|
290
|
+
</button>
|
|
291
|
+
</form>
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Search with Debounced Input
|
|
297
|
+
|
|
298
|
+
```tsx
|
|
299
|
+
import { useState } from "react";
|
|
300
|
+
import { DebounceInputField } from "@lax-wp/design-system";
|
|
301
|
+
|
|
302
|
+
function SearchExample() {
|
|
303
|
+
const [searchTerm, setSearchTerm] = useState("");
|
|
304
|
+
const [results, setResults] = useState<string[]>([]);
|
|
305
|
+
|
|
306
|
+
const handleSearch = async (term: string) => {
|
|
307
|
+
if (!term.trim()) {
|
|
308
|
+
setResults([]);
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Simulate API call
|
|
313
|
+
const mockResults = await fetch(`/api/search?q=${term}`);
|
|
314
|
+
const data = await mockResults.json();
|
|
315
|
+
setResults(data);
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
return (
|
|
319
|
+
<div>
|
|
320
|
+
<DebounceInputField
|
|
321
|
+
id="search"
|
|
322
|
+
label="Search Products"
|
|
323
|
+
type="search"
|
|
324
|
+
value={searchTerm}
|
|
325
|
+
onChange={(value) => {
|
|
326
|
+
setSearchTerm(value);
|
|
327
|
+
handleSearch(value);
|
|
328
|
+
}}
|
|
329
|
+
debounceTimeout={300}
|
|
330
|
+
placeholder="Type to search..."
|
|
331
|
+
helpText="Results appear as you type"
|
|
332
|
+
/>
|
|
333
|
+
|
|
334
|
+
<div className="mt-4">
|
|
335
|
+
{results.map((result, index) => (
|
|
336
|
+
<div key={index} className="p-2 border-b">
|
|
337
|
+
{result}
|
|
338
|
+
</div>
|
|
339
|
+
))}
|
|
340
|
+
</div>
|
|
341
|
+
</div>
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
## 🎨 Theming and Customization
|
|
347
|
+
|
|
348
|
+
### Using with Custom Themes
|
|
349
|
+
|
|
350
|
+
```tsx
|
|
351
|
+
// Add custom CSS variables for theming
|
|
352
|
+
:root {
|
|
353
|
+
--primary-50: #eff6ff;
|
|
354
|
+
--primary-500: #3b82f6;
|
|
355
|
+
--primary-600: #2563eb;
|
|
356
|
+
--error-500: #ef4444;
|
|
357
|
+
--success-500: #10b981;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// Dark mode support
|
|
361
|
+
.dark {
|
|
362
|
+
--primary-50: #1e40af;
|
|
363
|
+
--primary-500: #60a5fa;
|
|
364
|
+
--primary-600: #3b82f6;
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Custom Component Styling
|
|
369
|
+
|
|
370
|
+
```tsx
|
|
371
|
+
import { CurrencyInputField } from "@lax-wp/design-system";
|
|
372
|
+
|
|
373
|
+
function CustomStyledComponent() {
|
|
374
|
+
return (
|
|
375
|
+
<CurrencyInputField
|
|
376
|
+
id="custom"
|
|
377
|
+
label="Custom Styled Price"
|
|
378
|
+
wrapperClassName="bg-gradient-to-r from-blue-50 to-purple-50 p-4 rounded-lg"
|
|
379
|
+
inputClassName="border-2 border-purple-300 focus:border-purple-500"
|
|
380
|
+
labelClassName="text-purple-800 font-bold"
|
|
381
|
+
onChange={() => {}}
|
|
382
|
+
/>
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
## 🔍 TypeScript Support
|
|
388
|
+
|
|
389
|
+
The design system is built with TypeScript and provides comprehensive type definitions:
|
|
390
|
+
|
|
391
|
+
```tsx
|
|
392
|
+
import type {
|
|
393
|
+
CurrencyInputFieldProps,
|
|
394
|
+
DateRangeValue,
|
|
395
|
+
ToggleProps,
|
|
396
|
+
SelectOption,
|
|
397
|
+
} from "@lax-wp/design-system";
|
|
398
|
+
|
|
399
|
+
// All props are fully typed
|
|
400
|
+
const config: CurrencyInputFieldProps = {
|
|
401
|
+
id: "price",
|
|
402
|
+
label: "Price",
|
|
403
|
+
onChange: (value: number | null, currency: string) => {
|
|
404
|
+
// TypeScript knows the exact types here
|
|
405
|
+
console.log(`Price: ${value}, Currency: ${currency}`);
|
|
406
|
+
},
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
// Type-safe option handling
|
|
410
|
+
const options: SelectOption[] = [
|
|
411
|
+
{ value: "option1", label: "Option 1" },
|
|
412
|
+
{ value: "option2", label: "Option 2" },
|
|
413
|
+
];
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
## 🧪 Testing
|
|
417
|
+
|
|
418
|
+
### Running Tests
|
|
419
|
+
|
|
420
|
+
```bash
|
|
421
|
+
# Run unit tests
|
|
422
|
+
npm run test
|
|
423
|
+
|
|
424
|
+
# Run tests in watch mode
|
|
425
|
+
npm run test:watch
|
|
426
|
+
|
|
427
|
+
# Run tests with coverage
|
|
428
|
+
npm run test:coverage
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Testing with Your Application
|
|
432
|
+
|
|
433
|
+
When using yalc for local development, you can test your changes immediately:
|
|
434
|
+
|
|
435
|
+
1. Make changes to a component
|
|
436
|
+
2. Run `npm run build && yalc push`
|
|
437
|
+
3. Test in your React application
|
|
438
|
+
4. Iterate quickly without publishing to npm
|
|
439
|
+
|
|
440
|
+
## 📦 Publishing
|
|
441
|
+
|
|
442
|
+
### Preparing for Release
|
|
443
|
+
|
|
444
|
+
1. **Update version:**
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
npm version patch # or minor/major
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
2. **Build and test:**
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
npm run build
|
|
454
|
+
npm run test
|
|
455
|
+
npm run storybook:build
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
3. **Publish to npm:**
|
|
459
|
+
|
|
460
|
+
```bash
|
|
461
|
+
npm publish
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### Semantic Versioning
|
|
465
|
+
|
|
466
|
+
- **Patch (1.0.1)**: Bug fixes, small improvements
|
|
467
|
+
- **Minor (1.1.0)**: New components, backward-compatible features
|
|
468
|
+
- **Major (2.0.0)**: Breaking changes, API modifications
|
|
469
|
+
|
|
470
|
+
## 🤝 Contributing
|
|
471
|
+
|
|
472
|
+
### Development Workflow
|
|
473
|
+
|
|
474
|
+
1. **Fork and clone** the repository
|
|
475
|
+
2. **Create a feature branch:** `git checkout -b feature/new-component`
|
|
476
|
+
3. **Make your changes** following the established patterns
|
|
477
|
+
4. **Add tests and stories** for new components
|
|
478
|
+
5. **Test locally** using yalc with your application
|
|
479
|
+
6. **Submit a pull request** with clear description
|
|
480
|
+
|
|
481
|
+
### Component Development Guidelines
|
|
482
|
+
|
|
483
|
+
- Follow existing patterns for props and structure
|
|
484
|
+
- Add comprehensive TypeScript types and JSDoc
|
|
485
|
+
- Include Storybook stories with multiple examples
|
|
486
|
+
- Ensure accessibility (ARIA attributes, keyboard navigation)
|
|
487
|
+
- Support dark mode with proper contrast
|
|
488
|
+
- Add animation support where appropriate
|
|
489
|
+
- Test with screen readers and keyboard-only navigation
|
|
490
|
+
|
|
491
|
+
### Code Quality
|
|
492
|
+
|
|
493
|
+
```bash
|
|
494
|
+
# Lint your code
|
|
495
|
+
npm run lint
|
|
496
|
+
|
|
497
|
+
# Fix linting issues
|
|
498
|
+
npm run lint:fix
|
|
499
|
+
|
|
500
|
+
# Check TypeScript
|
|
501
|
+
npm run type-check
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
## 📄 License
|
|
505
|
+
|
|
506
|
+
MIT License - see LICENSE file for details.
|
|
507
|
+
|
|
508
|
+
## 🆘 Support
|
|
509
|
+
|
|
510
|
+
- **Issues**: Report bugs and request features via GitHub Issues
|
|
511
|
+
- **Documentation**: Check Storybook for component examples
|
|
512
|
+
- **Development**: Use yalc for local testing and development
|
|
513
|
+
|
|
514
|
+
## 🔗 Related Projects
|
|
515
|
+
|
|
516
|
+
- **LAX Web Portal**: Main application using this design system
|
|
517
|
+
- **LAX Activity Logger**: Secondary application with shared components
|
|
518
|
+
- **LAX Flow Orchestrator**: Workflow management with design system integration
|
|
9
519
|
|
|
10
520
|
## Expanding the ESLint configuration
|
|
11
521
|
|
|
@@ -13,9 +523,9 @@ If you are developing a production application, we recommend updating the config
|
|
|
13
523
|
|
|
14
524
|
```js
|
|
15
525
|
export default tseslint.config([
|
|
16
|
-
globalIgnores([
|
|
526
|
+
globalIgnores(["dist"]),
|
|
17
527
|
{
|
|
18
|
-
files: [
|
|
528
|
+
files: ["**/*.{ts,tsx}"],
|
|
19
529
|
extends: [
|
|
20
530
|
// Other configs...
|
|
21
531
|
|
|
@@ -30,40 +540,40 @@ export default tseslint.config([
|
|
|
30
540
|
],
|
|
31
541
|
languageOptions: {
|
|
32
542
|
parserOptions: {
|
|
33
|
-
project: [
|
|
543
|
+
project: ["./tsconfig.node.json", "./tsconfig.app.json"],
|
|
34
544
|
tsconfigRootDir: import.meta.dirname,
|
|
35
545
|
},
|
|
36
546
|
// other options...
|
|
37
547
|
},
|
|
38
548
|
},
|
|
39
|
-
])
|
|
549
|
+
]);
|
|
40
550
|
```
|
|
41
551
|
|
|
42
552
|
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
|
|
43
553
|
|
|
44
554
|
```js
|
|
45
555
|
// eslint.config.js
|
|
46
|
-
import reactX from
|
|
47
|
-
import reactDom from
|
|
556
|
+
import reactX from "eslint-plugin-react-x";
|
|
557
|
+
import reactDom from "eslint-plugin-react-dom";
|
|
48
558
|
|
|
49
559
|
export default tseslint.config([
|
|
50
|
-
globalIgnores([
|
|
560
|
+
globalIgnores(["dist"]),
|
|
51
561
|
{
|
|
52
|
-
files: [
|
|
562
|
+
files: ["**/*.{ts,tsx}"],
|
|
53
563
|
extends: [
|
|
54
564
|
// Other configs...
|
|
55
565
|
// Enable lint rules for React
|
|
56
|
-
reactX.configs[
|
|
566
|
+
reactX.configs["recommended-typescript"],
|
|
57
567
|
// Enable lint rules for React DOM
|
|
58
568
|
reactDom.configs.recommended,
|
|
59
569
|
],
|
|
60
570
|
languageOptions: {
|
|
61
571
|
parserOptions: {
|
|
62
|
-
project: [
|
|
572
|
+
project: ["./tsconfig.node.json", "./tsconfig.app.json"],
|
|
63
573
|
tsconfigRootDir: import.meta.dirname,
|
|
64
574
|
},
|
|
65
575
|
// other options...
|
|
66
576
|
},
|
|
67
577
|
},
|
|
68
|
-
])
|
|
578
|
+
]);
|
|
69
579
|
```
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Available badge status options
|
|
3
|
+
*/
|
|
4
|
+
export type BadgeStatus = "default" | "primary" | "warning" | "error" | "neutral" | "success" | "info";
|
|
5
|
+
/**
|
|
6
|
+
* Badge appearance variants
|
|
7
|
+
*/
|
|
8
|
+
export type BadgeAppearance = "filled" | "outline";
|
|
9
|
+
/**
|
|
10
|
+
* Badge size variants
|
|
11
|
+
*/
|
|
12
|
+
export type BadgeSize = "sm" | "md" | "lg";
|
|
13
|
+
/**
|
|
14
|
+
* Props for the Badge component
|
|
15
|
+
*/
|
|
16
|
+
export interface BadgeProps {
|
|
17
|
+
/** The badge status/color variant */
|
|
18
|
+
status?: BadgeStatus;
|
|
19
|
+
/** The text content to display */
|
|
20
|
+
children: string;
|
|
21
|
+
/** Visual appearance style */
|
|
22
|
+
appearance?: BadgeAppearance;
|
|
23
|
+
/** Size variant */
|
|
24
|
+
size?: BadgeSize;
|
|
25
|
+
/** Additional CSS classes for the wrapper */
|
|
26
|
+
className?: string;
|
|
27
|
+
/** Whether to use rounded pill shape */
|
|
28
|
+
isRounded?: boolean;
|
|
29
|
+
/** Whether to capitalize the text */
|
|
30
|
+
capitalize?: boolean;
|
|
31
|
+
/** Custom aria-label for accessibility */
|
|
32
|
+
"aria-label"?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Badge component displays small status indicators or labels
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* <Badge status="success">Active</Badge>
|
|
40
|
+
* <Badge status="error" appearance="filled">Error</Badge>
|
|
41
|
+
* <Badge status="warning" size="sm" isRounded>Warning</Badge>
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare const Badge: import("react").ForwardRefExoticComponent<BadgeProps & import("react").RefAttributes<HTMLSpanElement>>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Available banner status options
|
|
3
|
+
*/
|
|
4
|
+
export type BannerStatus = "success" | "error" | "warning" | "info" | "archived" | "canceled" | "queued" | "paused" | "awaiting_action" | "skipped" | "pending";
|
|
5
|
+
/**
|
|
6
|
+
* Props for the Banner component
|
|
7
|
+
*/
|
|
8
|
+
export interface BannerProps {
|
|
9
|
+
/** The banner status/color variant */
|
|
10
|
+
status: BannerStatus;
|
|
11
|
+
/** The main content to display */
|
|
12
|
+
children: React.ReactNode;
|
|
13
|
+
/** Additional content to display on the right side */
|
|
14
|
+
additionalChildren?: React.ReactNode;
|
|
15
|
+
/** Component to render when expanded (for error status) */
|
|
16
|
+
ExpandedComponent?: React.ComponentType<{
|
|
17
|
+
children: React.ReactNode;
|
|
18
|
+
}>;
|
|
19
|
+
/** Whether the banner is expandable */
|
|
20
|
+
expandable?: boolean;
|
|
21
|
+
/** Custom icon to override default status icon */
|
|
22
|
+
icon?: React.ReactNode;
|
|
23
|
+
/** Additional CSS classes for the wrapper */
|
|
24
|
+
className?: string;
|
|
25
|
+
/** Callback when banner is clicked (if expandable) */
|
|
26
|
+
onClick?: () => void;
|
|
27
|
+
/** Custom aria-label for accessibility */
|
|
28
|
+
"aria-label"?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Banner component displays important information with status-based styling
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* <Banner status="success">Operation completed successfully</Banner>
|
|
36
|
+
* <Banner status="error" expandable ExpandedComponent={ErrorDetails}>
|
|
37
|
+
* Error occurred
|
|
38
|
+
* </Banner>
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare const Banner: import("react").ForwardRefExoticComponent<BannerProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface JsonGridProps {
|
|
3
|
+
isFullScreen: boolean;
|
|
4
|
+
allExpanded: boolean;
|
|
5
|
+
toggleAll: () => void;
|
|
6
|
+
isEditMode: boolean;
|
|
7
|
+
isDarkMode: boolean;
|
|
8
|
+
style: React.CSSProperties;
|
|
9
|
+
value: string;
|
|
10
|
+
onChange?: (value: string) => void;
|
|
11
|
+
setIsAddKeyModalOpen: (open: boolean) => void;
|
|
12
|
+
isAddKeyModalOpen: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare const JsonGrid: React.FC<JsonGridProps>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface TabsProps<T extends string> {
|
|
3
|
+
variant?: 'default' | 'switch';
|
|
4
|
+
tabs: T[];
|
|
5
|
+
activeTab: T;
|
|
6
|
+
onTabClick: (tab: T) => void;
|
|
7
|
+
size?: 'sm' | 'md' | 'lg';
|
|
8
|
+
tabIcons?: Partial<Record<T, React.ReactNode>>;
|
|
9
|
+
height?: string;
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const Tabs: <T extends string>({ variant, tabs, activeTab, onTabClick, size, tabIcons, height, className }: TabsProps<T>) => import("react/jsx-runtime").JSX.Element;
|