@flux-ui/components 3.0.0-next.31 → 3.0.0-next.32

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.
@@ -0,0 +1,209 @@
1
+ import { FluxColor, FluxFormTreeViewSelectOption, FluxFormTreeViewSelectValue, FluxDirection, FluxAutoCompleteType, FluxIconName, FluxInputMask, FluxInputType } from '@flux-ui/types';
2
+ import { ComponentPublicInstance, nextTick, DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions, ComponentInternalInstance, VNodeProps, AllowedComponentProps, ComponentCustomProps, Slot, ComponentOptionsBase, GlobalComponents, GlobalDirectives, DebuggerEvent, WatchOptions, WatchStopHandle, ShallowUnwrapRef, ComponentCustomProperties, CreateComponentPublicInstanceWithMixins } from 'vue';
3
+ import { OnCleanup } from '@vue/reactivity';
4
+ type __VLS_Props = {
5
+ readonly disabled?: boolean;
6
+ readonly isMultiple?: boolean;
7
+ readonly isSearchable?: boolean;
8
+ readonly levelColors?: (FluxColor | string)[];
9
+ readonly options: FluxFormTreeViewSelectOption[];
10
+ readonly placeholder?: string;
11
+ };
12
+ type __VLS_PublicProps = {
13
+ modelValue: FluxFormTreeViewSelectValue;
14
+ } & __VLS_Props;
15
+ declare const _default: DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
16
+ "update:modelValue": (value: FluxFormTreeViewSelectValue) => any;
17
+ }, string, PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
18
+ "onUpdate:modelValue"?: (value: FluxFormTreeViewSelectValue) => any;
19
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
20
+ anchor: {
21
+ $: ComponentInternalInstance;
22
+ $data: {};
23
+ $props: {
24
+ readonly tagName: keyof HTMLElementTagNameMap;
25
+ } & VNodeProps & AllowedComponentProps & ComponentCustomProps;
26
+ $attrs: {
27
+ [x: string]: unknown;
28
+ };
29
+ $refs: {
30
+ [x: string]: unknown;
31
+ };
32
+ $slots: Readonly<{
33
+ [name: string]: Slot<any>;
34
+ }>;
35
+ $root: ComponentPublicInstance | null;
36
+ $parent: ComponentPublicInstance | null;
37
+ $host: Element | null;
38
+ $emit: (event: string, ...args: any[]) => void;
39
+ $el: any;
40
+ $options: ComponentOptionsBase<Readonly<{
41
+ readonly tagName: keyof HTMLElementTagNameMap;
42
+ }> & Readonly<{}>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, {}, {}, string, {}, GlobalComponents, GlobalDirectives, string, ComponentProvideOptions> & {
43
+ beforeCreate?: (() => void) | (() => void)[];
44
+ created?: (() => void) | (() => void)[];
45
+ beforeMount?: (() => void) | (() => void)[];
46
+ mounted?: (() => void) | (() => void)[];
47
+ beforeUpdate?: (() => void) | (() => void)[];
48
+ updated?: (() => void) | (() => void)[];
49
+ activated?: (() => void) | (() => void)[];
50
+ deactivated?: (() => void) | (() => void)[];
51
+ beforeDestroy?: (() => void) | (() => void)[];
52
+ beforeUnmount?: (() => void) | (() => void)[];
53
+ destroyed?: (() => void) | (() => void)[];
54
+ unmounted?: (() => void) | (() => void)[];
55
+ renderTracked?: ((e: DebuggerEvent) => void) | ((e: DebuggerEvent) => void)[];
56
+ renderTriggered?: ((e: DebuggerEvent) => void) | ((e: DebuggerEvent) => void)[];
57
+ errorCaptured?: ((err: unknown, instance: ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: ComponentPublicInstance | null, info: string) => boolean | void)[];
58
+ };
59
+ $forceUpdate: () => void;
60
+ $nextTick: typeof nextTick;
61
+ $watch<T extends string | ((
62
+ /** @type { [typeof AnchorPopup, typeof AnchorPopup, ] } */ ...args: any) => any)>(source: T, cb: T extends ((...args: any) => infer R) ? (...args: [R, R, OnCleanup]) => any : (...args: [any, any, OnCleanup]) => any, options?: WatchOptions): WatchStopHandle;
63
+ } & Readonly<{}> & Omit<Readonly<{
64
+ readonly tagName: keyof HTMLElementTagNameMap;
65
+ }> & Readonly<{}>, never> & ShallowUnwrapRef<{}> & {} & ComponentCustomProperties & {} & {
66
+ $slots: Readonly<{
67
+ default(): any;
68
+ }> & {
69
+ default(): any;
70
+ };
71
+ };
72
+ anchorPopup: {
73
+ $: ComponentInternalInstance;
74
+ $data: {};
75
+ $props: Partial<{}> & Omit<{
76
+ readonly anchor?: ComponentPublicInstance | HTMLElement | null;
77
+ readonly direction?: FluxDirection;
78
+ readonly margin?: number;
79
+ readonly position?: "top" | "top-left" | "top-right" | "left" | "left-top" | "left-bottom" | "right" | "right-top" | "right-bottom" | "bottom" | "bottom-left" | "bottom-right";
80
+ readonly useAnchorWidth?: boolean;
81
+ } & VNodeProps & AllowedComponentProps & ComponentCustomProps, never>;
82
+ $attrs: {
83
+ [x: string]: unknown;
84
+ };
85
+ $refs: {
86
+ [x: string]: unknown;
87
+ } & {
88
+ popup: HTMLDivElement;
89
+ };
90
+ $slots: Readonly<{
91
+ [name: string]: Slot<any>;
92
+ }>;
93
+ $root: ComponentPublicInstance | null;
94
+ $parent: ComponentPublicInstance | null;
95
+ $host: Element | null;
96
+ $emit: (event: string, ...args: any[]) => void;
97
+ $el: HTMLDivElement;
98
+ $options: ComponentOptionsBase<Readonly<{
99
+ readonly anchor?: ComponentPublicInstance | HTMLElement | null;
100
+ readonly direction?: FluxDirection;
101
+ readonly margin?: number;
102
+ readonly position?: "top" | "top-left" | "top-right" | "left" | "left-top" | "left-bottom" | "right" | "right-top" | "right-bottom" | "bottom" | "bottom-left" | "bottom-right";
103
+ readonly useAnchorWidth?: boolean;
104
+ }> & Readonly<{}>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, {}, {}, string, {}, GlobalComponents, GlobalDirectives, string, ComponentProvideOptions> & {
105
+ beforeCreate?: (() => void) | (() => void)[];
106
+ created?: (() => void) | (() => void)[];
107
+ beforeMount?: (() => void) | (() => void)[];
108
+ mounted?: (() => void) | (() => void)[];
109
+ beforeUpdate?: (() => void) | (() => void)[];
110
+ updated?: (() => void) | (() => void)[];
111
+ activated?: (() => void) | (() => void)[];
112
+ deactivated?: (() => void) | (() => void)[];
113
+ beforeDestroy?: (() => void) | (() => void)[];
114
+ beforeUnmount?: (() => void) | (() => void)[];
115
+ destroyed?: (() => void) | (() => void)[];
116
+ unmounted?: (() => void) | (() => void)[];
117
+ renderTracked?: ((e: DebuggerEvent) => void) | ((e: DebuggerEvent) => void)[];
118
+ renderTriggered?: ((e: DebuggerEvent) => void) | ((e: DebuggerEvent) => void)[];
119
+ errorCaptured?: ((err: unknown, instance: ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: ComponentPublicInstance | null, info: string) => boolean | void)[];
120
+ };
121
+ $forceUpdate: () => void;
122
+ $nextTick: typeof nextTick;
123
+ $watch<T extends string | ((
124
+ /** @type { [typeof AnchorPopup, typeof AnchorPopup, ] } */ ...args: any) => any)>(source: T, cb: T extends ((...args: any) => infer R) ? (...args: [R, R, OnCleanup]) => any : (...args: [any, any, OnCleanup]) => any, options?: WatchOptions): WatchStopHandle;
125
+ } & Readonly<{}> & Omit<Readonly<{
126
+ readonly anchor?: ComponentPublicInstance | HTMLElement | null;
127
+ readonly direction?: FluxDirection;
128
+ readonly margin?: number;
129
+ readonly position?: "top" | "top-left" | "top-right" | "left" | "left-top" | "left-bottom" | "right" | "right-top" | "right-bottom" | "bottom" | "bottom-left" | "bottom-right";
130
+ readonly useAnchorWidth?: boolean;
131
+ }> & Readonly<{}>, never> & ShallowUnwrapRef<{}> & {} & ComponentCustomProperties & {} & {
132
+ $slots: Readonly<{
133
+ default(): any;
134
+ }> & {
135
+ default(): any;
136
+ };
137
+ };
138
+ searchInput: CreateComponentPublicInstanceWithMixins<Readonly<{
139
+ modelValue?: object | string | number | null;
140
+ } & {
141
+ readonly autoComplete?: FluxAutoCompleteType;
142
+ readonly autoFocus?: boolean;
143
+ readonly iconLeading?: FluxIconName;
144
+ readonly iconTrailing?: FluxIconName;
145
+ readonly disabled?: boolean;
146
+ readonly isCondensed?: boolean;
147
+ readonly isLoading?: boolean;
148
+ readonly isReadonly?: boolean;
149
+ readonly isSecondary?: boolean;
150
+ readonly max?: string | number;
151
+ readonly maxLength?: number;
152
+ readonly min?: string | number;
153
+ readonly pattern?: FluxInputMask;
154
+ readonly placeholder?: string;
155
+ readonly step?: number;
156
+ readonly type?: FluxInputType;
157
+ }> & Readonly<{
158
+ onBlur?: () => any;
159
+ onFocus?: () => any;
160
+ onShowPicker?: () => any;
161
+ "onUpdate:modelValue"?: (value: string | number | object) => any;
162
+ }>, {
163
+ blur: () => void;
164
+ focus: () => void;
165
+ }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
166
+ blur: () => any;
167
+ focus: () => any;
168
+ showPicker: () => any;
169
+ "update:modelValue": (value: string | number | object) => any;
170
+ }, PublicProps, {}, true, {}, {}, GlobalComponents, GlobalDirectives, string, {
171
+ input: HTMLInputElement;
172
+ }, HTMLDivElement, ComponentProvideOptions, {
173
+ P: {};
174
+ B: {};
175
+ D: {};
176
+ C: {};
177
+ M: {};
178
+ Defaults: {};
179
+ }, Readonly<{
180
+ modelValue?: object | string | number | null;
181
+ } & {
182
+ readonly autoComplete?: FluxAutoCompleteType;
183
+ readonly autoFocus?: boolean;
184
+ readonly iconLeading?: FluxIconName;
185
+ readonly iconTrailing?: FluxIconName;
186
+ readonly disabled?: boolean;
187
+ readonly isCondensed?: boolean;
188
+ readonly isLoading?: boolean;
189
+ readonly isReadonly?: boolean;
190
+ readonly isSecondary?: boolean;
191
+ readonly max?: string | number;
192
+ readonly maxLength?: number;
193
+ readonly min?: string | number;
194
+ readonly pattern?: FluxInputMask;
195
+ readonly placeholder?: string;
196
+ readonly step?: number;
197
+ readonly type?: FluxInputType;
198
+ }> & Readonly<{
199
+ onBlur?: () => any;
200
+ onFocus?: () => any;
201
+ onShowPicker?: () => any;
202
+ "onUpdate:modelValue"?: (value: string | number | object) => any;
203
+ }>, {
204
+ blur: () => void;
205
+ focus: () => void;
206
+ }, {}, {}, {}, {}>;
207
+ nodeElements: HTMLDivElement[];
208
+ }, any>;
209
+ export default _default;
@@ -10,11 +10,13 @@ declare function __VLS_template(): {
10
10
  slots: Readonly<{
11
11
  default?(): any;
12
12
  overflow?(props: {
13
+ hasOverflow: boolean;
13
14
  items: VNode[];
14
15
  }): any;
15
16
  }> & {
16
17
  default?(): any;
17
18
  overflow?(props: {
19
+ hasOverflow: boolean;
18
20
  items: VNode[];
19
21
  }): any;
20
22
  };
@@ -0,0 +1,16 @@
1
+ import { FluxColor, FluxTreeViewOption } from '@flux-ui/types';
2
+ import { DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions } from 'vue';
3
+ type __VLS_Props = {
4
+ readonly levelColors?: (FluxColor | string)[];
5
+ readonly options: FluxTreeViewOption[];
6
+ };
7
+ declare const _default: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
8
+ click: (option: FluxTreeViewOption) => any;
9
+ dblclick: (option: FluxTreeViewOption) => any;
10
+ }, string, PublicProps, Readonly<__VLS_Props> & Readonly<{
11
+ onClick?: (option: FluxTreeViewOption) => any;
12
+ onDblclick?: (option: FluxTreeViewOption) => any;
13
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
14
+ nodeElements: HTMLDivElement[];
15
+ }, HTMLDivElement>;
16
+ export default _default;
@@ -67,6 +67,7 @@ export { default as FluxFormSelectAsync } from './FluxFormSelectAsync.vue';
67
67
  export { default as FluxFormSlider } from './FluxFormSlider.vue';
68
68
  export { default as FluxFormTextArea } from './FluxFormTextArea.vue';
69
69
  export { default as FluxFormTimeZonePicker } from './FluxFormTimeZonePicker.vue';
70
+ export { default as FluxFormTreeViewSelect } from './FluxFormTreeViewSelect.vue';
70
71
  export { default as FluxGallery } from './FluxGallery.vue';
71
72
  export { default as FluxGalleryItem } from './FluxGalleryItem.vue';
72
73
  export { default as FluxGrid } from './FluxGrid.vue';
@@ -151,4 +152,5 @@ export { default as FluxToolbar } from './FluxToolbar.vue';
151
152
  export { default as FluxToolbarGroup } from './FluxToolbarGroup.vue';
152
153
  export { default as FluxTooltip } from './FluxTooltip.vue';
153
154
  export { default as FluxTooltipProvider } from './FluxTooltipProvider.vue';
155
+ export { default as FluxTreeView } from './FluxTreeView.vue';
154
156
  export { default as FluxWindow } from './FluxWindow.vue';
@@ -1,2 +1,4 @@
1
1
  export { default as useFormSelect } from './useFormSelect';
2
2
  export { default as useTranslate } from './useTranslate';
3
+ export { flattenAll, flattenVisible, getLevelColor, INITIAL_HIGHLIGHTED_INDEX, useTreeView } from './useTreeView';
4
+ export type { TreeBaseOption, TreeFlatNode } from './useTreeView';
@@ -0,0 +1,28 @@
1
+ import { FluxColor, FluxIconName } from '@flux-ui/types';
2
+ import { ComputedRef, Ref } from 'vue';
3
+ export type TreeBaseOption = {
4
+ readonly id: string | number;
5
+ readonly label: string;
6
+ readonly icon?: FluxIconName;
7
+ readonly children?: TreeBaseOption[];
8
+ };
9
+ export type TreeFlatNode<TOption extends TreeBaseOption = TreeBaseOption> = TOption & {
10
+ readonly depth: number;
11
+ readonly isLast: boolean;
12
+ readonly lineGuides: boolean[];
13
+ };
14
+ export declare const FLUX_COLORS: FluxColor[];
15
+ export declare const INITIAL_HIGHLIGHTED_INDEX = -1;
16
+ export declare function flattenVisible<TOption extends TreeBaseOption>(nodes: TOption[], depth: number, expanded: Set<string | number>, parentGuides?: boolean[]): TreeFlatNode<TOption>[];
17
+ export declare function flattenAll<TOption extends TreeBaseOption>(nodes: TOption[], depth?: number): TreeFlatNode<TOption>[];
18
+ export declare function getLevelColor(depth: number, levelColors?: (FluxColor | string)[]): string | undefined;
19
+ export declare function useTreeView<TNode extends TreeFlatNode>(params: {
20
+ readonly expandedIds: Ref<Set<string | number>>;
21
+ readonly nodeElementRefs: Readonly<Ref<HTMLDivElement[] | null | undefined>>;
22
+ readonly visibleNodes: ComputedRef<TNode[]>;
23
+ }): {
24
+ readonly highlightedIndex: Ref<number>;
25
+ toggleExpand: (nodeId: string | number) => void;
26
+ onExpandClick: (node: TNode, evt: MouseEvent) => void;
27
+ onKeyNavigate: (evt: KeyboardEvent, onActivate: (node: TNode) => void) => boolean;
28
+ };
package/dist/index.css CHANGED
@@ -4464,6 +4464,152 @@ tfoot .table-cell {
4464
4464
  100% {
4465
4465
  aspect-ratio: var(--aspect-ratio);
4466
4466
  }
4467
+ }.tree-view-select-value {
4468
+ margin-left: 6px;
4469
+ overflow: hidden;
4470
+ text-overflow: ellipsis;
4471
+ white-space: nowrap;
4472
+ }
4473
+
4474
+ .tree-view-select-list {
4475
+ display: flex;
4476
+ flex-flow: column;
4477
+ padding: 9px;
4478
+ }
4479
+
4480
+ .tree-view-select-empty {
4481
+ padding: 12px 6px;
4482
+ color: var(--foreground-secondary);
4483
+ font-size: 14px;
4484
+ text-align: center;
4485
+ }
4486
+
4487
+ .tree-node {
4488
+ display: flex;
4489
+ width: 100%;
4490
+ min-height: 36px;
4491
+ padding: 0 8px;
4492
+ align-items: center;
4493
+ border-radius: var(--radius-half);
4494
+ color: var(--foreground);
4495
+ font-size: 14px;
4496
+ gap: 8px;
4497
+ outline: 0;
4498
+ transition: 150ms var(--swift-out);
4499
+ transition-property: background, color;
4500
+ user-select: none;
4501
+ }
4502
+ .tree-node.is-selectable, .tree-node.is-expandable {
4503
+ cursor: pointer;
4504
+ }
4505
+ @media (hover: hover) {
4506
+ .tree-node.is-selectable:hover, .tree-node.is-expandable:hover {
4507
+ background: var(--surface-hover);
4508
+ }
4509
+ }
4510
+ .tree-node.is-selected {
4511
+ background: var(--primary-50);
4512
+ color: var(--primary-700);
4513
+ font-weight: 600;
4514
+ }
4515
+ @media (hover: hover) {
4516
+ .tree-node.is-selected.is-selectable:hover {
4517
+ background: var(--primary-100);
4518
+ }
4519
+ }
4520
+ .tree-node.is-highlighted:not(.is-selected) {
4521
+ background: var(--surface-hover);
4522
+ }
4523
+ .tree-node.is-highlighted.is-selected {
4524
+ background: var(--primary-100);
4525
+ }
4526
+
4527
+ .tree-node-check {
4528
+ color: var(--primary-600);
4529
+ flex-shrink: 0;
4530
+ }
4531
+
4532
+ .tree-node-line-area {
4533
+ display: flex;
4534
+ align-self: stretch;
4535
+ flex-shrink: 0;
4536
+ }
4537
+
4538
+ .tree-indent {
4539
+ position: relative;
4540
+ width: 20px;
4541
+ align-self: stretch;
4542
+ flex-shrink: 0;
4543
+ pointer-events: none;
4544
+ }
4545
+ .tree-indent.has-line::before {
4546
+ content: "";
4547
+ position: absolute;
4548
+ top: 0;
4549
+ bottom: 0;
4550
+ left: 9px;
4551
+ width: 1px;
4552
+ background: var(--surface-stroke);
4553
+ }
4554
+
4555
+ .tree-connector {
4556
+ position: relative;
4557
+ width: 20px;
4558
+ align-self: stretch;
4559
+ flex-shrink: 0;
4560
+ pointer-events: none;
4561
+ }
4562
+ .tree-connector:not(.is-last)::before {
4563
+ content: "";
4564
+ position: absolute;
4565
+ top: 0;
4566
+ bottom: 0;
4567
+ left: 9px;
4568
+ width: 1px;
4569
+ background: var(--surface-stroke);
4570
+ }
4571
+ .tree-connector::after {
4572
+ content: "";
4573
+ position: absolute;
4574
+ top: 0;
4575
+ bottom: 50%;
4576
+ left: 9px;
4577
+ right: 0;
4578
+ border-left: 1px solid var(--surface-stroke);
4579
+ border-bottom: 1px solid var(--surface-stroke);
4580
+ border-bottom-left-radius: 6px;
4581
+ }
4582
+
4583
+ .tree-node-expand {
4584
+ display: flex;
4585
+ width: 16px;
4586
+ flex-shrink: 0;
4587
+ align-items: center;
4588
+ justify-content: center;
4589
+ color: var(--foreground-secondary);
4590
+ }
4591
+ .tree-node-expand:not(:empty) {
4592
+ cursor: pointer;
4593
+ }
4594
+
4595
+ .tree-node-color-dot {
4596
+ display: block;
4597
+ width: 8px;
4598
+ height: 8px;
4599
+ border-radius: 50%;
4600
+ flex-shrink: 0;
4601
+ }
4602
+
4603
+ .tree-node-icon {
4604
+ color: var(--foreground-secondary);
4605
+ flex-shrink: 0;
4606
+ }
4607
+
4608
+ .tree-node-label {
4609
+ flex: 1;
4610
+ overflow: hidden;
4611
+ text-overflow: ellipsis;
4612
+ white-space: nowrap;
4467
4613
  }.remove {
4468
4614
  position: absolute;
4469
4615
  display: flex;
@@ -6055,4 +6201,116 @@ tfoot .table-cell {
6055
6201
 
6056
6202
  .pane-header + .toolbar-flat {
6057
6203
  margin-top: 21px;
6204
+ }.tree-view {
6205
+ display: flex;
6206
+ flex-flow: column;
6207
+ outline: 0;
6208
+ }
6209
+
6210
+ .tree-node {
6211
+ display: flex;
6212
+ width: 100%;
6213
+ min-height: 36px;
6214
+ padding: 0 8px;
6215
+ align-items: center;
6216
+ border-radius: var(--radius-half);
6217
+ color: var(--foreground);
6218
+ cursor: pointer;
6219
+ font-size: 14px;
6220
+ gap: 8px;
6221
+ outline: 0;
6222
+ transition: 150ms var(--swift-out);
6223
+ transition-property: background, color;
6224
+ user-select: none;
6225
+ }
6226
+ @media (hover: hover) {
6227
+ .tree-node:hover {
6228
+ background: var(--surface-hover);
6229
+ }
6230
+ }
6231
+ .tree-node.is-highlighted {
6232
+ background: var(--surface-hover);
6233
+ }
6234
+
6235
+ .tree-node-line-area {
6236
+ display: flex;
6237
+ align-self: stretch;
6238
+ flex-shrink: 0;
6239
+ }
6240
+
6241
+ .tree-indent {
6242
+ position: relative;
6243
+ width: 20px;
6244
+ align-self: stretch;
6245
+ flex-shrink: 0;
6246
+ pointer-events: none;
6247
+ }
6248
+ .tree-indent.has-line::before {
6249
+ content: "";
6250
+ position: absolute;
6251
+ top: 0;
6252
+ bottom: 0;
6253
+ left: 9px;
6254
+ width: 1px;
6255
+ background: var(--surface-stroke);
6256
+ }
6257
+
6258
+ .tree-connector {
6259
+ position: relative;
6260
+ width: 20px;
6261
+ align-self: stretch;
6262
+ flex-shrink: 0;
6263
+ pointer-events: none;
6264
+ }
6265
+ .tree-connector:not(.is-last)::before {
6266
+ content: "";
6267
+ position: absolute;
6268
+ top: 0;
6269
+ bottom: 0;
6270
+ left: 9px;
6271
+ width: 1px;
6272
+ background: var(--surface-stroke);
6273
+ }
6274
+ .tree-connector::after {
6275
+ content: "";
6276
+ position: absolute;
6277
+ top: 0;
6278
+ bottom: 50%;
6279
+ left: 9px;
6280
+ right: 0;
6281
+ border-left: 1px solid var(--surface-stroke);
6282
+ border-bottom: 1px solid var(--surface-stroke);
6283
+ border-bottom-left-radius: 6px;
6284
+ }
6285
+
6286
+ .tree-node-expand {
6287
+ display: flex;
6288
+ width: 16px;
6289
+ flex-shrink: 0;
6290
+ align-items: center;
6291
+ justify-content: center;
6292
+ color: var(--foreground-secondary);
6293
+ }
6294
+ .tree-node-expand:not(:empty) {
6295
+ cursor: pointer;
6296
+ }
6297
+
6298
+ .tree-node-color-dot {
6299
+ display: block;
6300
+ width: 8px;
6301
+ height: 8px;
6302
+ border-radius: 50%;
6303
+ flex-shrink: 0;
6304
+ }
6305
+
6306
+ .tree-node-icon {
6307
+ color: var(--foreground-secondary);
6308
+ flex-shrink: 0;
6309
+ }
6310
+
6311
+ .tree-node-label {
6312
+ flex: 1;
6313
+ overflow: hidden;
6314
+ text-overflow: ellipsis;
6315
+ white-space: nowrap;
6058
6316
  }/*$vite$:1*/