@ticatec/uniface-element 0.2.0 → 0.2.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/README.md +273 -1
- package/README_CN.md +341 -0
- package/dist/common/MouseClickHandler.d.ts +1 -1
- package/dist/dialog/CommonDialog.svelte +6 -3
- package/dist/dialog/CommonDialog.svelte.d.ts +2 -1
- package/dist/dialog/Dialog.svelte +36 -10
- 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/dialog/DialogWrapper.svelte.d.ts +22 -0
- package/dist/dialog/Dialogs.js +1 -1
- package/dist/dialog/ModalResult.d.ts +5 -0
- package/dist/dialog/ModalResult.js +5 -0
- 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 +38 -5
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
# HeaderLayout
|
|
2
|
+
|
|
3
|
+
The HeaderLayout component provides a flexible T-shaped layout with a header at the top and main content area below. The main area can optionally include a sidebar that can be dynamically resized, and the layout adapts based on provided properties.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **T-Shaped Layout**: Header spans the full width at the top with content below
|
|
8
|
+
- **Optional Sidebar**: Main content area can include a resizable sidebar
|
|
9
|
+
- **Flexible Configuration**: Configurable header height and sidebar dimensions
|
|
10
|
+
- **Split Panel Integration**: Uses Split component for smooth sidebar resizing
|
|
11
|
+
- **Responsive Design**: Adapts to different screen sizes and configurations
|
|
12
|
+
|
|
13
|
+
## Import
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { HeaderLayout } from '@ticatec/uniface-element/app-layout/HeaderLayout';
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Properties
|
|
20
|
+
|
|
21
|
+
| Property | Type | Default | Description |
|
|
22
|
+
|----------|------|---------|-------------|
|
|
23
|
+
| `sidebarResize` | `boolean` | `false` | If set to true, enables the sidebar resizing feature |
|
|
24
|
+
| `headerHeight` | `string` | `"48px"` | Sets the height of the header |
|
|
25
|
+
| `sidebarWidth` | `string` | `"300px"` | Sets the initial width of the sidebar |
|
|
26
|
+
| `sidebarMaxWidth` | `string \| null` | `null` | Sets the maximum width for the sidebar when resizing |
|
|
27
|
+
| `sidebarMinWidth` | `string \| null` | `null` | Sets the minimum width for the sidebar when resizing |
|
|
28
|
+
|
|
29
|
+
## Slots
|
|
30
|
+
|
|
31
|
+
- **header**: The content to be displayed in the header (spans full width)
|
|
32
|
+
- **sidebar**: The content to be displayed in the sidebar (optional)
|
|
33
|
+
- **Default Slot**: The main content to be displayed in the content area
|
|
34
|
+
|
|
35
|
+
## Basic Usage
|
|
36
|
+
|
|
37
|
+
```svelte
|
|
38
|
+
<script lang="ts">
|
|
39
|
+
import { HeaderLayout } from '@ticatec/uniface-element/app-layout/HeaderLayout';
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<HeaderLayout
|
|
43
|
+
sidebarResize={true}
|
|
44
|
+
headerHeight="60px"
|
|
45
|
+
sidebarWidth="250px"
|
|
46
|
+
sidebarMaxWidth="400px"
|
|
47
|
+
sidebarMinWidth="200px"
|
|
48
|
+
>
|
|
49
|
+
<div slot="header">
|
|
50
|
+
<h1>Application Header</h1>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<div slot="sidebar">
|
|
54
|
+
<p>Sidebar content</p>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<div>
|
|
58
|
+
<p>Main content area</p>
|
|
59
|
+
</div>
|
|
60
|
+
</HeaderLayout>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Advanced Examples
|
|
64
|
+
|
|
65
|
+
### Application with Navigation Header
|
|
66
|
+
|
|
67
|
+
```svelte
|
|
68
|
+
<script lang="ts">
|
|
69
|
+
import { HeaderLayout } from '@ticatec/uniface-element/app-layout/HeaderLayout';
|
|
70
|
+
import { NavigatorMenu } from '@ticatec/uniface-element/NavigatorMenu';
|
|
71
|
+
import { Button } from '@ticatec/uniface-element/Button';
|
|
72
|
+
import Breadcrumbs from '@ticatec/uniface-element/Breadcrumbs';
|
|
73
|
+
|
|
74
|
+
let menuItems = [
|
|
75
|
+
{ id: 1, text: 'Dashboard', icon: 'dashboard' },
|
|
76
|
+
{ id: 2, text: 'Projects', icon: 'folder' },
|
|
77
|
+
{ id: 3, text: 'Team', icon: 'people' },
|
|
78
|
+
{ id: 4, text: 'Settings', icon: 'settings' }
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
let breadcrumbItems = [
|
|
82
|
+
{ text: 'Home', href: '#' },
|
|
83
|
+
{ text: 'Projects', href: '#' },
|
|
84
|
+
{ text: 'Current Project' }
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
let currentUser = { name: 'John Doe', role: 'Admin' };
|
|
88
|
+
</script>
|
|
89
|
+
|
|
90
|
+
<HeaderLayout
|
|
91
|
+
sidebarResize={true}
|
|
92
|
+
headerHeight="80px"
|
|
93
|
+
sidebarWidth="280px"
|
|
94
|
+
sidebarMaxWidth="400px"
|
|
95
|
+
sidebarMinWidth="200px"
|
|
96
|
+
>
|
|
97
|
+
<div slot="header" class="app-header">
|
|
98
|
+
<div class="header-brand">
|
|
99
|
+
<img src="/logo.png" alt="Logo" class="logo" />
|
|
100
|
+
<h1>Project Manager</h1>
|
|
101
|
+
</div>
|
|
102
|
+
|
|
103
|
+
<div class="header-nav">
|
|
104
|
+
<Breadcrumbs items={breadcrumbItems} />
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
<div class="header-user">
|
|
108
|
+
<span class="user-info">
|
|
109
|
+
{currentUser.name} ({currentUser.role})
|
|
110
|
+
</span>
|
|
111
|
+
<Button variant="outlined" size="small">Profile</Button>
|
|
112
|
+
<Button type="primary" size="small">Logout</Button>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
|
|
116
|
+
<div slot="sidebar" class="app-sidebar">
|
|
117
|
+
<NavigatorMenu items={menuItems} />
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
<main class="app-content">
|
|
121
|
+
<div class="content-header">
|
|
122
|
+
<h2>Welcome to Dashboard</h2>
|
|
123
|
+
<p>Manage your projects and team from here</p>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<div class="content-body">
|
|
127
|
+
<div class="stats-grid">
|
|
128
|
+
<div class="stat-card">
|
|
129
|
+
<h3>Active Projects</h3>
|
|
130
|
+
<div class="stat-value">12</div>
|
|
131
|
+
</div>
|
|
132
|
+
<div class="stat-card">
|
|
133
|
+
<h3>Team Members</h3>
|
|
134
|
+
<div class="stat-value">8</div>
|
|
135
|
+
</div>
|
|
136
|
+
<div class="stat-card">
|
|
137
|
+
<h3>Completed Tasks</h3>
|
|
138
|
+
<div class="stat-value">145</div>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
</main>
|
|
143
|
+
</HeaderLayout>
|
|
144
|
+
|
|
145
|
+
<style>
|
|
146
|
+
.app-header {
|
|
147
|
+
display: flex;
|
|
148
|
+
justify-content: space-between;
|
|
149
|
+
align-items: center;
|
|
150
|
+
padding: 0 20px;
|
|
151
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
152
|
+
color: white;
|
|
153
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.header-brand {
|
|
157
|
+
display: flex;
|
|
158
|
+
align-items: center;
|
|
159
|
+
gap: 15px;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.logo {
|
|
163
|
+
width: 40px;
|
|
164
|
+
height: 40px;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.header-nav {
|
|
168
|
+
flex: 1;
|
|
169
|
+
display: flex;
|
|
170
|
+
justify-content: center;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.header-user {
|
|
174
|
+
display: flex;
|
|
175
|
+
align-items: center;
|
|
176
|
+
gap: 15px;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.user-info {
|
|
180
|
+
font-size: 0.9em;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.app-sidebar {
|
|
184
|
+
background: #f8f9fa;
|
|
185
|
+
border-right: 1px solid #e9ecef;
|
|
186
|
+
padding: 20px 0;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.app-content {
|
|
190
|
+
padding: 30px;
|
|
191
|
+
background: #ffffff;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.content-header {
|
|
195
|
+
margin-bottom: 30px;
|
|
196
|
+
padding-bottom: 20px;
|
|
197
|
+
border-bottom: 1px solid #e9ecef;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.content-header h2 {
|
|
201
|
+
margin: 0 0 5px 0;
|
|
202
|
+
color: #2c3e50;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.content-header p {
|
|
206
|
+
margin: 0;
|
|
207
|
+
color: #6c757d;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.stats-grid {
|
|
211
|
+
display: grid;
|
|
212
|
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
213
|
+
gap: 20px;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.stat-card {
|
|
217
|
+
background: white;
|
|
218
|
+
padding: 20px;
|
|
219
|
+
border-radius: 8px;
|
|
220
|
+
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
221
|
+
text-align: center;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.stat-card h3 {
|
|
225
|
+
margin: 0 0 10px 0;
|
|
226
|
+
font-size: 0.9em;
|
|
227
|
+
color: #6c757d;
|
|
228
|
+
text-transform: uppercase;
|
|
229
|
+
letter-spacing: 1px;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.stat-value {
|
|
233
|
+
font-size: 2.5em;
|
|
234
|
+
font-weight: bold;
|
|
235
|
+
color: #2c3e50;
|
|
236
|
+
}
|
|
237
|
+
</style>
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Document Editor Layout
|
|
241
|
+
|
|
242
|
+
```svelte
|
|
243
|
+
<script lang="ts">
|
|
244
|
+
import { HeaderLayout } from '@ticatec/uniface-element/app-layout/HeaderLayout';
|
|
245
|
+
import { Button } from '@ticatec/uniface-element/Button';
|
|
246
|
+
import { IconButton } from '@ticatec/uniface-element/IconButton';
|
|
247
|
+
|
|
248
|
+
let documentTitle = 'Untitled Document';
|
|
249
|
+
let lastSaved = new Date().toLocaleTimeString();
|
|
250
|
+
let wordCount = 1247;
|
|
251
|
+
</script>
|
|
252
|
+
|
|
253
|
+
<HeaderLayout
|
|
254
|
+
sidebarResize={true}
|
|
255
|
+
headerHeight="70px"
|
|
256
|
+
sidebarWidth="250px"
|
|
257
|
+
sidebarMaxWidth="350px"
|
|
258
|
+
sidebarMinWidth="200px"
|
|
259
|
+
>
|
|
260
|
+
<div slot="header" class="editor-header">
|
|
261
|
+
<div class="header-left">
|
|
262
|
+
<IconButton icon="menu" title="File menu" />
|
|
263
|
+
<div class="document-info">
|
|
264
|
+
<input
|
|
265
|
+
bind:value={documentTitle}
|
|
266
|
+
class="document-title"
|
|
267
|
+
placeholder="Untitled Document"
|
|
268
|
+
/>
|
|
269
|
+
<small class="last-saved">Last saved: {lastSaved}</small>
|
|
270
|
+
</div>
|
|
271
|
+
</div>
|
|
272
|
+
|
|
273
|
+
<div class="header-center">
|
|
274
|
+
<div class="toolbar">
|
|
275
|
+
<IconButton icon="undo" title="Undo" />
|
|
276
|
+
<IconButton icon="redo" title="Redo" />
|
|
277
|
+
<div class="divider"></div>
|
|
278
|
+
<IconButton icon="format_bold" title="Bold" />
|
|
279
|
+
<IconButton icon="format_italic" title="Italic" />
|
|
280
|
+
<IconButton icon="format_underlined" title="Underline" />
|
|
281
|
+
</div>
|
|
282
|
+
</div>
|
|
283
|
+
|
|
284
|
+
<div class="header-right">
|
|
285
|
+
<Button variant="outlined" size="small">Share</Button>
|
|
286
|
+
<Button type="primary" size="small">Save</Button>
|
|
287
|
+
</div>
|
|
288
|
+
</div>
|
|
289
|
+
|
|
290
|
+
<div slot="sidebar" class="document-sidebar">
|
|
291
|
+
<div class="sidebar-section">
|
|
292
|
+
<h3>Document Outline</h3>
|
|
293
|
+
<ul class="outline-list">
|
|
294
|
+
<li><a href="#intro">Introduction</a></li>
|
|
295
|
+
<li><a href="#chapter1">Chapter 1</a></li>
|
|
296
|
+
<li><a href="#chapter2">Chapter 2</a></li>
|
|
297
|
+
<li><a href="#conclusion">Conclusion</a></li>
|
|
298
|
+
</ul>
|
|
299
|
+
</div>
|
|
300
|
+
|
|
301
|
+
<div class="sidebar-section">
|
|
302
|
+
<h3>Statistics</h3>
|
|
303
|
+
<div class="doc-stats">
|
|
304
|
+
<div class="stat-item">
|
|
305
|
+
<label>Words:</label>
|
|
306
|
+
<span>{wordCount}</span>
|
|
307
|
+
</div>
|
|
308
|
+
<div class="stat-item">
|
|
309
|
+
<label>Characters:</label>
|
|
310
|
+
<span>{wordCount * 5}</span>
|
|
311
|
+
</div>
|
|
312
|
+
<div class="stat-item">
|
|
313
|
+
<label>Pages:</label>
|
|
314
|
+
<span>{Math.ceil(wordCount / 250)}</span>
|
|
315
|
+
</div>
|
|
316
|
+
</div>
|
|
317
|
+
</div>
|
|
318
|
+
</div>
|
|
319
|
+
|
|
320
|
+
<div class="editor-content">
|
|
321
|
+
<div class="document-editor">
|
|
322
|
+
<div class="editor-paper">
|
|
323
|
+
<h1>Document Title</h1>
|
|
324
|
+
<p>Start writing your document here...</p>
|
|
325
|
+
<p>The editor content would go in this area. You can add any rich text editing component or simple textarea.</p>
|
|
326
|
+
</div>
|
|
327
|
+
</div>
|
|
328
|
+
</div>
|
|
329
|
+
</HeaderLayout>
|
|
330
|
+
|
|
331
|
+
<style>
|
|
332
|
+
.editor-header {
|
|
333
|
+
display: flex;
|
|
334
|
+
justify-content: space-between;
|
|
335
|
+
align-items: center;
|
|
336
|
+
padding: 0 15px;
|
|
337
|
+
background: white;
|
|
338
|
+
border-bottom: 1px solid #e0e0e0;
|
|
339
|
+
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.header-left {
|
|
343
|
+
display: flex;
|
|
344
|
+
align-items: center;
|
|
345
|
+
gap: 15px;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.document-info {
|
|
349
|
+
display: flex;
|
|
350
|
+
flex-direction: column;
|
|
351
|
+
gap: 2px;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
.document-title {
|
|
355
|
+
border: none;
|
|
356
|
+
font-size: 1.1em;
|
|
357
|
+
font-weight: 500;
|
|
358
|
+
padding: 2px 4px;
|
|
359
|
+
border-radius: 3px;
|
|
360
|
+
background: transparent;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
.document-title:focus {
|
|
364
|
+
background: #f5f5f5;
|
|
365
|
+
outline: none;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
.last-saved {
|
|
369
|
+
color: #666;
|
|
370
|
+
font-size: 0.8em;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.header-center {
|
|
374
|
+
flex: 1;
|
|
375
|
+
display: flex;
|
|
376
|
+
justify-content: center;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
.toolbar {
|
|
380
|
+
display: flex;
|
|
381
|
+
align-items: center;
|
|
382
|
+
gap: 5px;
|
|
383
|
+
background: #f8f9fa;
|
|
384
|
+
padding: 5px 10px;
|
|
385
|
+
border-radius: 6px;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
.divider {
|
|
389
|
+
width: 1px;
|
|
390
|
+
height: 20px;
|
|
391
|
+
background: #dee2e6;
|
|
392
|
+
margin: 0 5px;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.header-right {
|
|
396
|
+
display: flex;
|
|
397
|
+
gap: 10px;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
.document-sidebar {
|
|
401
|
+
background: #fafafa;
|
|
402
|
+
border-right: 1px solid #e0e0e0;
|
|
403
|
+
padding: 20px 0;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
.sidebar-section {
|
|
407
|
+
padding: 0 20px;
|
|
408
|
+
margin-bottom: 30px;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
.sidebar-section h3 {
|
|
412
|
+
margin: 0 0 15px 0;
|
|
413
|
+
font-size: 0.9em;
|
|
414
|
+
color: #495057;
|
|
415
|
+
text-transform: uppercase;
|
|
416
|
+
letter-spacing: 0.5px;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
.outline-list {
|
|
420
|
+
list-style: none;
|
|
421
|
+
padding: 0;
|
|
422
|
+
margin: 0;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
.outline-list li {
|
|
426
|
+
margin-bottom: 8px;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
.outline-list a {
|
|
430
|
+
text-decoration: none;
|
|
431
|
+
color: #6c757d;
|
|
432
|
+
padding: 4px 8px;
|
|
433
|
+
display: block;
|
|
434
|
+
border-radius: 4px;
|
|
435
|
+
transition: all 0.2s;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
.outline-list a:hover {
|
|
439
|
+
background: #e9ecef;
|
|
440
|
+
color: #495057;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
.doc-stats {
|
|
444
|
+
display: flex;
|
|
445
|
+
flex-direction: column;
|
|
446
|
+
gap: 8px;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
.stat-item {
|
|
450
|
+
display: flex;
|
|
451
|
+
justify-content: space-between;
|
|
452
|
+
align-items: center;
|
|
453
|
+
font-size: 0.9em;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
.stat-item label {
|
|
457
|
+
color: #6c757d;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
.stat-item span {
|
|
461
|
+
font-weight: 500;
|
|
462
|
+
color: #495057;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
.editor-content {
|
|
466
|
+
background: #f8f9fa;
|
|
467
|
+
padding: 20px;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
.document-editor {
|
|
471
|
+
max-width: 800px;
|
|
472
|
+
margin: 0 auto;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
.editor-paper {
|
|
476
|
+
background: white;
|
|
477
|
+
padding: 40px;
|
|
478
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
479
|
+
min-height: 600px;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
.editor-paper h1 {
|
|
483
|
+
margin-top: 0;
|
|
484
|
+
color: #2c3e50;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
.editor-paper p {
|
|
488
|
+
line-height: 1.6;
|
|
489
|
+
color: #495057;
|
|
490
|
+
}
|
|
491
|
+
</style>
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
## Best Practices
|
|
495
|
+
|
|
496
|
+
1. **Header Content**: Use the header for global navigation, branding, and user actions
|
|
497
|
+
2. **Layout Hierarchy**: Ensure clear visual hierarchy between header, sidebar, and main content
|
|
498
|
+
3. **Responsive Behavior**: Consider how the layout behaves on different screen sizes
|
|
499
|
+
4. **Performance**: Keep header content lightweight for consistent performance
|
|
500
|
+
5. **Accessibility**: Use semantic HTML and proper focus management
|
|
501
|
+
6. **Content Organization**: Use the sidebar for contextual navigation and tools
|
|
502
|
+
|
|
503
|
+
## Accessibility Considerations
|
|
504
|
+
|
|
505
|
+
- Use proper heading hierarchy (h1 in header, h2+ in content areas)
|
|
506
|
+
- Ensure keyboard navigation works across all layout sections
|
|
507
|
+
- Provide skip links for screen reader users
|
|
508
|
+
- Maintain proper focus management when sections are resized
|
|
509
|
+
- Use semantic HTML elements within slots (header, nav, main)
|
|
510
|
+
|
|
511
|
+
## Browser Support
|
|
512
|
+
|
|
513
|
+
- Modern browsers with CSS Grid and Flexbox support
|
|
514
|
+
- Resize functionality requires pointer events support
|
|
515
|
+
- Layout works in all browsers supporting CSS Grid
|
|
516
|
+
|
|
517
|
+
## Notes
|
|
518
|
+
|
|
519
|
+
- The component uses the Split component internally for sidebar resize functionality
|
|
520
|
+
- Header spans the full width and remains fixed at the top
|
|
521
|
+
- Sidebar is optional - the layout works with just header and main content
|
|
522
|
+
- You can specify minimum and maximum widths for the sidebar when resizing
|
|
523
|
+
- All dimensions can be specified in any valid CSS unit (px, %, rem, etc.)
|
|
524
|
+
- The layout automatically adapts to the provided slot content
|