@12-apps/ui 1.4.1 → 1.5.1
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/package.json +17 -8
- package/src/button/index.ts +1 -0
- package/src/social-login-button/index.ts +1 -0
- package/src/{social-login-button.tsx → social-login-button/social-login-button.tsx} +5 -5
- package/src/user-avatar/index.ts +1 -0
- package/src/{user-avatar.tsx → user-avatar/user-avatar.tsx} +4 -4
- package/eslint.config.js +0 -77
- package/src/__tests__/data-grid.test.tsx +0 -125
- package/src/__tests__/package-wiring.test.ts +0 -41
- package/src/__tests__/setup.ts +0 -1
- package/src/__tests__/social-login-button.test.tsx +0 -186
- package/src/__tests__/user-avatar.test.tsx +0 -195
- package/src/__tests__/viewport.test.ts +0 -50
- package/src/components/command/__tests__/command.test.tsx +0 -112
- package/src/components/data-display/Alert/Alert.stories.tsx +0 -559
- package/src/components/data-display/Alert/Alert.test.stories.tsx +0 -707
- package/src/components/data-display/AlertDialog/AlertDialog.stories.tsx +0 -362
- package/src/components/data-display/AlertDialog/AlertDialog.test.stories.tsx +0 -753
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.stories.tsx +0 -230
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.test.stories.tsx +0 -270
- package/src/components/data-display/Avatar/Avatar.stories.tsx +0 -721
- package/src/components/data-display/Avatar/Avatar.test.stories.tsx +0 -822
- package/src/components/data-display/Badge/Badge.stories.tsx +0 -1134
- package/src/components/data-display/Badge/Badge.test.stories.tsx +0 -1194
- package/src/components/data-display/Banner/Banner.stories.tsx +0 -528
- package/src/components/data-display/Banner/Banner.test.stories.tsx +0 -503
- package/src/components/data-display/Carousel/Carousel.stories.tsx +0 -607
- package/src/components/data-display/Carousel/Carousel.test.stories.tsx +0 -691
- package/src/components/data-display/Chart/Chart.stories.tsx +0 -568
- package/src/components/data-display/Chart/Chart.test.stories.tsx +0 -174
- package/src/components/data-display/Chart/SpecChart.stories.tsx +0 -150
- package/src/components/data-display/Chart/SpecChart.test.stories.tsx +0 -56
- package/src/components/data-display/Chart/__tests__/SpecChart.test.tsx +0 -60
- package/src/components/data-display/Chart/__tests__/chart-format.test.ts +0 -43
- package/src/components/data-display/Chart/__tests__/chart-spec.test.ts +0 -119
- package/src/components/data-display/Chip/Chip.stories.tsx +0 -252
- package/src/components/data-display/Chip/Chip.test.stories.tsx +0 -266
- package/src/components/data-display/DataGrid/DataGrid.stories.tsx +0 -515
- package/src/components/data-display/DataGrid/DataGrid.test.stories.tsx +0 -653
- package/src/components/data-display/DataViews/__tests__/DataViewsGrid.test.tsx +0 -271
- package/src/components/data-display/DataViews/__tests__/DataViewsTableBase.test.tsx +0 -134
- package/src/components/data-display/DataViews/__tests__/SaveViewModal.test.tsx +0 -83
- package/src/components/data-display/DataViews/__tests__/data-views-filter.test.ts +0 -115
- package/src/components/data-display/DataViews/__tests__/data-views-preview.test.ts +0 -53
- package/src/components/data-display/DataViews/__tests__/range-pill.test.tsx +0 -114
- package/src/components/data-display/DataViews/base-card.stories.tsx +0 -136
- package/src/components/data-display/DescriptionItem/DescriptionItem.stories.tsx +0 -254
- package/src/components/data-display/EmptyState/EmptyState.stories.tsx +0 -282
- package/src/components/data-display/EmptyState/EmptyState.test.stories.tsx +0 -441
- package/src/components/data-display/ErrorState/ErrorState.stories.tsx +0 -110
- package/src/components/data-display/ErrorState/ErrorState.test.stories.tsx +0 -133
- package/src/components/data-display/HoverCard/HoverCard.stories.tsx +0 -650
- package/src/components/data-display/HoverCard/HoverCard.test.stories.tsx +0 -929
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.stories.tsx +0 -411
- package/src/components/data-display/LazyImage/LazyImage.stories.tsx +0 -387
- package/src/components/data-display/Lightbox/Lightbox.stories.tsx +0 -315
- package/src/components/data-display/Lightbox/Lightbox.test.stories.tsx +0 -598
- package/src/components/data-display/LoadingState/LoadingState.stories.tsx +0 -124
- package/src/components/data-display/LoadingState/LoadingState.test.stories.tsx +0 -99
- package/src/components/data-display/MapPreview/MapPreview.stories.tsx +0 -458
- package/src/components/data-display/MapPreview/MapPreview.test.stories.tsx +0 -394
- package/src/components/data-display/Popover/Popover.stories.tsx +0 -295
- package/src/components/data-display/Popover/Popover.test.stories.tsx +0 -1162
- package/src/components/data-display/Progress/Progress.stories.tsx +0 -481
- package/src/components/data-display/Progress/Progress.test.stories.tsx +0 -2070
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.stories.tsx +0 -160
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.test.stories.tsx +0 -190
- package/src/components/data-display/Sheet/Sheet.stories.tsx +0 -883
- package/src/components/data-display/Sheet/Sheet.test.stories.tsx +0 -1101
- package/src/components/data-display/StatCard/StatCard.stories.tsx +0 -167
- package/src/components/data-display/StatCard/StatCard.test.stories.tsx +0 -240
- package/src/components/data-display/Stepper/Stepper.stories.tsx +0 -540
- package/src/components/data-display/Stepper/Stepper.test.stories.tsx +0 -600
- package/src/components/data-display/Table/Table.stories.tsx +0 -803
- package/src/components/data-display/Table/Table.test.stories.tsx +0 -369
- package/src/components/data-display/Timeline/Timeline.stories.tsx +0 -442
- package/src/components/data-display/Timeline/Timeline.test.stories.tsx +0 -930
- package/src/components/data-display/TimingDiagram/TimingDiagram.stories.tsx +0 -475
- package/src/components/data-display/TimingDiagram/TimingDiagram.test.stories.tsx +0 -734
- package/src/components/data-display/Tooltip/Tooltip.stories.tsx +0 -468
- package/src/components/data-display/Tooltip/Tooltip.test.stories.tsx +0 -1154
- package/src/components/feedback/ConfirmAction/ConfirmAction.stories.tsx +0 -146
- package/src/components/feedback/ConfirmAction/ConfirmAction.test.stories.tsx +0 -114
- package/src/components/feedback/ConfirmAction/__tests__/confirm-action.test.tsx +0 -288
- package/src/components/feedback/Dialog/Dialog.stories.tsx +0 -833
- package/src/components/feedback/Dialog/Dialog.test.stories.tsx +0 -955
- package/src/components/feedback/Dialog/__tests__/dialog-content-spacing.test.tsx +0 -66
- package/src/components/feedback/Modal/Modal.stories.tsx +0 -765
- package/src/components/feedback/Modal/Modal.test.stories.tsx +0 -251
- package/src/components/feedback/Sonner/Sonner.stories.tsx +0 -698
- package/src/components/feedback/Sonner/Sonner.test.stories.tsx +0 -896
- package/src/components/feedback/StackedModal/StackedModal.stories.tsx +0 -1783
- package/src/components/feedback/StackedModal/StackedModal.test.stories.tsx +0 -975
- package/src/components/feedback/StackedModal/__tests__/stacked-modal-viewport.test.tsx +0 -104
- package/src/components/feedback/Toast/Toast.stories.tsx +0 -548
- package/src/components/feedback/Toast/Toast.test.stories.tsx +0 -834
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.stories.tsx +0 -691
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.test.stories.tsx +0 -634
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.stories.tsx +0 -665
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.test.stories.tsx +0 -727
- package/src/components/form/Autocomplete/Autocomplete.stories.tsx +0 -715
- package/src/components/form/Autocomplete/Autocomplete.test.stories.tsx +0 -825
- package/src/components/form/Button/Button.stories.tsx +0 -365
- package/src/components/form/Button/Button.test.stories.tsx +0 -607
- package/src/components/form/Calendar/Calendar.stories.tsx +0 -349
- package/src/components/form/Calendar/Calendar.test.stories.tsx +0 -464
- package/src/components/form/CepField/CepField.stories.tsx +0 -138
- package/src/components/form/CepField/CepField.test.stories.tsx +0 -281
- package/src/components/form/Checkbox/Checkbox.stories.tsx +0 -265
- package/src/components/form/Checkbox/Checkbox.test.stories.tsx +0 -181
- package/src/components/form/CodeEditor/CodeEditor.stories.tsx +0 -871
- package/src/components/form/CodeEditor/CodeEditor.test.stories.tsx +0 -574
- package/src/components/form/Command/Command.stories.tsx +0 -580
- package/src/components/form/Command/Command.test.stories.tsx +0 -215
- package/src/components/form/CreatableSelect/CreatableSelect.stories.tsx +0 -112
- package/src/components/form/CreatableSelect/CreatableSelect.test.stories.tsx +0 -134
- package/src/components/form/Form/Form.stories.tsx +0 -687
- package/src/components/form/Form/Form.test.stories.tsx +0 -601
- package/src/components/form/Input/Input.stories.tsx +0 -260
- package/src/components/form/Input/Input.test.stories.tsx +0 -1191
- package/src/components/form/InputOTP/InputOTP.stories.tsx +0 -774
- package/src/components/form/InputOTP/InputOTP.test.stories.tsx +0 -588
- package/src/components/form/Label/Label.stories.tsx +0 -473
- package/src/components/form/Label/Label.test.stories.tsx +0 -909
- package/src/components/form/Menubar/Menubar.stories.tsx +0 -472
- package/src/components/form/Menubar/Menubar.test.stories.tsx +0 -584
- package/src/components/form/PasswordStrength/PasswordStrength.stories.tsx +0 -562
- package/src/components/form/PasswordStrength/PasswordStrength.test.stories.tsx +0 -327
- package/src/components/form/PhoneInput/PhoneInput.stories.tsx +0 -495
- package/src/components/form/PhoneInput/PhoneInput.test.stories.tsx +0 -666
- package/src/components/form/RadioGroup/RadioGroup.stories.tsx +0 -518
- package/src/components/form/RadioGroup/RadioGroup.test.stories.tsx +0 -685
- package/src/components/form/RichTextEditor/RichTextEditor.stories.tsx +0 -261
- package/src/components/form/RichTextEditor/RichTextEditor.test.stories.tsx +0 -491
- package/src/components/form/SearchPalette/SearchPalette.stories.tsx +0 -135
- package/src/components/form/Select/Select.stories.tsx +0 -364
- package/src/components/form/Select/Select.test.stories.tsx +0 -985
- package/src/components/form/Slider/Slider.stories.tsx +0 -418
- package/src/components/form/Slider/Slider.test.stories.tsx +0 -1042
- package/src/components/form/Switch/Switch.stories.tsx +0 -697
- package/src/components/form/Switch/Switch.test.stories.tsx +0 -597
- package/src/components/form/Textarea/Textarea.stories.tsx +0 -473
- package/src/components/form/Textarea/Textarea.test.stories.tsx +0 -702
- package/src/components/form/Toggle/Toggle.stories.tsx +0 -638
- package/src/components/form/Toggle/Toggle.test.stories.tsx +0 -1159
- package/src/components/form/ToggleGroup/ToggleGroup.stories.tsx +0 -617
- package/src/components/form/ToggleGroup/ToggleGroup.test.stories.tsx +0 -918
- package/src/components/form/UploadButton/UploadButton.stories.tsx +0 -367
- package/src/components/form/UploadButton/UploadButton.test.stories.tsx +0 -573
- package/src/components/form/total-form/total-form.test.tsx +0 -214
- package/src/components/layout/Accordion/Accordion.stories.tsx +0 -694
- package/src/components/layout/Accordion/Accordion.test.stories.tsx +0 -1344
- package/src/components/layout/Card/Card.stories.tsx +0 -591
- package/src/components/layout/Card/Card.test.stories.tsx +0 -1134
- package/src/components/layout/CardGrid/__tests__/CardGrid.test.tsx +0 -92
- package/src/components/layout/Collapsible/Collapsible.stories.tsx +0 -180
- package/src/components/layout/Collapsible/Collapsible.test.stories.tsx +0 -308
- package/src/components/layout/Container/Container.stories.tsx +0 -557
- package/src/components/layout/Container/Container.test.stories.tsx +0 -745
- package/src/components/layout/ContentToolbar/ContentToolbar.stories.tsx +0 -129
- package/src/components/layout/ContentToolbar/ContentToolbar.test.stories.tsx +0 -251
- package/src/components/layout/ContentToolbar/__tests__/ColumnsMenu.test.tsx +0 -39
- package/src/components/layout/ContentToolbar/__tests__/MultiSelectDropdown.test.tsx +0 -131
- package/src/components/layout/ContentToolbar/__tests__/SavedViewsMenu.test.tsx +0 -99
- package/src/components/layout/Dashboard/Dashboard.stories.tsx +0 -104
- package/src/components/layout/Dashboard/Dashboard.test.stories.tsx +0 -190
- package/src/components/layout/Drawer/Drawer.stories.tsx +0 -658
- package/src/components/layout/Drawer/Drawer.test.stories.tsx +0 -1343
- package/src/components/layout/Resizable/Resizable.stories.tsx +0 -1039
- package/src/components/layout/Resizable/Resizable.test.stories.tsx +0 -750
- package/src/components/layout/ScrollArea/ScrollArea.stories.tsx +0 -651
- package/src/components/layout/ScrollArea/ScrollArea.test.stories.tsx +0 -619
- package/src/components/layout/Separator/Separator.stories.tsx +0 -563
- package/src/components/layout/Separator/Separator.test.stories.tsx +0 -518
- package/src/components/layout/SettingsLayout/SettingsLayout.stories.tsx +0 -192
- package/src/components/layout/SettingsLayout/SettingsLayout.test.stories.tsx +0 -175
- package/src/components/layout/Sidebar/Sidebar.stories.tsx +0 -609
- package/src/components/layout/Sidebar/Sidebar.test.stories.tsx +0 -1324
- package/src/components/layout/Skeleton/Skeleton.stories.tsx +0 -689
- package/src/components/layout/Skeleton/Skeleton.test.stories.tsx +0 -521
- package/src/components/layout/Spacer/Spacer.stories.tsx +0 -502
- package/src/components/layout/Spacer/Spacer.test.stories.tsx +0 -472
- package/src/components/layout/TableFilter/TableFilter.stories.tsx +0 -82
- package/src/components/layout/TableFilter/TableFilter.test.stories.tsx +0 -87
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.stories.tsx +0 -638
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.test.stories.tsx +0 -1008
- package/src/components/navigation/CommandPalette/CommandPalette.stories.tsx +0 -386
- package/src/components/navigation/CommandPalette/CommandPalette.test.stories.tsx +0 -435
- package/src/components/navigation/ContextMenu/ContextMenu.stories.tsx +0 -614
- package/src/components/navigation/ContextMenu/ContextMenu.test.stories.tsx +0 -845
- package/src/components/navigation/DropdownMenu/DropdownMenu.stories.tsx +0 -578
- package/src/components/navigation/DropdownMenu/DropdownMenu.test.stories.tsx +0 -660
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.stories.tsx +0 -516
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.test.stories.tsx +0 -935
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuHorizontal.stories.tsx +0 -501
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuVertical.stories.tsx +0 -453
- package/src/components/navigation/Pagination/Pagination.stories.tsx +0 -602
- package/src/components/navigation/Pagination/Pagination.test.stories.tsx +0 -520
- package/src/components/navigation/Tabs/Tabs.stories.tsx +0 -1004
- package/src/components/navigation/Tabs/Tabs.test.stories.tsx +0 -1225
- package/src/components/typography/Blockquote/Blockquote.stories.tsx +0 -359
- package/src/components/typography/Blockquote/Blockquote.test.stories.tsx +0 -432
- package/src/components/typography/Code/Code.stories.tsx +0 -686
- package/src/components/typography/Code/Code.test.stories.tsx +0 -703
- package/src/components/typography/Heading/Heading.stories.tsx +0 -451
- package/src/components/typography/Heading/Heading.test.stories.tsx +0 -830
- package/src/components/typography/Paragraph/Paragraph.stories.tsx +0 -280
- package/src/components/typography/Paragraph/Paragraph.test.stories.tsx +0 -231
- package/src/components/typography/Text/Text.stories.tsx +0 -359
- package/src/components/typography/Text/Text.test.stories.tsx +0 -762
- package/src/components/utility/AnimatedIcon/AnimatedIcon.stories.tsx +0 -945
- package/src/components/utility/AnimatedIcon/AnimatedIcon.test.stories.tsx +0 -603
- package/src/components/utility/AspectRatio/AspectRatio.stories.tsx +0 -414
- package/src/components/utility/AspectRatio/AspectRatio.test.stories.tsx +0 -859
- package/src/components/utility/InfiniteScroll/InfiniteScroll.stories.tsx +0 -620
- package/src/components/utility/InfiniteScroll/InfiniteScroll.test.stories.tsx +0 -361
- package/src/components/utility/InstallPrompt/InstallPrompt.stories.tsx +0 -118
- package/src/components/utility/InstallPrompt/InstallPrompt.test.stories.tsx +0 -83
- package/src/components/utility/InstallPrompt/__tests__/InstallPrompt.ios.test.tsx +0 -65
- package/src/components/utility/InstallPrompt/__tests__/usePwaInstall.test.tsx +0 -271
- package/src/components/utility/Portal/Portal.stories.tsx +0 -340
- package/src/components/utility/Portal/Portal.test.stories.tsx +0 -2086
- package/src/components/utility/Transition/Transition.stories.tsx +0 -493
- package/src/components/utility/Transition/Transition.test.stories.tsx +0 -854
- package/src/components/utility/VirtualList/VirtualList.stories.tsx +0 -1073
- package/src/components/utility/VirtualList/VirtualList.test.stories.tsx +0 -1085
- package/src/components/utility/WorkflowStep/WorkflowStep.stories.tsx +0 -431
- package/src/components/utility/WorkflowStep/WorkflowStep.test.stories.tsx +0 -364
- /package/src/{button.tsx → button/button.tsx} +0 -0
|
@@ -1,871 +0,0 @@
|
|
|
1
|
-
import { Alert,Box, Button, Paper, Stack, Typography } from '@mui/material';
|
|
2
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
|
|
5
|
-
import { CodeEditor } from './CodeEditor';
|
|
6
|
-
import type { EditorLanguage } from './CodeEditor.types';
|
|
7
|
-
|
|
8
|
-
const meta: Meta<typeof CodeEditor> = {
|
|
9
|
-
title: 'Enhanced/CodeEditor',
|
|
10
|
-
component: CodeEditor,
|
|
11
|
-
parameters: {
|
|
12
|
-
layout: 'padded',
|
|
13
|
-
docs: {
|
|
14
|
-
description: {
|
|
15
|
-
component:
|
|
16
|
-
'A powerful Monaco-based code editor with syntax highlighting, themes, and advanced features like auto-formatting, fullscreen mode, and live editing.',
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
tags: ['autodocs', 'component:CodeEditor'],
|
|
21
|
-
argTypes: {
|
|
22
|
-
language: {
|
|
23
|
-
control: { type: 'select' },
|
|
24
|
-
options: [
|
|
25
|
-
'javascript',
|
|
26
|
-
'typescript',
|
|
27
|
-
'json',
|
|
28
|
-
'css',
|
|
29
|
-
'html',
|
|
30
|
-
'yaml',
|
|
31
|
-
'markdown',
|
|
32
|
-
'sql',
|
|
33
|
-
'python',
|
|
34
|
-
],
|
|
35
|
-
description: 'Programming language for syntax highlighting',
|
|
36
|
-
},
|
|
37
|
-
theme: {
|
|
38
|
-
control: { type: 'select' },
|
|
39
|
-
options: ['light', 'dark', 'auto'],
|
|
40
|
-
description: 'Editor color theme',
|
|
41
|
-
},
|
|
42
|
-
height: {
|
|
43
|
-
control: 'text',
|
|
44
|
-
description: 'Height of the editor',
|
|
45
|
-
},
|
|
46
|
-
readOnly: {
|
|
47
|
-
control: 'boolean',
|
|
48
|
-
description: 'Makes editor read-only',
|
|
49
|
-
},
|
|
50
|
-
lineNumbers: {
|
|
51
|
-
control: 'boolean',
|
|
52
|
-
description: 'Show line numbers',
|
|
53
|
-
},
|
|
54
|
-
minimap: {
|
|
55
|
-
control: 'boolean',
|
|
56
|
-
description: 'Show minimap navigation',
|
|
57
|
-
},
|
|
58
|
-
fontSize: {
|
|
59
|
-
control: { type: 'number', min: 10, max: 24 },
|
|
60
|
-
description: 'Font size in pixels',
|
|
61
|
-
},
|
|
62
|
-
wordWrap: {
|
|
63
|
-
control: 'boolean',
|
|
64
|
-
description: 'Enable word wrapping',
|
|
65
|
-
},
|
|
66
|
-
showToolbar: {
|
|
67
|
-
control: 'boolean',
|
|
68
|
-
description: 'Show editor toolbar',
|
|
69
|
-
},
|
|
70
|
-
autoFormat: {
|
|
71
|
-
control: 'boolean',
|
|
72
|
-
description: 'Auto-format code on load',
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
export default meta;
|
|
78
|
-
type Story = StoryObj<typeof meta>;
|
|
79
|
-
|
|
80
|
-
// Sample code snippets for different languages
|
|
81
|
-
const sampleCode = {
|
|
82
|
-
javascript: `// JavaScript Example
|
|
83
|
-
function fibonacci(n) {
|
|
84
|
-
if (n <= 1) return n;
|
|
85
|
-
|
|
86
|
-
const memo = [0, 1];
|
|
87
|
-
|
|
88
|
-
for (let i = 2; i <= n; i++) {
|
|
89
|
-
memo[i] = memo[i - 1] + memo[i - 2];
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return memo[n];
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Test the function
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
// ES6 Arrow Function
|
|
99
|
-
const greet = (name = 'World') => {
|
|
100
|
-
return \`Hello, \${name}!\`;
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
// Array methods
|
|
104
|
-
const numbers = [1, 2, 3, 4, 5];
|
|
105
|
-
const doubled = numbers.map(n => n * 2);
|
|
106
|
-
const sum = numbers.reduce((acc, n) => acc + n, 0);`,
|
|
107
|
-
|
|
108
|
-
typescript: `// TypeScript Example
|
|
109
|
-
interface User {
|
|
110
|
-
id: number;
|
|
111
|
-
name: string;
|
|
112
|
-
email: string;
|
|
113
|
-
role: 'admin' | 'user' | 'guest';
|
|
114
|
-
metadata?: Record<string, any>;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
class UserService {
|
|
118
|
-
private users: Map<number, User> = new Map();
|
|
119
|
-
|
|
120
|
-
constructor(private apiUrl: string) {}
|
|
121
|
-
|
|
122
|
-
async getUser(id: number): Promise<User | undefined> {
|
|
123
|
-
if (this.users.has(id)) {
|
|
124
|
-
return this.users.get(id);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const response = await fetch(\`\${this.apiUrl}/users/\${id}\`);
|
|
128
|
-
const user = await response.json() as User;
|
|
129
|
-
|
|
130
|
-
this.users.set(id, user);
|
|
131
|
-
return user;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
updateUser(id: number, updates: Partial<User>): void {
|
|
135
|
-
const existing = this.users.get(id);
|
|
136
|
-
if (existing) {
|
|
137
|
-
this.users.set(id, { ...existing, ...updates });
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Generic function
|
|
143
|
-
function reverseArray<T>(arr: T[]): T[] {
|
|
144
|
-
return [...arr].reverse();
|
|
145
|
-
}`,
|
|
146
|
-
|
|
147
|
-
json: `{
|
|
148
|
-
"name": "procurement-ui",
|
|
149
|
-
"version": "1.0.0",
|
|
150
|
-
"description": "Modern UI component library",
|
|
151
|
-
"main": "dist/index.js",
|
|
152
|
-
"scripts": {
|
|
153
|
-
"dev": "vite dev",
|
|
154
|
-
"build": "tsc && vite build",
|
|
155
|
-
"test": "jest",
|
|
156
|
-
"lint": "eslint src --ext ts,tsx"
|
|
157
|
-
},
|
|
158
|
-
"dependencies": {
|
|
159
|
-
"@mui/material": "^5.14.0",
|
|
160
|
-
"react": "^18.2.0",
|
|
161
|
-
"react-dom": "^18.2.0"
|
|
162
|
-
},
|
|
163
|
-
"devDependencies": {
|
|
164
|
-
"@types/react": "^18.2.0",
|
|
165
|
-
"typescript": "^5.0.0",
|
|
166
|
-
"vite": "^4.0.0"
|
|
167
|
-
},
|
|
168
|
-
"repository": {
|
|
169
|
-
"type": "git",
|
|
170
|
-
"url": "https://github.com/example/procurement-ui"
|
|
171
|
-
},
|
|
172
|
-
"keywords": ["ui", "components", "react", "typescript"],
|
|
173
|
-
"author": "Development Team",
|
|
174
|
-
"license": "MIT"
|
|
175
|
-
}`,
|
|
176
|
-
|
|
177
|
-
css: `/* Modern CSS with Variables and Animations */
|
|
178
|
-
:root {
|
|
179
|
-
--primary-color: #667eea;
|
|
180
|
-
--secondary-color: #764ba2;
|
|
181
|
-
--text-color: #2d3748;
|
|
182
|
-
--bg-color: #f7fafc;
|
|
183
|
-
--border-radius: 8px;
|
|
184
|
-
--transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
.card {
|
|
188
|
-
background: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%);
|
|
189
|
-
border-radius: var(--border-radius);
|
|
190
|
-
padding: 2rem;
|
|
191
|
-
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
|
|
192
|
-
transition: var(--transition);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
.card:hover {
|
|
196
|
-
transform: translateY(-4px);
|
|
197
|
-
box-shadow: 0 25px 50px rgba(0, 0, 0, 0.15);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
@keyframes fadeIn {
|
|
201
|
-
from {
|
|
202
|
-
opacity: 0;
|
|
203
|
-
transform: translateY(20px);
|
|
204
|
-
}
|
|
205
|
-
to {
|
|
206
|
-
opacity: 1;
|
|
207
|
-
transform: translateY(0);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
.animated {
|
|
212
|
-
animation: fadeIn 0.5s ease-out forwards;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
@media (max-width: 768px) {
|
|
216
|
-
.card {
|
|
217
|
-
padding: 1rem;
|
|
218
|
-
}
|
|
219
|
-
}`,
|
|
220
|
-
|
|
221
|
-
html: `<!DOCTYPE html>
|
|
222
|
-
<html lang="en">
|
|
223
|
-
<head>
|
|
224
|
-
<meta charset="UTF-8">
|
|
225
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
226
|
-
<title>Modern Web App</title>
|
|
227
|
-
<link rel="stylesheet" href="styles.css">
|
|
228
|
-
</head>
|
|
229
|
-
<body>
|
|
230
|
-
<header class="navbar">
|
|
231
|
-
<nav>
|
|
232
|
-
<div class="logo">
|
|
233
|
-
<img src="logo.svg" alt="Logo">
|
|
234
|
-
</div>
|
|
235
|
-
<ul class="nav-links">
|
|
236
|
-
<li><a href="#home">Home</a></li>
|
|
237
|
-
<li><a href="#features">Features</a></li>
|
|
238
|
-
<li><a href="#about">About</a></li>
|
|
239
|
-
<li><a href="#contact">Contact</a></li>
|
|
240
|
-
</ul>
|
|
241
|
-
</nav>
|
|
242
|
-
</header>
|
|
243
|
-
|
|
244
|
-
<main>
|
|
245
|
-
<section id="hero" class="hero-section">
|
|
246
|
-
<div class="container">
|
|
247
|
-
<h1>Welcome to Our Platform</h1>
|
|
248
|
-
<p>Build amazing things with modern tools</p>
|
|
249
|
-
<button class="cta-button">Get Started</button>
|
|
250
|
-
</div>
|
|
251
|
-
</section>
|
|
252
|
-
|
|
253
|
-
<section id="features">
|
|
254
|
-
<div class="feature-grid">
|
|
255
|
-
<article class="feature-card">
|
|
256
|
-
<h3>Fast Performance</h3>
|
|
257
|
-
<p>Lightning-fast load times and smooth interactions</p>
|
|
258
|
-
</article>
|
|
259
|
-
</div>
|
|
260
|
-
</section>
|
|
261
|
-
</main>
|
|
262
|
-
|
|
263
|
-
<script src="app.js"></script>
|
|
264
|
-
</body>
|
|
265
|
-
</html>`,
|
|
266
|
-
|
|
267
|
-
python: `# Python Example with Classes and Decorators
|
|
268
|
-
import time
|
|
269
|
-
from typing import List, Dict, Optional
|
|
270
|
-
from functools import wraps
|
|
271
|
-
|
|
272
|
-
def timer(func):
|
|
273
|
-
"""Decorator to measure function execution time"""
|
|
274
|
-
@wraps(func)
|
|
275
|
-
def wrapper(*args, **kwargs):
|
|
276
|
-
start = time.time()
|
|
277
|
-
result = func(*args, **kwargs)
|
|
278
|
-
end = time.time()
|
|
279
|
-
print(f"{func.__name__} took {end - start:.4f} seconds")
|
|
280
|
-
return result
|
|
281
|
-
return wrapper
|
|
282
|
-
|
|
283
|
-
class DataProcessor:
|
|
284
|
-
"""Process and analyze data with various algorithms"""
|
|
285
|
-
|
|
286
|
-
def __init__(self, data: List[int]):
|
|
287
|
-
self.data = data
|
|
288
|
-
self._cache: Dict[str, any] = {}
|
|
289
|
-
|
|
290
|
-
@timer
|
|
291
|
-
def calculate_statistics(self) -> Dict[str, float]:
|
|
292
|
-
"""Calculate basic statistics for the dataset"""
|
|
293
|
-
if 'stats' in self._cache:
|
|
294
|
-
return self._cache['stats']
|
|
295
|
-
|
|
296
|
-
stats = {
|
|
297
|
-
'mean': sum(self.data) / len(self.data),
|
|
298
|
-
'min': min(self.data),
|
|
299
|
-
'max': max(self.data),
|
|
300
|
-
'median': self._calculate_median(),
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
self._cache['stats'] = stats
|
|
304
|
-
return stats
|
|
305
|
-
|
|
306
|
-
def _calculate_median(self) -> float:
|
|
307
|
-
"""Calculate median value"""
|
|
308
|
-
sorted_data = sorted(self.data)
|
|
309
|
-
n = len(sorted_data)
|
|
310
|
-
|
|
311
|
-
if n % 2 == 0:
|
|
312
|
-
return (sorted_data[n//2 - 1] + sorted_data[n//2]) / 2
|
|
313
|
-
return sorted_data[n//2]
|
|
314
|
-
|
|
315
|
-
# Example usage
|
|
316
|
-
if __name__ == "__main__":
|
|
317
|
-
processor = DataProcessor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
318
|
-
stats = processor.calculate_statistics()
|
|
319
|
-
print(f"Statistics: {stats}")`,
|
|
320
|
-
|
|
321
|
-
sql: `-- SQL Example with Complex Queries
|
|
322
|
-
-- Create tables for an e-commerce system
|
|
323
|
-
|
|
324
|
-
CREATE TABLE users (
|
|
325
|
-
id SERIAL PRIMARY KEY,
|
|
326
|
-
username VARCHAR(50) UNIQUE NOT NULL,
|
|
327
|
-
email VARCHAR(100) UNIQUE NOT NULL,
|
|
328
|
-
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
329
|
-
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
330
|
-
);
|
|
331
|
-
|
|
332
|
-
CREATE TABLE products (
|
|
333
|
-
id SERIAL PRIMARY KEY,
|
|
334
|
-
name VARCHAR(200) NOT NULL,
|
|
335
|
-
description TEXT,
|
|
336
|
-
price DECIMAL(10, 2) NOT NULL,
|
|
337
|
-
stock_quantity INTEGER DEFAULT 0,
|
|
338
|
-
category_id INTEGER REFERENCES categories(id),
|
|
339
|
-
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
340
|
-
);
|
|
341
|
-
|
|
342
|
-
CREATE TABLE orders (
|
|
343
|
-
id SERIAL PRIMARY KEY,
|
|
344
|
-
user_id INTEGER REFERENCES users(id),
|
|
345
|
-
total_amount DECIMAL(10, 2) NOT NULL,
|
|
346
|
-
status VARCHAR(20) DEFAULT 'pending',
|
|
347
|
-
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
348
|
-
);
|
|
349
|
-
|
|
350
|
-
-- Complex query with JOIN and aggregation
|
|
351
|
-
WITH monthly_sales AS (
|
|
352
|
-
SELECT
|
|
353
|
-
DATE_TRUNC('month', o.order_date) as month,
|
|
354
|
-
p.category_id,
|
|
355
|
-
SUM(oi.quantity * oi.price) as revenue,
|
|
356
|
-
COUNT(DISTINCT o.user_id) as unique_customers
|
|
357
|
-
FROM orders o
|
|
358
|
-
JOIN order_items oi ON o.id = oi.order_id
|
|
359
|
-
JOIN products p ON oi.product_id = p.id
|
|
360
|
-
WHERE o.status = 'completed'
|
|
361
|
-
GROUP BY DATE_TRUNC('month', o.order_date), p.category_id
|
|
362
|
-
)
|
|
363
|
-
SELECT
|
|
364
|
-
month,
|
|
365
|
-
c.name as category,
|
|
366
|
-
revenue,
|
|
367
|
-
unique_customers,
|
|
368
|
-
RANK() OVER (PARTITION BY month ORDER BY revenue DESC) as revenue_rank
|
|
369
|
-
FROM monthly_sales ms
|
|
370
|
-
JOIN categories c ON ms.category_id = c.id
|
|
371
|
-
ORDER BY month DESC, revenue DESC;`,
|
|
372
|
-
|
|
373
|
-
yaml: `# YAML Configuration Example
|
|
374
|
-
apiVersion: v1
|
|
375
|
-
kind: Service
|
|
376
|
-
metadata:
|
|
377
|
-
name: procurement-api
|
|
378
|
-
namespace: production
|
|
379
|
-
labels:
|
|
380
|
-
app: procurement
|
|
381
|
-
tier: backend
|
|
382
|
-
version: v1.0.0
|
|
383
|
-
|
|
384
|
-
spec:
|
|
385
|
-
type: LoadBalancer
|
|
386
|
-
selector:
|
|
387
|
-
app: procurement
|
|
388
|
-
tier: backend
|
|
389
|
-
ports:
|
|
390
|
-
- name: http
|
|
391
|
-
port: 80
|
|
392
|
-
targetPort: 8080
|
|
393
|
-
protocol: TCP
|
|
394
|
-
- name: https
|
|
395
|
-
port: 443
|
|
396
|
-
targetPort: 8443
|
|
397
|
-
protocol: TCP
|
|
398
|
-
|
|
399
|
-
---
|
|
400
|
-
|
|
401
|
-
apiVersion: apps/v1
|
|
402
|
-
kind: Deployment
|
|
403
|
-
metadata:
|
|
404
|
-
name: procurement-api
|
|
405
|
-
namespace: production
|
|
406
|
-
|
|
407
|
-
spec:
|
|
408
|
-
replicas: 3
|
|
409
|
-
strategy:
|
|
410
|
-
type: RollingUpdate
|
|
411
|
-
rollingUpdate:
|
|
412
|
-
maxSurge: 1
|
|
413
|
-
maxUnavailable: 0
|
|
414
|
-
|
|
415
|
-
selector:
|
|
416
|
-
matchLabels:
|
|
417
|
-
app: procurement
|
|
418
|
-
tier: backend
|
|
419
|
-
|
|
420
|
-
template:
|
|
421
|
-
metadata:
|
|
422
|
-
labels:
|
|
423
|
-
app: procurement
|
|
424
|
-
tier: backend
|
|
425
|
-
spec:
|
|
426
|
-
containers:
|
|
427
|
-
- name: api
|
|
428
|
-
image: procurement/api:1.0.0
|
|
429
|
-
ports:
|
|
430
|
-
- containerPort: 8080
|
|
431
|
-
env:
|
|
432
|
-
- name: DATABASE_URL
|
|
433
|
-
valueFrom:
|
|
434
|
-
secretKeyRef:
|
|
435
|
-
name: db-secret
|
|
436
|
-
key: url
|
|
437
|
-
resources:
|
|
438
|
-
requests:
|
|
439
|
-
memory: "256Mi"
|
|
440
|
-
cpu: "250m"
|
|
441
|
-
limits:
|
|
442
|
-
memory: "512Mi"
|
|
443
|
-
cpu: "500m"`,
|
|
444
|
-
|
|
445
|
-
markdown: `# Project Documentation
|
|
446
|
-
|
|
447
|
-
## Overview
|
|
448
|
-
|
|
449
|
-
This is a **comprehensive guide** to our component library featuring:
|
|
450
|
-
|
|
451
|
-
- 🚀 **Fast Performance** - Optimized for speed
|
|
452
|
-
- 🎨 **Beautiful Design** - Modern and clean UI
|
|
453
|
-
- 📱 **Responsive** - Works on all devices
|
|
454
|
-
- ♿ **Accessible** - WCAG 2.1 compliant
|
|
455
|
-
|
|
456
|
-
## Installation
|
|
457
|
-
|
|
458
|
-
\`\`\`bash
|
|
459
|
-
npm install @company/ui-components
|
|
460
|
-
# or
|
|
461
|
-
yarn add @company/ui-components
|
|
462
|
-
\`\`\`
|
|
463
|
-
|
|
464
|
-
## Quick Start
|
|
465
|
-
|
|
466
|
-
Import and use components in your React application:
|
|
467
|
-
|
|
468
|
-
\`\`\`jsx
|
|
469
|
-
import { Button, Card, Dialog } from '@company/ui-components';
|
|
470
|
-
|
|
471
|
-
function App() {
|
|
472
|
-
return (
|
|
473
|
-
<Card>
|
|
474
|
-
<h1>Welcome</h1>
|
|
475
|
-
<Button variant="primary">Get Started</Button>
|
|
476
|
-
</Card>
|
|
477
|
-
);
|
|
478
|
-
}
|
|
479
|
-
\`\`\`
|
|
480
|
-
|
|
481
|
-
## Features
|
|
482
|
-
|
|
483
|
-
### Component Library
|
|
484
|
-
|
|
485
|
-
| Component | Status | Description |
|
|
486
|
-
|-----------|--------|-------------|
|
|
487
|
-
| Button | ✅ Stable | Interactive button with variants |
|
|
488
|
-
| Card | ✅ Stable | Container for content |
|
|
489
|
-
| Dialog | 🚧 Beta | Modal dialog component |
|
|
490
|
-
| Table | 📋 Planned | Data table with sorting |
|
|
491
|
-
|
|
492
|
-
### Advanced Features
|
|
493
|
-
|
|
494
|
-
1. **Theming Support**
|
|
495
|
-
- Light/Dark modes
|
|
496
|
-
- Custom color schemes
|
|
497
|
-
- Typography system
|
|
498
|
-
|
|
499
|
-
2. **Accessibility**
|
|
500
|
-
- Keyboard navigation
|
|
501
|
-
- Screen reader support
|
|
502
|
-
- ARIA attributes
|
|
503
|
-
|
|
504
|
-
> **Note:** All components are tested across modern browsers.
|
|
505
|
-
|
|
506
|
-
## API Reference
|
|
507
|
-
|
|
508
|
-
### Button Props
|
|
509
|
-
|
|
510
|
-
- \`variant\`: 'primary' | 'secondary' | 'danger'
|
|
511
|
-
- \`size\`: 'small' | 'medium' | 'large'
|
|
512
|
-
- \`disabled\`: boolean
|
|
513
|
-
- \`onClick\`: () => void
|
|
514
|
-
|
|
515
|
-
## Contributing
|
|
516
|
-
|
|
517
|
-
Please read our [contributing guidelines](./CONTRIBUTING.md) before submitting PRs.
|
|
518
|
-
|
|
519
|
-
---
|
|
520
|
-
|
|
521
|
-
*Last updated: January 2024*`,
|
|
522
|
-
};
|
|
523
|
-
|
|
524
|
-
export const Default: Story = {
|
|
525
|
-
args: {
|
|
526
|
-
language: 'javascript',
|
|
527
|
-
value: sampleCode.javascript,
|
|
528
|
-
height: '400px',
|
|
529
|
-
showToolbar: true,
|
|
530
|
-
lineNumbers: true,
|
|
531
|
-
},
|
|
532
|
-
};
|
|
533
|
-
|
|
534
|
-
const AllLanguagesComponent = () => {
|
|
535
|
-
const [activeLanguage, setActiveLanguage] = React.useState<EditorLanguage>('javascript');
|
|
536
|
-
|
|
537
|
-
return (
|
|
538
|
-
<Stack spacing={3}>
|
|
539
|
-
<Stack direction="row" spacing={1} flexWrap="wrap">
|
|
540
|
-
{Object.keys(sampleCode).map((lang) => (
|
|
541
|
-
<Button
|
|
542
|
-
key={lang}
|
|
543
|
-
variant={activeLanguage === lang ? 'contained' : 'outlined'}
|
|
544
|
-
size="small"
|
|
545
|
-
onClick={() => setActiveLanguage(lang as EditorLanguage)}
|
|
546
|
-
>
|
|
547
|
-
{lang}
|
|
548
|
-
</Button>
|
|
549
|
-
))}
|
|
550
|
-
</Stack>
|
|
551
|
-
|
|
552
|
-
<CodeEditor
|
|
553
|
-
language={activeLanguage}
|
|
554
|
-
value={sampleCode[activeLanguage as keyof typeof sampleCode]}
|
|
555
|
-
height="500px"
|
|
556
|
-
showToolbar={true}
|
|
557
|
-
onChange={() => {
|
|
558
|
-
/** do nothing */
|
|
559
|
-
}}
|
|
560
|
-
/>
|
|
561
|
-
</Stack>
|
|
562
|
-
);
|
|
563
|
-
};
|
|
564
|
-
|
|
565
|
-
export const AllLanguages: Story = {
|
|
566
|
-
render: () => <AllLanguagesComponent />,
|
|
567
|
-
};
|
|
568
|
-
|
|
569
|
-
export const DarkTheme: Story = {
|
|
570
|
-
args: {
|
|
571
|
-
language: 'typescript',
|
|
572
|
-
value: sampleCode.typescript,
|
|
573
|
-
theme: 'dark',
|
|
574
|
-
height: '400px',
|
|
575
|
-
showToolbar: true,
|
|
576
|
-
},
|
|
577
|
-
decorators: [
|
|
578
|
-
(Story) => (
|
|
579
|
-
<Box sx={{ bgcolor: '#1a1a1a', p: 3, borderRadius: 2 }}>
|
|
580
|
-
<Story />
|
|
581
|
-
</Box>
|
|
582
|
-
),
|
|
583
|
-
],
|
|
584
|
-
};
|
|
585
|
-
|
|
586
|
-
export const LightTheme: Story = {
|
|
587
|
-
args: {
|
|
588
|
-
language: 'css',
|
|
589
|
-
value: sampleCode.css,
|
|
590
|
-
theme: 'light',
|
|
591
|
-
height: '400px',
|
|
592
|
-
showToolbar: true,
|
|
593
|
-
},
|
|
594
|
-
};
|
|
595
|
-
|
|
596
|
-
export const ReadOnlyMode: Story = {
|
|
597
|
-
args: {
|
|
598
|
-
language: 'json',
|
|
599
|
-
value: sampleCode.json,
|
|
600
|
-
readOnly: true,
|
|
601
|
-
height: '400px',
|
|
602
|
-
showToolbar: true,
|
|
603
|
-
},
|
|
604
|
-
render: (args) => (
|
|
605
|
-
<Stack spacing={2}>
|
|
606
|
-
<Alert severity="info">
|
|
607
|
-
This editor is in read-only mode. Users can view and copy but cannot edit.
|
|
608
|
-
</Alert>
|
|
609
|
-
<CodeEditor {...args} />
|
|
610
|
-
</Stack>
|
|
611
|
-
),
|
|
612
|
-
};
|
|
613
|
-
|
|
614
|
-
const LiveEditorComponent = () => {
|
|
615
|
-
const [code, setCode] = React.useState(sampleCode.javascript);
|
|
616
|
-
const [saved, setSaved] = React.useState(false);
|
|
617
|
-
|
|
618
|
-
const handleSave = (value: string) => {
|
|
619
|
-
setCode(value);
|
|
620
|
-
setSaved(true);
|
|
621
|
-
window.setTimeout(() => setSaved(false), 2000);
|
|
622
|
-
};
|
|
623
|
-
|
|
624
|
-
return (
|
|
625
|
-
<Stack spacing={3}>
|
|
626
|
-
<Typography variant="h6">Live Code Editor with Save</Typography>
|
|
627
|
-
<Typography variant="body2" color="text.secondary">
|
|
628
|
-
Edit the code below and press Ctrl+S (or Cmd+S) to save
|
|
629
|
-
</Typography>
|
|
630
|
-
|
|
631
|
-
{saved && <Alert severity="success">Code saved successfully!</Alert>}
|
|
632
|
-
|
|
633
|
-
<CodeEditor
|
|
634
|
-
language="javascript"
|
|
635
|
-
value={code}
|
|
636
|
-
onChange={setCode}
|
|
637
|
-
onSave={handleSave}
|
|
638
|
-
height="400px"
|
|
639
|
-
showToolbar={true}
|
|
640
|
-
autoFormat={false}
|
|
641
|
-
/>
|
|
642
|
-
|
|
643
|
-
<Paper sx={{ p: 2, bgcolor: 'grey.50' }}>
|
|
644
|
-
<Typography variant="subtitle2" gutterBottom>
|
|
645
|
-
Code Length: {code.length} characters
|
|
646
|
-
</Typography>
|
|
647
|
-
<Typography variant="caption" color="text.secondary">
|
|
648
|
-
Last modified: {new Date().toLocaleTimeString()}
|
|
649
|
-
</Typography>
|
|
650
|
-
</Paper>
|
|
651
|
-
</Stack>
|
|
652
|
-
);
|
|
653
|
-
};
|
|
654
|
-
|
|
655
|
-
export const LiveEditor: Story = {
|
|
656
|
-
render: () => <LiveEditorComponent />,
|
|
657
|
-
};
|
|
658
|
-
|
|
659
|
-
export const WithMinimap: Story = {
|
|
660
|
-
args: {
|
|
661
|
-
language: 'typescript',
|
|
662
|
-
value: sampleCode.typescript,
|
|
663
|
-
height: '500px',
|
|
664
|
-
minimap: true,
|
|
665
|
-
showToolbar: true,
|
|
666
|
-
},
|
|
667
|
-
};
|
|
668
|
-
|
|
669
|
-
const CustomFontSizeComponent = () => {
|
|
670
|
-
const [fontSize, setFontSize] = React.useState(14);
|
|
671
|
-
|
|
672
|
-
return (
|
|
673
|
-
<Stack spacing={3}>
|
|
674
|
-
<Stack direction="row" spacing={2} alignItems="center">
|
|
675
|
-
<Typography>Font Size:</Typography>
|
|
676
|
-
{[12, 14, 16, 18, 20].map((size) => (
|
|
677
|
-
<Button
|
|
678
|
-
key={size}
|
|
679
|
-
variant={fontSize === size ? 'contained' : 'outlined'}
|
|
680
|
-
size="small"
|
|
681
|
-
onClick={() => setFontSize(size)}
|
|
682
|
-
>
|
|
683
|
-
{size}px
|
|
684
|
-
</Button>
|
|
685
|
-
))}
|
|
686
|
-
</Stack>
|
|
687
|
-
|
|
688
|
-
<CodeEditor
|
|
689
|
-
language="python"
|
|
690
|
-
value={sampleCode.python}
|
|
691
|
-
fontSize={fontSize}
|
|
692
|
-
height="400px"
|
|
693
|
-
showToolbar={true}
|
|
694
|
-
/>
|
|
695
|
-
</Stack>
|
|
696
|
-
);
|
|
697
|
-
};
|
|
698
|
-
|
|
699
|
-
export const CustomFontSize: Story = {
|
|
700
|
-
render: () => <CustomFontSizeComponent />,
|
|
701
|
-
};
|
|
702
|
-
|
|
703
|
-
export const WithWordWrap: Story = {
|
|
704
|
-
args: {
|
|
705
|
-
language: 'html',
|
|
706
|
-
value: sampleCode.html,
|
|
707
|
-
wordWrap: true,
|
|
708
|
-
height: '400px',
|
|
709
|
-
showToolbar: true,
|
|
710
|
-
},
|
|
711
|
-
};
|
|
712
|
-
|
|
713
|
-
export const NoToolbar: Story = {
|
|
714
|
-
args: {
|
|
715
|
-
language: 'sql',
|
|
716
|
-
value: sampleCode.sql,
|
|
717
|
-
showToolbar: false,
|
|
718
|
-
height: '400px',
|
|
719
|
-
},
|
|
720
|
-
};
|
|
721
|
-
|
|
722
|
-
export const WithPlaceholder: Story = {
|
|
723
|
-
args: {
|
|
724
|
-
language: 'javascript',
|
|
725
|
-
value: '',
|
|
726
|
-
placeholder: '// Start typing your JavaScript code here...',
|
|
727
|
-
height: '300px',
|
|
728
|
-
showToolbar: true,
|
|
729
|
-
},
|
|
730
|
-
};
|
|
731
|
-
|
|
732
|
-
export const AutoFormat: Story = {
|
|
733
|
-
render: () => {
|
|
734
|
-
const unformattedCode = `function messy(a,b,c){if(a>b){return c}else{return a+b}}const x={name:"test",value:123,items:[1,2,3,4,5]};`;
|
|
735
|
-
|
|
736
|
-
return (
|
|
737
|
-
<Stack spacing={3}>
|
|
738
|
-
<Alert severity="info">This editor will automatically format the code when it loads</Alert>
|
|
739
|
-
|
|
740
|
-
<CodeEditor
|
|
741
|
-
language="javascript"
|
|
742
|
-
value={unformattedCode}
|
|
743
|
-
autoFormat={true}
|
|
744
|
-
height="300px"
|
|
745
|
-
showToolbar={true}
|
|
746
|
-
/>
|
|
747
|
-
</Stack>
|
|
748
|
-
);
|
|
749
|
-
},
|
|
750
|
-
};
|
|
751
|
-
|
|
752
|
-
export const ComparisonView: Story = {
|
|
753
|
-
render: () => {
|
|
754
|
-
const originalCode = sampleCode.javascript;
|
|
755
|
-
const modifiedCode = sampleCode.typescript;
|
|
756
|
-
|
|
757
|
-
return (
|
|
758
|
-
<Stack spacing={3}>
|
|
759
|
-
<Typography variant="h6">Code Comparison</Typography>
|
|
760
|
-
|
|
761
|
-
<Box display="grid" gridTemplateColumns="1fr 1fr" gap={2}>
|
|
762
|
-
<Stack spacing={1}>
|
|
763
|
-
<Typography variant="subtitle2">Original (JavaScript)</Typography>
|
|
764
|
-
<CodeEditor
|
|
765
|
-
language="javascript"
|
|
766
|
-
value={originalCode}
|
|
767
|
-
height="400px"
|
|
768
|
-
readOnly={true}
|
|
769
|
-
showToolbar={false}
|
|
770
|
-
/>
|
|
771
|
-
</Stack>
|
|
772
|
-
|
|
773
|
-
<Stack spacing={1}>
|
|
774
|
-
<Typography variant="subtitle2">Modified (TypeScript)</Typography>
|
|
775
|
-
<CodeEditor
|
|
776
|
-
language="typescript"
|
|
777
|
-
value={modifiedCode}
|
|
778
|
-
height="400px"
|
|
779
|
-
readOnly={false}
|
|
780
|
-
showToolbar={false}
|
|
781
|
-
/>
|
|
782
|
-
</Stack>
|
|
783
|
-
</Box>
|
|
784
|
-
</Stack>
|
|
785
|
-
);
|
|
786
|
-
},
|
|
787
|
-
};
|
|
788
|
-
|
|
789
|
-
// Required story exports for validation
|
|
790
|
-
export const AllVariants: Story = {
|
|
791
|
-
render: () => (
|
|
792
|
-
<Stack spacing={4}>
|
|
793
|
-
<CodeEditor language="javascript" value="console.log('Default variant');" />
|
|
794
|
-
<CodeEditor
|
|
795
|
-
language="typescript"
|
|
796
|
-
value="const message: string = 'TypeScript variant';"
|
|
797
|
-
theme="dark"
|
|
798
|
-
/>
|
|
799
|
-
<CodeEditor language="json" value='{"variant": "JSON with minimap"}' minimap />
|
|
800
|
-
</Stack>
|
|
801
|
-
),
|
|
802
|
-
};
|
|
803
|
-
|
|
804
|
-
export const AllSizes: Story = {
|
|
805
|
-
render: () => (
|
|
806
|
-
<Stack spacing={4}>
|
|
807
|
-
<CodeEditor language="javascript" value="// Small size" height="200px" fontSize={12} />
|
|
808
|
-
<CodeEditor
|
|
809
|
-
language="javascript"
|
|
810
|
-
value="// Medium size (default)"
|
|
811
|
-
height="400px"
|
|
812
|
-
fontSize={14}
|
|
813
|
-
/>
|
|
814
|
-
<CodeEditor language="javascript" value="// Large size" height="600px" fontSize={16} />
|
|
815
|
-
</Stack>
|
|
816
|
-
),
|
|
817
|
-
};
|
|
818
|
-
|
|
819
|
-
export const AllStates: Story = {
|
|
820
|
-
render: () => (
|
|
821
|
-
<Stack spacing={4}>
|
|
822
|
-
<CodeEditor language="javascript" value="// Normal state" />
|
|
823
|
-
<CodeEditor language="javascript" value="// Read-only state" readOnly />
|
|
824
|
-
<CodeEditor language="javascript" value="" placeholder="Empty state with placeholder" />
|
|
825
|
-
</Stack>
|
|
826
|
-
),
|
|
827
|
-
};
|
|
828
|
-
|
|
829
|
-
const InteractiveComponent = () => {
|
|
830
|
-
const [code1, setCode1] = React.useState('// Interactive editor 1');
|
|
831
|
-
const [code2, setCode2] = React.useState('// Interactive editor 2');
|
|
832
|
-
|
|
833
|
-
const handleSave = (value: string) => {
|
|
834
|
-
// Handle save action
|
|
835
|
-
setCode1(value);
|
|
836
|
-
};
|
|
837
|
-
|
|
838
|
-
return (
|
|
839
|
-
<Stack spacing={4}>
|
|
840
|
-
<CodeEditor language="javascript" value={code1} onChange={setCode1} onSave={handleSave} />
|
|
841
|
-
<CodeEditor language="typescript" value={code2} onChange={setCode2} wordWrap autoFormat />
|
|
842
|
-
</Stack>
|
|
843
|
-
);
|
|
844
|
-
};
|
|
845
|
-
|
|
846
|
-
export const InteractiveStates: Story = {
|
|
847
|
-
render: () => <InteractiveComponent />,
|
|
848
|
-
};
|
|
849
|
-
|
|
850
|
-
export const Responsive: Story = {
|
|
851
|
-
parameters: {
|
|
852
|
-
viewport: {
|
|
853
|
-
viewports: {
|
|
854
|
-
mobile: { name: 'Mobile', styles: { width: '375px', height: '667px' } },
|
|
855
|
-
tablet: { name: 'Tablet', styles: { width: '768px', height: '1024px' } },
|
|
856
|
-
desktop: { name: 'Desktop', styles: { width: '1200px', height: '800px' } },
|
|
857
|
-
},
|
|
858
|
-
},
|
|
859
|
-
},
|
|
860
|
-
render: () => (
|
|
861
|
-
<CodeEditor
|
|
862
|
-
language="javascript"
|
|
863
|
-
value={`// Responsive code editor
|
|
864
|
-
// This editor adapts to different screen sizes
|
|
865
|
-
function responsiveFunction() {
|
|
866
|
-
return 'Works on mobile, tablet, and desktop';
|
|
867
|
-
}`}
|
|
868
|
-
height="300px"
|
|
869
|
-
/>
|
|
870
|
-
),
|
|
871
|
-
};
|