@ticatec/topside-elements 1.1.0 → 1.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/CHANGELOG.md +16 -0
- package/dist/app_layout/ClassicLayout.svelte +22 -11
- package/dist/app_layout/ClassicLayout.svelte.d.ts +6 -0
- package/dist/app_layout/ColumnsLayout.svelte +7 -4
- package/dist/app_layout/ColumnsLayout.svelte.d.ts +2 -0
- package/dist/app_layout/HeaderLayout.svelte +11 -2
- package/dist/app_layout/HeaderLayout.svelte.d.ts +4 -0
- package/dist/app_layout/README.md +23 -1
- package/dist/app_layout/README_CN.md +23 -1
- package/dist/app_layout/RowsLayout.svelte +7 -4
- package/dist/app_layout/RowsLayout.svelte.d.ts +2 -0
- package/dist/app_layout/SidebarLayout.svelte +11 -2
- package/dist/app_layout/SidebarLayout.svelte.d.ts +4 -0
- package/dist/data_display/list_box/ListBox.svelte +14 -4
- package/dist/data_display/list_box/ListBox.svelte.d.ts +6 -3
- package/dist/data_display/list_box/README.md +25 -3
- package/dist/data_display/list_box/README_CN.md +25 -3
- package/docs/NAMING.md +1 -1
- package/docs/NAMING_CN.md +1 -1
- package/docs/components/README.md +5 -5
- package/docs/components/classic-layout/README.md +3 -0
- package/docs/components/columns-layout/README.md +1 -0
- package/docs/components/header-layout/README.md +2 -0
- package/docs/components/list-box/README.md +18 -0
- package/docs/components/rows-layout/README.md +1 -0
- package/docs/components/sidebar-layout/README.md +2 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.2.1
|
|
4
|
+
|
|
5
|
+
### 新增
|
|
6
|
+
- **ListBox 列表内置首尾项(`contentHeader` / `contentFooter` Snippet)**:在 `.listbox-content` 滚动容器内部的最上部与最下部分别新增 `contentHeader` 与 `contentFooter` 插槽。与外部固定不滚动的 `header` / `footer` 不同,这两个插槽的内容位于滚动视口内,跟随列表项一起滚动,适合呈现“全部/快捷选项”、“底部新增”或说明信息。
|
|
7
|
+
|
|
8
|
+
## 1.2.0
|
|
9
|
+
|
|
10
|
+
### 新增
|
|
11
|
+
- **应用布局分割线**:SidebarLayout / HeaderLayout / ClassicLayout / ColumnsLayout / RowsLayout 新增 `divider`(默认 `true`),面板之间显示分割线;与 `*Resize`(能否拖动)相互独立——不可拖动时为固定线,可拖动但 `divider=false` 时线条为 0px、悬停 / 拖动时仅显示把手。SidebarLayout / HeaderLayout / ClassicLayout 新增 `headerDivider`,ClassicLayout 新增 `bottomDivider`(默认 `false`)。
|
|
12
|
+
|
|
13
|
+
### 行为变化
|
|
14
|
+
- 布局默认会显示面板之间的 1px 分割线(此前只有开启 `*Resize` 时才有)。自己用 border 画过分割线的页面会出现双线,去掉 border 或设 `divider={false}`。
|
|
15
|
+
|
|
16
|
+
### 修复
|
|
17
|
+
- ClassicLayout:`sidebarResize` 为真但没有 `sidebar` snippet 时不再渲染多余的分割线。
|
|
18
|
+
|
|
3
19
|
## 1.1.0
|
|
4
20
|
|
|
5
21
|
### 新增
|
|
@@ -13,6 +13,12 @@
|
|
|
13
13
|
rightBarResize?: boolean;
|
|
14
14
|
rightBarMaxWidth?: string | null;
|
|
15
15
|
rightBarMinWidth?: string | null;
|
|
16
|
+
/** 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 */
|
|
17
|
+
divider?: boolean;
|
|
18
|
+
/** 头部与内容之间显示横向分割线,默认 false */
|
|
19
|
+
headerDivider?: boolean;
|
|
20
|
+
/** 内容与底部状态栏之间显示横向分割线,默认 false */
|
|
21
|
+
bottomDivider?: boolean;
|
|
16
22
|
header?: Snippet;
|
|
17
23
|
sidebar?: Snippet;
|
|
18
24
|
children?: Snippet;
|
|
@@ -31,6 +37,9 @@
|
|
|
31
37
|
rightBarResize = false,
|
|
32
38
|
rightBarMaxWidth = null,
|
|
33
39
|
rightBarMinWidth = null,
|
|
40
|
+
divider = true,
|
|
41
|
+
headerDivider = false,
|
|
42
|
+
bottomDivider = false,
|
|
34
43
|
header,
|
|
35
44
|
sidebar,
|
|
36
45
|
children,
|
|
@@ -51,17 +60,18 @@
|
|
|
51
60
|
<div class="header-area" style="height: {headerHeight}">
|
|
52
61
|
{@render header()}
|
|
53
62
|
</div>
|
|
63
|
+
{#if headerDivider}
|
|
64
|
+
<Split direction="horizontal"/>
|
|
65
|
+
{/if}
|
|
54
66
|
{/if}
|
|
55
67
|
<div class="middle-area">
|
|
56
68
|
{#if sidebar}
|
|
57
69
|
<div bind:this={sidebarPanel} class="sidebar" style="width: {sidebarWidth}; {maxWidth} {minWidth}">
|
|
58
|
-
{
|
|
59
|
-
{@render sidebar()}
|
|
60
|
-
{/if}
|
|
70
|
+
{@render sidebar()}
|
|
61
71
|
</div>
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
72
|
+
{#if sidebarResize || divider}
|
|
73
|
+
<Split direction="vertical" bindingPanel={sidebarResize ? sidebarPanel : undefined} width={divider ? undefined : 0}/>
|
|
74
|
+
{/if}
|
|
65
75
|
{/if}
|
|
66
76
|
<div class="content-area">
|
|
67
77
|
{#if children}
|
|
@@ -69,17 +79,18 @@
|
|
|
69
79
|
{/if}
|
|
70
80
|
</div>
|
|
71
81
|
{#if rightSidebar}
|
|
72
|
-
{#if rightBarResize}
|
|
73
|
-
<Split direction="vertical" bindingPanel={rightBarPanel} reverse/>
|
|
82
|
+
{#if rightBarResize || divider}
|
|
83
|
+
<Split direction="vertical" bindingPanel={rightBarResize ? rightBarPanel : undefined} width={divider ? undefined : 0} reverse/>
|
|
74
84
|
{/if}
|
|
75
85
|
<div bind:this={rightBarPanel} class="right-sidebar" style="width: {rightBarWidth}; {rightMinWidth} {rightMaxWidth}">
|
|
76
|
-
{
|
|
77
|
-
{@render rightSidebar()}
|
|
78
|
-
{/if}
|
|
86
|
+
{@render rightSidebar()}
|
|
79
87
|
</div>
|
|
80
88
|
{/if}
|
|
81
89
|
</div>
|
|
82
90
|
{#if bottom}
|
|
91
|
+
{#if bottomDivider}
|
|
92
|
+
<Split direction="horizontal"/>
|
|
93
|
+
{/if}
|
|
83
94
|
<div class="bottom-area" style="height: {statusHeight}">
|
|
84
95
|
{@render bottom()}
|
|
85
96
|
</div>
|
|
@@ -10,6 +10,12 @@ interface Props {
|
|
|
10
10
|
rightBarResize?: boolean;
|
|
11
11
|
rightBarMaxWidth?: string | null;
|
|
12
12
|
rightBarMinWidth?: string | null;
|
|
13
|
+
/** 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 */
|
|
14
|
+
divider?: boolean;
|
|
15
|
+
/** 头部与内容之间显示横向分割线,默认 false */
|
|
16
|
+
headerDivider?: boolean;
|
|
17
|
+
/** 内容与底部状态栏之间显示横向分割线,默认 false */
|
|
18
|
+
bottomDivider?: boolean;
|
|
13
19
|
header?: Snippet;
|
|
14
20
|
sidebar?: Snippet;
|
|
15
21
|
children?: Snippet;
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
rightMaxWidth?: string | null;
|
|
18
18
|
leftResize?: boolean;
|
|
19
19
|
rightResize?: boolean;
|
|
20
|
+
/** 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 */
|
|
21
|
+
divider?: boolean;
|
|
20
22
|
left?: Snippet;
|
|
21
23
|
children?: Snippet;
|
|
22
24
|
right?: Snippet;
|
|
@@ -33,6 +35,7 @@
|
|
|
33
35
|
rightMaxWidth = null,
|
|
34
36
|
leftResize = false,
|
|
35
37
|
rightResize = false,
|
|
38
|
+
divider = true,
|
|
36
39
|
left,
|
|
37
40
|
children,
|
|
38
41
|
right
|
|
@@ -57,8 +60,8 @@
|
|
|
57
60
|
{@render left()}
|
|
58
61
|
{/if}
|
|
59
62
|
</div>
|
|
60
|
-
{#if leftResize}
|
|
61
|
-
<Split bindingPanel={leftPanel}/>
|
|
63
|
+
{#if leftResize || divider}
|
|
64
|
+
<Split bindingPanel={leftResize ? leftPanel : undefined} width={divider ? undefined : 0}/>
|
|
62
65
|
{/if}
|
|
63
66
|
<div class="center-panel">
|
|
64
67
|
{#if children}
|
|
@@ -66,8 +69,8 @@
|
|
|
66
69
|
{/if}
|
|
67
70
|
</div>
|
|
68
71
|
{#if right}
|
|
69
|
-
{#if rightResize}
|
|
70
|
-
<Split bindingPanel={rightPanel} reverse/>
|
|
72
|
+
{#if rightResize || divider}
|
|
73
|
+
<Split bindingPanel={rightResize ? rightPanel : undefined} width={divider ? undefined : 0} reverse/>
|
|
71
74
|
{/if}
|
|
72
75
|
<div bind:this={rightPanel} class="right-panel" style={rightStyle}>
|
|
73
76
|
{@render right()}
|
|
@@ -14,6 +14,8 @@ interface Props {
|
|
|
14
14
|
rightMaxWidth?: string | null;
|
|
15
15
|
leftResize?: boolean;
|
|
16
16
|
rightResize?: boolean;
|
|
17
|
+
/** 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 */
|
|
18
|
+
divider?: boolean;
|
|
17
19
|
left?: Snippet;
|
|
18
20
|
children?: Snippet;
|
|
19
21
|
right?: Snippet;
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
sidebarResize?: boolean;
|
|
9
9
|
sidebarMaxWidth?: string | null;
|
|
10
10
|
sidebarMinWidth?: string | null;
|
|
11
|
+
/** 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 */
|
|
12
|
+
divider?: boolean;
|
|
13
|
+
/** 头部与内容之间显示横向分割线,默认 false */
|
|
14
|
+
headerDivider?: boolean;
|
|
11
15
|
header?: Snippet;
|
|
12
16
|
sidebar?: Snippet;
|
|
13
17
|
children?: Snippet;
|
|
@@ -19,6 +23,8 @@
|
|
|
19
23
|
sidebarResize = false,
|
|
20
24
|
sidebarMaxWidth = null,
|
|
21
25
|
sidebarMinWidth = null,
|
|
26
|
+
divider = true,
|
|
27
|
+
headerDivider = false,
|
|
22
28
|
header,
|
|
23
29
|
sidebar,
|
|
24
30
|
children
|
|
@@ -34,6 +40,9 @@
|
|
|
34
40
|
<div class="header-area" style="height: {headerHeight}">
|
|
35
41
|
{@render header()}
|
|
36
42
|
</div>
|
|
43
|
+
{#if headerDivider}
|
|
44
|
+
<Split direction="horizontal"/>
|
|
45
|
+
{/if}
|
|
37
46
|
{/if}
|
|
38
47
|
<div class="content-wrapper">
|
|
39
48
|
{#if sidebar}
|
|
@@ -42,8 +51,8 @@
|
|
|
42
51
|
{@render sidebar()}
|
|
43
52
|
{/if}
|
|
44
53
|
</div>
|
|
45
|
-
{#if sidebarResize}
|
|
46
|
-
<Split direction="vertical" bindingPanel={sidebarPanel}/>
|
|
54
|
+
{#if sidebarResize || divider}
|
|
55
|
+
<Split direction="vertical" bindingPanel={sidebarResize ? sidebarPanel : undefined} width={divider ? undefined : 0}/>
|
|
47
56
|
{/if}
|
|
48
57
|
{/if}
|
|
49
58
|
<div class="main-content">
|
|
@@ -5,6 +5,10 @@ interface Props {
|
|
|
5
5
|
sidebarResize?: boolean;
|
|
6
6
|
sidebarMaxWidth?: string | null;
|
|
7
7
|
sidebarMinWidth?: string | null;
|
|
8
|
+
/** 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 */
|
|
9
|
+
divider?: boolean;
|
|
10
|
+
/** 头部与内容之间显示横向分割线,默认 false */
|
|
11
|
+
headerDivider?: boolean;
|
|
8
12
|
header?: Snippet;
|
|
9
13
|
sidebar?: Snippet;
|
|
10
14
|
children?: Snippet;
|
|
@@ -38,7 +38,7 @@ npm install @ticatec/topside-elements
|
|
|
38
38
|
| **ColumnsLayout** | Left + center + right horizontal panels |
|
|
39
39
|
| **RowsLayout** | Top + center + bottom vertical panels |
|
|
40
40
|
|
|
41
|
-
All layouts accept `*Resize`
|
|
41
|
+
All layouts accept `*Resize` (draggable), `divider` (show line) and min/max constraints; panels without a corresponding snippet are not rendered.
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
@@ -51,6 +51,8 @@ Optional resizable sidebar on the left, plus a header area and content area stac
|
|
|
51
51
|
| Prop | Type | Default | Description |
|
|
52
52
|
|------|------|---------|-------------|
|
|
53
53
|
| `sidebarResize` | `boolean` | `false` | Enable sidebar resizing |
|
|
54
|
+
| `divider` | `boolean` | `true` | Show a divider line between panels; independent of `*Resize` |
|
|
55
|
+
| `headerDivider` | `boolean` | `false` | Show a horizontal line between header and content |
|
|
54
56
|
| `headerHeight` | `string` | `'48px'` | Height of the header area |
|
|
55
57
|
| `sidebarWidth` | `string` | `'300px'` | Initial width of the sidebar |
|
|
56
58
|
| `sidebarMaxWidth` | `string \| null` | `null` | Maximum sidebar width (only when `sidebarResize`) |
|
|
@@ -99,6 +101,8 @@ Header on top, with a sidebar + content area below the header.
|
|
|
99
101
|
| `headerHeight` | `string` | `'48px'` | Height of the header |
|
|
100
102
|
| `sidebarWidth` | `string` | `'300px'` | Width of the sidebar |
|
|
101
103
|
| `sidebarResize` | `boolean` | `false` | Enable sidebar resizing |
|
|
104
|
+
| `divider` | `boolean` | `true` | Show a divider line between panels; independent of `*Resize` |
|
|
105
|
+
| `headerDivider` | `boolean` | `false` | Show a horizontal line between header and content |
|
|
102
106
|
| `sidebarMaxWidth` | `string \| null` | `null` | Maximum sidebar width (only when `sidebarResize`) |
|
|
103
107
|
| `sidebarMinWidth` | `string \| null` | `null` | Minimum sidebar width (only when `sidebarResize`) |
|
|
104
108
|
|
|
@@ -145,6 +149,9 @@ Traditional desktop application layout: header, left sidebar, content area, opti
|
|
|
145
149
|
| `sidebarMaxWidth` | `string \| null` | `null` | Maximum left sidebar width (only when `sidebarResize`) |
|
|
146
150
|
| `sidebarMinWidth` | `string \| null` | `null` | Minimum left sidebar width (only when `sidebarResize`) |
|
|
147
151
|
| `rightBarResize` | `boolean` | `false` | Enable right sidebar resizing |
|
|
152
|
+
| `divider` | `boolean` | `true` | Show a divider line between panels; independent of `*Resize` |
|
|
153
|
+
| `headerDivider` | `boolean` | `false` | Show a horizontal line between header and content |
|
|
154
|
+
| `bottomDivider` | `boolean` | `false` | Show a horizontal line between content and status bar |
|
|
148
155
|
| `rightBarMaxWidth` | `string \| null` | `null` | Maximum right sidebar width (only when `rightBarResize`) |
|
|
149
156
|
| `rightBarMinWidth` | `string \| null` | `null` | Minimum right sidebar width (only when `rightBarResize`) |
|
|
150
157
|
|
|
@@ -207,6 +214,7 @@ Three-column horizontal layout: left + center + right. Center fills remaining sp
|
|
|
207
214
|
| `rightMaxWidth` | `string \| null` | `null` | Right column max-width |
|
|
208
215
|
| `leftResize` | `boolean` | `false` | Enable left column resizing |
|
|
209
216
|
| `rightResize` | `boolean` | `false` | Enable right column resizing |
|
|
217
|
+
| `divider` | `boolean` | `true` | Show a divider line between panels; independent of `*Resize` |
|
|
210
218
|
|
|
211
219
|
### Snippets
|
|
212
220
|
|
|
@@ -260,6 +268,7 @@ Three-row vertical layout: top + center + bottom. Center fills remaining space;
|
|
|
260
268
|
| `bottomMaxHeight` | `string \| null` | `null` | Bottom row max-height |
|
|
261
269
|
| `topResize` | `boolean` | `false` | Enable top row resizing |
|
|
262
270
|
| `bottomResize` | `boolean` | `false` | Enable bottom row resizing |
|
|
271
|
+
| `divider` | `boolean` | `true` | Show a divider line between panels; independent of `*Resize` |
|
|
263
272
|
|
|
264
273
|
### Snippets
|
|
265
274
|
|
|
@@ -295,6 +304,19 @@ Three-row vertical layout: top + center + bottom. Center fills remaining space;
|
|
|
295
304
|
|
|
296
305
|
---
|
|
297
306
|
|
|
307
|
+
## Dividers
|
|
308
|
+
|
|
309
|
+
Lines between panels are rendered by [Split](../general/split/README.md). `divider` and `*Resize` are independent switches:
|
|
310
|
+
|
|
311
|
+
| `*Resize` | `divider` | Result |
|
|
312
|
+
|---|---|---|
|
|
313
|
+
| `false` | `true` (default) | Fixed 1px line, not draggable |
|
|
314
|
+
| `true` | `true` | 1px line; a handle appears on hover; draggable |
|
|
315
|
+
| `true` | `false` | No visible line (0px), still draggable near the edge; handle on hover / drag |
|
|
316
|
+
| `false` | `false` | No divider |
|
|
317
|
+
|
|
318
|
+
SidebarLayout / HeaderLayout / ClassicLayout also have `headerDivider` (line below the header), and ClassicLayout has `bottomDivider` (line above the status bar); both default to off, since headers and status bars usually have their own background or border. Line color comes from `--topside-dividing-line-color`.
|
|
319
|
+
|
|
298
320
|
## Resizable Panels
|
|
299
321
|
|
|
300
322
|
When `*Resize` is enabled, a split handle is rendered between the panel and the center area:
|
|
@@ -38,7 +38,7 @@ npm install @ticatec/topside-elements
|
|
|
38
38
|
| **ColumnsLayout** | 左 + 中 + 右 三列水平布局 |
|
|
39
39
|
| **RowsLayout** | 上 + 中 + 下 三行垂直布局 |
|
|
40
40
|
|
|
41
|
-
所有布局都支持 `*Resize
|
|
41
|
+
所有布局都支持 `*Resize`(能否拖动)、`divider`(是否显示分割线)和 min/max 约束;未提供对应 snippet 的面板不会被渲染。
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
@@ -51,6 +51,8 @@ npm install @ticatec/topside-elements
|
|
|
51
51
|
| 属性 | 类型 | 默认值 | 描述 |
|
|
52
52
|
|------|------|---------|-------------|
|
|
53
53
|
| `sidebarResize` | `boolean` | `false` | 启用侧边栏调整大小 |
|
|
54
|
+
| `divider` | `boolean` | `true` | 面板之间是否显示分割线;与 `*Resize` 独立 |
|
|
55
|
+
| `headerDivider` | `boolean` | `false` | 顶栏与内容之间显示横向分割线 |
|
|
54
56
|
| `headerHeight` | `string` | `"48px"` | 标题区域高度 |
|
|
55
57
|
| `sidebarWidth` | `string` | `"300px"` | 侧边栏初始宽度 |
|
|
56
58
|
| `sidebarMaxWidth` | `string \| null` | `null` | 侧边栏最大宽度(仅当 `sidebarResize` 为真时生效) |
|
|
@@ -99,6 +101,8 @@ npm install @ticatec/topside-elements
|
|
|
99
101
|
| `headerHeight` | `string` | `"48px"` | 标题栏高度 |
|
|
100
102
|
| `sidebarWidth` | `string` | `"300px"` | 侧边栏宽度 |
|
|
101
103
|
| `sidebarResize` | `boolean` | `false` | 启用侧边栏调整大小 |
|
|
104
|
+
| `divider` | `boolean` | `true` | 面板之间是否显示分割线;与 `*Resize` 独立 |
|
|
105
|
+
| `headerDivider` | `boolean` | `false` | 顶栏与内容之间显示横向分割线 |
|
|
102
106
|
| `sidebarMaxWidth` | `string \| null` | `null` | 侧边栏最大宽度(仅当 `sidebarResize` 为真时生效) |
|
|
103
107
|
| `sidebarMinWidth` | `string \| null` | `null` | 侧边栏最小宽度(仅当 `sidebarResize` 为真时生效) |
|
|
104
108
|
|
|
@@ -145,6 +149,9 @@ npm install @ticatec/topside-elements
|
|
|
145
149
|
| `sidebarMaxWidth` | `string \| null` | `null` | 左侧边栏最大宽度(仅当 `sidebarResize` 为真时生效) |
|
|
146
150
|
| `sidebarMinWidth` | `string \| null` | `null` | 左侧边栏最小宽度(仅当 `sidebarResize` 为真时生效) |
|
|
147
151
|
| `rightBarResize` | `boolean` | `false` | 启用右侧边栏调整大小 |
|
|
152
|
+
| `divider` | `boolean` | `true` | 面板之间是否显示分割线;与 `*Resize` 独立 |
|
|
153
|
+
| `headerDivider` | `boolean` | `false` | 顶栏与内容之间显示横向分割线 |
|
|
154
|
+
| `bottomDivider` | `boolean` | `false` | 内容与状态栏之间显示横向分割线 |
|
|
148
155
|
| `rightBarMaxWidth` | `string \| null` | `null` | 右侧边栏最大宽度(仅当 `rightBarResize` 为真时生效) |
|
|
149
156
|
| `rightBarMinWidth` | `string \| null` | `null` | 右侧边栏最小宽度(仅当 `rightBarResize` 为真时生效) |
|
|
150
157
|
|
|
@@ -207,6 +214,7 @@ npm install @ticatec/topside-elements
|
|
|
207
214
|
| `rightMaxWidth` | `string \| null` | `null` | 右列最大宽度 |
|
|
208
215
|
| `leftResize` | `boolean` | `false` | 启用左列调整大小 |
|
|
209
216
|
| `rightResize` | `boolean` | `false` | 启用右列调整大小 |
|
|
217
|
+
| `divider` | `boolean` | `true` | 面板之间是否显示分割线;与 `*Resize` 独立 |
|
|
210
218
|
|
|
211
219
|
### Snippets
|
|
212
220
|
|
|
@@ -260,6 +268,7 @@ npm install @ticatec/topside-elements
|
|
|
260
268
|
| `bottomMaxHeight` | `string \| null` | `null` | 底部行最大高度 |
|
|
261
269
|
| `topResize` | `boolean` | `false` | 启用顶部行调整大小 |
|
|
262
270
|
| `bottomResize` | `boolean` | `false` | 启用底部行调整大小 |
|
|
271
|
+
| `divider` | `boolean` | `true` | 面板之间是否显示分割线;与 `*Resize` 独立 |
|
|
263
272
|
|
|
264
273
|
### Snippets
|
|
265
274
|
|
|
@@ -295,6 +304,19 @@ npm install @ticatec/topside-elements
|
|
|
295
304
|
|
|
296
305
|
---
|
|
297
306
|
|
|
307
|
+
## 分割线
|
|
308
|
+
|
|
309
|
+
面板之间的分割线由 [Split](../general/split/README_CN.md) 渲染,`divider` 与 `*Resize` 是两个独立的开关:
|
|
310
|
+
|
|
311
|
+
| `*Resize` | `divider` | 效果 |
|
|
312
|
+
|---|---|---|
|
|
313
|
+
| `false` | `true`(默认) | 固定的 1px 分割线,不可拖动 |
|
|
314
|
+
| `true` | `true` | 1px 分割线,悬停时中间出现把手,可拖动 |
|
|
315
|
+
| `true` | `false` | 不显示线(0px),靠近边界仍可拖动,悬停 / 拖动时出现把手 |
|
|
316
|
+
| `false` | `false` | 无分割线 |
|
|
317
|
+
|
|
318
|
+
SidebarLayout / HeaderLayout / ClassicLayout 另有 `headerDivider`(顶栏下方横线),ClassicLayout 还有 `bottomDivider`(状态栏上方横线),默认都关闭——顶栏和状态栏通常自带底色或边框。线条颜色由 `--topside-dividing-line-color` 控制。
|
|
319
|
+
|
|
298
320
|
## 可调整面板
|
|
299
321
|
|
|
300
322
|
当 `*Resize` 启用时,面板与中央区域之间会渲染一个拖动手柄:
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
bottomMaxHeight?: string | null;
|
|
18
18
|
topResize?: boolean;
|
|
19
19
|
bottomResize?: boolean;
|
|
20
|
+
/** 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 */
|
|
21
|
+
divider?: boolean;
|
|
20
22
|
top?: Snippet;
|
|
21
23
|
children?: Snippet;
|
|
22
24
|
bottom?: Snippet;
|
|
@@ -33,6 +35,7 @@
|
|
|
33
35
|
bottomMaxHeight = null,
|
|
34
36
|
topResize = false,
|
|
35
37
|
bottomResize = false,
|
|
38
|
+
divider = true,
|
|
36
39
|
top,
|
|
37
40
|
children,
|
|
38
41
|
bottom
|
|
@@ -57,8 +60,8 @@
|
|
|
57
60
|
{@render top()}
|
|
58
61
|
{/if}
|
|
59
62
|
</div>
|
|
60
|
-
{#if topResize}
|
|
61
|
-
<Split bindingPanel={topPanel} direction="horizontal"/>
|
|
63
|
+
{#if topResize || divider}
|
|
64
|
+
<Split bindingPanel={topResize ? topPanel : undefined} width={divider ? undefined : 0} direction="horizontal"/>
|
|
62
65
|
{/if}
|
|
63
66
|
<div class="center-panel">
|
|
64
67
|
{#if children}
|
|
@@ -66,8 +69,8 @@
|
|
|
66
69
|
{/if}
|
|
67
70
|
</div>
|
|
68
71
|
{#if bottom}
|
|
69
|
-
{#if bottomResize}
|
|
70
|
-
<Split bindingPanel={bottomPanel} reverse direction="horizontal"/>
|
|
72
|
+
{#if bottomResize || divider}
|
|
73
|
+
<Split bindingPanel={bottomResize ? bottomPanel : undefined} width={divider ? undefined : 0} reverse direction="horizontal"/>
|
|
71
74
|
{/if}
|
|
72
75
|
<div bind:this={bottomPanel} class="bottom-panel" style={bottomStyle}>
|
|
73
76
|
{@render bottom()}
|
|
@@ -14,6 +14,8 @@ interface Props {
|
|
|
14
14
|
bottomMaxHeight?: string | null;
|
|
15
15
|
topResize?: boolean;
|
|
16
16
|
bottomResize?: boolean;
|
|
17
|
+
/** 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 */
|
|
18
|
+
divider?: boolean;
|
|
17
19
|
top?: Snippet;
|
|
18
20
|
children?: Snippet;
|
|
19
21
|
bottom?: Snippet;
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
sidebarWidth?: string;
|
|
9
9
|
sidebarMaxWidth?: string | null;
|
|
10
10
|
sidebarMinWidth?: string | null;
|
|
11
|
+
/** 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 */
|
|
12
|
+
divider?: boolean;
|
|
13
|
+
/** 头部与内容之间显示横向分割线,默认 false */
|
|
14
|
+
headerDivider?: boolean;
|
|
11
15
|
sidebar?: Snippet;
|
|
12
16
|
header?: Snippet;
|
|
13
17
|
children?: Snippet;
|
|
@@ -19,6 +23,8 @@
|
|
|
19
23
|
sidebarWidth = '300px',
|
|
20
24
|
sidebarMaxWidth = null,
|
|
21
25
|
sidebarMinWidth = null,
|
|
26
|
+
divider = true,
|
|
27
|
+
headerDivider = false,
|
|
22
28
|
sidebar,
|
|
23
29
|
header,
|
|
24
30
|
children
|
|
@@ -36,8 +42,8 @@
|
|
|
36
42
|
{@render sidebar()}
|
|
37
43
|
{/if}
|
|
38
44
|
</div>
|
|
39
|
-
{#if sidebarResize}
|
|
40
|
-
<Split direction="vertical" bindingPanel={sidebarPanel}/>
|
|
45
|
+
{#if sidebarResize || divider}
|
|
46
|
+
<Split direction="vertical" bindingPanel={sidebarResize ? sidebarPanel : undefined} width={divider ? undefined : 0}/>
|
|
41
47
|
{/if}
|
|
42
48
|
{/if}
|
|
43
49
|
<div class="main-content">
|
|
@@ -45,6 +51,9 @@
|
|
|
45
51
|
<div class="header-area" style="height: {headerHeight}">
|
|
46
52
|
{@render header()}
|
|
47
53
|
</div>
|
|
54
|
+
{#if headerDivider}
|
|
55
|
+
<Split direction="horizontal"/>
|
|
56
|
+
{/if}
|
|
48
57
|
{/if}
|
|
49
58
|
<div class="content-area">
|
|
50
59
|
{#if children}
|
|
@@ -5,6 +5,10 @@ interface Props {
|
|
|
5
5
|
sidebarWidth?: string;
|
|
6
6
|
sidebarMaxWidth?: string | null;
|
|
7
7
|
sidebarMinWidth?: string | null;
|
|
8
|
+
/** 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 */
|
|
9
|
+
divider?: boolean;
|
|
10
|
+
/** 头部与内容之间显示横向分割线,默认 false */
|
|
11
|
+
headerDivider?: boolean;
|
|
8
12
|
sidebar?: Snippet;
|
|
9
13
|
header?: Snippet;
|
|
10
14
|
children?: Snippet;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {tick, onDestroy, untrack} from "svelte";
|
|
2
|
+
import {tick, onDestroy, untrack, type Snippet} from "svelte";
|
|
3
3
|
import SearchBox from "../../form/search_box"
|
|
4
4
|
import type {FilterFn} from "../../types";
|
|
5
5
|
import type {ListLazyLoader} from "../../types";
|
|
@@ -29,9 +29,11 @@
|
|
|
29
29
|
title?: string;
|
|
30
30
|
round?: boolean;
|
|
31
31
|
filterText?: string;
|
|
32
|
-
header?: any;
|
|
33
|
-
footer?: any;
|
|
34
|
-
|
|
32
|
+
header?: Snippet | any;
|
|
33
|
+
footer?: Snippet | any;
|
|
34
|
+
contentHeader?: Snippet | any;
|
|
35
|
+
contentFooter?: Snippet | any;
|
|
36
|
+
loadMoreIndicator?: Snippet | any;
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
let {
|
|
@@ -54,6 +56,8 @@
|
|
|
54
56
|
filterText,
|
|
55
57
|
header,
|
|
56
58
|
footer,
|
|
59
|
+
contentHeader,
|
|
60
|
+
contentFooter,
|
|
57
61
|
loadMoreIndicator
|
|
58
62
|
}: Props = $props();
|
|
59
63
|
|
|
@@ -293,6 +297,9 @@
|
|
|
293
297
|
{/if}
|
|
294
298
|
<div class="listbox-content" class:selectable={selectMode==='single'} bind:this={scrollElement} onscroll={handleScroll}
|
|
295
299
|
role="listbox" aria-multiselectable={selectMode === 'multiple' ? true : undefined}>
|
|
300
|
+
{#if contentHeader}
|
|
301
|
+
{@render contentHeader()}
|
|
302
|
+
{/if}
|
|
296
303
|
{#if filteredList && ItemRender}
|
|
297
304
|
{#each filteredList as item}
|
|
298
305
|
{#if selectMode === "multiple"}
|
|
@@ -319,6 +326,9 @@
|
|
|
319
326
|
{#if hasMore && loadMoreIndicator}
|
|
320
327
|
{@render loadMoreIndicator()}
|
|
321
328
|
{/if}
|
|
329
|
+
{#if contentFooter}
|
|
330
|
+
{@render contentFooter()}
|
|
331
|
+
{/if}
|
|
322
332
|
</div>
|
|
323
333
|
{#if footer}
|
|
324
334
|
<div class="box-footer flex-container">
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type Snippet } from "svelte";
|
|
1
2
|
import type { FilterFn } from "../../types";
|
|
2
3
|
import type { ListLazyLoader } from "../../types";
|
|
3
4
|
type OnSelectChange = (item: any) => void;
|
|
@@ -22,9 +23,11 @@ interface Props {
|
|
|
22
23
|
title?: string;
|
|
23
24
|
round?: boolean;
|
|
24
25
|
filterText?: string;
|
|
25
|
-
header?: any;
|
|
26
|
-
footer?: any;
|
|
27
|
-
|
|
26
|
+
header?: Snippet | any;
|
|
27
|
+
footer?: Snippet | any;
|
|
28
|
+
contentHeader?: Snippet | any;
|
|
29
|
+
contentFooter?: Snippet | any;
|
|
30
|
+
loadMoreIndicator?: Snippet | any;
|
|
28
31
|
}
|
|
29
32
|
declare const ListBox: import("svelte").Component<Props, {}, "selectedItems">;
|
|
30
33
|
type ListBox = ReturnType<typeof ListBox>;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
A list component with optional header / footer snippets, built-in search, lazy loading, and single / multiple selection modes.
|
|
6
6
|
|
|
7
|
-
> Svelte 5 component. Custom header/footer/load-more
|
|
7
|
+
> Svelte 5 component. Custom header/footer/load-more/content snippets are passed as **Snippets** (`header`, `footer`, `contentHeader`, `contentFooter`, `loadMoreIndicator`).
|
|
8
8
|
|
|
9
9
|
## Installation
|
|
10
10
|
|
|
@@ -39,8 +39,10 @@ npm install @ticatec/topside-elements
|
|
|
39
39
|
| `round` | `boolean` | `false` | Adds a border radius (`--topside-radius`) |
|
|
40
40
|
| `class` | `string` | `undefined` | Extra class on the root |
|
|
41
41
|
| `style` | `string \| null` | `null` | Inline CSS on the root |
|
|
42
|
-
| `header` | `Snippet` | `undefined` | Custom header content (overrides `title
|
|
43
|
-
| `footer` | `Snippet` | `undefined` | Custom footer content |
|
|
42
|
+
| `header` | `Snippet` | `undefined` | Custom header content (overrides `title`, fixed above content) |
|
|
43
|
+
| `footer` | `Snippet` | `undefined` | Custom footer content (fixed below content) |
|
|
44
|
+
| `contentHeader` | `Snippet` | `undefined` | Custom snippet at the top inside `listbox-content` (scrolls with list items) |
|
|
45
|
+
| `contentFooter` | `Snippet` | `undefined` | Custom snippet at the bottom inside `listbox-content` (scrolls with list items) |
|
|
44
46
|
| `loadMoreIndicator` | `Snippet` | `undefined` | Custom "loading more" indicator shown at the bottom while `hasMore` |
|
|
45
47
|
| `onchange` | `(item: any) => void` | `undefined` | Single-mode: fires when the selected item changes (also fires with `null` when filter resets selection) |
|
|
46
48
|
| `onItemDblClick` | `(item: any) => void` | `undefined` | Single-mode only |
|
|
@@ -111,6 +113,26 @@ interface LoadResult {
|
|
|
111
113
|
<button disabled={selected.length === 0} onclick={() => console.log(selected)}>OK</button>
|
|
112
114
|
```
|
|
113
115
|
|
|
116
|
+
### Scrolling content header & footer (`contentHeader` & `contentFooter`)
|
|
117
|
+
|
|
118
|
+
Unlike `header` and `footer` which remain pinned outside the scroll viewport, `contentHeader` and `contentFooter` sit inside `.listbox-content` at the very top and bottom, scrolling alongside the list items:
|
|
119
|
+
|
|
120
|
+
```svelte
|
|
121
|
+
<ListBox list={users} itemRender={UserItem} selectMode="single" style="height: 300px;">
|
|
122
|
+
{#snippet contentHeader()}
|
|
123
|
+
<div style="padding: 8px 12px; background: #eef2ff; border-bottom: 1px solid #e0e7ff; cursor: pointer;">
|
|
124
|
+
All Users / Quick Actions (scrolls with list)
|
|
125
|
+
</div>
|
|
126
|
+
{/snippet}
|
|
127
|
+
|
|
128
|
+
{#snippet contentFooter()}
|
|
129
|
+
<div style="padding: 8px 12px; text-align: center; color: #64748b; border-top: 1px solid #f1f5f9;">
|
|
130
|
+
Bottom action or footer notice (scrolls with list)
|
|
131
|
+
</div>
|
|
132
|
+
{/snippet}
|
|
133
|
+
</ListBox>
|
|
134
|
+
```
|
|
135
|
+
|
|
114
136
|
### Lazy-loaded list with custom footer
|
|
115
137
|
|
|
116
138
|
```svelte
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
列表组件,可选 header / footer snippet、内置搜索框、懒加载、单选 / 多选。
|
|
6
6
|
|
|
7
|
-
> Svelte 5 组件。header / footer / 加载更多 通过 **Snippet** 传入(`header`、`footer`、`loadMoreIndicator`)。
|
|
7
|
+
> Svelte 5 组件。header / footer / contentHeader / contentFooter / 加载更多 通过 **Snippet** 传入(`header`、`footer`、`contentHeader`、`contentFooter`、`loadMoreIndicator`)。
|
|
8
8
|
|
|
9
9
|
## 安装
|
|
10
10
|
|
|
@@ -39,8 +39,10 @@ npm install @ticatec/topside-elements
|
|
|
39
39
|
| `round` | `boolean` | `false` | 加圆角(`--topside-radius`) |
|
|
40
40
|
| `class` | `string` | `undefined` | 根节点附加 class |
|
|
41
41
|
| `style` | `string \| null` | `null` | 根节点内联 CSS |
|
|
42
|
-
| `header` | `Snippet` | `undefined` | 自定义 header(覆盖 `title
|
|
43
|
-
| `footer` | `Snippet` | `undefined` | 自定义 footer |
|
|
42
|
+
| `header` | `Snippet` | `undefined` | 自定义 header(覆盖 `title`,固定在顶部不随列表滚动) |
|
|
43
|
+
| `footer` | `Snippet` | `undefined` | 自定义 footer(固定在底部不随列表滚动) |
|
|
44
|
+
| `contentHeader` | `Snippet` | `undefined` | 位于 `listbox-content` 最上部的自定义组件/片段(跟随列表滚动) |
|
|
45
|
+
| `contentFooter` | `Snippet` | `undefined` | 位于 `listbox-content` 最下部的自定义组件/片段(跟随列表滚动) |
|
|
44
46
|
| `loadMoreIndicator` | `Snippet` | `undefined` | 自定义"加载更多"指示器,`hasMore` 时显示在底部 |
|
|
45
47
|
| `onchange` | `(item: any) => void` | `undefined` | 单选模式:选中变化时触发(过滤重置时也会以 `null` 触发一次) |
|
|
46
48
|
| `onItemDblClick` | `(item: any) => void` | `undefined` | 仅单选模式 |
|
|
@@ -111,6 +113,26 @@ interface LoadResult {
|
|
|
111
113
|
<button disabled={selected.length === 0} onclick={() => console.log(selected)}>OK</button>
|
|
112
114
|
```
|
|
113
115
|
|
|
116
|
+
### 随列表滚动的内置首尾项 (`contentHeader` & `contentFooter`)
|
|
117
|
+
|
|
118
|
+
与 `header` 和 `footer`(固定在滚动容器外部、不随内容滚动)不同,`contentHeader` 与 `contentFooter` 位于 `.listbox-content` 滚动容器内部的最上部与最下部,跟随列表项一起滚动,适合放置“全部选项”、“快捷动作”或底部的“新增选项”等条目:
|
|
119
|
+
|
|
120
|
+
```svelte
|
|
121
|
+
<ListBox list={users} itemRender={UserItem} selectMode="single" style="height: 300px;">
|
|
122
|
+
{#snippet contentHeader()}
|
|
123
|
+
<div style="padding: 8px 12px; background: #eef2ff; border-bottom: 1px solid #e0e7ff; cursor: pointer;">
|
|
124
|
+
全部选项 / 快捷操作(跟随列表滚动)
|
|
125
|
+
</div>
|
|
126
|
+
{/snippet}
|
|
127
|
+
|
|
128
|
+
{#snippet contentFooter()}
|
|
129
|
+
<div style="padding: 8px 12px; text-align: center; color: #64748b; border-top: 1px solid #f1f5f9;">
|
|
130
|
+
底部操作或说明(跟随列表滚动)
|
|
131
|
+
</div>
|
|
132
|
+
{/snippet}
|
|
133
|
+
</ListBox>
|
|
134
|
+
```
|
|
135
|
+
|
|
114
136
|
### 懒加载 + 自定义 footer
|
|
115
137
|
|
|
116
138
|
```svelte
|
package/docs/NAMING.md
CHANGED
|
@@ -342,7 +342,7 @@ interface Action<T = any> {
|
|
|
342
342
|
**Events (notifications)**: `onchange` `onclick` `ondblclick` `onfocus` `onblur` `oninput` `onclose` `onselect` `ondelete` `onremove` `onrefresh` `onconfirm` `onaction` `ondownload` `onretry` `onkeydown` `onkeyup` `onkeypress` `oncontextmenu` `ontoggle` `onItemClick` `onRowClick` `onIconClick` `onPageSizeChange` `onFileUploaded` `onFileRejected` `onUploadError` `onPreview` `onResizeEnd`; between DataTable's internal panels: `onCellClick` `onWidthChange` `onRowExpand` `onRowSelectChange` `onToggleSelectAll`
|
|
343
343
|
**Hooks (veto)**: `beforeClose` `beforeRemove` `beforeChange` `beforeTransfer`
|
|
344
344
|
**Instance methods**: `focus()` `blur()` `clear()` `open()` `close()` `reset()` `push()` `pop()` `getElement()` `openFileDialog()`
|
|
345
|
-
**Snippets**: `children` `header` `headerExtra` `footer` `left` `right` `top` `bottom` `sidebar` `home` `leadingIcon` `trailingIcon` `popup` `item` `tab` `node` `chevronIcon` `nodeIcon` `from` `to`
|
|
345
|
+
**Snippets**: `children` `header` `headerExtra` `footer` `contentHeader` `contentFooter` `left` `right` `top` `bottom` `sidebar` `home` `leadingIcon` `trailingIcon` `popup` `item` `tab` `node` `chevronIcon` `nodeIcon` `from` `to`
|
|
346
346
|
|
|
347
347
|
---
|
|
348
348
|
|
package/docs/NAMING_CN.md
CHANGED
|
@@ -342,7 +342,7 @@ interface Action<T = any> {
|
|
|
342
342
|
**事件(通知)**:`onchange` `onclick` `ondblclick` `onfocus` `onblur` `oninput` `onclose` `onselect` `ondelete` `onremove` `onrefresh` `onconfirm` `onaction` `ondownload` `onretry` `onkeydown` `onkeyup` `onkeypress` `oncontextmenu` `ontoggle` `onItemClick` `onRowClick` `onIconClick` `onPageSizeChange` `onFileUploaded` `onFileRejected` `onUploadError` `onPreview` `onResizeEnd`;DataTable 内部面板间:`onCellClick` `onWidthChange` `onRowExpand` `onRowSelectChange` `onToggleSelectAll`
|
|
343
343
|
**钩子(否决)**:`beforeClose` `beforeRemove` `beforeChange` `beforeTransfer`
|
|
344
344
|
**实例方法**:`focus()` `blur()` `clear()` `open()` `close()` `reset()` `push()` `pop()` `getElement()` `openFileDialog()`
|
|
345
|
-
**Snippet**:`children` `header` `headerExtra` `footer` `left` `right` `top` `bottom` `sidebar` `home` `leadingIcon` `trailingIcon` `popup` `item` `tab` `node` `chevronIcon` `nodeIcon` `from` `to`
|
|
345
|
+
**Snippet**:`children` `header` `headerExtra` `footer` `contentHeader` `contentFooter` `left` `right` `top` `bottom` `sidebar` `home` `leadingIcon` `trailingIcon` `popup` `item` `tab` `node` `chevronIcon` `nodeIcon` `from` `to`
|
|
346
346
|
|
|
347
347
|
---
|
|
348
348
|
|
|
@@ -128,8 +128,8 @@
|
|
|
128
128
|
|
|
129
129
|
| 组件 | 导入路径 | 示例 | 属性数 |
|
|
130
130
|
| --- | --- | --- | ---: |
|
|
131
|
-
| [ClassicLayout](./classic-layout/README.md) | `@ticatec/topside-elements/app-layout/ClassicLayout` | [示例](./classic-layout/example.svelte) |
|
|
132
|
-
| [ColumnsLayout](./columns-layout/README.md) | `@ticatec/topside-elements/app-layout/ColumnsLayout` | [示例](./columns-layout/example.svelte) |
|
|
133
|
-
| [HeaderLayout](./header-layout/README.md) | `@ticatec/topside-elements/app-layout/HeaderLayout` | [示例](./header-layout/example.svelte) |
|
|
134
|
-
| [RowsLayout](./rows-layout/README.md) | `@ticatec/topside-elements/app-layout/RowsLayout` | [示例](./rows-layout/example.svelte) |
|
|
135
|
-
| [SidebarLayout](./sidebar-layout/README.md) | `@ticatec/topside-elements/app-layout/SidebarLayout` | [示例](./sidebar-layout/example.svelte) |
|
|
131
|
+
| [ClassicLayout](./classic-layout/README.md) | `@ticatec/topside-elements/app-layout/ClassicLayout` | [示例](./classic-layout/example.svelte) | 18 |
|
|
132
|
+
| [ColumnsLayout](./columns-layout/README.md) | `@ticatec/topside-elements/app-layout/ColumnsLayout` | [示例](./columns-layout/example.svelte) | 14 |
|
|
133
|
+
| [HeaderLayout](./header-layout/README.md) | `@ticatec/topside-elements/app-layout/HeaderLayout` | [示例](./header-layout/example.svelte) | 10 |
|
|
134
|
+
| [RowsLayout](./rows-layout/README.md) | `@ticatec/topside-elements/app-layout/RowsLayout` | [示例](./rows-layout/example.svelte) | 14 |
|
|
135
|
+
| [SidebarLayout](./sidebar-layout/README.md) | `@ticatec/topside-elements/app-layout/SidebarLayout` | [示例](./sidebar-layout/example.svelte) | 10 |
|
|
@@ -31,6 +31,9 @@ import ClassicLayout from '@ticatec/topside-elements/app-layout/ClassicLayout';
|
|
|
31
31
|
| `rightBarResize` | 否 | `boolean` | 否 | `false` | 否 | 可选配置,具体取值范围和数据结构见类型列。 |
|
|
32
32
|
| `rightBarMaxWidth` | 否 | `string \| null` | 否 | `null` | 否 | 宽度配置;字符串可以使用 px、rem、% 等 CSS 单位。 |
|
|
33
33
|
| `rightBarMinWidth` | 否 | `string \| null` | 否 | `null` | 否 | 宽度配置;字符串可以使用 px、rem、% 等 CSS 单位。 |
|
|
34
|
+
| `divider` | 否 | `boolean` | 否 | `true` | 否 | 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 |
|
|
35
|
+
| `headerDivider` | 否 | `boolean` | 否 | `false` | 否 | 头部与内容之间显示横向分割线,默认 false |
|
|
36
|
+
| `bottomDivider` | 否 | `boolean` | 否 | `false` | 否 | 内容与底部状态栏之间显示横向分割线,默认 false |
|
|
34
37
|
| `header` | 否 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 渲染入口,用于替换或补充默认内容。 |
|
|
35
38
|
| `sidebar` | 否 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 渲染入口,用于替换或补充默认内容。 |
|
|
36
39
|
| `children` | 是 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 子内容,用于自定义组件主体。 |
|
|
@@ -31,6 +31,7 @@ import ColumnsLayout from '@ticatec/topside-elements/app-layout/ColumnsLayout';
|
|
|
31
31
|
| `rightMaxWidth` | 否 | `string \| null` | 否 | `null` | 否 | 右栏最大宽度(CSS 长度) |
|
|
32
32
|
| `leftResize` | 否 | `boolean` | 否 | `false` | 否 | 可选配置,具体取值范围和数据结构见类型列。 |
|
|
33
33
|
| `rightResize` | 否 | `boolean` | 否 | `false` | 否 | 可选配置,具体取值范围和数据结构见类型列。 |
|
|
34
|
+
| `divider` | 否 | `boolean` | 否 | `true` | 否 | 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 |
|
|
34
35
|
| `left` | 否 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 渲染入口,用于替换或补充默认内容。 |
|
|
35
36
|
| `children` | 是 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 子内容,用于自定义组件主体。 |
|
|
36
37
|
| `right` | 否 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 渲染入口,用于替换或补充默认内容。 |
|
|
@@ -26,6 +26,8 @@ import HeaderLayout from '@ticatec/topside-elements/app-layout/HeaderLayout';
|
|
|
26
26
|
| `sidebarResize` | 否 | `boolean` | 否 | `false` | 否 | 可选配置,具体取值范围和数据结构见类型列。 |
|
|
27
27
|
| `sidebarMaxWidth` | 否 | `string \| null` | 否 | `null` | 否 | 宽度配置;字符串可以使用 px、rem、% 等 CSS 单位。 |
|
|
28
28
|
| `sidebarMinWidth` | 否 | `string \| null` | 否 | `null` | 否 | 宽度配置;字符串可以使用 px、rem、% 等 CSS 单位。 |
|
|
29
|
+
| `divider` | 否 | `boolean` | 否 | `true` | 否 | 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 |
|
|
30
|
+
| `headerDivider` | 否 | `boolean` | 否 | `false` | 否 | 头部与内容之间显示横向分割线,默认 false |
|
|
29
31
|
| `header` | 否 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 渲染入口,用于替换或补充默认内容。 |
|
|
30
32
|
| `sidebar` | 否 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 渲染入口,用于替换或补充默认内容。 |
|
|
31
33
|
| `children` | 是 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 子内容,用于自定义组件主体。 |
|
|
@@ -40,6 +40,8 @@ import ListBox from '@ticatec/topside-elements/ListBox';
|
|
|
40
40
|
| `filterText` | 是 | `string` | 否 | `undefined` | 否 | 过滤输入框的外部初始值或受控值,用于预设搜索条件。 |
|
|
41
41
|
| `header` | 否 | `any` | 否 | `undefined` | 否 | 可选配置,具体取值范围和数据结构见类型列。 |
|
|
42
42
|
| `footer` | 否 | `any` | 否 | `undefined` | 否 | 可选配置,具体取值范围和数据结构见类型列。 |
|
|
43
|
+
| `contentHeader` | 否 | `Snippet \| any` | 否 | `undefined` | 否 | 位于 listbox-content 最上部的自定义组件/片段(跟随列表滚动)。 |
|
|
44
|
+
| `contentFooter` | 否 | `Snippet \| any` | 否 | `undefined` | 否 | 位于 listbox-content 最下部的自定义组件/片段(跟随列表滚动)。 |
|
|
43
45
|
| `loadMoreIndicator` | 否 | `any` | 否 | `undefined` | 否 | 可选配置,具体取值范围和数据结构见类型列。 |
|
|
44
46
|
|
|
45
47
|
> 组件的“可绑定”表示源码使用了 Svelte 5 的 `$bindable`;服务的“响应式”表示成员使用了 `$state`。复杂类型请同时参考 TypeScript 自动补全。
|
|
@@ -121,6 +123,22 @@ import ListBox from '@ticatec/topside-elements/ListBox';
|
|
|
121
123
|
- 默认值:`undefined`
|
|
122
124
|
- 示例写法:`filterText="研发"`
|
|
123
125
|
|
|
126
|
+
### `contentHeader`
|
|
127
|
+
|
|
128
|
+
位于 `listbox-content` 滚动容器内部的最上部,在所有列表项之前渲染,**跟随列表一起滚动**(与固定的 `header` 区分)。可用于放置如“全部选项”、“快捷搜索”等类似选择项的内容。
|
|
129
|
+
|
|
130
|
+
- 类型:`Snippet | any`
|
|
131
|
+
- 默认值:`undefined`
|
|
132
|
+
- 示例写法:`{#snippet contentHeader()}<div>全部选项</div>{/snippet}`
|
|
133
|
+
|
|
134
|
+
### `contentFooter`
|
|
135
|
+
|
|
136
|
+
位于 `listbox-content` 滚动容器内部的最下部,在所有列表项(及加载更多指示器)之后渲染,**跟随列表一起滚动**(与固定的 `footer` 区分)。可用于放置如“新增选项”、“列表说明”等类似选择项的内容。
|
|
137
|
+
|
|
138
|
+
- 类型:`Snippet | any`
|
|
139
|
+
- 默认值:`undefined`
|
|
140
|
+
- 示例写法:`{#snippet contentFooter()}<div>新增选项</div>{/snippet}`
|
|
141
|
+
|
|
124
142
|
## 相关类型定义
|
|
125
143
|
|
|
126
144
|
以下定义帮助理解复杂属性的数据结构;其中部分辅助类型属于内部实现,不一定是独立导出入口。
|
|
@@ -31,6 +31,7 @@ import RowsLayout from '@ticatec/topside-elements/app-layout/RowsLayout';
|
|
|
31
31
|
| `bottomMaxHeight` | 否 | `string \| null` | 否 | `null` | 否 | 下栏最大高度(CSS 长度) |
|
|
32
32
|
| `topResize` | 否 | `boolean` | 否 | `false` | 否 | 可选配置,具体取值范围和数据结构见类型列。 |
|
|
33
33
|
| `bottomResize` | 否 | `boolean` | 否 | `false` | 否 | 可选配置,具体取值范围和数据结构见类型列。 |
|
|
34
|
+
| `divider` | 否 | `boolean` | 否 | `true` | 否 | 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 |
|
|
34
35
|
| `top` | 否 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 渲染入口,用于替换或补充默认内容。 |
|
|
35
36
|
| `children` | 是 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 子内容,用于自定义组件主体。 |
|
|
36
37
|
| `bottom` | 否 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 渲染入口,用于替换或补充默认内容。 |
|
|
@@ -26,6 +26,8 @@ import SidebarLayout from '@ticatec/topside-elements/app-layout/SidebarLayout';
|
|
|
26
26
|
| `sidebarWidth` | 否 | `string` | 否 | `'300px'` | 否 | 宽度配置;字符串可以使用 px、rem、% 等 CSS 单位。 |
|
|
27
27
|
| `sidebarMaxWidth` | 否 | `string \| null` | 否 | `null` | 否 | 宽度配置;字符串可以使用 px、rem、% 等 CSS 单位。 |
|
|
28
28
|
| `sidebarMinWidth` | 否 | `string \| null` | 否 | `null` | 否 | 宽度配置;字符串可以使用 px、rem、% 等 CSS 单位。 |
|
|
29
|
+
| `divider` | 否 | `boolean` | 否 | `true` | 否 | 面板之间是否显示分割线,默认 true;与 *Resize(能否拖动)相互独立:可拖动但不显示线时,只在悬停 / 拖动时出现把手 |
|
|
30
|
+
| `headerDivider` | 否 | `boolean` | 否 | `false` | 否 | 头部与内容之间显示横向分割线,默认 false |
|
|
29
31
|
| `sidebar` | 否 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 渲染入口,用于替换或补充默认内容。 |
|
|
30
32
|
| `header` | 否 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 渲染入口,用于替换或补充默认内容。 |
|
|
31
33
|
| `children` | 是 | `Snippet` | 否 | `undefined` | 否 | Svelte Snippet 子内容,用于自定义组件主体。 |
|
package/package.json
CHANGED