@ticatec/uniface-element 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +320 -1
- package/README_CN.md +392 -0
- package/dist/accordion/Accordion.svelte +1 -1
- package/dist/action-bar/ActionBar.svelte +7 -1
- package/dist/attachment-files/FileRender.svelte +1 -1
- package/dist/attachment-files/FileUploadBar.svelte +7 -6
- package/dist/attachment-files/FileUploadPanel.svelte +2 -2
- package/dist/base-calendar/DateContext.js +5 -4
- package/dist/base-calendar/YearPickupPanel.svelte +4 -4
- package/dist/card/Card.svelte +1 -1
- package/dist/card/Card.svelte.d.ts +1 -1
- package/dist/cascade-options-select/CascadeOptionSelect.svelte +2 -3
- package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +46 -1
- package/dist/cascade-options-select/CascadePanel.svelte +1 -1
- package/dist/checkbox/CheckBox.svelte +1 -1
- package/dist/color-picker/ColorPicker.svelte +9 -9
- package/dist/color-picker/ColorPicker.svelte.d.ts +0 -2
- package/dist/color-picker/ColorPickerPanel.svelte +11 -15
- package/dist/color-picker/ColorPickerPanel.svelte.d.ts +1 -1
- package/dist/common/CommonPicker.svelte +2 -2
- package/dist/common/CommonPicker.svelte.d.ts +1 -1
- package/dist/common/MouseClickHandler.d.ts +1 -1
- package/dist/common/Popover.svelte +28 -6
- package/dist/common/Popover.svelte.d.ts +9 -3
- package/dist/common/uniface-utils.js +6 -4
- package/dist/common-editor/CommonEditor.svelte +1 -1
- package/dist/common-editor/CommonEditor.svelte.d.ts +1 -1
- package/dist/common-editor/NumberInput.svelte +1 -1
- package/dist/common-editor/NumberInput.svelte.d.ts +1 -1
- package/dist/concise-data-table/ConciseListTable.svelte +7 -2
- package/dist/concise-data-table/ConciseListTable.svelte.d.ts +1 -0
- package/dist/concise-data-table/DataRow.svelte +1 -1
- package/dist/concise-data-table/TableOptions.d.ts +1 -1
- package/dist/data-table/DataTable.svelte +1 -1
- package/dist/data-table/parts/ActionsPanel.svelte +4 -3
- package/dist/data-table/parts/ActionsRow.svelte +3 -3
- package/dist/data-table/parts/ContentPanel.svelte +3 -2
- package/dist/data-table/parts/FixedColumnsPanel.svelte +0 -1
- package/dist/data-table/parts/FixedColumnsPanel.svelte.d.ts +1 -2
- package/dist/data-table/parts/FixedHeaderPanel.svelte +2 -2
- package/dist/data-table/parts/FixedRow.svelte +2 -1
- package/dist/data-table/parts/FixedRow.svelte.d.ts +1 -1
- package/dist/data-table/parts/HrefCell.svelte +23 -2
- package/dist/data-table/parts/PopupMenu.svelte +25 -2
- package/dist/data-table/parts/PopupMenu.svelte.d.ts +8 -1
- package/dist/date-picker/DatePicker.svelte +0 -1
- package/dist/date-picker/DateTimePicker.svelte +3 -3
- package/dist/date-picker/ScrollBar.svelte +4 -7
- package/dist/date-range/DateRangeEditor.svelte +1 -1
- package/dist/dialog/CommonDialog.svelte +8 -5
- package/dist/dialog/CommonDialog.svelte.d.ts +2 -1
- package/dist/dialog/Dialog.svelte +37 -12
- package/dist/dialog/Dialog.svelte.d.ts +4 -3
- package/dist/dialog/DialogBoard.svelte +11 -8
- package/dist/dialog/DialogWrapper.svelte +10 -0
- package/dist/{common-editor/DateInput.svelte.d.ts → dialog/DialogWrapper.svelte.d.ts} +6 -13
- package/dist/dialog/Dialogs.js +1 -1
- package/dist/dialog/ModalResult.d.ts +5 -0
- package/dist/dialog/ModalResult.js +5 -0
- package/dist/drawer/Drawer.svelte +1 -1
- package/dist/form-field/FormField.svelte +2 -1
- package/dist/form-field/FormField.svelte.d.ts +1 -0
- package/dist/form-panel/flex-row-form/FormContainer.svelte +1 -1
- package/dist/form-panel/grid-form/EmptyCell.svelte +8 -7
- package/dist/form-panel/grid-form/EmptyCell.svelte.d.ts +2 -2
- package/dist/form-panel/grid-form/GridField.svelte +1 -1
- package/dist/i18nRes/i18nRes.d.ts +2 -0
- package/dist/i18nRes/i18nRes.js +44 -0
- package/dist/i18nRes/index.d.ts +2 -0
- package/dist/i18nRes/index.js +2 -0
- package/dist/image-files/ImageFilesField.svelte +1 -1
- package/dist/indicator/IndicatorBoard.svelte +1 -1
- package/dist/inline-cell-editor/InvalidEditor.svelte +1 -0
- package/dist/input-options-select/InputOptionsSelect.svelte +6 -6
- package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +1 -1
- package/dist/layout/flex/FlexBlock.svelte +1 -1
- package/dist/lookup-editor/LookupEditor.svelte +1 -1
- package/dist/memo-editor/MemoEditor.svelte +2 -2
- package/dist/message-box/IMessageBox.d.ts +2 -4
- package/dist/message-box/IMessageBox.js +4 -6
- package/dist/message-box/MessageBoxBoard.svelte +1 -3
- package/dist/options-multi-select/OptionsMultiSelect.svelte +1 -1
- package/dist/prompts-text-editor/PromptsTextEditor.svelte +2 -2
- package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +1 -1
- package/dist/property-editor/PropertyEditor.svelte +3 -3
- package/dist/text-editor/PasswordEditor.svelte +1 -1
- package/dist/transfer/Transfer.svelte +17 -12
- package/dist/transfer/Transfer.svelte.d.ts +0 -1
- package/dist/unit-number-editor/UnitNumberEditor.svelte +2 -2
- package/docs/buttons/cn/ActionBar.md +459 -0
- package/docs/buttons/cn/Button.md +228 -0
- package/docs/buttons/cn/IconButton.md +294 -0
- package/docs/buttons/cn/README.md +600 -0
- package/docs/buttons/cn/TextButton.md +163 -0
- package/docs/buttons/en/ActionBar.md +459 -0
- package/docs/buttons/en/Button.md +228 -0
- package/docs/buttons/en/IconButton.md +294 -0
- package/docs/buttons/en/README.md +600 -0
- package/docs/buttons/en/TextButton.md +163 -0
- package/docs/containers/cn/accordion.md +622 -0
- package/docs/containers/cn/box.md +445 -0
- package/docs/containers/cn/card.md +404 -0
- package/docs/containers/cn/page.md +576 -0
- package/docs/containers/cn/tabs.md +686 -0
- package/docs/containers/en/accordion.md +622 -0
- package/docs/containers/en/box.md +445 -0
- package/docs/containers/en/card.md +404 -0
- package/docs/containers/en/page.md +576 -0
- package/docs/containers/en/tabs.md +686 -0
- package/docs/data-display/cn/concise-data-table.md +731 -0
- package/docs/data-display/cn/listbox.md +786 -0
- package/docs/data-display/cn/treeview.md +863 -0
- package/docs/data-display/en/concise-data-table.md +732 -0
- package/docs/data-display/en/listbox.md +786 -0
- package/docs/data-display/en/treeview.md +863 -0
- package/docs/data-table/cn/README.md +596 -0
- package/docs/data-table/en/README.md +596 -0
- package/docs/dialog/cn/README.md +767 -0
- package/docs/dialog/en/README.md +767 -0
- package/docs/form/cn/README.md +847 -0
- package/docs/form/en/README.md +847 -0
- package/docs/form-components/cn/README.md +495 -0
- package/docs/form-components/cn/attachmentfilesfield.md +757 -0
- package/docs/form-components/cn/cascade-options-select.md +374 -0
- package/docs/form-components/cn/checkbox.md +58 -0
- package/docs/form-components/cn/date-picker.md +138 -0
- package/docs/form-components/cn/datetime-picker.md +228 -0
- package/docs/form-components/cn/group-checkbox.md +405 -0
- package/docs/form-components/cn/group-radiobox.md +525 -0
- package/docs/form-components/cn/imagefilesfield.md +651 -0
- package/docs/form-components/cn/input-options-select.md +250 -0
- package/docs/form-components/cn/lookup-editor.md +406 -0
- package/docs/form-components/cn/memoeditor.md +409 -0
- package/docs/form-components/cn/number-editor.md +261 -0
- package/docs/form-components/cn/options-multi-select.md +177 -0
- package/docs/form-components/cn/options-select.md +83 -0
- package/docs/form-components/cn/passwordeditor.md +538 -0
- package/docs/form-components/cn/prompts-text-editor.md +241 -0
- package/docs/form-components/cn/radiobutton.md +84 -0
- package/docs/form-components/cn/switch.md +178 -0
- package/docs/form-components/cn/text-editor.md +142 -0
- package/docs/form-components/cn/time-editor.md +159 -0
- package/docs/form-components/cn/unit-number-editor.md +164 -0
- package/docs/form-components/en/README.md +463 -0
- package/docs/form-components/en/attachmentfilesfield.md +757 -0
- package/docs/form-components/en/cascade-options-select.md +358 -0
- package/docs/form-components/en/checkbox.md +59 -0
- package/docs/form-components/en/date-picker.md +138 -0
- package/docs/form-components/en/datetime-picker.md +228 -0
- package/docs/form-components/en/group-checkbox.md +395 -0
- package/docs/form-components/en/group-radiobox.md +498 -0
- package/docs/form-components/en/imagefilesfield.md +651 -0
- package/docs/form-components/en/input-options-select.md +239 -0
- package/docs/form-components/en/lookup-editor.md +389 -0
- package/docs/form-components/en/memoeditor.md +409 -0
- package/docs/form-components/en/number-editor.md +249 -0
- package/docs/form-components/en/options-multi-select.md +177 -0
- package/docs/form-components/en/options-select.md +83 -0
- package/docs/form-components/en/passwordeditor.md +538 -0
- package/docs/form-components/en/prompts-text-editor.md +241 -0
- package/docs/form-components/en/radiobutton.md +84 -0
- package/docs/form-components/en/switch.md +180 -0
- package/docs/form-components/en/text-editor.md +142 -0
- package/docs/form-components/en/time-editor.md +159 -0
- package/docs/form-components/en/unit-number-editor.md +164 -0
- package/docs/form-layout/cn/criteria-field.md +652 -0
- package/docs/form-layout/cn/flex-form.md +454 -0
- package/docs/form-layout/cn/flex-row-form.md +542 -0
- package/docs/form-layout/cn/form-field.md +923 -0
- package/docs/form-layout/cn/grid-form.md +676 -0
- package/docs/form-layout/en/criteria-field.md +652 -0
- package/docs/form-layout/en/flex-form.md +454 -0
- package/docs/form-layout/en/flex-row-form.md +542 -0
- package/docs/form-layout/en/form-field.md +923 -0
- package/docs/form-layout/en/grid-form.md +676 -0
- package/docs/global/cn/README.md +534 -0
- package/docs/global/en/README.md +534 -0
- package/docs/layout/cn/classiclayout.md +460 -0
- package/docs/layout/cn/headerlayout.md +524 -0
- package/docs/layout/cn/sidebarlayout.md +263 -0
- package/docs/layout/en/classiclayout.md +951 -0
- package/docs/layout/en/headerlayout.md +524 -0
- package/docs/layout/en/sidebarlayout.md +262 -0
- package/docs/misc/cn/README.md +1217 -0
- package/docs/misc/en/README.md +1217 -0
- package/docs/navigation/cn/breadcrumb.md +291 -0
- package/docs/navigation/cn/navigator.md +322 -0
- package/docs/navigation/cn/navigatormenu.md +512 -0
- package/docs/navigation/cn/progressbar.md +199 -0
- package/docs/navigation/cn/progressstepbar.md +299 -0
- package/docs/navigation/en/breadcrumb.md +291 -0
- package/docs/navigation/en/navigator.md +322 -0
- package/docs/navigation/en/navigatormenu.md +512 -0
- package/docs/navigation/en/progressbar.md +199 -0
- package/docs/navigation/en/progressstepbar.md +299 -0
- package/docs/search-filters/cn/daterange.md +1156 -0
- package/docs/search-filters/cn/numberrange.md +688 -0
- package/docs/search-filters/cn/searchbox.md +1582 -0
- package/docs/search-filters/en/daterange.md +1156 -0
- package/docs/search-filters/en/numberrange.md +688 -0
- package/docs/search-filters/en/searchbox.md +1582 -0
- package/package.json +53 -13
- package/dist/common-editor/DateInput.svelte +0 -27
- package/dist/i18n_resources/index.d.ts +0 -3
- package/dist/i18n_resources/index.js +0 -3
- /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.d.ts +0 -0
- /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.js +0 -0
- /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.d.ts +0 -0
- /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.js +0 -0
|
@@ -0,0 +1,951 @@
|
|
|
1
|
+
# ClassicLayout
|
|
2
|
+
|
|
3
|
+
The ClassicLayout component provides a comprehensive full-screen layout with header, footer, sidebar, right sidebar, and main content area. This classic application layout is ideal for complex applications that need multiple content zones and navigation areas.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Full-Screen Layout**: Covers the entire viewport with header, content, and optional footer
|
|
8
|
+
- **Dual Sidebars**: Left sidebar for navigation and optional right sidebar for tools/info
|
|
9
|
+
- **Resizable Panels**: Both sidebars can be independently resized
|
|
10
|
+
- **Header and Footer**: Fixed header and optional status/footer bar
|
|
11
|
+
- **Flexible Configuration**: All areas are optional and highly configurable
|
|
12
|
+
- **Split Panel Integration**: Uses Split component for smooth panel resizing
|
|
13
|
+
|
|
14
|
+
## Import
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { ClassicLayout } from '@ticatec/uniface-element/app-layout/ClassicLayout';
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Properties
|
|
21
|
+
|
|
22
|
+
| Property | Type | Default | Description |
|
|
23
|
+
|----------|------|---------|-------------|
|
|
24
|
+
| `headerHeight` | `string` | `"48px"` | Sets the height of the header |
|
|
25
|
+
| `statusHeight` | `string` | `"22px"` | Sets the height of the status/footer bar |
|
|
26
|
+
| `sidebarWidth` | `string` | `"300px"` | Sets the initial width of the left sidebar |
|
|
27
|
+
| `sidebarResize` | `boolean` | `false` | Enables left sidebar resizing |
|
|
28
|
+
| `sidebarMaxWidth` | `string \| null` | `null` | Maximum width for the left sidebar |
|
|
29
|
+
| `sidebarMinWidth` | `string \| null` | `null` | Minimum width for the left sidebar |
|
|
30
|
+
| `rightBarWidth` | `string` | `"240px"` | Sets the initial width of the right sidebar |
|
|
31
|
+
| `rightBarResize` | `boolean` | `false` | Enables right sidebar resizing |
|
|
32
|
+
| `rightBarMaxWidth` | `string \| null` | `null` | Maximum width for the right sidebar |
|
|
33
|
+
| `rightBarMinWidth` | `string \| null` | `null` | Minimum width for the right sidebar |
|
|
34
|
+
|
|
35
|
+
## Slots
|
|
36
|
+
|
|
37
|
+
- **header**: Content displayed in the header area (spans full width)
|
|
38
|
+
- **sidebar**: Content for the left sidebar (optional)
|
|
39
|
+
- **right-sidebar**: Content for the right sidebar (optional)
|
|
40
|
+
- **bottom**: Content for the footer/status bar (optional)
|
|
41
|
+
- **Default Slot**: Main content displayed in the center area
|
|
42
|
+
|
|
43
|
+
## Basic Usage
|
|
44
|
+
|
|
45
|
+
```svelte
|
|
46
|
+
<script lang="ts">
|
|
47
|
+
import { ClassicLayout } from '@ticatec/uniface-element/app-layout/ClassicLayout';
|
|
48
|
+
</script>
|
|
49
|
+
|
|
50
|
+
<ClassicLayout
|
|
51
|
+
headerHeight="60px"
|
|
52
|
+
statusHeight="25px"
|
|
53
|
+
sidebarWidth="280px"
|
|
54
|
+
rightBarWidth="250px"
|
|
55
|
+
sidebarResize={true}
|
|
56
|
+
rightBarResize={true}
|
|
57
|
+
>
|
|
58
|
+
<div slot="header" class="app-header">
|
|
59
|
+
<h1>Application Title</h1>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div slot="sidebar" class="main-sidebar">
|
|
63
|
+
<p>Left sidebar content</p>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<div slot="right-sidebar" class="right-panel">
|
|
67
|
+
<p>Right sidebar content</p>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<div slot="bottom" class="status-bar">
|
|
71
|
+
<p>Status bar content</p>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<main class="main-content">
|
|
75
|
+
<p>Main application content</p>
|
|
76
|
+
</main>
|
|
77
|
+
</ClassicLayout>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Advanced Examples
|
|
81
|
+
|
|
82
|
+
### IDE-Style Application Layout
|
|
83
|
+
|
|
84
|
+
```svelte
|
|
85
|
+
<script lang="ts">
|
|
86
|
+
import { ClassicLayout } from '@ticatec/uniface-element/app-layout/ClassicLayout';
|
|
87
|
+
import { NavigatorMenu } from '@ticatec/uniface-element/NavigatorMenu';
|
|
88
|
+
import { Button } from '@ticatec/uniface-element/Button';
|
|
89
|
+
import { Tabs } from '@ticatec/uniface-element/Tabs';
|
|
90
|
+
|
|
91
|
+
let menuItems = [
|
|
92
|
+
{ id: 1, text: 'Explorer', icon: 'folder_open' },
|
|
93
|
+
{ id: 2, text: 'Search', icon: 'search' },
|
|
94
|
+
{ id: 3, text: 'Source Control', icon: 'source' },
|
|
95
|
+
{ id: 4, text: 'Extensions', icon: 'extension' }
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
let openTabs = [
|
|
99
|
+
{ id: 1, title: 'App.svelte', modified: true },
|
|
100
|
+
{ id: 2, title: 'main.ts', modified: false },
|
|
101
|
+
{ id: 3, title: 'styles.css', modified: true }
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
let activeTab = 1;
|
|
105
|
+
let projectStats = {
|
|
106
|
+
files: 127,
|
|
107
|
+
lines: 5420,
|
|
108
|
+
characters: 98234
|
|
109
|
+
};
|
|
110
|
+
</script>
|
|
111
|
+
|
|
112
|
+
<ClassicLayout
|
|
113
|
+
headerHeight="40px"
|
|
114
|
+
statusHeight="22px"
|
|
115
|
+
sidebarWidth="300px"
|
|
116
|
+
rightBarWidth="280px"
|
|
117
|
+
sidebarResize={true}
|
|
118
|
+
rightBarResize={true}
|
|
119
|
+
sidebarMinWidth="200px"
|
|
120
|
+
sidebarMaxWidth="500px"
|
|
121
|
+
rightBarMinWidth="200px"
|
|
122
|
+
rightBarMaxWidth="400px"
|
|
123
|
+
>
|
|
124
|
+
<div slot="header" class="ide-header">
|
|
125
|
+
<div class="header-section">
|
|
126
|
+
<span class="app-title">Code Editor</span>
|
|
127
|
+
</div>
|
|
128
|
+
<div class="header-section header-center">
|
|
129
|
+
<div class="search-box">
|
|
130
|
+
<input type="text" placeholder="Search files..." />
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
<div class="header-section">
|
|
134
|
+
<Button size="small" variant="outlined">Run</Button>
|
|
135
|
+
<Button size="small" type="primary">Debug</Button>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
|
|
139
|
+
<div slot="sidebar" class="ide-sidebar">
|
|
140
|
+
<div class="sidebar-header">
|
|
141
|
+
<h3>Explorer</h3>
|
|
142
|
+
</div>
|
|
143
|
+
<NavigatorMenu items={menuItems} />
|
|
144
|
+
|
|
145
|
+
<div class="file-tree">
|
|
146
|
+
<div class="tree-item">📁 src</div>
|
|
147
|
+
<div class="tree-item tree-nested">📄 App.svelte</div>
|
|
148
|
+
<div class="tree-item tree-nested">📄 main.ts</div>
|
|
149
|
+
<div class="tree-item">📁 public</div>
|
|
150
|
+
<div class="tree-item">📄 package.json</div>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
|
|
154
|
+
<div slot="right-sidebar" class="ide-right-panel">
|
|
155
|
+
<div class="panel-header">
|
|
156
|
+
<h3>Properties</h3>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
<div class="properties-section">
|
|
160
|
+
<h4>Project Statistics</h4>
|
|
161
|
+
<div class="stat-grid">
|
|
162
|
+
<div class="stat-item">
|
|
163
|
+
<label>Files:</label>
|
|
164
|
+
<span>{projectStats.files}</span>
|
|
165
|
+
</div>
|
|
166
|
+
<div class="stat-item">
|
|
167
|
+
<label>Lines:</label>
|
|
168
|
+
<span>{projectStats.lines}</span>
|
|
169
|
+
</div>
|
|
170
|
+
<div class="stat-item">
|
|
171
|
+
<label>Characters:</label>
|
|
172
|
+
<span>{projectStats.characters}</span>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
|
|
177
|
+
<div class="properties-section">
|
|
178
|
+
<h4>Problems</h4>
|
|
179
|
+
<div class="problem-list">
|
|
180
|
+
<div class="problem-item warning">
|
|
181
|
+
<span class="problem-icon">⚠️</span>
|
|
182
|
+
<span>Unused variable 'temp'</span>
|
|
183
|
+
</div>
|
|
184
|
+
<div class="problem-item error">
|
|
185
|
+
<span class="problem-icon">❌</span>
|
|
186
|
+
<span>Missing semicolon</span>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
|
|
192
|
+
<div slot="bottom" class="ide-status">
|
|
193
|
+
<div class="status-left">
|
|
194
|
+
<span>Ready</span>
|
|
195
|
+
<span class="separator">|</span>
|
|
196
|
+
<span>Line 45, Column 12</span>
|
|
197
|
+
</div>
|
|
198
|
+
<div class="status-right">
|
|
199
|
+
<span>TypeScript</span>
|
|
200
|
+
<span class="separator">|</span>
|
|
201
|
+
<span>UTF-8</span>
|
|
202
|
+
<span class="separator">|</span>
|
|
203
|
+
<span>LF</span>
|
|
204
|
+
</div>
|
|
205
|
+
</div>
|
|
206
|
+
|
|
207
|
+
<div class="ide-main">
|
|
208
|
+
<div class="tabs-container">
|
|
209
|
+
<Tabs items={openTabs} bind:activeTab />
|
|
210
|
+
</div>
|
|
211
|
+
|
|
212
|
+
<div class="editor-container">
|
|
213
|
+
<div class="line-numbers">
|
|
214
|
+
{#each Array(20) as _, i}
|
|
215
|
+
<div class="line-number">{i + 1}</div>
|
|
216
|
+
{/each}
|
|
217
|
+
</div>
|
|
218
|
+
|
|
219
|
+
<div class="code-editor">
|
|
220
|
+
<pre><code>
|
|
221
|
+
<script lang="ts">
|
|
222
|
+
import { Button } from '@ticatec/uniface-element/Button';
|
|
223
|
+
|
|
224
|
+
let count = 0;
|
|
225
|
+
|
|
226
|
+
const increment = () => {
|
|
227
|
+
count += 1;
|
|
228
|
+
};
|
|
229
|
+
</script>
|
|
230
|
+
|
|
231
|
+
<div class="app">
|
|
232
|
+
<h1>Welcome to Svelte</h1>
|
|
233
|
+
<Button on:click={increment}>
|
|
234
|
+
Count: {count}
|
|
235
|
+
</Button>
|
|
236
|
+
</div>
|
|
237
|
+
</code></pre>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
</ClassicLayout>
|
|
242
|
+
|
|
243
|
+
<style>
|
|
244
|
+
.ide-header {
|
|
245
|
+
display: flex;
|
|
246
|
+
justify-content: space-between;
|
|
247
|
+
align-items: center;
|
|
248
|
+
padding: 0 15px;
|
|
249
|
+
background: #2d2d30;
|
|
250
|
+
color: #cccccc;
|
|
251
|
+
border-bottom: 1px solid #3e3e42;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.header-section {
|
|
255
|
+
display: flex;
|
|
256
|
+
align-items: center;
|
|
257
|
+
gap: 10px;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.header-center {
|
|
261
|
+
flex: 1;
|
|
262
|
+
justify-content: center;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.app-title {
|
|
266
|
+
font-weight: 500;
|
|
267
|
+
font-size: 0.9em;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.search-box input {
|
|
271
|
+
background: #3c3c3c;
|
|
272
|
+
border: 1px solid #464647;
|
|
273
|
+
color: #cccccc;
|
|
274
|
+
padding: 4px 8px;
|
|
275
|
+
border-radius: 3px;
|
|
276
|
+
width: 200px;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.ide-sidebar {
|
|
280
|
+
background: #252526;
|
|
281
|
+
color: #cccccc;
|
|
282
|
+
padding: 0;
|
|
283
|
+
border-right: 1px solid #3e3e42;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.sidebar-header {
|
|
287
|
+
padding: 10px 15px;
|
|
288
|
+
background: #2d2d30;
|
|
289
|
+
border-bottom: 1px solid #3e3e42;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.sidebar-header h3 {
|
|
293
|
+
margin: 0;
|
|
294
|
+
font-size: 0.85em;
|
|
295
|
+
text-transform: uppercase;
|
|
296
|
+
letter-spacing: 0.5px;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.file-tree {
|
|
300
|
+
padding: 10px 0;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
.tree-item {
|
|
304
|
+
padding: 4px 15px;
|
|
305
|
+
cursor: pointer;
|
|
306
|
+
font-size: 0.9em;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
.tree-item:hover {
|
|
310
|
+
background: #2a2d2e;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
.tree-nested {
|
|
314
|
+
padding-left: 30px;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
.ide-right-panel {
|
|
318
|
+
background: #252526;
|
|
319
|
+
color: #cccccc;
|
|
320
|
+
border-left: 1px solid #3e3e42;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
.panel-header {
|
|
324
|
+
padding: 10px 15px;
|
|
325
|
+
background: #2d2d30;
|
|
326
|
+
border-bottom: 1px solid #3e3e42;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
.panel-header h3 {
|
|
330
|
+
margin: 0;
|
|
331
|
+
font-size: 0.85em;
|
|
332
|
+
text-transform: uppercase;
|
|
333
|
+
letter-spacing: 0.5px;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
.properties-section {
|
|
337
|
+
padding: 15px;
|
|
338
|
+
border-bottom: 1px solid #3e3e42;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
.properties-section h4 {
|
|
342
|
+
margin: 0 0 10px 0;
|
|
343
|
+
font-size: 0.8em;
|
|
344
|
+
color: #cccccc;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.stat-grid {
|
|
348
|
+
display: flex;
|
|
349
|
+
flex-direction: column;
|
|
350
|
+
gap: 5px;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
.stat-item {
|
|
354
|
+
display: flex;
|
|
355
|
+
justify-content: space-between;
|
|
356
|
+
font-size: 0.85em;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
.stat-item label {
|
|
360
|
+
color: #969696;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
.problem-list {
|
|
364
|
+
display: flex;
|
|
365
|
+
flex-direction: column;
|
|
366
|
+
gap: 5px;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
.problem-item {
|
|
370
|
+
display: flex;
|
|
371
|
+
align-items: center;
|
|
372
|
+
gap: 8px;
|
|
373
|
+
font-size: 0.85em;
|
|
374
|
+
padding: 3px 0;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
.problem-item.warning {
|
|
378
|
+
color: #ffcc02;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
.problem-item.error {
|
|
382
|
+
color: #f48771;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
.problem-icon {
|
|
386
|
+
font-size: 0.9em;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
.ide-status {
|
|
390
|
+
display: flex;
|
|
391
|
+
justify-content: space-between;
|
|
392
|
+
align-items: center;
|
|
393
|
+
padding: 0 15px;
|
|
394
|
+
background: #007acc;
|
|
395
|
+
color: white;
|
|
396
|
+
font-size: 0.8em;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.status-left, .status-right {
|
|
400
|
+
display: flex;
|
|
401
|
+
align-items: center;
|
|
402
|
+
gap: 8px;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
.separator {
|
|
406
|
+
opacity: 0.7;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
.ide-main {
|
|
410
|
+
background: #1e1e1e;
|
|
411
|
+
color: #cccccc;
|
|
412
|
+
display: flex;
|
|
413
|
+
flex-direction: column;
|
|
414
|
+
height: 100%;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
.tabs-container {
|
|
418
|
+
background: #2d2d30;
|
|
419
|
+
border-bottom: 1px solid #3e3e42;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
.editor-container {
|
|
423
|
+
display: flex;
|
|
424
|
+
flex: 1;
|
|
425
|
+
height: 100%;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
.line-numbers {
|
|
429
|
+
background: #1e1e1e;
|
|
430
|
+
color: #858585;
|
|
431
|
+
padding: 10px 5px;
|
|
432
|
+
font-family: 'Courier New', monospace;
|
|
433
|
+
font-size: 0.85em;
|
|
434
|
+
line-height: 1.4;
|
|
435
|
+
text-align: right;
|
|
436
|
+
border-right: 1px solid #3e3e42;
|
|
437
|
+
user-select: none;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
.line-number {
|
|
441
|
+
padding: 0 8px;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
.code-editor {
|
|
445
|
+
flex: 1;
|
|
446
|
+
padding: 10px;
|
|
447
|
+
font-family: 'Courier New', monospace;
|
|
448
|
+
font-size: 0.85em;
|
|
449
|
+
line-height: 1.4;
|
|
450
|
+
overflow: auto;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
.code-editor pre {
|
|
454
|
+
margin: 0;
|
|
455
|
+
color: #cccccc;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.code-editor code {
|
|
459
|
+
color: inherit;
|
|
460
|
+
}
|
|
461
|
+
</style>
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### Dashboard Application Layout
|
|
465
|
+
|
|
466
|
+
```svelte
|
|
467
|
+
<script lang="ts">
|
|
468
|
+
import { ClassicLayout } from '@ticatec/uniface-element/app-layout/ClassicLayout';
|
|
469
|
+
import { NavigatorMenu } from '@ticatec/uniface-element/NavigatorMenu';
|
|
470
|
+
import { Button } from '@ticatec/uniface-element/Button';
|
|
471
|
+
import { Card } from '@ticatec/uniface-element/Card';
|
|
472
|
+
|
|
473
|
+
let navigationItems = [
|
|
474
|
+
{ id: 1, text: 'Dashboard', icon: 'dashboard', active: true },
|
|
475
|
+
{ id: 2, text: 'Analytics', icon: 'analytics' },
|
|
476
|
+
{ id: 3, text: 'Reports', icon: 'assessment' },
|
|
477
|
+
{ id: 4, text: 'Users', icon: 'people' },
|
|
478
|
+
{ id: 5, text: 'Settings', icon: 'settings' }
|
|
479
|
+
];
|
|
480
|
+
|
|
481
|
+
let currentUser = {
|
|
482
|
+
name: 'John Doe',
|
|
483
|
+
role: 'Administrator',
|
|
484
|
+
avatar: '/avatar.jpg'
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
let notifications = [
|
|
488
|
+
{ id: 1, text: 'New user registered', time: '2 min ago', type: 'info' },
|
|
489
|
+
{ id: 2, text: 'Server maintenance scheduled', time: '1 hour ago', type: 'warning' },
|
|
490
|
+
{ id: 3, text: 'Backup completed', time: '3 hours ago', type: 'success' }
|
|
491
|
+
];
|
|
492
|
+
|
|
493
|
+
let systemStats = {
|
|
494
|
+
uptime: '15 days, 4 hours',
|
|
495
|
+
memory: '68%',
|
|
496
|
+
cpu: '23%',
|
|
497
|
+
storage: '45%'
|
|
498
|
+
};
|
|
499
|
+
</script>
|
|
500
|
+
|
|
501
|
+
<ClassicLayout
|
|
502
|
+
headerHeight="65px"
|
|
503
|
+
statusHeight="28px"
|
|
504
|
+
sidebarWidth="260px"
|
|
505
|
+
rightBarWidth="300px"
|
|
506
|
+
sidebarResize={true}
|
|
507
|
+
rightBarResize={true}
|
|
508
|
+
>
|
|
509
|
+
<div slot="header" class="dashboard-header">
|
|
510
|
+
<div class="header-brand">
|
|
511
|
+
<img src="/logo.png" alt="Company Logo" class="logo" />
|
|
512
|
+
<div class="brand-info">
|
|
513
|
+
<h1>Admin Dashboard</h1>
|
|
514
|
+
<span class="version">v2.1.0</span>
|
|
515
|
+
</div>
|
|
516
|
+
</div>
|
|
517
|
+
|
|
518
|
+
<div class="header-actions">
|
|
519
|
+
<Button variant="outlined" size="small">
|
|
520
|
+
📊 Export Data
|
|
521
|
+
</Button>
|
|
522
|
+
<div class="user-menu">
|
|
523
|
+
<img src={currentUser.avatar} alt="User Avatar" class="user-avatar" />
|
|
524
|
+
<div class="user-info">
|
|
525
|
+
<span class="user-name">{currentUser.name}</span>
|
|
526
|
+
<small class="user-role">{currentUser.role}</small>
|
|
527
|
+
</div>
|
|
528
|
+
</div>
|
|
529
|
+
</div>
|
|
530
|
+
</div>
|
|
531
|
+
|
|
532
|
+
<div slot="sidebar" class="dashboard-sidebar">
|
|
533
|
+
<div class="sidebar-content">
|
|
534
|
+
<NavigatorMenu items={navigationItems} />
|
|
535
|
+
|
|
536
|
+
<div class="sidebar-section">
|
|
537
|
+
<h3>Quick Actions</h3>
|
|
538
|
+
<div class="quick-actions">
|
|
539
|
+
<Button size="small" style="width: 100%; margin-bottom: 8px;">
|
|
540
|
+
+ New User
|
|
541
|
+
</Button>
|
|
542
|
+
<Button size="small" variant="outlined" style="width: 100%; margin-bottom: 8px;">
|
|
543
|
+
📈 Generate Report
|
|
544
|
+
</Button>
|
|
545
|
+
<Button size="small" variant="outlined" style="width: 100%;">
|
|
546
|
+
🔧 System Maintenance
|
|
547
|
+
</Button>
|
|
548
|
+
</div>
|
|
549
|
+
</div>
|
|
550
|
+
</div>
|
|
551
|
+
</div>
|
|
552
|
+
|
|
553
|
+
<div slot="right-sidebar" class="dashboard-rightbar">
|
|
554
|
+
<div class="rightbar-section">
|
|
555
|
+
<h3>Notifications</h3>
|
|
556
|
+
<div class="notifications-list">
|
|
557
|
+
{#each notifications as notification}
|
|
558
|
+
<div class="notification-item {notification.type}">
|
|
559
|
+
<div class="notification-content">
|
|
560
|
+
<p>{notification.text}</p>
|
|
561
|
+
<small>{notification.time}</small>
|
|
562
|
+
</div>
|
|
563
|
+
</div>
|
|
564
|
+
{/each}
|
|
565
|
+
</div>
|
|
566
|
+
</div>
|
|
567
|
+
|
|
568
|
+
<div class="rightbar-section">
|
|
569
|
+
<h3>System Status</h3>
|
|
570
|
+
<div class="system-stats">
|
|
571
|
+
<div class="stat-row">
|
|
572
|
+
<label>Uptime:</label>
|
|
573
|
+
<span>{systemStats.uptime}</span>
|
|
574
|
+
</div>
|
|
575
|
+
<div class="stat-row">
|
|
576
|
+
<label>Memory:</label>
|
|
577
|
+
<span class="stat-value">{systemStats.memory}</span>
|
|
578
|
+
</div>
|
|
579
|
+
<div class="stat-row">
|
|
580
|
+
<label>CPU:</label>
|
|
581
|
+
<span class="stat-value">{systemStats.cpu}</span>
|
|
582
|
+
</div>
|
|
583
|
+
<div class="stat-row">
|
|
584
|
+
<label>Storage:</label>
|
|
585
|
+
<span class="stat-value">{systemStats.storage}</span>
|
|
586
|
+
</div>
|
|
587
|
+
</div>
|
|
588
|
+
</div>
|
|
589
|
+
</div>
|
|
590
|
+
|
|
591
|
+
<div slot="bottom" class="dashboard-status">
|
|
592
|
+
<div class="status-info">
|
|
593
|
+
<span>🟢 All systems operational</span>
|
|
594
|
+
<span class="separator">•</span>
|
|
595
|
+
<span>Last updated: {new Date().toLocaleTimeString()}</span>
|
|
596
|
+
</div>
|
|
597
|
+
<div class="status-actions">
|
|
598
|
+
<span>Connected users: 1,247</span>
|
|
599
|
+
</div>
|
|
600
|
+
</div>
|
|
601
|
+
|
|
602
|
+
<div class="dashboard-main">
|
|
603
|
+
<div class="main-header">
|
|
604
|
+
<h2>Welcome back, {currentUser.name}</h2>
|
|
605
|
+
<p>Here's what's happening with your system today.</p>
|
|
606
|
+
</div>
|
|
607
|
+
|
|
608
|
+
<div class="dashboard-grid">
|
|
609
|
+
<Card title="Total Users" style="grid-area: users;">
|
|
610
|
+
<div class="metric-card">
|
|
611
|
+
<div class="metric-value">12,486</div>
|
|
612
|
+
<div class="metric-change positive">+5.2%</div>
|
|
613
|
+
</div>
|
|
614
|
+
</Card>
|
|
615
|
+
|
|
616
|
+
<Card title="Revenue" style="grid-area: revenue;">
|
|
617
|
+
<div class="metric-card">
|
|
618
|
+
<div class="metric-value">$48,392</div>
|
|
619
|
+
<div class="metric-change positive">+12.1%</div>
|
|
620
|
+
</div>
|
|
621
|
+
</Card>
|
|
622
|
+
|
|
623
|
+
<Card title="Active Sessions" style="grid-area: sessions;">
|
|
624
|
+
<div class="metric-card">
|
|
625
|
+
<div class="metric-value">1,247</div>
|
|
626
|
+
<div class="metric-change negative">-2.8%</div>
|
|
627
|
+
</div>
|
|
628
|
+
</Card>
|
|
629
|
+
|
|
630
|
+
<Card title="Performance" style="grid-area: performance;">
|
|
631
|
+
<div class="metric-card">
|
|
632
|
+
<div class="metric-value">98.2%</div>
|
|
633
|
+
<div class="metric-change positive">+0.5%</div>
|
|
634
|
+
</div>
|
|
635
|
+
</Card>
|
|
636
|
+
|
|
637
|
+
<Card title="Recent Activity" style="grid-area: activity;">
|
|
638
|
+
<div class="activity-list">
|
|
639
|
+
<div class="activity-item">User login from IP 192.168.1.1</div>
|
|
640
|
+
<div class="activity-item">Database backup completed</div>
|
|
641
|
+
<div class="activity-item">New report generated</div>
|
|
642
|
+
</div>
|
|
643
|
+
</Card>
|
|
644
|
+
</div>
|
|
645
|
+
</div>
|
|
646
|
+
</ClassicLayout>
|
|
647
|
+
|
|
648
|
+
<style>
|
|
649
|
+
/* Dashboard Header */
|
|
650
|
+
.dashboard-header {
|
|
651
|
+
display: flex;
|
|
652
|
+
justify-content: space-between;
|
|
653
|
+
align-items: center;
|
|
654
|
+
padding: 0 20px;
|
|
655
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
656
|
+
color: white;
|
|
657
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
.header-brand {
|
|
661
|
+
display: flex;
|
|
662
|
+
align-items: center;
|
|
663
|
+
gap: 15px;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
.logo {
|
|
667
|
+
width: 40px;
|
|
668
|
+
height: 40px;
|
|
669
|
+
border-radius: 8px;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
.brand-info h1 {
|
|
673
|
+
margin: 0;
|
|
674
|
+
font-size: 1.3em;
|
|
675
|
+
font-weight: 600;
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
.version {
|
|
679
|
+
font-size: 0.7em;
|
|
680
|
+
opacity: 0.8;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
.header-actions {
|
|
684
|
+
display: flex;
|
|
685
|
+
align-items: center;
|
|
686
|
+
gap: 20px;
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
.user-menu {
|
|
690
|
+
display: flex;
|
|
691
|
+
align-items: center;
|
|
692
|
+
gap: 12px;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
.user-avatar {
|
|
696
|
+
width: 35px;
|
|
697
|
+
height: 35px;
|
|
698
|
+
border-radius: 50%;
|
|
699
|
+
border: 2px solid rgba(255,255,255,0.3);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
.user-info {
|
|
703
|
+
display: flex;
|
|
704
|
+
flex-direction: column;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
.user-name {
|
|
708
|
+
font-weight: 500;
|
|
709
|
+
font-size: 0.9em;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
.user-role {
|
|
713
|
+
font-size: 0.75em;
|
|
714
|
+
opacity: 0.8;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
/* Sidebar */
|
|
718
|
+
.dashboard-sidebar {
|
|
719
|
+
background: #f8f9fa;
|
|
720
|
+
border-right: 1px solid #e9ecef;
|
|
721
|
+
padding: 0;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
.sidebar-content {
|
|
725
|
+
padding: 20px 0;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
.sidebar-section {
|
|
729
|
+
padding: 20px;
|
|
730
|
+
border-top: 1px solid #e9ecef;
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
.sidebar-section h3 {
|
|
734
|
+
margin: 0 0 15px 0;
|
|
735
|
+
font-size: 0.9em;
|
|
736
|
+
color: #495057;
|
|
737
|
+
text-transform: uppercase;
|
|
738
|
+
letter-spacing: 0.5px;
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
.quick-actions {
|
|
742
|
+
display: flex;
|
|
743
|
+
flex-direction: column;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
/* Right Sidebar */
|
|
747
|
+
.dashboard-rightbar {
|
|
748
|
+
background: #f8f9fa;
|
|
749
|
+
border-left: 1px solid #e9ecef;
|
|
750
|
+
padding: 20px 0;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
.rightbar-section {
|
|
754
|
+
padding: 0 20px;
|
|
755
|
+
margin-bottom: 30px;
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
.rightbar-section h3 {
|
|
759
|
+
margin: 0 0 15px 0;
|
|
760
|
+
font-size: 0.9em;
|
|
761
|
+
color: #495057;
|
|
762
|
+
text-transform: uppercase;
|
|
763
|
+
letter-spacing: 0.5px;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
.notifications-list {
|
|
767
|
+
display: flex;
|
|
768
|
+
flex-direction: column;
|
|
769
|
+
gap: 10px;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
.notification-item {
|
|
773
|
+
padding: 12px;
|
|
774
|
+
border-radius: 6px;
|
|
775
|
+
border-left: 3px solid;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
.notification-item.info {
|
|
779
|
+
background: #e7f3ff;
|
|
780
|
+
border-left-color: #2196f3;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
.notification-item.warning {
|
|
784
|
+
background: #fff8e1;
|
|
785
|
+
border-left-color: #ff9800;
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
.notification-item.success {
|
|
789
|
+
background: #e8f5e8;
|
|
790
|
+
border-left-color: #4caf50;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
.notification-content p {
|
|
794
|
+
margin: 0 0 4px 0;
|
|
795
|
+
font-size: 0.85em;
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
.notification-content small {
|
|
799
|
+
color: #666;
|
|
800
|
+
font-size: 0.75em;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
.system-stats {
|
|
804
|
+
display: flex;
|
|
805
|
+
flex-direction: column;
|
|
806
|
+
gap: 8px;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
.stat-row {
|
|
810
|
+
display: flex;
|
|
811
|
+
justify-content: space-between;
|
|
812
|
+
align-items: center;
|
|
813
|
+
font-size: 0.9em;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
.stat-row label {
|
|
817
|
+
color: #6c757d;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
.stat-value {
|
|
821
|
+
font-weight: 500;
|
|
822
|
+
color: #495057;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
/* Status Bar */
|
|
826
|
+
.dashboard-status {
|
|
827
|
+
display: flex;
|
|
828
|
+
justify-content: space-between;
|
|
829
|
+
align-items: center;
|
|
830
|
+
padding: 0 20px;
|
|
831
|
+
background: #28a745;
|
|
832
|
+
color: white;
|
|
833
|
+
font-size: 0.8em;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
.status-info {
|
|
837
|
+
display: flex;
|
|
838
|
+
align-items: center;
|
|
839
|
+
gap: 10px;
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
.separator {
|
|
843
|
+
opacity: 0.7;
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
/* Main Content */
|
|
847
|
+
.dashboard-main {
|
|
848
|
+
padding: 30px;
|
|
849
|
+
background: #ffffff;
|
|
850
|
+
height: 100%;
|
|
851
|
+
overflow-y: auto;
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
.main-header {
|
|
855
|
+
margin-bottom: 30px;
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
.main-header h2 {
|
|
859
|
+
margin: 0 0 5px 0;
|
|
860
|
+
color: #2c3e50;
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
.main-header p {
|
|
864
|
+
margin: 0;
|
|
865
|
+
color: #6c757d;
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
.dashboard-grid {
|
|
869
|
+
display: grid;
|
|
870
|
+
grid-template-areas:
|
|
871
|
+
"users revenue sessions performance"
|
|
872
|
+
"activity activity activity activity";
|
|
873
|
+
grid-template-columns: 1fr 1fr 1fr 1fr;
|
|
874
|
+
gap: 20px;
|
|
875
|
+
height: calc(100% - 100px);
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
.metric-card {
|
|
879
|
+
text-align: center;
|
|
880
|
+
padding: 20px;
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
.metric-value {
|
|
884
|
+
font-size: 2.5em;
|
|
885
|
+
font-weight: bold;
|
|
886
|
+
color: #2c3e50;
|
|
887
|
+
margin-bottom: 8px;
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
.metric-change {
|
|
891
|
+
font-size: 0.9em;
|
|
892
|
+
font-weight: 500;
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
.metric-change.positive {
|
|
896
|
+
color: #28a745;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
.metric-change.negative {
|
|
900
|
+
color: #dc3545;
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
.activity-list {
|
|
904
|
+
padding: 15px;
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
.activity-item {
|
|
908
|
+
padding: 8px 0;
|
|
909
|
+
border-bottom: 1px solid #f1f1f1;
|
|
910
|
+
font-size: 0.9em;
|
|
911
|
+
color: #495057;
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
.activity-item:last-child {
|
|
915
|
+
border-bottom: none;
|
|
916
|
+
}
|
|
917
|
+
</style>
|
|
918
|
+
```
|
|
919
|
+
|
|
920
|
+
## Best Practices
|
|
921
|
+
|
|
922
|
+
1. **Layout Planning**: Plan your layout zones carefully - header for branding/navigation, sidebars for tools/navigation, main for content
|
|
923
|
+
2. **Responsive Design**: Consider how the layout adapts on different screen sizes
|
|
924
|
+
3. **Content Hierarchy**: Use the header for primary navigation, sidebars for secondary tools
|
|
925
|
+
4. **Performance**: Keep sidebar content lightweight to maintain smooth resizing
|
|
926
|
+
5. **User Experience**: Provide clear visual separation between different areas
|
|
927
|
+
6. **Accessibility**: Use semantic HTML within slots and maintain proper focus management
|
|
928
|
+
|
|
929
|
+
## Accessibility Considerations
|
|
930
|
+
|
|
931
|
+
- Use proper heading hierarchy across all layout areas
|
|
932
|
+
- Ensure keyboard navigation works smoothly between panels
|
|
933
|
+
- Provide skip links for screen reader users to jump between major sections
|
|
934
|
+
- Use semantic HTML elements (header, nav, main, aside, footer) within appropriate slots
|
|
935
|
+
- Maintain proper focus management when panels are resized
|
|
936
|
+
- Ensure color contrast meets accessibility standards in all areas
|
|
937
|
+
|
|
938
|
+
## Browser Support
|
|
939
|
+
|
|
940
|
+
- Modern browsers with CSS Flexbox support
|
|
941
|
+
- Resize functionality requires pointer events support
|
|
942
|
+
- Layout works in all browsers supporting modern CSS
|
|
943
|
+
|
|
944
|
+
## Notes
|
|
945
|
+
|
|
946
|
+
- The component uses Split component internally for panel resize functionality
|
|
947
|
+
- All slots are optional - you can use any combination of header, sidebars, main content, and footer
|
|
948
|
+
- You can specify minimum and maximum widths for both sidebars independently
|
|
949
|
+
- Header and footer heights can be customized with any valid CSS unit
|
|
950
|
+
- The layout covers the full viewport and is ideal for application interfaces
|
|
951
|
+
- Both left and right sidebars can be resized independently when enabled
|