@offlinemediainc/offline-ui 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2109 @@
1
+ type ColorToken = `yellow-${25 | 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900}` | `blue-${25 | 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900}` | `gray-${25 | 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900}` | `chart-${1 | 2 | 3 | 4 | 5 | 6 | 7 | 8}` | "red-400" | "semantic-success500" | "white" | "black";
2
+ type TypographyClass = "display-large" | "display-medium" | "display-small" | "headline-large" | "headline-medium" | "headline-small" | "title-large" | "title-medium" | "title-small" | "body-large" | "body-medium" | "body-small" | "body-x-small" | "label-large" | "label-medium" | "label-small" | "stat-mono" | "nav-label" | "nav-link";
3
+ type ShadowLevel = "shadow-card" | "shadow-tag" | "shadow-elevated";
4
+ type BadgeVariant = "default" | "secondary" | "destructive" | "success" | "warning" | "outline" | "link";
5
+ type ButtonVariant = "default" | "secondary" | "destructive" | "outline" | "ghost" | "link";
6
+ type ButtonSize = "default" | "sm" | "lg" | "icon";
7
+ type LucideIconName = string;
8
+ type TailwindClass = string;
9
+ interface ComponentMeta {
10
+ name: string;
11
+ status: "approved" | "draft";
12
+ description: string;
13
+ imports: string[];
14
+ variants?: Record<string, string[]>;
15
+ sizes?: string[];
16
+ composition?: string[];
17
+ }
18
+
19
+ declare const semanticColors: {
20
+ readonly brand: {
21
+ /** Yellow-400 (#de8e0f) - brand accent for highlights, badges, premium touches. NEVER for buttons */
22
+ readonly primary: "yellow-400";
23
+ /** Blue-400 (#004fff) - for links and clickable text ONLY */
24
+ readonly interactive: "blue-400";
25
+ };
26
+ readonly text: {
27
+ /** Gray-900 (#191919) - primary text, headings, important content */
28
+ readonly primary: "gray-900";
29
+ /** Gray-600 (#636363) - secondary/supporting text */
30
+ readonly secondary: "gray-600";
31
+ /** Gray-500 (#7c7c7c) - muted text, timestamps, helpers */
32
+ readonly muted: "gray-500";
33
+ /** White text on dark backgrounds */
34
+ readonly onDark: "white";
35
+ /** Blue-400 for clickable links */
36
+ readonly link: "blue-400";
37
+ /** Success green for positive text */
38
+ readonly positive: "semantic-success500";
39
+ /** Red for error/negative text */
40
+ readonly negative: "red-400";
41
+ };
42
+ readonly surface: {
43
+ /** White - default page/card background */
44
+ readonly default: "white";
45
+ /** Gray-50 (#ececec) - muted/secondary backgrounds */
46
+ readonly muted: "gray-50";
47
+ /** White with shadow-elevated for floating surfaces */
48
+ readonly elevated: "white + shadow-elevated";
49
+ };
50
+ readonly border: {
51
+ /** Gray-200 (#c6c6c6) - default borders */
52
+ readonly default: "gray-200";
53
+ /** Gray-300 (#aeaeae) - stronger borders */
54
+ readonly strong: "gray-300";
55
+ /** Yellow-400 - interactive/accent borders */
56
+ readonly interactive: "yellow-400";
57
+ /** Gray-900 - focus ring borders */
58
+ readonly focus: "gray-900";
59
+ };
60
+ readonly feedback: {
61
+ /** Chart-3 (#099250) - success, positive, growth */
62
+ readonly positive: "chart-3";
63
+ /** Chart-5 (#d31a0c) - error, negative, problems */
64
+ readonly negative: "chart-5";
65
+ /** Yellow-400 - warning states */
66
+ readonly warning: "yellow-400";
67
+ /** Chart-4 (#636363) - neutral/baseline */
68
+ readonly neutral: "chart-4";
69
+ };
70
+ };
71
+ declare const colorHexValues: {
72
+ readonly "yellow-25": "#fff2d8";
73
+ readonly "yellow-50": "#ffe9bd";
74
+ readonly "yellow-100": "#ffd386";
75
+ readonly "yellow-200": "#ffbd54";
76
+ readonly "yellow-300": "#f0a52c";
77
+ readonly "yellow-400": "#de8e0f";
78
+ readonly "yellow-500": "#c57900";
79
+ readonly "yellow-600": "#a76700";
80
+ readonly "yellow-700": "#835100";
81
+ readonly "yellow-800": "#5c3900";
82
+ readonly "yellow-900": "#331f00";
83
+ readonly "blue-25": "#d8e7ff";
84
+ readonly "blue-50": "#bed6ff";
85
+ readonly "blue-100": "#85afff";
86
+ readonly "blue-200": "#508bff";
87
+ readonly "blue-300": "#236aff";
88
+ readonly "blue-400": "#004fff";
89
+ readonly "blue-500": "#0046e0";
90
+ readonly "blue-600": "#003bbb";
91
+ readonly "blue-700": "#002e91";
92
+ readonly "blue-800": "#001f63";
93
+ readonly "blue-900": "#001033";
94
+ readonly "gray-25": "#f2f2f2";
95
+ readonly "gray-50": "#ececec";
96
+ readonly "gray-100": "#dfdfdf";
97
+ readonly "gray-200": "#c6c6c6";
98
+ readonly "gray-300": "#aeaeae";
99
+ readonly "gray-400": "#959595";
100
+ readonly "gray-500": "#7c7c7c";
101
+ readonly "gray-600": "#636363";
102
+ readonly "gray-700": "#4a4a4a";
103
+ readonly "gray-800": "#323232";
104
+ readonly "gray-900": "#191919";
105
+ readonly "red-400": "#d31a0c";
106
+ readonly "semantic-success500": "#099250";
107
+ readonly "chart-1": "#de8e0f";
108
+ readonly "chart-2": "#004fff";
109
+ readonly "chart-3": "#099250";
110
+ readonly "chart-4": "#636363";
111
+ readonly "chart-5": "#d31a0c";
112
+ readonly "chart-6": "#a76700";
113
+ readonly "chart-7": "#003bbb";
114
+ readonly "chart-8": "#959595";
115
+ };
116
+ type SemanticColors = typeof semanticColors;
117
+ type ColorHexValues = typeof colorHexValues;
118
+
119
+ declare const typographyDecisions: {
120
+ /** Hero headlines, major section titles - Cabinet Grotesk, use sparingly */
121
+ readonly pageTitle: "display-small";
122
+ /** Section headings within pages */
123
+ readonly sectionHeading: "headline-medium";
124
+ /** Card titles, panel headers */
125
+ readonly cardTitle: "headline-small";
126
+ /** Large stat values in dashboards */
127
+ readonly statValueLarge: "display-medium";
128
+ /** Smaller stat values */
129
+ readonly statValueSmall: "display-small";
130
+ /** Labels under stat values */
131
+ readonly statLabel: "body-small";
132
+ /** Default body text */
133
+ readonly bodyDefault: "body-medium";
134
+ /** Secondary/supporting body text */
135
+ readonly bodySecondary: "body-small";
136
+ /** Form field labels */
137
+ readonly formLabel: "label-medium";
138
+ /** Helper text below inputs */
139
+ readonly formHelper: "body-small text-muted";
140
+ /** Error messages below inputs */
141
+ readonly formError: "body-small text-negative";
142
+ /** Button text */
143
+ readonly buttonText: "label-medium";
144
+ /** Sidebar/nav items */
145
+ readonly navItem: "body-medium";
146
+ /** Badge text */
147
+ readonly badgeText: "label-small";
148
+ /** Table header cells */
149
+ readonly tableHeader: "label-medium";
150
+ /** Table body cells */
151
+ readonly tableCell: "body-medium";
152
+ /** Timestamps, dates */
153
+ readonly timestamp: "body-small text-muted";
154
+ /** Empty state headline */
155
+ readonly emptyStateTitle: "headline-small";
156
+ /** Empty state description */
157
+ readonly emptyStateDescription: "body-medium text-muted";
158
+ /** Dialog title */
159
+ readonly dialogTitle: "headline-medium";
160
+ /** Dialog description */
161
+ readonly dialogDescription: "body-medium text-muted";
162
+ /** Sidebar section labels */
163
+ readonly sidebarLabel: "nav-label";
164
+ /** Sidebar navigation items */
165
+ readonly sidebarItem: "body-medium";
166
+ /** Breadcrumb items */
167
+ readonly breadcrumbItem: "body-small";
168
+ /** Current breadcrumb (muted) */
169
+ readonly breadcrumbCurrent: "body-small text-muted";
170
+ };
171
+ declare const fontFamilyDecisions: {
172
+ /** Cabinet Grotesk - hero headlines, major titles. Use sparingly for impact */
173
+ readonly display: "var(--font-cabinet-grotesk), var(--font-satoshi), sans-serif";
174
+ /** Satoshi - everything else: headlines, body, labels. The workhorse font */
175
+ readonly body: "var(--font-satoshi), sans-serif";
176
+ /** DM Mono - stats, numbers, code. When precision matters */
177
+ readonly mono: "var(--font-dm-mono), 'DM Mono', monospace";
178
+ };
179
+ declare const typographyScale: {
180
+ readonly "display-large": {
181
+ readonly size: "36px";
182
+ readonly lineHeight: "100%";
183
+ readonly weight: 800;
184
+ readonly font: "Cabinet Grotesk";
185
+ };
186
+ readonly "display-medium": {
187
+ readonly size: "32px";
188
+ readonly lineHeight: "100%";
189
+ readonly weight: 800;
190
+ readonly font: "Cabinet Grotesk";
191
+ };
192
+ readonly "display-small": {
193
+ readonly size: "29px";
194
+ readonly lineHeight: "100%";
195
+ readonly weight: 800;
196
+ readonly font: "Cabinet Grotesk";
197
+ };
198
+ readonly "headline-large": {
199
+ readonly size: "26px";
200
+ readonly lineHeight: "32px";
201
+ readonly weight: 700;
202
+ readonly font: "Satoshi";
203
+ };
204
+ readonly "headline-medium": {
205
+ readonly size: "23px";
206
+ readonly lineHeight: "28px";
207
+ readonly weight: 700;
208
+ readonly font: "Satoshi";
209
+ };
210
+ readonly "headline-small": {
211
+ readonly size: "20px";
212
+ readonly lineHeight: "24px";
213
+ readonly weight: 700;
214
+ readonly font: "Satoshi";
215
+ };
216
+ readonly "title-large": {
217
+ readonly size: "18px";
218
+ readonly lineHeight: "22px";
219
+ readonly weight: 700;
220
+ readonly font: "Satoshi";
221
+ };
222
+ readonly "title-medium": {
223
+ readonly size: "16px";
224
+ readonly lineHeight: "20px";
225
+ readonly weight: 700;
226
+ readonly font: "Satoshi";
227
+ };
228
+ readonly "title-small": {
229
+ readonly size: "14px";
230
+ readonly lineHeight: "18px";
231
+ readonly weight: 700;
232
+ readonly font: "Satoshi";
233
+ };
234
+ readonly "body-large": {
235
+ readonly size: "16px";
236
+ readonly lineHeight: "24px";
237
+ readonly weight: 500;
238
+ readonly font: "Satoshi";
239
+ };
240
+ readonly "body-medium": {
241
+ readonly size: "14px";
242
+ readonly lineHeight: "20px";
243
+ readonly weight: 500;
244
+ readonly font: "Satoshi";
245
+ };
246
+ readonly "body-small": {
247
+ readonly size: "12px";
248
+ readonly lineHeight: "16px";
249
+ readonly weight: 500;
250
+ readonly font: "Satoshi";
251
+ };
252
+ readonly "body-x-small": {
253
+ readonly size: "10px";
254
+ readonly lineHeight: "14px";
255
+ readonly weight: 500;
256
+ readonly font: "Satoshi";
257
+ };
258
+ readonly "label-large": {
259
+ readonly size: "14px";
260
+ readonly lineHeight: "18px";
261
+ readonly weight: 700;
262
+ readonly font: "Satoshi";
263
+ };
264
+ readonly "label-medium": {
265
+ readonly size: "12px";
266
+ readonly lineHeight: "16px";
267
+ readonly weight: 700;
268
+ readonly font: "Satoshi";
269
+ };
270
+ readonly "label-small": {
271
+ readonly size: "10px";
272
+ readonly lineHeight: "14px";
273
+ readonly weight: 700;
274
+ readonly font: "Satoshi";
275
+ };
276
+ readonly "stat-mono": {
277
+ readonly weight: 500;
278
+ readonly letterSpacing: "0.04em";
279
+ readonly font: "DM Mono";
280
+ };
281
+ };
282
+ type TypographyDecisions = typeof typographyDecisions;
283
+ type FontFamilyDecisions = typeof fontFamilyDecisions;
284
+ type TypographyScale = typeof typographyScale;
285
+
286
+ declare const componentDecisions: {
287
+ readonly lists: {
288
+ /** Clickable list rows (partners, offers, events) */
289
+ readonly clickableRow: "Item";
290
+ /** Structured data with sorting/filtering */
291
+ readonly dataTable: "Table";
292
+ /** Grid of cards (dashboard, gallery) */
293
+ readonly cardGrid: "Card in grid";
294
+ /** Simple bulleted/numbered lists */
295
+ readonly simpleList: "ul with body-medium";
296
+ /** Key-value pairs */
297
+ readonly descriptionList: "dl with label-medium dt and body-medium dd";
298
+ };
299
+ readonly feedback: {
300
+ /** Success after action (save, create, delete) */
301
+ readonly actionSuccess: "toast.success";
302
+ /** Error after action */
303
+ readonly actionError: "toast.error";
304
+ /** Warning banner in content area */
305
+ readonly inlineWarning: "Alert variant=warning";
306
+ /** Error banner in content area */
307
+ readonly inlineError: "Alert variant=destructive";
308
+ /** Form field validation error */
309
+ readonly fieldError: "body-small text-negative below input";
310
+ /** Info/tip banner */
311
+ readonly inlineInfo: "Alert variant=default";
312
+ };
313
+ readonly modals: {
314
+ /** Forms, content entry, multi-step flows */
315
+ readonly formEntry: "Dialog";
316
+ /** Destructive action confirmation (delete, discard) */
317
+ readonly confirmDestructive: "AlertDialog";
318
+ /** Side panel for details, secondary content */
319
+ readonly sidePanel: "Sheet side=right";
320
+ /** Mobile navigation drawer */
321
+ readonly mobileNav: "Sheet side=left";
322
+ /** Mobile action sheets */
323
+ readonly mobileActions: "Sheet side=bottom h-auto max-h-[80vh]";
324
+ /** Preview/detail view */
325
+ readonly preview: "Dialog or Sheet";
326
+ };
327
+ readonly navigation: {
328
+ /** Primary app navigation */
329
+ readonly primaryNav: "Sidebar";
330
+ /** Page-level tabs */
331
+ readonly pageTabs: "Tabs";
332
+ /** Location breadcrumbs */
333
+ readonly breadcrumbs: "Breadcrumb";
334
+ /** Section header with back button */
335
+ readonly sectionHeader: "Breadcrumb + headline";
336
+ /** Dropdown navigation menu */
337
+ readonly dropdownNav: "DropdownMenu";
338
+ };
339
+ readonly selection: {
340
+ /** Single choice from 2-5 options */
341
+ readonly singleFromFew: "radio group";
342
+ /** Single choice from many options */
343
+ readonly singleFromMany: "Select";
344
+ /** Multiple choices allowed */
345
+ readonly multiple: "Checkbox group";
346
+ /** On/off toggle */
347
+ readonly toggle: "single Checkbox";
348
+ /** Segmented control (view modes) */
349
+ readonly segmented: "Tabs variant=pill";
350
+ };
351
+ readonly data: {
352
+ /** Status indicator */
353
+ readonly status: "Badge";
354
+ /** Progress indication */
355
+ readonly progress: "Progress";
356
+ /** Avatar/profile image */
357
+ readonly avatar: "Avatar";
358
+ /** Data visualization */
359
+ readonly chart: "Chart (recharts)";
360
+ /** Loading placeholder */
361
+ readonly skeleton: "Skeleton";
362
+ };
363
+ readonly forms: {
364
+ /** Single-line text input */
365
+ readonly textInput: "Input";
366
+ /** Multi-line text input */
367
+ readonly textArea: "Textarea";
368
+ /** Email/password/number input */
369
+ readonly typedInput: "Input type=email|password|number";
370
+ /** OTP/verification code */
371
+ readonly otpInput: "InputOTP";
372
+ /** Form field label */
373
+ readonly label: "Label htmlFor={id}";
374
+ /** Checkbox with label */
375
+ readonly checkbox: "Checkbox + Label";
376
+ };
377
+ readonly layout: {
378
+ /** Content card container */
379
+ readonly card: "Card";
380
+ /** Expandable content */
381
+ readonly accordion: "Accordion";
382
+ /** Collapsible section */
383
+ readonly collapsible: "Collapsible";
384
+ /** Visual divider */
385
+ readonly separator: "Separator";
386
+ /** Hover information */
387
+ readonly tooltip: "Tooltip";
388
+ };
389
+ };
390
+ type ComponentDecisions = typeof componentDecisions;
391
+
392
+ declare const componentRegistry: Record<string, ComponentMeta>;
393
+ declare const approvedComponents: string[];
394
+ declare const draftComponents: string[];
395
+ type ComponentRegistry = typeof componentRegistry;
396
+
397
+ declare const layoutPatterns: {
398
+ readonly page: {
399
+ /** Content area max width */
400
+ readonly maxWidth: "max-w-4xl";
401
+ /** Wider content area (dashboards, tables) */
402
+ readonly maxWidthWide: "max-w-6xl";
403
+ /** Page padding */
404
+ readonly padding: "px-4 py-6";
405
+ /** Gap between major sections */
406
+ readonly sectionGap: "space-y-8";
407
+ /** Main content wrapper */
408
+ readonly wrapper: "mx-auto px-4 py-6";
409
+ };
410
+ readonly cards: {
411
+ /** Standard card padding */
412
+ readonly padding: "p-6";
413
+ /** Compact card padding */
414
+ readonly paddingCompact: "p-4";
415
+ /** Gap between cards in grid */
416
+ readonly gap: "gap-4";
417
+ /** 2-column responsive grid */
418
+ readonly grid2col: "grid grid-cols-1 md:grid-cols-2 gap-4";
419
+ /** 3-column responsive grid */
420
+ readonly grid3col: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4";
421
+ /** 4-column responsive grid */
422
+ readonly grid4col: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4";
423
+ /** Stack of cards */
424
+ readonly stack: "flex flex-col gap-4";
425
+ };
426
+ readonly forms: {
427
+ /** Gap between form fields */
428
+ readonly fieldGap: "space-y-4";
429
+ /** Gap between label and input */
430
+ readonly labelGap: "mb-2";
431
+ /** Gap between input and helper text */
432
+ readonly helperGap: "mt-1";
433
+ /** Gap between buttons in button group */
434
+ readonly buttonGap: "gap-2";
435
+ /** Gap between form sections */
436
+ readonly sectionGap: "space-y-6";
437
+ /** Form container */
438
+ readonly container: "space-y-4";
439
+ /** Form actions row */
440
+ readonly actions: "flex justify-end gap-2 pt-4";
441
+ /** Full-width form field */
442
+ readonly fieldFull: "w-full";
443
+ /** Inline field pair */
444
+ readonly fieldPair: "grid grid-cols-2 gap-4";
445
+ };
446
+ readonly inline: {
447
+ /** Icon + text alignment */
448
+ readonly iconText: "inline-flex items-center gap-2";
449
+ /** Badge group spacing */
450
+ readonly badges: "flex flex-wrap gap-2";
451
+ /** Button group spacing */
452
+ readonly buttons: "flex items-center gap-2";
453
+ /** Tag list */
454
+ readonly tags: "flex flex-wrap gap-1";
455
+ };
456
+ readonly header: {
457
+ /** Page header with title and actions */
458
+ readonly pageHeader: "flex items-center justify-between mb-6";
459
+ /** Section header */
460
+ readonly sectionHeader: "flex items-center justify-between mb-4";
461
+ /** Card header */
462
+ readonly cardHeader: "flex items-center justify-between";
463
+ };
464
+ readonly sidebar: {
465
+ /** Sidebar width */
466
+ readonly width: "w-64";
467
+ /** Collapsed sidebar width */
468
+ readonly widthCollapsed: "w-16";
469
+ /** Content area with sidebar */
470
+ readonly contentWithSidebar: "ml-64";
471
+ /** Mobile: full width content */
472
+ readonly contentMobile: "ml-0";
473
+ };
474
+ readonly responsive: {
475
+ /** Hide on mobile, show on tablet+ */
476
+ readonly hideMobile: "hidden md:block";
477
+ /** Show on mobile, hide on tablet+ */
478
+ readonly showMobile: "md:hidden";
479
+ /** Stack on mobile, row on tablet+ */
480
+ readonly stackToRow: "flex flex-col md:flex-row";
481
+ /** Full width on mobile, auto on tablet+ */
482
+ readonly fullToAuto: "w-full md:w-auto";
483
+ };
484
+ };
485
+ type LayoutPatterns = typeof layoutPatterns;
486
+
487
+ declare const statePatterns: {
488
+ readonly loading: {
489
+ /** Full page loading skeleton */
490
+ readonly page: "Skeleton matching page structure";
491
+ /** Card loading skeleton */
492
+ readonly card: "Skeleton matching card structure";
493
+ /** Button loading state */
494
+ readonly button: {
495
+ readonly icon: "Loader2";
496
+ readonly text: "Loading...";
497
+ readonly classes: "disabled opacity-50";
498
+ readonly iconClasses: "animate-spin mr-2 h-4 w-4";
499
+ };
500
+ /** Inline loading spinner */
501
+ readonly inline: {
502
+ readonly icon: "Loader2";
503
+ readonly classes: "animate-spin h-4 w-4";
504
+ };
505
+ /** Table row skeleton */
506
+ readonly tableRow: "Skeleton h-12 w-full";
507
+ /** List item skeleton */
508
+ readonly listItem: "Skeleton h-16 w-full";
509
+ /** Avatar skeleton */
510
+ readonly avatar: "Skeleton h-10 w-10 rounded-full";
511
+ };
512
+ readonly empty: {
513
+ /** Empty state container structure */
514
+ readonly structure: "flex flex-col items-center justify-center py-12 text-center";
515
+ /** Empty state icon */
516
+ readonly icon: {
517
+ readonly classes: "h-12 w-12 text-muted-foreground mb-4";
518
+ readonly note: "Use relevant lucide icon for context";
519
+ };
520
+ /** Empty state title */
521
+ readonly title: {
522
+ readonly classes: "headline-small mb-2";
523
+ };
524
+ /** Empty state description */
525
+ readonly description: {
526
+ readonly classes: "body-medium text-muted-foreground max-w-sm mx-auto mb-4";
527
+ };
528
+ /** Empty state action button */
529
+ readonly action: {
530
+ readonly variant: "outline";
531
+ readonly note: "Optional - only if user can take action to fill empty state";
532
+ };
533
+ };
534
+ readonly error: {
535
+ /** Full page error */
536
+ readonly page: {
537
+ readonly component: "Alert";
538
+ readonly variant: "destructive";
539
+ readonly includeRetry: true;
540
+ readonly classes: "max-w-lg mx-auto my-8";
541
+ };
542
+ /** Inline error message */
543
+ readonly inline: {
544
+ readonly classes: "body-small text-destructive";
545
+ };
546
+ /** Form field error */
547
+ readonly field: {
548
+ readonly inputClasses: "border-destructive focus:ring-destructive";
549
+ readonly messageClasses: "body-small text-destructive mt-1";
550
+ };
551
+ /** Error banner */
552
+ readonly banner: {
553
+ readonly component: "Alert";
554
+ readonly variant: "destructive";
555
+ readonly classes: "mb-4";
556
+ };
557
+ };
558
+ readonly disabled: {
559
+ /** Disabled opacity */
560
+ readonly opacity: "opacity-50";
561
+ /** Disabled cursor */
562
+ readonly cursor: "cursor-not-allowed";
563
+ /** Prevent interaction */
564
+ readonly interaction: "pointer-events-none";
565
+ /** Combined disabled classes */
566
+ readonly combined: "opacity-50 cursor-not-allowed pointer-events-none";
567
+ };
568
+ readonly success: {
569
+ /** Success toast */
570
+ readonly toast: {
571
+ readonly method: "toast.success";
572
+ readonly duration: 3000;
573
+ };
574
+ /** Inline success message */
575
+ readonly inline: {
576
+ readonly classes: "body-small text-[var(--semantic-success500)]";
577
+ };
578
+ /** Success banner */
579
+ readonly banner: {
580
+ readonly component: "Alert";
581
+ readonly variant: "default";
582
+ readonly icon: "CheckCircle";
583
+ readonly classes: "border-[var(--semantic-success500)] bg-green-50";
584
+ };
585
+ };
586
+ readonly warning: {
587
+ /** Warning banner */
588
+ readonly banner: {
589
+ readonly component: "Alert";
590
+ readonly variant: "warning";
591
+ readonly icon: "AlertTriangle";
592
+ };
593
+ /** Inline warning */
594
+ readonly inline: {
595
+ readonly classes: "body-small text-[var(--colors-yellow-600)]";
596
+ };
597
+ };
598
+ };
599
+ type StatePatterns = typeof statePatterns;
600
+
601
+ declare const interactionPatterns: {
602
+ readonly clickableCard: {
603
+ /** Default state */
604
+ readonly default: "shadow-card transition-shadow duration-200";
605
+ /** Hover state */
606
+ readonly hover: "hover:shadow-elevated";
607
+ /** Cursor */
608
+ readonly cursor: "cursor-pointer";
609
+ /** Combined classes */
610
+ readonly combined: "shadow-card hover:shadow-elevated cursor-pointer transition-shadow duration-200";
611
+ /** With border change */
612
+ readonly withBorder: "border border-gray-200 hover:border-gray-300 cursor-pointer transition-colors";
613
+ };
614
+ readonly link: {
615
+ /** Default link styling */
616
+ readonly default: "text-[var(--colors-blue-400)] underline-offset-4";
617
+ /** Hover state */
618
+ readonly hover: "hover:underline";
619
+ /** Combined classes */
620
+ readonly combined: "text-[var(--colors-blue-400)] underline-offset-4 hover:underline";
621
+ /** Navigation link (no underline by default) */
622
+ readonly nav: "text-[var(--colors-blue-400)] hover:underline underline-offset-4";
623
+ };
624
+ readonly iconButton: {
625
+ /** Default state */
626
+ readonly default: "p-2 rounded-md transition-colors";
627
+ /** Hover state */
628
+ readonly hover: "hover:bg-muted";
629
+ /** Combined classes */
630
+ readonly combined: "p-2 rounded-md hover:bg-muted transition-colors";
631
+ /** Destructive icon button */
632
+ readonly destructive: "p-2 rounded-md hover:bg-destructive/10 hover:text-destructive transition-colors";
633
+ };
634
+ readonly tableRow: {
635
+ /** Default state */
636
+ readonly default: "transition-colors";
637
+ /** Hover state */
638
+ readonly hover: "hover:bg-muted/50";
639
+ /** Combined classes */
640
+ readonly combined: "hover:bg-muted/50 transition-colors";
641
+ /** Clickable row */
642
+ readonly clickable: "hover:bg-muted/50 cursor-pointer transition-colors";
643
+ };
644
+ readonly listItem: {
645
+ /** Default Item hover */
646
+ readonly default: "transition-colors";
647
+ /** Hover state */
648
+ readonly hover: "hover:bg-muted/50";
649
+ /** Active/selected state */
650
+ readonly active: "bg-muted";
651
+ /** Combined for clickable items */
652
+ readonly combined: "hover:bg-muted/50 cursor-pointer transition-colors";
653
+ };
654
+ readonly button: {
655
+ /** Focus ring */
656
+ readonly focus: "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2";
657
+ /** Active/pressed state */
658
+ readonly active: "active:scale-[0.98]";
659
+ /** Transition */
660
+ readonly transition: "transition-colors";
661
+ };
662
+ readonly input: {
663
+ /** Default state */
664
+ readonly default: "border border-gray-200 transition-colors";
665
+ /** Hover state */
666
+ readonly hover: "hover:border-gray-300";
667
+ /** Focus state */
668
+ readonly focus: "focus:border-gray-900 focus:ring-2 focus:ring-gray-900/10";
669
+ /** Error state */
670
+ readonly error: "border-destructive focus:border-destructive focus:ring-destructive/10";
671
+ /** Combined */
672
+ readonly combined: "border border-gray-200 hover:border-gray-300 focus:border-gray-900 focus:ring-2 focus:ring-gray-900/10 transition-colors";
673
+ };
674
+ readonly menuItem: {
675
+ /** Default state */
676
+ readonly default: "transition-colors rounded-sm";
677
+ /** Hover/focus state */
678
+ readonly hover: "hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground";
679
+ /** Combined classes */
680
+ readonly combined: "hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground rounded-sm transition-colors";
681
+ };
682
+ readonly sidebarItem: {
683
+ /** Default state */
684
+ readonly default: "transition-colors rounded-md";
685
+ /** Hover state */
686
+ readonly hover: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground";
687
+ /** Active/current page */
688
+ readonly active: "bg-sidebar-accent text-sidebar-accent-foreground";
689
+ /** Combined */
690
+ readonly combined: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground rounded-md transition-colors";
691
+ };
692
+ readonly transitions: {
693
+ /** Fast transition (colors, opacity) */
694
+ readonly fast: "transition-colors duration-150";
695
+ /** Medium transition (transform, shadow) */
696
+ readonly medium: "transition-all duration-200";
697
+ /** Slow transition (layout) */
698
+ readonly slow: "transition-all duration-300";
699
+ /** Ease functions */
700
+ readonly ease: {
701
+ readonly default: "ease-in-out";
702
+ readonly in: "ease-in";
703
+ readonly out: "ease-out";
704
+ readonly bounce: "cubic-bezier(0.68, -0.55, 0.265, 1.55)";
705
+ };
706
+ };
707
+ };
708
+ type InteractionPatterns = typeof interactionPatterns;
709
+
710
+ declare const chartPatterns: {
711
+ /** Order of colors when assigning to data series */
712
+ readonly colorPriority: readonly ["chart-1", "chart-3", "chart-5", "chart-4", "chart-6", "chart-8"];
713
+ /** Rating distribution color mapping (5-star to 1-star) */
714
+ readonly ratingDistribution: {
715
+ readonly "5": "chart-3";
716
+ readonly "4": "chart-1";
717
+ readonly "3": "chart-4";
718
+ readonly "2": "chart-5";
719
+ readonly "1": "chart-5";
720
+ };
721
+ /** Colors for positive/growth metrics */
722
+ readonly positiveMetrics: readonly ["chart-1", "chart-3", "chart-6"];
723
+ /** Colors for negative/decline metrics */
724
+ readonly negativeMetrics: readonly ["chart-5", "chart-4", "chart-8"];
725
+ /** Comparison pairs (e.g., this period vs last period) */
726
+ readonly comparisonPairs: {
727
+ readonly current: "chart-1";
728
+ readonly previous: "chart-4";
729
+ };
730
+ /** Axis styling (Recharts) */
731
+ readonly axisStyle: {
732
+ readonly tickLine: false;
733
+ readonly axisLine: false;
734
+ readonly tick: {
735
+ readonly fill: "hsl(var(--muted-foreground))";
736
+ readonly fontSize: 12;
737
+ };
738
+ readonly tickMargin: 8;
739
+ };
740
+ /** Y-axis specific */
741
+ readonly yAxisStyle: {
742
+ readonly tickLine: false;
743
+ readonly axisLine: false;
744
+ readonly tick: {
745
+ readonly fill: "hsl(var(--muted-foreground))";
746
+ readonly fontSize: 12;
747
+ };
748
+ readonly width: 40;
749
+ };
750
+ /** X-axis specific */
751
+ readonly xAxisStyle: {
752
+ readonly tickLine: false;
753
+ readonly axisLine: false;
754
+ readonly tick: {
755
+ readonly fill: "hsl(var(--muted-foreground))";
756
+ readonly fontSize: 12;
757
+ };
758
+ readonly height: 40;
759
+ };
760
+ /** Bar chart corner radius */
761
+ readonly barRadius: [number, number, number, number];
762
+ /** Grid styling */
763
+ readonly gridStyle: {
764
+ readonly stroke: "hsl(var(--border))";
765
+ readonly strokeDasharray: "3 3";
766
+ };
767
+ /** Tooltip styling */
768
+ readonly tooltipStyle: {
769
+ readonly contentStyle: {
770
+ readonly backgroundColor: "hsl(var(--popover))";
771
+ readonly border: "1px solid hsl(var(--border))";
772
+ readonly borderRadius: "6px";
773
+ readonly boxShadow: "var(--card-shadow)";
774
+ };
775
+ readonly labelStyle: {
776
+ readonly fontWeight: 600;
777
+ readonly marginBottom: 4;
778
+ };
779
+ };
780
+ /** Legend styling */
781
+ readonly legendStyle: {
782
+ readonly iconType: "circle";
783
+ readonly iconSize: 8;
784
+ readonly wrapperStyle: {
785
+ readonly paddingTop: 16;
786
+ };
787
+ };
788
+ /** Chart container sizing */
789
+ readonly containerSizing: {
790
+ /** Small chart (sparkline, mini) */
791
+ readonly small: {
792
+ readonly height: 100;
793
+ };
794
+ /** Medium chart (card) */
795
+ readonly medium: {
796
+ readonly height: 200;
797
+ };
798
+ /** Large chart (main view) */
799
+ readonly large: {
800
+ readonly height: 300;
801
+ };
802
+ /** Full height (dashboard) */
803
+ readonly full: {
804
+ readonly height: 400;
805
+ };
806
+ };
807
+ /** Margin presets */
808
+ readonly margins: {
809
+ /** No labels */
810
+ readonly none: {
811
+ readonly top: 0;
812
+ readonly right: 0;
813
+ readonly bottom: 0;
814
+ readonly left: 0;
815
+ };
816
+ /** With axis labels */
817
+ readonly withAxis: {
818
+ readonly top: 10;
819
+ readonly right: 10;
820
+ readonly bottom: 30;
821
+ readonly left: 40;
822
+ };
823
+ /** With legend */
824
+ readonly withLegend: {
825
+ readonly top: 10;
826
+ readonly right: 10;
827
+ readonly bottom: 50;
828
+ readonly left: 40;
829
+ };
830
+ };
831
+ /** Semantic data series names */
832
+ readonly semanticSeries: {
833
+ readonly revenue: {
834
+ readonly color: "chart-1";
835
+ readonly label: "Revenue";
836
+ };
837
+ readonly growth: {
838
+ readonly color: "chart-3";
839
+ readonly label: "Growth";
840
+ };
841
+ readonly decline: {
842
+ readonly color: "chart-5";
843
+ readonly label: "Decline";
844
+ };
845
+ readonly baseline: {
846
+ readonly color: "chart-4";
847
+ readonly label: "Baseline";
848
+ };
849
+ readonly target: {
850
+ readonly color: "chart-2";
851
+ readonly label: "Target";
852
+ };
853
+ };
854
+ };
855
+ type ChartPatterns = typeof chartPatterns;
856
+
857
+ declare const modalPatterns: {
858
+ readonly sizes: {
859
+ /** Small dialogs (simple confirm, single field) */
860
+ readonly small: "max-w-sm";
861
+ /** Default dialogs (forms, content) */
862
+ readonly default: "max-w-lg";
863
+ /** Large dialogs (complex forms, multi-step) */
864
+ readonly large: "max-w-2xl";
865
+ /** Extra large (previews, rich content) */
866
+ readonly xl: "max-w-3xl";
867
+ /** Full width (tables, complex layouts) */
868
+ readonly full: "max-w-4xl";
869
+ };
870
+ /** Header with icon (for important dialogs) */
871
+ readonly headerWithIcon: {
872
+ /** Icon container base classes */
873
+ readonly iconContainer: "size-12 rounded-full flex items-center justify-center mb-4";
874
+ /** Positive/success icon background */
875
+ readonly iconPositive: "bg-yellow-100 text-yellow-600";
876
+ /** Info icon background */
877
+ readonly iconInfo: "bg-blue-100 text-blue-600";
878
+ /** Destructive/warning icon background */
879
+ readonly iconDestructive: "bg-red-100 text-red-600";
880
+ /** Success icon background */
881
+ readonly iconSuccess: "bg-green-100 text-green-600";
882
+ /** Icon size inside container */
883
+ readonly iconSize: "h-6 w-6";
884
+ };
885
+ /** Footer patterns */
886
+ readonly footer: {
887
+ /** Standard alignment */
888
+ readonly alignment: "flex justify-end gap-2";
889
+ /** Cancel button comes first (left) */
890
+ readonly cancelFirst: true;
891
+ /** Destructive actions */
892
+ readonly destructive: {
893
+ readonly cancelVariant: "outline";
894
+ readonly actionVariant: "destructive";
895
+ };
896
+ /** Standard actions */
897
+ readonly standard: {
898
+ readonly cancelVariant: "outline";
899
+ readonly actionVariant: "default";
900
+ };
901
+ };
902
+ /** Mobile considerations */
903
+ readonly mobile: {
904
+ /** Dialog content height constraint */
905
+ readonly dialogHeight: "max-h-[90vh] overflow-y-auto";
906
+ /** Bottom sheet height */
907
+ readonly bottomSheetHeight: "h-auto max-h-[80vh]";
908
+ /** Full screen dialog */
909
+ readonly fullScreen: "fixed inset-0 max-w-none rounded-none";
910
+ };
911
+ /** Sheet-specific patterns */
912
+ readonly sheet: {
913
+ /** Right panel (default) - detail views */
914
+ readonly right: {
915
+ readonly side: "right";
916
+ readonly width: "w-[400px] sm:max-w-[540px]";
917
+ };
918
+ /** Left panel - mobile navigation */
919
+ readonly left: {
920
+ readonly side: "left";
921
+ readonly width: "w-[300px] sm:max-w-[400px]";
922
+ };
923
+ /** Bottom panel - mobile actions */
924
+ readonly bottom: {
925
+ readonly side: "bottom";
926
+ readonly height: "h-auto max-h-[80vh]";
927
+ readonly rounded: "rounded-t-xl";
928
+ };
929
+ };
930
+ /** AlertDialog specific (destructive confirmations) */
931
+ readonly alertDialog: {
932
+ /** Header: title + description only. NO icons, NO decoration */
933
+ readonly headerRule: "Title and description text only";
934
+ /** Footer button order */
935
+ readonly buttonOrder: readonly ["AlertDialogCancel", "AlertDialogAction"];
936
+ /** Action button for destructive */
937
+ readonly destructiveAction: {
938
+ readonly variant: "destructive";
939
+ readonly text: "Delete";
940
+ };
941
+ /** Standard messaging */
942
+ readonly messaging: {
943
+ readonly title: "Action verb + object (e.g., 'Delete this item?')";
944
+ readonly description: "Consequence explanation (e.g., 'This action cannot be undone.')";
945
+ };
946
+ };
947
+ /** Common dialog content patterns */
948
+ readonly contentPatterns: {
949
+ /** Form dialog */
950
+ readonly form: {
951
+ readonly spacing: "space-y-4";
952
+ readonly footerSpacing: "pt-4";
953
+ };
954
+ /** Confirmation dialog */
955
+ readonly confirmation: {
956
+ readonly textAlign: "text-center";
957
+ readonly spacing: "space-y-2";
958
+ };
959
+ /** Detail/preview dialog */
960
+ readonly detail: {
961
+ readonly maxHeight: "max-h-[70vh]";
962
+ readonly overflow: "overflow-y-auto";
963
+ };
964
+ };
965
+ /** Animation timing */
966
+ readonly animation: {
967
+ /** Dialog fade/scale */
968
+ readonly dialog: "duration-200";
969
+ /** Sheet slide */
970
+ readonly sheet: "duration-300";
971
+ /** Overlay fade */
972
+ readonly overlay: "duration-200";
973
+ };
974
+ };
975
+ type ModalPatterns = typeof modalPatterns;
976
+
977
+ declare const iconMappings: {
978
+ /** Action icons - for buttons and interactive elements */
979
+ readonly actions: {
980
+ readonly edit: "Pencil";
981
+ readonly delete: "Trash2";
982
+ readonly add: "Plus";
983
+ readonly create: "Plus";
984
+ readonly close: "X";
985
+ readonly cancel: "X";
986
+ readonly menu: "MoreVertical";
987
+ readonly menuHorizontal: "MoreHorizontal";
988
+ readonly settings: "Settings";
989
+ readonly copy: "Copy";
990
+ readonly duplicate: "Copy";
991
+ readonly download: "Download";
992
+ readonly upload: "Upload";
993
+ readonly refresh: "RefreshCw";
994
+ readonly save: "Save";
995
+ readonly send: "Send";
996
+ readonly search: "Search";
997
+ readonly filter: "Filter";
998
+ readonly sort: "ArrowUpDown";
999
+ readonly archive: "Archive";
1000
+ readonly restore: "ArchiveRestore";
1001
+ readonly undo: "Undo2";
1002
+ readonly redo: "Redo2";
1003
+ readonly print: "Printer";
1004
+ readonly export: "FileDown";
1005
+ readonly import: "FileUp";
1006
+ };
1007
+ /** Navigation icons */
1008
+ readonly navigation: {
1009
+ readonly back: "ArrowLeft";
1010
+ readonly forward: "ArrowRight";
1011
+ readonly up: "ArrowUp";
1012
+ readonly down: "ArrowDown";
1013
+ readonly external: "ExternalLink";
1014
+ readonly expand: "ChevronDown";
1015
+ readonly collapse: "ChevronUp";
1016
+ readonly chevronLeft: "ChevronLeft";
1017
+ readonly chevronRight: "ChevronRight";
1018
+ readonly home: "Home";
1019
+ readonly menu: "Menu";
1020
+ readonly sidebar: "PanelLeft";
1021
+ readonly grid: "LayoutGrid";
1022
+ readonly list: "List";
1023
+ };
1024
+ /** Status icons */
1025
+ readonly status: {
1026
+ readonly success: "CheckCircle";
1027
+ readonly check: "Check";
1028
+ readonly warning: "AlertTriangle";
1029
+ readonly error: "AlertCircle";
1030
+ readonly info: "Info";
1031
+ readonly loading: "Loader2";
1032
+ readonly pending: "Clock";
1033
+ readonly scheduled: "CalendarClock";
1034
+ readonly draft: "FileEdit";
1035
+ readonly active: "CircleDot";
1036
+ readonly inactive: "Circle";
1037
+ readonly verified: "BadgeCheck";
1038
+ readonly locked: "Lock";
1039
+ readonly unlocked: "Unlock";
1040
+ readonly visible: "Eye";
1041
+ readonly hidden: "EyeOff";
1042
+ };
1043
+ /** Domain-specific icons */
1044
+ readonly domain: {
1045
+ readonly calendar: "Calendar";
1046
+ readonly date: "Calendar";
1047
+ readonly time: "Clock";
1048
+ readonly location: "MapPin";
1049
+ readonly address: "MapPin";
1050
+ readonly team: "Users";
1051
+ readonly user: "User";
1052
+ readonly profile: "UserCircle";
1053
+ readonly email: "Mail";
1054
+ readonly phone: "Phone";
1055
+ readonly money: "DollarSign";
1056
+ readonly payment: "CreditCard";
1057
+ readonly invoice: "Receipt";
1058
+ readonly rating: "Star";
1059
+ readonly favorite: "Heart";
1060
+ readonly bookmark: "Bookmark";
1061
+ readonly share: "Share2";
1062
+ readonly link: "Link";
1063
+ readonly attachment: "Paperclip";
1064
+ readonly image: "Image";
1065
+ readonly file: "File";
1066
+ readonly folder: "Folder";
1067
+ readonly document: "FileText";
1068
+ readonly chart: "BarChart3";
1069
+ readonly analytics: "TrendingUp";
1070
+ readonly dashboard: "LayoutDashboard";
1071
+ readonly notification: "Bell";
1072
+ readonly message: "MessageSquare";
1073
+ readonly comment: "MessageCircle";
1074
+ readonly tag: "Tag";
1075
+ readonly category: "Folder";
1076
+ readonly partner: "Building2";
1077
+ readonly company: "Building";
1078
+ readonly store: "Store";
1079
+ readonly product: "Package";
1080
+ readonly inventory: "Boxes";
1081
+ readonly order: "ShoppingCart";
1082
+ readonly offer: "Ticket";
1083
+ readonly event: "CalendarDays";
1084
+ readonly campaign: "Megaphone";
1085
+ };
1086
+ /** Form icons */
1087
+ readonly form: {
1088
+ readonly required: "Asterisk";
1089
+ readonly optional: "Circle";
1090
+ readonly help: "HelpCircle";
1091
+ readonly clear: "XCircle";
1092
+ readonly show: "Eye";
1093
+ readonly hide: "EyeOff";
1094
+ readonly increment: "Plus";
1095
+ readonly decrement: "Minus";
1096
+ };
1097
+ /** Empty state icons */
1098
+ readonly emptyStates: {
1099
+ readonly noData: "Inbox";
1100
+ readonly noResults: "SearchX";
1101
+ readonly noItems: "PackageOpen";
1102
+ readonly noContent: "FileX";
1103
+ readonly noAccess: "ShieldX";
1104
+ readonly error: "AlertOctagon";
1105
+ readonly maintenance: "Wrench";
1106
+ readonly construction: "Construction";
1107
+ };
1108
+ };
1109
+ declare const getIcon: (category: keyof typeof iconMappings, key: string) => string | undefined;
1110
+ type IconMappings = typeof iconMappings;
1111
+
1112
+ declare const badgeMappings: {
1113
+ /** Status badge variants */
1114
+ readonly status: {
1115
+ readonly active: "success";
1116
+ readonly live: "success";
1117
+ readonly complete: "success";
1118
+ readonly completed: "success";
1119
+ readonly approved: "success";
1120
+ readonly verified: "success";
1121
+ readonly published: "success";
1122
+ readonly online: "success";
1123
+ readonly pending: "warning";
1124
+ readonly pendingReview: "warning";
1125
+ readonly inReview: "warning";
1126
+ readonly processing: "warning";
1127
+ readonly scheduled: "warning";
1128
+ readonly draft: "secondary";
1129
+ readonly inProgress: "secondary";
1130
+ readonly paused: "secondary";
1131
+ readonly inactive: "secondary";
1132
+ readonly offline: "secondary";
1133
+ readonly error: "destructive";
1134
+ readonly failed: "destructive";
1135
+ readonly cancelled: "destructive";
1136
+ readonly rejected: "destructive";
1137
+ readonly expired: "destructive";
1138
+ readonly overdue: "destructive";
1139
+ readonly archived: "outline";
1140
+ readonly closed: "outline";
1141
+ readonly ended: "outline";
1142
+ readonly past: "outline";
1143
+ };
1144
+ /** Generic tag styling */
1145
+ readonly tags: "outline";
1146
+ /** Premium/VIP styling (use CSS class, not Badge component) */
1147
+ readonly premium: {
1148
+ readonly className: "badge-premium";
1149
+ readonly note: "Use badge-premium CSS class, not Badge component variant";
1150
+ };
1151
+ /** Badge with shadow for floating effect */
1152
+ readonly floating: {
1153
+ readonly additionalClass: "shadow-tag";
1154
+ readonly note: "Add shadow-tag class to Badge for floating effect";
1155
+ };
1156
+ };
1157
+ declare const getBadgeVariant: (status: string) => string;
1158
+ declare const statusLabels: Record<string, string>;
1159
+ type BadgeMappings = typeof badgeMappings;
1160
+
1161
+ /**
1162
+ * Complete Offline Design System
1163
+ *
1164
+ * Use this object for LLM consumption - it contains all design decisions,
1165
+ * patterns, and component guidance in a single queryable structure.
1166
+ *
1167
+ * @example
1168
+ * // What color for positive feedback?
1169
+ * offlineDesignSystem.semantics.colors.feedback.positive // "chart-3"
1170
+ *
1171
+ * // What component for delete confirmation?
1172
+ * offlineDesignSystem.components.decisions.modals.confirmDestructive // "AlertDialog"
1173
+ *
1174
+ * // What typography for stat values?
1175
+ * offlineDesignSystem.semantics.typography.statValueLarge // "display-medium"
1176
+ *
1177
+ * // What icon for delete action?
1178
+ * offlineDesignSystem.mappings.icons.actions.delete // "Trash2"
1179
+ *
1180
+ * // What spacing between form fields?
1181
+ * offlineDesignSystem.patterns.layout.forms.fieldGap // "space-y-4"
1182
+ */
1183
+ declare const offlineDesignSystem: {
1184
+ /** Package metadata */
1185
+ readonly meta: {
1186
+ readonly name: "@offlinemediainc/offline-ui";
1187
+ readonly version: "0.2.0";
1188
+ readonly description: "Offline Media Design System - LLM-friendly design decisions and patterns";
1189
+ };
1190
+ /** Quick reference for most common decisions */
1191
+ readonly quickReference: {
1192
+ readonly colors: {
1193
+ readonly primary: "#191919 (gray-900) - buttons, text, UI elements";
1194
+ readonly accent: "#de8e0f (yellow-400) - ACCENT ONLY, never buttons";
1195
+ readonly link: "#004fff (blue-400) - clickable text only";
1196
+ readonly success: "#099250 (chart-3) - positive feedback";
1197
+ readonly error: "#d31a0c (chart-5) - errors, destructive";
1198
+ };
1199
+ readonly fonts: {
1200
+ readonly display: "Cabinet Grotesk - hero headlines only";
1201
+ readonly body: "Satoshi - everything else";
1202
+ readonly mono: "DM Mono - stats and numbers";
1203
+ };
1204
+ readonly shadows: {
1205
+ readonly card: "shadow-card - default for containers";
1206
+ readonly floating: "shadow-tag - floating badges";
1207
+ readonly modal: "shadow-elevated - dialogs, popovers";
1208
+ };
1209
+ readonly components: {
1210
+ readonly formModal: "Dialog";
1211
+ readonly destructiveConfirm: "AlertDialog";
1212
+ readonly sidePanel: "Sheet side=right";
1213
+ readonly listItem: "Item";
1214
+ readonly toast: "toast.success / toast.error";
1215
+ };
1216
+ };
1217
+ /** Semantic color and typography mappings */
1218
+ readonly semantics: {
1219
+ readonly colors: {
1220
+ readonly brand: {
1221
+ readonly primary: "yellow-400";
1222
+ readonly interactive: "blue-400";
1223
+ };
1224
+ readonly text: {
1225
+ readonly primary: "gray-900";
1226
+ readonly secondary: "gray-600";
1227
+ readonly muted: "gray-500";
1228
+ readonly onDark: "white";
1229
+ readonly link: "blue-400";
1230
+ readonly positive: "semantic-success500";
1231
+ readonly negative: "red-400";
1232
+ };
1233
+ readonly surface: {
1234
+ readonly default: "white";
1235
+ readonly muted: "gray-50";
1236
+ readonly elevated: "white + shadow-elevated";
1237
+ };
1238
+ readonly border: {
1239
+ readonly default: "gray-200";
1240
+ readonly strong: "gray-300";
1241
+ readonly interactive: "yellow-400";
1242
+ readonly focus: "gray-900";
1243
+ };
1244
+ readonly feedback: {
1245
+ readonly positive: "chart-3";
1246
+ readonly negative: "chart-5";
1247
+ readonly warning: "yellow-400";
1248
+ readonly neutral: "chart-4";
1249
+ };
1250
+ };
1251
+ readonly colorHexValues: {
1252
+ readonly "yellow-25": "#fff2d8";
1253
+ readonly "yellow-50": "#ffe9bd";
1254
+ readonly "yellow-100": "#ffd386";
1255
+ readonly "yellow-200": "#ffbd54";
1256
+ readonly "yellow-300": "#f0a52c";
1257
+ readonly "yellow-400": "#de8e0f";
1258
+ readonly "yellow-500": "#c57900";
1259
+ readonly "yellow-600": "#a76700";
1260
+ readonly "yellow-700": "#835100";
1261
+ readonly "yellow-800": "#5c3900";
1262
+ readonly "yellow-900": "#331f00";
1263
+ readonly "blue-25": "#d8e7ff";
1264
+ readonly "blue-50": "#bed6ff";
1265
+ readonly "blue-100": "#85afff";
1266
+ readonly "blue-200": "#508bff";
1267
+ readonly "blue-300": "#236aff";
1268
+ readonly "blue-400": "#004fff";
1269
+ readonly "blue-500": "#0046e0";
1270
+ readonly "blue-600": "#003bbb";
1271
+ readonly "blue-700": "#002e91";
1272
+ readonly "blue-800": "#001f63";
1273
+ readonly "blue-900": "#001033";
1274
+ readonly "gray-25": "#f2f2f2";
1275
+ readonly "gray-50": "#ececec";
1276
+ readonly "gray-100": "#dfdfdf";
1277
+ readonly "gray-200": "#c6c6c6";
1278
+ readonly "gray-300": "#aeaeae";
1279
+ readonly "gray-400": "#959595";
1280
+ readonly "gray-500": "#7c7c7c";
1281
+ readonly "gray-600": "#636363";
1282
+ readonly "gray-700": "#4a4a4a";
1283
+ readonly "gray-800": "#323232";
1284
+ readonly "gray-900": "#191919";
1285
+ readonly "red-400": "#d31a0c";
1286
+ readonly "semantic-success500": "#099250";
1287
+ readonly "chart-1": "#de8e0f";
1288
+ readonly "chart-2": "#004fff";
1289
+ readonly "chart-3": "#099250";
1290
+ readonly "chart-4": "#636363";
1291
+ readonly "chart-5": "#d31a0c";
1292
+ readonly "chart-6": "#a76700";
1293
+ readonly "chart-7": "#003bbb";
1294
+ readonly "chart-8": "#959595";
1295
+ };
1296
+ readonly typography: {
1297
+ readonly pageTitle: "display-small";
1298
+ readonly sectionHeading: "headline-medium";
1299
+ readonly cardTitle: "headline-small";
1300
+ readonly statValueLarge: "display-medium";
1301
+ readonly statValueSmall: "display-small";
1302
+ readonly statLabel: "body-small";
1303
+ readonly bodyDefault: "body-medium";
1304
+ readonly bodySecondary: "body-small";
1305
+ readonly formLabel: "label-medium";
1306
+ readonly formHelper: "body-small text-muted";
1307
+ readonly formError: "body-small text-negative";
1308
+ readonly buttonText: "label-medium";
1309
+ readonly navItem: "body-medium";
1310
+ readonly badgeText: "label-small";
1311
+ readonly tableHeader: "label-medium";
1312
+ readonly tableCell: "body-medium";
1313
+ readonly timestamp: "body-small text-muted";
1314
+ readonly emptyStateTitle: "headline-small";
1315
+ readonly emptyStateDescription: "body-medium text-muted";
1316
+ readonly dialogTitle: "headline-medium";
1317
+ readonly dialogDescription: "body-medium text-muted";
1318
+ readonly sidebarLabel: "nav-label";
1319
+ readonly sidebarItem: "body-medium";
1320
+ readonly breadcrumbItem: "body-small";
1321
+ readonly breadcrumbCurrent: "body-small text-muted";
1322
+ };
1323
+ readonly fontFamilies: {
1324
+ readonly display: "var(--font-cabinet-grotesk), var(--font-satoshi), sans-serif";
1325
+ readonly body: "var(--font-satoshi), sans-serif";
1326
+ readonly mono: "var(--font-dm-mono), 'DM Mono', monospace";
1327
+ };
1328
+ readonly typographyScale: {
1329
+ readonly "display-large": {
1330
+ readonly size: "36px";
1331
+ readonly lineHeight: "100%";
1332
+ readonly weight: 800;
1333
+ readonly font: "Cabinet Grotesk";
1334
+ };
1335
+ readonly "display-medium": {
1336
+ readonly size: "32px";
1337
+ readonly lineHeight: "100%";
1338
+ readonly weight: 800;
1339
+ readonly font: "Cabinet Grotesk";
1340
+ };
1341
+ readonly "display-small": {
1342
+ readonly size: "29px";
1343
+ readonly lineHeight: "100%";
1344
+ readonly weight: 800;
1345
+ readonly font: "Cabinet Grotesk";
1346
+ };
1347
+ readonly "headline-large": {
1348
+ readonly size: "26px";
1349
+ readonly lineHeight: "32px";
1350
+ readonly weight: 700;
1351
+ readonly font: "Satoshi";
1352
+ };
1353
+ readonly "headline-medium": {
1354
+ readonly size: "23px";
1355
+ readonly lineHeight: "28px";
1356
+ readonly weight: 700;
1357
+ readonly font: "Satoshi";
1358
+ };
1359
+ readonly "headline-small": {
1360
+ readonly size: "20px";
1361
+ readonly lineHeight: "24px";
1362
+ readonly weight: 700;
1363
+ readonly font: "Satoshi";
1364
+ };
1365
+ readonly "title-large": {
1366
+ readonly size: "18px";
1367
+ readonly lineHeight: "22px";
1368
+ readonly weight: 700;
1369
+ readonly font: "Satoshi";
1370
+ };
1371
+ readonly "title-medium": {
1372
+ readonly size: "16px";
1373
+ readonly lineHeight: "20px";
1374
+ readonly weight: 700;
1375
+ readonly font: "Satoshi";
1376
+ };
1377
+ readonly "title-small": {
1378
+ readonly size: "14px";
1379
+ readonly lineHeight: "18px";
1380
+ readonly weight: 700;
1381
+ readonly font: "Satoshi";
1382
+ };
1383
+ readonly "body-large": {
1384
+ readonly size: "16px";
1385
+ readonly lineHeight: "24px";
1386
+ readonly weight: 500;
1387
+ readonly font: "Satoshi";
1388
+ };
1389
+ readonly "body-medium": {
1390
+ readonly size: "14px";
1391
+ readonly lineHeight: "20px";
1392
+ readonly weight: 500;
1393
+ readonly font: "Satoshi";
1394
+ };
1395
+ readonly "body-small": {
1396
+ readonly size: "12px";
1397
+ readonly lineHeight: "16px";
1398
+ readonly weight: 500;
1399
+ readonly font: "Satoshi";
1400
+ };
1401
+ readonly "body-x-small": {
1402
+ readonly size: "10px";
1403
+ readonly lineHeight: "14px";
1404
+ readonly weight: 500;
1405
+ readonly font: "Satoshi";
1406
+ };
1407
+ readonly "label-large": {
1408
+ readonly size: "14px";
1409
+ readonly lineHeight: "18px";
1410
+ readonly weight: 700;
1411
+ readonly font: "Satoshi";
1412
+ };
1413
+ readonly "label-medium": {
1414
+ readonly size: "12px";
1415
+ readonly lineHeight: "16px";
1416
+ readonly weight: 700;
1417
+ readonly font: "Satoshi";
1418
+ };
1419
+ readonly "label-small": {
1420
+ readonly size: "10px";
1421
+ readonly lineHeight: "14px";
1422
+ readonly weight: 700;
1423
+ readonly font: "Satoshi";
1424
+ };
1425
+ readonly "stat-mono": {
1426
+ readonly weight: 500;
1427
+ readonly letterSpacing: "0.04em";
1428
+ readonly font: "DM Mono";
1429
+ };
1430
+ };
1431
+ };
1432
+ /** Component decisions and metadata */
1433
+ readonly components: {
1434
+ readonly decisions: {
1435
+ readonly lists: {
1436
+ readonly clickableRow: "Item";
1437
+ readonly dataTable: "Table";
1438
+ readonly cardGrid: "Card in grid";
1439
+ readonly simpleList: "ul with body-medium";
1440
+ readonly descriptionList: "dl with label-medium dt and body-medium dd";
1441
+ };
1442
+ readonly feedback: {
1443
+ readonly actionSuccess: "toast.success";
1444
+ readonly actionError: "toast.error";
1445
+ readonly inlineWarning: "Alert variant=warning";
1446
+ readonly inlineError: "Alert variant=destructive";
1447
+ readonly fieldError: "body-small text-negative below input";
1448
+ readonly inlineInfo: "Alert variant=default";
1449
+ };
1450
+ readonly modals: {
1451
+ readonly formEntry: "Dialog";
1452
+ readonly confirmDestructive: "AlertDialog";
1453
+ readonly sidePanel: "Sheet side=right";
1454
+ readonly mobileNav: "Sheet side=left";
1455
+ readonly mobileActions: "Sheet side=bottom h-auto max-h-[80vh]";
1456
+ readonly preview: "Dialog or Sheet";
1457
+ };
1458
+ readonly navigation: {
1459
+ readonly primaryNav: "Sidebar";
1460
+ readonly pageTabs: "Tabs";
1461
+ readonly breadcrumbs: "Breadcrumb";
1462
+ readonly sectionHeader: "Breadcrumb + headline";
1463
+ readonly dropdownNav: "DropdownMenu";
1464
+ };
1465
+ readonly selection: {
1466
+ readonly singleFromFew: "radio group";
1467
+ readonly singleFromMany: "Select";
1468
+ readonly multiple: "Checkbox group";
1469
+ readonly toggle: "single Checkbox";
1470
+ readonly segmented: "Tabs variant=pill";
1471
+ };
1472
+ readonly data: {
1473
+ readonly status: "Badge";
1474
+ readonly progress: "Progress";
1475
+ readonly avatar: "Avatar";
1476
+ readonly chart: "Chart (recharts)";
1477
+ readonly skeleton: "Skeleton";
1478
+ };
1479
+ readonly forms: {
1480
+ readonly textInput: "Input";
1481
+ readonly textArea: "Textarea";
1482
+ readonly typedInput: "Input type=email|password|number";
1483
+ readonly otpInput: "InputOTP";
1484
+ readonly label: "Label htmlFor={id}";
1485
+ readonly checkbox: "Checkbox + Label";
1486
+ };
1487
+ readonly layout: {
1488
+ readonly card: "Card";
1489
+ readonly accordion: "Accordion";
1490
+ readonly collapsible: "Collapsible";
1491
+ readonly separator: "Separator";
1492
+ readonly tooltip: "Tooltip";
1493
+ };
1494
+ };
1495
+ readonly registry: Record<string, ComponentMeta>;
1496
+ readonly approved: string[];
1497
+ readonly draft: string[];
1498
+ };
1499
+ /** Layout, state, and interaction patterns */
1500
+ readonly patterns: {
1501
+ readonly layout: {
1502
+ readonly page: {
1503
+ readonly maxWidth: "max-w-4xl";
1504
+ readonly maxWidthWide: "max-w-6xl";
1505
+ readonly padding: "px-4 py-6";
1506
+ readonly sectionGap: "space-y-8";
1507
+ readonly wrapper: "mx-auto px-4 py-6";
1508
+ };
1509
+ readonly cards: {
1510
+ readonly padding: "p-6";
1511
+ readonly paddingCompact: "p-4";
1512
+ readonly gap: "gap-4";
1513
+ readonly grid2col: "grid grid-cols-1 md:grid-cols-2 gap-4";
1514
+ readonly grid3col: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4";
1515
+ readonly grid4col: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4";
1516
+ readonly stack: "flex flex-col gap-4";
1517
+ };
1518
+ readonly forms: {
1519
+ readonly fieldGap: "space-y-4";
1520
+ readonly labelGap: "mb-2";
1521
+ readonly helperGap: "mt-1";
1522
+ readonly buttonGap: "gap-2";
1523
+ readonly sectionGap: "space-y-6";
1524
+ readonly container: "space-y-4";
1525
+ readonly actions: "flex justify-end gap-2 pt-4";
1526
+ readonly fieldFull: "w-full";
1527
+ readonly fieldPair: "grid grid-cols-2 gap-4";
1528
+ };
1529
+ readonly inline: {
1530
+ readonly iconText: "inline-flex items-center gap-2";
1531
+ readonly badges: "flex flex-wrap gap-2";
1532
+ readonly buttons: "flex items-center gap-2";
1533
+ readonly tags: "flex flex-wrap gap-1";
1534
+ };
1535
+ readonly header: {
1536
+ readonly pageHeader: "flex items-center justify-between mb-6";
1537
+ readonly sectionHeader: "flex items-center justify-between mb-4";
1538
+ readonly cardHeader: "flex items-center justify-between";
1539
+ };
1540
+ readonly sidebar: {
1541
+ readonly width: "w-64";
1542
+ readonly widthCollapsed: "w-16";
1543
+ readonly contentWithSidebar: "ml-64";
1544
+ readonly contentMobile: "ml-0";
1545
+ };
1546
+ readonly responsive: {
1547
+ readonly hideMobile: "hidden md:block";
1548
+ readonly showMobile: "md:hidden";
1549
+ readonly stackToRow: "flex flex-col md:flex-row";
1550
+ readonly fullToAuto: "w-full md:w-auto";
1551
+ };
1552
+ };
1553
+ readonly states: {
1554
+ readonly loading: {
1555
+ readonly page: "Skeleton matching page structure";
1556
+ readonly card: "Skeleton matching card structure";
1557
+ readonly button: {
1558
+ readonly icon: "Loader2";
1559
+ readonly text: "Loading...";
1560
+ readonly classes: "disabled opacity-50";
1561
+ readonly iconClasses: "animate-spin mr-2 h-4 w-4";
1562
+ };
1563
+ readonly inline: {
1564
+ readonly icon: "Loader2";
1565
+ readonly classes: "animate-spin h-4 w-4";
1566
+ };
1567
+ readonly tableRow: "Skeleton h-12 w-full";
1568
+ readonly listItem: "Skeleton h-16 w-full";
1569
+ readonly avatar: "Skeleton h-10 w-10 rounded-full";
1570
+ };
1571
+ readonly empty: {
1572
+ readonly structure: "flex flex-col items-center justify-center py-12 text-center";
1573
+ readonly icon: {
1574
+ readonly classes: "h-12 w-12 text-muted-foreground mb-4";
1575
+ readonly note: "Use relevant lucide icon for context";
1576
+ };
1577
+ readonly title: {
1578
+ readonly classes: "headline-small mb-2";
1579
+ };
1580
+ readonly description: {
1581
+ readonly classes: "body-medium text-muted-foreground max-w-sm mx-auto mb-4";
1582
+ };
1583
+ readonly action: {
1584
+ readonly variant: "outline";
1585
+ readonly note: "Optional - only if user can take action to fill empty state";
1586
+ };
1587
+ };
1588
+ readonly error: {
1589
+ readonly page: {
1590
+ readonly component: "Alert";
1591
+ readonly variant: "destructive";
1592
+ readonly includeRetry: true;
1593
+ readonly classes: "max-w-lg mx-auto my-8";
1594
+ };
1595
+ readonly inline: {
1596
+ readonly classes: "body-small text-destructive";
1597
+ };
1598
+ readonly field: {
1599
+ readonly inputClasses: "border-destructive focus:ring-destructive";
1600
+ readonly messageClasses: "body-small text-destructive mt-1";
1601
+ };
1602
+ readonly banner: {
1603
+ readonly component: "Alert";
1604
+ readonly variant: "destructive";
1605
+ readonly classes: "mb-4";
1606
+ };
1607
+ };
1608
+ readonly disabled: {
1609
+ readonly opacity: "opacity-50";
1610
+ readonly cursor: "cursor-not-allowed";
1611
+ readonly interaction: "pointer-events-none";
1612
+ readonly combined: "opacity-50 cursor-not-allowed pointer-events-none";
1613
+ };
1614
+ readonly success: {
1615
+ readonly toast: {
1616
+ readonly method: "toast.success";
1617
+ readonly duration: 3000;
1618
+ };
1619
+ readonly inline: {
1620
+ readonly classes: "body-small text-[var(--semantic-success500)]";
1621
+ };
1622
+ readonly banner: {
1623
+ readonly component: "Alert";
1624
+ readonly variant: "default";
1625
+ readonly icon: "CheckCircle";
1626
+ readonly classes: "border-[var(--semantic-success500)] bg-green-50";
1627
+ };
1628
+ };
1629
+ readonly warning: {
1630
+ readonly banner: {
1631
+ readonly component: "Alert";
1632
+ readonly variant: "warning";
1633
+ readonly icon: "AlertTriangle";
1634
+ };
1635
+ readonly inline: {
1636
+ readonly classes: "body-small text-[var(--colors-yellow-600)]";
1637
+ };
1638
+ };
1639
+ };
1640
+ readonly interactions: {
1641
+ readonly clickableCard: {
1642
+ readonly default: "shadow-card transition-shadow duration-200";
1643
+ readonly hover: "hover:shadow-elevated";
1644
+ readonly cursor: "cursor-pointer";
1645
+ readonly combined: "shadow-card hover:shadow-elevated cursor-pointer transition-shadow duration-200";
1646
+ readonly withBorder: "border border-gray-200 hover:border-gray-300 cursor-pointer transition-colors";
1647
+ };
1648
+ readonly link: {
1649
+ readonly default: "text-[var(--colors-blue-400)] underline-offset-4";
1650
+ readonly hover: "hover:underline";
1651
+ readonly combined: "text-[var(--colors-blue-400)] underline-offset-4 hover:underline";
1652
+ readonly nav: "text-[var(--colors-blue-400)] hover:underline underline-offset-4";
1653
+ };
1654
+ readonly iconButton: {
1655
+ readonly default: "p-2 rounded-md transition-colors";
1656
+ readonly hover: "hover:bg-muted";
1657
+ readonly combined: "p-2 rounded-md hover:bg-muted transition-colors";
1658
+ readonly destructive: "p-2 rounded-md hover:bg-destructive/10 hover:text-destructive transition-colors";
1659
+ };
1660
+ readonly tableRow: {
1661
+ readonly default: "transition-colors";
1662
+ readonly hover: "hover:bg-muted/50";
1663
+ readonly combined: "hover:bg-muted/50 transition-colors";
1664
+ readonly clickable: "hover:bg-muted/50 cursor-pointer transition-colors";
1665
+ };
1666
+ readonly listItem: {
1667
+ readonly default: "transition-colors";
1668
+ readonly hover: "hover:bg-muted/50";
1669
+ readonly active: "bg-muted";
1670
+ readonly combined: "hover:bg-muted/50 cursor-pointer transition-colors";
1671
+ };
1672
+ readonly button: {
1673
+ readonly focus: "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2";
1674
+ readonly active: "active:scale-[0.98]";
1675
+ readonly transition: "transition-colors";
1676
+ };
1677
+ readonly input: {
1678
+ readonly default: "border border-gray-200 transition-colors";
1679
+ readonly hover: "hover:border-gray-300";
1680
+ readonly focus: "focus:border-gray-900 focus:ring-2 focus:ring-gray-900/10";
1681
+ readonly error: "border-destructive focus:border-destructive focus:ring-destructive/10";
1682
+ readonly combined: "border border-gray-200 hover:border-gray-300 focus:border-gray-900 focus:ring-2 focus:ring-gray-900/10 transition-colors";
1683
+ };
1684
+ readonly menuItem: {
1685
+ readonly default: "transition-colors rounded-sm";
1686
+ readonly hover: "hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground";
1687
+ readonly combined: "hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground rounded-sm transition-colors";
1688
+ };
1689
+ readonly sidebarItem: {
1690
+ readonly default: "transition-colors rounded-md";
1691
+ readonly hover: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground";
1692
+ readonly active: "bg-sidebar-accent text-sidebar-accent-foreground";
1693
+ readonly combined: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground rounded-md transition-colors";
1694
+ };
1695
+ readonly transitions: {
1696
+ readonly fast: "transition-colors duration-150";
1697
+ readonly medium: "transition-all duration-200";
1698
+ readonly slow: "transition-all duration-300";
1699
+ readonly ease: {
1700
+ readonly default: "ease-in-out";
1701
+ readonly in: "ease-in";
1702
+ readonly out: "ease-out";
1703
+ readonly bounce: "cubic-bezier(0.68, -0.55, 0.265, 1.55)";
1704
+ };
1705
+ };
1706
+ };
1707
+ readonly charts: {
1708
+ readonly colorPriority: readonly ["chart-1", "chart-3", "chart-5", "chart-4", "chart-6", "chart-8"];
1709
+ readonly ratingDistribution: {
1710
+ readonly "5": "chart-3";
1711
+ readonly "4": "chart-1";
1712
+ readonly "3": "chart-4";
1713
+ readonly "2": "chart-5";
1714
+ readonly "1": "chart-5";
1715
+ };
1716
+ readonly positiveMetrics: readonly ["chart-1", "chart-3", "chart-6"];
1717
+ readonly negativeMetrics: readonly ["chart-5", "chart-4", "chart-8"];
1718
+ readonly comparisonPairs: {
1719
+ readonly current: "chart-1";
1720
+ readonly previous: "chart-4";
1721
+ };
1722
+ readonly axisStyle: {
1723
+ readonly tickLine: false;
1724
+ readonly axisLine: false;
1725
+ readonly tick: {
1726
+ readonly fill: "hsl(var(--muted-foreground))";
1727
+ readonly fontSize: 12;
1728
+ };
1729
+ readonly tickMargin: 8;
1730
+ };
1731
+ readonly yAxisStyle: {
1732
+ readonly tickLine: false;
1733
+ readonly axisLine: false;
1734
+ readonly tick: {
1735
+ readonly fill: "hsl(var(--muted-foreground))";
1736
+ readonly fontSize: 12;
1737
+ };
1738
+ readonly width: 40;
1739
+ };
1740
+ readonly xAxisStyle: {
1741
+ readonly tickLine: false;
1742
+ readonly axisLine: false;
1743
+ readonly tick: {
1744
+ readonly fill: "hsl(var(--muted-foreground))";
1745
+ readonly fontSize: 12;
1746
+ };
1747
+ readonly height: 40;
1748
+ };
1749
+ readonly barRadius: [number, number, number, number];
1750
+ readonly gridStyle: {
1751
+ readonly stroke: "hsl(var(--border))";
1752
+ readonly strokeDasharray: "3 3";
1753
+ };
1754
+ readonly tooltipStyle: {
1755
+ readonly contentStyle: {
1756
+ readonly backgroundColor: "hsl(var(--popover))";
1757
+ readonly border: "1px solid hsl(var(--border))";
1758
+ readonly borderRadius: "6px";
1759
+ readonly boxShadow: "var(--card-shadow)";
1760
+ };
1761
+ readonly labelStyle: {
1762
+ readonly fontWeight: 600;
1763
+ readonly marginBottom: 4;
1764
+ };
1765
+ };
1766
+ readonly legendStyle: {
1767
+ readonly iconType: "circle";
1768
+ readonly iconSize: 8;
1769
+ readonly wrapperStyle: {
1770
+ readonly paddingTop: 16;
1771
+ };
1772
+ };
1773
+ readonly containerSizing: {
1774
+ readonly small: {
1775
+ readonly height: 100;
1776
+ };
1777
+ readonly medium: {
1778
+ readonly height: 200;
1779
+ };
1780
+ readonly large: {
1781
+ readonly height: 300;
1782
+ };
1783
+ readonly full: {
1784
+ readonly height: 400;
1785
+ };
1786
+ };
1787
+ readonly margins: {
1788
+ readonly none: {
1789
+ readonly top: 0;
1790
+ readonly right: 0;
1791
+ readonly bottom: 0;
1792
+ readonly left: 0;
1793
+ };
1794
+ readonly withAxis: {
1795
+ readonly top: 10;
1796
+ readonly right: 10;
1797
+ readonly bottom: 30;
1798
+ readonly left: 40;
1799
+ };
1800
+ readonly withLegend: {
1801
+ readonly top: 10;
1802
+ readonly right: 10;
1803
+ readonly bottom: 50;
1804
+ readonly left: 40;
1805
+ };
1806
+ };
1807
+ readonly semanticSeries: {
1808
+ readonly revenue: {
1809
+ readonly color: "chart-1";
1810
+ readonly label: "Revenue";
1811
+ };
1812
+ readonly growth: {
1813
+ readonly color: "chart-3";
1814
+ readonly label: "Growth";
1815
+ };
1816
+ readonly decline: {
1817
+ readonly color: "chart-5";
1818
+ readonly label: "Decline";
1819
+ };
1820
+ readonly baseline: {
1821
+ readonly color: "chart-4";
1822
+ readonly label: "Baseline";
1823
+ };
1824
+ readonly target: {
1825
+ readonly color: "chart-2";
1826
+ readonly label: "Target";
1827
+ };
1828
+ };
1829
+ };
1830
+ readonly modals: {
1831
+ readonly sizes: {
1832
+ readonly small: "max-w-sm";
1833
+ readonly default: "max-w-lg";
1834
+ readonly large: "max-w-2xl";
1835
+ readonly xl: "max-w-3xl";
1836
+ readonly full: "max-w-4xl";
1837
+ };
1838
+ readonly headerWithIcon: {
1839
+ readonly iconContainer: "size-12 rounded-full flex items-center justify-center mb-4";
1840
+ readonly iconPositive: "bg-yellow-100 text-yellow-600";
1841
+ readonly iconInfo: "bg-blue-100 text-blue-600";
1842
+ readonly iconDestructive: "bg-red-100 text-red-600";
1843
+ readonly iconSuccess: "bg-green-100 text-green-600";
1844
+ readonly iconSize: "h-6 w-6";
1845
+ };
1846
+ readonly footer: {
1847
+ readonly alignment: "flex justify-end gap-2";
1848
+ readonly cancelFirst: true;
1849
+ readonly destructive: {
1850
+ readonly cancelVariant: "outline";
1851
+ readonly actionVariant: "destructive";
1852
+ };
1853
+ readonly standard: {
1854
+ readonly cancelVariant: "outline";
1855
+ readonly actionVariant: "default";
1856
+ };
1857
+ };
1858
+ readonly mobile: {
1859
+ readonly dialogHeight: "max-h-[90vh] overflow-y-auto";
1860
+ readonly bottomSheetHeight: "h-auto max-h-[80vh]";
1861
+ readonly fullScreen: "fixed inset-0 max-w-none rounded-none";
1862
+ };
1863
+ readonly sheet: {
1864
+ readonly right: {
1865
+ readonly side: "right";
1866
+ readonly width: "w-[400px] sm:max-w-[540px]";
1867
+ };
1868
+ readonly left: {
1869
+ readonly side: "left";
1870
+ readonly width: "w-[300px] sm:max-w-[400px]";
1871
+ };
1872
+ readonly bottom: {
1873
+ readonly side: "bottom";
1874
+ readonly height: "h-auto max-h-[80vh]";
1875
+ readonly rounded: "rounded-t-xl";
1876
+ };
1877
+ };
1878
+ readonly alertDialog: {
1879
+ readonly headerRule: "Title and description text only";
1880
+ readonly buttonOrder: readonly ["AlertDialogCancel", "AlertDialogAction"];
1881
+ readonly destructiveAction: {
1882
+ readonly variant: "destructive";
1883
+ readonly text: "Delete";
1884
+ };
1885
+ readonly messaging: {
1886
+ readonly title: "Action verb + object (e.g., 'Delete this item?')";
1887
+ readonly description: "Consequence explanation (e.g., 'This action cannot be undone.')";
1888
+ };
1889
+ };
1890
+ readonly contentPatterns: {
1891
+ readonly form: {
1892
+ readonly spacing: "space-y-4";
1893
+ readonly footerSpacing: "pt-4";
1894
+ };
1895
+ readonly confirmation: {
1896
+ readonly textAlign: "text-center";
1897
+ readonly spacing: "space-y-2";
1898
+ };
1899
+ readonly detail: {
1900
+ readonly maxHeight: "max-h-[70vh]";
1901
+ readonly overflow: "overflow-y-auto";
1902
+ };
1903
+ };
1904
+ readonly animation: {
1905
+ readonly dialog: "duration-200";
1906
+ readonly sheet: "duration-300";
1907
+ readonly overlay: "duration-200";
1908
+ };
1909
+ };
1910
+ };
1911
+ /** Icon and badge mappings */
1912
+ readonly mappings: {
1913
+ readonly icons: {
1914
+ readonly actions: {
1915
+ readonly edit: "Pencil";
1916
+ readonly delete: "Trash2";
1917
+ readonly add: "Plus";
1918
+ readonly create: "Plus";
1919
+ readonly close: "X";
1920
+ readonly cancel: "X";
1921
+ readonly menu: "MoreVertical";
1922
+ readonly menuHorizontal: "MoreHorizontal";
1923
+ readonly settings: "Settings";
1924
+ readonly copy: "Copy";
1925
+ readonly duplicate: "Copy";
1926
+ readonly download: "Download";
1927
+ readonly upload: "Upload";
1928
+ readonly refresh: "RefreshCw";
1929
+ readonly save: "Save";
1930
+ readonly send: "Send";
1931
+ readonly search: "Search";
1932
+ readonly filter: "Filter";
1933
+ readonly sort: "ArrowUpDown";
1934
+ readonly archive: "Archive";
1935
+ readonly restore: "ArchiveRestore";
1936
+ readonly undo: "Undo2";
1937
+ readonly redo: "Redo2";
1938
+ readonly print: "Printer";
1939
+ readonly export: "FileDown";
1940
+ readonly import: "FileUp";
1941
+ };
1942
+ readonly navigation: {
1943
+ readonly back: "ArrowLeft";
1944
+ readonly forward: "ArrowRight";
1945
+ readonly up: "ArrowUp";
1946
+ readonly down: "ArrowDown";
1947
+ readonly external: "ExternalLink";
1948
+ readonly expand: "ChevronDown";
1949
+ readonly collapse: "ChevronUp";
1950
+ readonly chevronLeft: "ChevronLeft";
1951
+ readonly chevronRight: "ChevronRight";
1952
+ readonly home: "Home";
1953
+ readonly menu: "Menu";
1954
+ readonly sidebar: "PanelLeft";
1955
+ readonly grid: "LayoutGrid";
1956
+ readonly list: "List";
1957
+ };
1958
+ readonly status: {
1959
+ readonly success: "CheckCircle";
1960
+ readonly check: "Check";
1961
+ readonly warning: "AlertTriangle";
1962
+ readonly error: "AlertCircle";
1963
+ readonly info: "Info";
1964
+ readonly loading: "Loader2";
1965
+ readonly pending: "Clock";
1966
+ readonly scheduled: "CalendarClock";
1967
+ readonly draft: "FileEdit";
1968
+ readonly active: "CircleDot";
1969
+ readonly inactive: "Circle";
1970
+ readonly verified: "BadgeCheck";
1971
+ readonly locked: "Lock";
1972
+ readonly unlocked: "Unlock";
1973
+ readonly visible: "Eye";
1974
+ readonly hidden: "EyeOff";
1975
+ };
1976
+ readonly domain: {
1977
+ readonly calendar: "Calendar";
1978
+ readonly date: "Calendar";
1979
+ readonly time: "Clock";
1980
+ readonly location: "MapPin";
1981
+ readonly address: "MapPin";
1982
+ readonly team: "Users";
1983
+ readonly user: "User";
1984
+ readonly profile: "UserCircle";
1985
+ readonly email: "Mail";
1986
+ readonly phone: "Phone";
1987
+ readonly money: "DollarSign";
1988
+ readonly payment: "CreditCard";
1989
+ readonly invoice: "Receipt";
1990
+ readonly rating: "Star";
1991
+ readonly favorite: "Heart";
1992
+ readonly bookmark: "Bookmark";
1993
+ readonly share: "Share2";
1994
+ readonly link: "Link";
1995
+ readonly attachment: "Paperclip";
1996
+ readonly image: "Image";
1997
+ readonly file: "File";
1998
+ readonly folder: "Folder";
1999
+ readonly document: "FileText";
2000
+ readonly chart: "BarChart3";
2001
+ readonly analytics: "TrendingUp";
2002
+ readonly dashboard: "LayoutDashboard";
2003
+ readonly notification: "Bell";
2004
+ readonly message: "MessageSquare";
2005
+ readonly comment: "MessageCircle";
2006
+ readonly tag: "Tag";
2007
+ readonly category: "Folder";
2008
+ readonly partner: "Building2";
2009
+ readonly company: "Building";
2010
+ readonly store: "Store";
2011
+ readonly product: "Package";
2012
+ readonly inventory: "Boxes";
2013
+ readonly order: "ShoppingCart";
2014
+ readonly offer: "Ticket";
2015
+ readonly event: "CalendarDays";
2016
+ readonly campaign: "Megaphone";
2017
+ };
2018
+ readonly form: {
2019
+ readonly required: "Asterisk";
2020
+ readonly optional: "Circle";
2021
+ readonly help: "HelpCircle";
2022
+ readonly clear: "XCircle";
2023
+ readonly show: "Eye";
2024
+ readonly hide: "EyeOff";
2025
+ readonly increment: "Plus";
2026
+ readonly decrement: "Minus";
2027
+ };
2028
+ readonly emptyStates: {
2029
+ readonly noData: "Inbox";
2030
+ readonly noResults: "SearchX";
2031
+ readonly noItems: "PackageOpen";
2032
+ readonly noContent: "FileX";
2033
+ readonly noAccess: "ShieldX";
2034
+ readonly error: "AlertOctagon";
2035
+ readonly maintenance: "Wrench";
2036
+ readonly construction: "Construction";
2037
+ };
2038
+ };
2039
+ readonly badges: {
2040
+ readonly status: {
2041
+ readonly active: "success";
2042
+ readonly live: "success";
2043
+ readonly complete: "success";
2044
+ readonly completed: "success";
2045
+ readonly approved: "success";
2046
+ readonly verified: "success";
2047
+ readonly published: "success";
2048
+ readonly online: "success";
2049
+ readonly pending: "warning";
2050
+ readonly pendingReview: "warning";
2051
+ readonly inReview: "warning";
2052
+ readonly processing: "warning";
2053
+ readonly scheduled: "warning";
2054
+ readonly draft: "secondary";
2055
+ readonly inProgress: "secondary";
2056
+ readonly paused: "secondary";
2057
+ readonly inactive: "secondary";
2058
+ readonly offline: "secondary";
2059
+ readonly error: "destructive";
2060
+ readonly failed: "destructive";
2061
+ readonly cancelled: "destructive";
2062
+ readonly rejected: "destructive";
2063
+ readonly expired: "destructive";
2064
+ readonly overdue: "destructive";
2065
+ readonly archived: "outline";
2066
+ readonly closed: "outline";
2067
+ readonly ended: "outline";
2068
+ readonly past: "outline";
2069
+ };
2070
+ readonly tags: "outline";
2071
+ readonly premium: {
2072
+ readonly className: "badge-premium";
2073
+ readonly note: "Use badge-premium CSS class, not Badge component variant";
2074
+ };
2075
+ readonly floating: {
2076
+ readonly additionalClass: "shadow-tag";
2077
+ readonly note: "Add shadow-tag class to Badge for floating effect";
2078
+ };
2079
+ };
2080
+ readonly statusLabels: Record<string, string>;
2081
+ };
2082
+ /** Design rules and anti-patterns */
2083
+ readonly rules: {
2084
+ readonly critical: readonly ["NEVER use yellow (#de8e0f) for buttons - yellow is accent only", "Blue (#004fff) is ONLY for clickable text links", "AlertDialog headers: title + description only, NO icons or decoration", "Icon-only buttons MUST have aria-label", "Inputs MUST be paired with Label using htmlFor"];
2085
+ readonly guidelines: readonly ["Use CSS variables instead of hardcoded hex values", "Match shadow level to element importance: card < tag < elevated", "Use Cabinet Grotesk (display-*) sparingly for hero headlines", "Use stat-mono for numerical data and statistics", "Add max-h-[90vh] overflow-y-auto to Dialog for mobile"];
2086
+ readonly antiPatterns: readonly [{
2087
+ readonly bad: "Yellow buttons";
2088
+ readonly fix: "Use Button variant='default' (black)";
2089
+ }, {
2090
+ readonly bad: "Home icon in breadcrumb";
2091
+ readonly fix: "Use 'Home' text instead";
2092
+ }, {
2093
+ readonly bad: "Decorated AlertDialog headers";
2094
+ readonly fix: "Title + description only";
2095
+ }, {
2096
+ readonly bad: "Missing input labels";
2097
+ readonly fix: "Always pair Input with Label htmlFor";
2098
+ }, {
2099
+ readonly bad: "Hardcoded colors";
2100
+ readonly fix: "Use CSS variables or semantic classes";
2101
+ }, {
2102
+ readonly bad: "Overusing premium styling";
2103
+ readonly fix: "Reserve for actual premium content";
2104
+ }];
2105
+ };
2106
+ };
2107
+ type OfflineDesignSystem = typeof offlineDesignSystem;
2108
+
2109
+ export { type BadgeMappings, type BadgeVariant, type ButtonSize, type ButtonVariant, type ChartPatterns, type ColorHexValues, type ColorToken, type ComponentDecisions, type ComponentMeta, type ComponentRegistry, type FontFamilyDecisions, type IconMappings, type InteractionPatterns, type LayoutPatterns, type LucideIconName, type ModalPatterns, type OfflineDesignSystem, type SemanticColors, type ShadowLevel, type StatePatterns, type TailwindClass, type TypographyClass, type TypographyDecisions, type TypographyScale, approvedComponents, badgeMappings, chartPatterns, colorHexValues, componentDecisions, componentRegistry, draftComponents, fontFamilyDecisions, getBadgeVariant, getIcon, iconMappings, interactionPatterns, layoutPatterns, modalPatterns, offlineDesignSystem, semanticColors, statePatterns, statusLabels, typographyDecisions, typographyScale };