@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.
Files changed (209) hide show
  1. package/README.md +320 -1
  2. package/README_CN.md +392 -0
  3. package/dist/accordion/Accordion.svelte +1 -1
  4. package/dist/action-bar/ActionBar.svelte +7 -1
  5. package/dist/attachment-files/FileRender.svelte +1 -1
  6. package/dist/attachment-files/FileUploadBar.svelte +7 -6
  7. package/dist/attachment-files/FileUploadPanel.svelte +2 -2
  8. package/dist/base-calendar/DateContext.js +5 -4
  9. package/dist/base-calendar/YearPickupPanel.svelte +4 -4
  10. package/dist/card/Card.svelte +1 -1
  11. package/dist/card/Card.svelte.d.ts +1 -1
  12. package/dist/cascade-options-select/CascadeOptionSelect.svelte +2 -3
  13. package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +46 -1
  14. package/dist/cascade-options-select/CascadePanel.svelte +1 -1
  15. package/dist/checkbox/CheckBox.svelte +1 -1
  16. package/dist/color-picker/ColorPicker.svelte +9 -9
  17. package/dist/color-picker/ColorPicker.svelte.d.ts +0 -2
  18. package/dist/color-picker/ColorPickerPanel.svelte +11 -15
  19. package/dist/color-picker/ColorPickerPanel.svelte.d.ts +1 -1
  20. package/dist/common/CommonPicker.svelte +2 -2
  21. package/dist/common/CommonPicker.svelte.d.ts +1 -1
  22. package/dist/common/MouseClickHandler.d.ts +1 -1
  23. package/dist/common/Popover.svelte +28 -6
  24. package/dist/common/Popover.svelte.d.ts +9 -3
  25. package/dist/common/uniface-utils.js +6 -4
  26. package/dist/common-editor/CommonEditor.svelte +1 -1
  27. package/dist/common-editor/CommonEditor.svelte.d.ts +1 -1
  28. package/dist/common-editor/NumberInput.svelte +1 -1
  29. package/dist/common-editor/NumberInput.svelte.d.ts +1 -1
  30. package/dist/concise-data-table/ConciseListTable.svelte +7 -2
  31. package/dist/concise-data-table/ConciseListTable.svelte.d.ts +1 -0
  32. package/dist/concise-data-table/DataRow.svelte +1 -1
  33. package/dist/concise-data-table/TableOptions.d.ts +1 -1
  34. package/dist/data-table/DataTable.svelte +1 -1
  35. package/dist/data-table/parts/ActionsPanel.svelte +4 -3
  36. package/dist/data-table/parts/ActionsRow.svelte +3 -3
  37. package/dist/data-table/parts/ContentPanel.svelte +3 -2
  38. package/dist/data-table/parts/FixedColumnsPanel.svelte +0 -1
  39. package/dist/data-table/parts/FixedColumnsPanel.svelte.d.ts +1 -2
  40. package/dist/data-table/parts/FixedHeaderPanel.svelte +2 -2
  41. package/dist/data-table/parts/FixedRow.svelte +2 -1
  42. package/dist/data-table/parts/FixedRow.svelte.d.ts +1 -1
  43. package/dist/data-table/parts/HrefCell.svelte +23 -2
  44. package/dist/data-table/parts/PopupMenu.svelte +25 -2
  45. package/dist/data-table/parts/PopupMenu.svelte.d.ts +8 -1
  46. package/dist/date-picker/DatePicker.svelte +0 -1
  47. package/dist/date-picker/DateTimePicker.svelte +3 -3
  48. package/dist/date-picker/ScrollBar.svelte +4 -7
  49. package/dist/date-range/DateRangeEditor.svelte +1 -1
  50. package/dist/dialog/CommonDialog.svelte +8 -5
  51. package/dist/dialog/CommonDialog.svelte.d.ts +2 -1
  52. package/dist/dialog/Dialog.svelte +37 -12
  53. package/dist/dialog/Dialog.svelte.d.ts +4 -3
  54. package/dist/dialog/DialogBoard.svelte +11 -8
  55. package/dist/dialog/DialogWrapper.svelte +10 -0
  56. package/dist/{common-editor/DateInput.svelte.d.ts → dialog/DialogWrapper.svelte.d.ts} +6 -13
  57. package/dist/dialog/Dialogs.js +1 -1
  58. package/dist/dialog/ModalResult.d.ts +5 -0
  59. package/dist/dialog/ModalResult.js +5 -0
  60. package/dist/drawer/Drawer.svelte +1 -1
  61. package/dist/form-field/FormField.svelte +2 -1
  62. package/dist/form-field/FormField.svelte.d.ts +1 -0
  63. package/dist/form-panel/flex-row-form/FormContainer.svelte +1 -1
  64. package/dist/form-panel/grid-form/EmptyCell.svelte +8 -7
  65. package/dist/form-panel/grid-form/EmptyCell.svelte.d.ts +2 -2
  66. package/dist/form-panel/grid-form/GridField.svelte +1 -1
  67. package/dist/i18nRes/i18nRes.d.ts +2 -0
  68. package/dist/i18nRes/i18nRes.js +44 -0
  69. package/dist/i18nRes/index.d.ts +2 -0
  70. package/dist/i18nRes/index.js +2 -0
  71. package/dist/image-files/ImageFilesField.svelte +1 -1
  72. package/dist/indicator/IndicatorBoard.svelte +1 -1
  73. package/dist/inline-cell-editor/InvalidEditor.svelte +1 -0
  74. package/dist/input-options-select/InputOptionsSelect.svelte +6 -6
  75. package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +1 -1
  76. package/dist/layout/flex/FlexBlock.svelte +1 -1
  77. package/dist/lookup-editor/LookupEditor.svelte +1 -1
  78. package/dist/memo-editor/MemoEditor.svelte +2 -2
  79. package/dist/message-box/IMessageBox.d.ts +2 -4
  80. package/dist/message-box/IMessageBox.js +4 -6
  81. package/dist/message-box/MessageBoxBoard.svelte +1 -3
  82. package/dist/options-multi-select/OptionsMultiSelect.svelte +1 -1
  83. package/dist/prompts-text-editor/PromptsTextEditor.svelte +2 -2
  84. package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +1 -1
  85. package/dist/property-editor/PropertyEditor.svelte +3 -3
  86. package/dist/text-editor/PasswordEditor.svelte +1 -1
  87. package/dist/transfer/Transfer.svelte +17 -12
  88. package/dist/transfer/Transfer.svelte.d.ts +0 -1
  89. package/dist/unit-number-editor/UnitNumberEditor.svelte +2 -2
  90. package/docs/buttons/cn/ActionBar.md +459 -0
  91. package/docs/buttons/cn/Button.md +228 -0
  92. package/docs/buttons/cn/IconButton.md +294 -0
  93. package/docs/buttons/cn/README.md +600 -0
  94. package/docs/buttons/cn/TextButton.md +163 -0
  95. package/docs/buttons/en/ActionBar.md +459 -0
  96. package/docs/buttons/en/Button.md +228 -0
  97. package/docs/buttons/en/IconButton.md +294 -0
  98. package/docs/buttons/en/README.md +600 -0
  99. package/docs/buttons/en/TextButton.md +163 -0
  100. package/docs/containers/cn/accordion.md +622 -0
  101. package/docs/containers/cn/box.md +445 -0
  102. package/docs/containers/cn/card.md +404 -0
  103. package/docs/containers/cn/page.md +576 -0
  104. package/docs/containers/cn/tabs.md +686 -0
  105. package/docs/containers/en/accordion.md +622 -0
  106. package/docs/containers/en/box.md +445 -0
  107. package/docs/containers/en/card.md +404 -0
  108. package/docs/containers/en/page.md +576 -0
  109. package/docs/containers/en/tabs.md +686 -0
  110. package/docs/data-display/cn/concise-data-table.md +731 -0
  111. package/docs/data-display/cn/listbox.md +786 -0
  112. package/docs/data-display/cn/treeview.md +863 -0
  113. package/docs/data-display/en/concise-data-table.md +732 -0
  114. package/docs/data-display/en/listbox.md +786 -0
  115. package/docs/data-display/en/treeview.md +863 -0
  116. package/docs/data-table/cn/README.md +596 -0
  117. package/docs/data-table/en/README.md +596 -0
  118. package/docs/dialog/cn/README.md +767 -0
  119. package/docs/dialog/en/README.md +767 -0
  120. package/docs/form/cn/README.md +847 -0
  121. package/docs/form/en/README.md +847 -0
  122. package/docs/form-components/cn/README.md +495 -0
  123. package/docs/form-components/cn/attachmentfilesfield.md +757 -0
  124. package/docs/form-components/cn/cascade-options-select.md +374 -0
  125. package/docs/form-components/cn/checkbox.md +58 -0
  126. package/docs/form-components/cn/date-picker.md +138 -0
  127. package/docs/form-components/cn/datetime-picker.md +228 -0
  128. package/docs/form-components/cn/group-checkbox.md +405 -0
  129. package/docs/form-components/cn/group-radiobox.md +525 -0
  130. package/docs/form-components/cn/imagefilesfield.md +651 -0
  131. package/docs/form-components/cn/input-options-select.md +250 -0
  132. package/docs/form-components/cn/lookup-editor.md +406 -0
  133. package/docs/form-components/cn/memoeditor.md +409 -0
  134. package/docs/form-components/cn/number-editor.md +261 -0
  135. package/docs/form-components/cn/options-multi-select.md +177 -0
  136. package/docs/form-components/cn/options-select.md +83 -0
  137. package/docs/form-components/cn/passwordeditor.md +538 -0
  138. package/docs/form-components/cn/prompts-text-editor.md +241 -0
  139. package/docs/form-components/cn/radiobutton.md +84 -0
  140. package/docs/form-components/cn/switch.md +178 -0
  141. package/docs/form-components/cn/text-editor.md +142 -0
  142. package/docs/form-components/cn/time-editor.md +159 -0
  143. package/docs/form-components/cn/unit-number-editor.md +164 -0
  144. package/docs/form-components/en/README.md +463 -0
  145. package/docs/form-components/en/attachmentfilesfield.md +757 -0
  146. package/docs/form-components/en/cascade-options-select.md +358 -0
  147. package/docs/form-components/en/checkbox.md +59 -0
  148. package/docs/form-components/en/date-picker.md +138 -0
  149. package/docs/form-components/en/datetime-picker.md +228 -0
  150. package/docs/form-components/en/group-checkbox.md +395 -0
  151. package/docs/form-components/en/group-radiobox.md +498 -0
  152. package/docs/form-components/en/imagefilesfield.md +651 -0
  153. package/docs/form-components/en/input-options-select.md +239 -0
  154. package/docs/form-components/en/lookup-editor.md +389 -0
  155. package/docs/form-components/en/memoeditor.md +409 -0
  156. package/docs/form-components/en/number-editor.md +249 -0
  157. package/docs/form-components/en/options-multi-select.md +177 -0
  158. package/docs/form-components/en/options-select.md +83 -0
  159. package/docs/form-components/en/passwordeditor.md +538 -0
  160. package/docs/form-components/en/prompts-text-editor.md +241 -0
  161. package/docs/form-components/en/radiobutton.md +84 -0
  162. package/docs/form-components/en/switch.md +180 -0
  163. package/docs/form-components/en/text-editor.md +142 -0
  164. package/docs/form-components/en/time-editor.md +159 -0
  165. package/docs/form-components/en/unit-number-editor.md +164 -0
  166. package/docs/form-layout/cn/criteria-field.md +652 -0
  167. package/docs/form-layout/cn/flex-form.md +454 -0
  168. package/docs/form-layout/cn/flex-row-form.md +542 -0
  169. package/docs/form-layout/cn/form-field.md +923 -0
  170. package/docs/form-layout/cn/grid-form.md +676 -0
  171. package/docs/form-layout/en/criteria-field.md +652 -0
  172. package/docs/form-layout/en/flex-form.md +454 -0
  173. package/docs/form-layout/en/flex-row-form.md +542 -0
  174. package/docs/form-layout/en/form-field.md +923 -0
  175. package/docs/form-layout/en/grid-form.md +676 -0
  176. package/docs/global/cn/README.md +534 -0
  177. package/docs/global/en/README.md +534 -0
  178. package/docs/layout/cn/classiclayout.md +460 -0
  179. package/docs/layout/cn/headerlayout.md +524 -0
  180. package/docs/layout/cn/sidebarlayout.md +263 -0
  181. package/docs/layout/en/classiclayout.md +951 -0
  182. package/docs/layout/en/headerlayout.md +524 -0
  183. package/docs/layout/en/sidebarlayout.md +262 -0
  184. package/docs/misc/cn/README.md +1217 -0
  185. package/docs/misc/en/README.md +1217 -0
  186. package/docs/navigation/cn/breadcrumb.md +291 -0
  187. package/docs/navigation/cn/navigator.md +322 -0
  188. package/docs/navigation/cn/navigatormenu.md +512 -0
  189. package/docs/navigation/cn/progressbar.md +199 -0
  190. package/docs/navigation/cn/progressstepbar.md +299 -0
  191. package/docs/navigation/en/breadcrumb.md +291 -0
  192. package/docs/navigation/en/navigator.md +322 -0
  193. package/docs/navigation/en/navigatormenu.md +512 -0
  194. package/docs/navigation/en/progressbar.md +199 -0
  195. package/docs/navigation/en/progressstepbar.md +299 -0
  196. package/docs/search-filters/cn/daterange.md +1156 -0
  197. package/docs/search-filters/cn/numberrange.md +688 -0
  198. package/docs/search-filters/cn/searchbox.md +1582 -0
  199. package/docs/search-filters/en/daterange.md +1156 -0
  200. package/docs/search-filters/en/numberrange.md +688 -0
  201. package/docs/search-filters/en/searchbox.md +1582 -0
  202. package/package.json +53 -13
  203. package/dist/common-editor/DateInput.svelte +0 -27
  204. package/dist/i18n_resources/index.d.ts +0 -3
  205. package/dist/i18n_resources/index.js +0 -3
  206. /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.d.ts +0 -0
  207. /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.js +0 -0
  208. /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.d.ts +0 -0
  209. /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
+ &lt;script lang="ts"&gt;
222
+ import &#123; Button &#125; from '@ticatec/uniface-element/Button';
223
+
224
+ let count = 0;
225
+
226
+ const increment = () => &#123;
227
+ count += 1;
228
+ &#125;;
229
+ &lt;/script&gt;
230
+
231
+ &lt;div class="app"&gt;
232
+ &lt;h1&gt;Welcome to Svelte&lt;/h1&gt;
233
+ &lt;Button on:click=&#123;increment&#125;&gt;
234
+ Count: &#123;count&#125;
235
+ &lt;/Button&gt;
236
+ &lt;/div&gt;
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