snail.vue 2.0.27 → 2.0.29

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.
@@ -1,9 +1,9 @@
1
1
  import * as snail_core from 'snail.core';
2
- import { DateFormat, DateValue, TimeValue, IScope, RunResult, IAsyncScope } from 'snail.core';
3
- import * as snail_view from 'snail.view';
4
- import { ScrollbarOptions, ScrollStatus, CSSClassOptions, BaseStyle, HeightStyle, FlexBoxStyle, WidthStyle, BorderStyle, PaddingStyle, MarginStyle } from 'snail.view';
2
+ import { DateFormat, DateValue, TimeValue, IAsyncScope, IScope, RunResult } from 'snail.core';
5
3
  import * as vue from 'vue';
6
4
  import { Component, ShallowRef, Ref, WatchSource, App } from 'vue';
5
+ import * as snail_view from 'snail.view';
6
+ import { ScrollbarOptions, ScrollStatus, CSSClassOptions, BaseStyle, HeightStyle, FlexBoxStyle, WidthStyle, BorderStyle, PaddingStyle, MarginStyle } from 'snail.view';
7
7
 
8
8
  /**
9
9
  * loading提示框的配置选项
@@ -212,6 +212,12 @@ type DatePickerOptions = {
212
212
  * - 默认 “yyyy-MM-dd"
213
213
  */
214
214
  format?: DateFormat;
215
+ /**
216
+ * 渲染模式
217
+ * - default 默认模式,文本框+图标,文本框填充满+边框
218
+ * - simple 简单模式,有值时才显示文本框,且无边框+不填充满
219
+ */
220
+ mode?: "default" | "simple";
215
221
  /**
216
222
  * 日期最小值
217
223
  * - 选择年月日时,早于此值的年月日不可选
@@ -249,6 +255,12 @@ type TimePickerOptions = {
249
255
  * 时间格式
250
256
  */
251
257
  format?: "HH:mm:ss" | "HH:mm";
258
+ /**
259
+ * 渲染模式
260
+ * - default 默认模式,文本框+图标,文本框填充满+边框
261
+ * - simple 简单模式,有值时才显示文本框,且无边框+不填充满
262
+ */
263
+ mode?: "default" | "simple";
252
264
  /**
253
265
  * 最小时间
254
266
  * - 传入值格式为 "时:分:秒"
@@ -313,6 +325,188 @@ type TimePickerMinuteItem = Required<Pick<TimeValue, "minute" | "hour"> & Disabl
313
325
  */
314
326
  type TimePickerSecondItem = Required<TimeValue & DisabledOptions>;
315
327
 
328
+ /**
329
+ * 组件配置选项
330
+ */
331
+ type ComponentOptions = {
332
+ /**
333
+ * 组件名称;
334
+ * - 确保组件已注册,否则会加载不出来
335
+ */
336
+ name?: string;
337
+ /**
338
+ * Vue组件对象
339
+ * - name未传入时生效
340
+ * - 推荐外部使用 shallowRef 包裹对象,避免响应式的性能问题
341
+ */
342
+ component?: Component;
343
+ /**
344
+ * 组件js文件url地址
345
+ * - 支持#号锚点钻取
346
+ * - name、component未传入时生效
347
+ */
348
+ url?: string;
349
+ };
350
+ /**
351
+ * 提取组件的props类型
352
+ * - 有效的 Props 类型:extends Record<string, any>
353
+ * - 有效类型则返回 Props 自身;否则无效,为undefined
354
+ */
355
+ type PropsType<Props> = Props extends Record<string, any> ? Props : undefined;
356
+ /**
357
+ * 事件发射器类型
358
+ * - 将【组件中组件】转换为vue的 defineEmits 类型
359
+ * - 用于将组件的事件发射器包裹传递到其他组件、class中使用
360
+ */
361
+ type EmitterType<Events extends Record<string, any[]>> = {
362
+ <K extends keyof Events>(event: K, ...payload: Events[K]): any;
363
+ };
364
+ /**
365
+ * 提取【组件插槽】类型
366
+ */
367
+ type SlotsType<Slots extends Record<string, any>> = {
368
+ [key in keyof Slots]: (props: Slots[key]) => any;
369
+ };
370
+ /**
371
+ * 提取【组件事件】类型
372
+ * - 将【组件事件】中的key首字母小写,追加上on前缀;key对应的value为监听函数参数
373
+ * - T的类型约束:Record<string, unknown[]>
374
+ */
375
+ type EventsType<Events> = Events extends Record<string, unknown[]> ? ({
376
+ [key in keyof Events as `on${Capitalize<string & key>}`]?: (...args: Events[key]) => void;
377
+ }) : never;
378
+ /**
379
+ * 组件绑定 配置选项
380
+ * - Props、Events、Model 为可选泛型,分别约束 props、events、model 属性
381
+ * - 若泛型类型无效,则对应属性类型强制为undefined;详细参照对应属性说明
382
+ */
383
+ type ComponentBindOptions<Props = void, Model = void> = {
384
+ /**
385
+ * 传递给组件的属性值,执行 v-bind 绑定
386
+ * - key为属性名称,遵循vue解析规则;若绑定事件,则key为 on事件名称 ,事件名称首字母大写
387
+ * - 通过泛型类型 Props 约束,有效类型:Props extends Record<string, any>
388
+ * @see EventsType<Events> 获取组件事件类型
389
+ */
390
+ props?: PropsType<Props>;
391
+ /**
392
+ * 传递给组件的双向绑定数据,执行 v-model 绑定
393
+ * - 使用 ShallowRef/Ref 包裹;推荐 ShallowRef,仅和组件进行.value值交互,避免深层双向影响性能
394
+ * - 通过泛型类型 Model 约束,有效类型: 非void、never、null、undefined等无效类型
395
+ */
396
+ model?: Model extends (void | never | null | undefined) ? undefined : (ShallowRef<Model> | Ref<Model>);
397
+ };
398
+
399
+ /**
400
+ * 公共通用数据结构:
401
+ * 1、在弹窗、模态弹窗、跟随弹窗的效果下复用
402
+ */
403
+
404
+ /**
405
+ * 弹窗配置选项
406
+ * - 约束弹出组件信息
407
+ * - 弹出组件时传递的参数信息
408
+ * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
409
+ */
410
+ type PopupOptions<Props = void, Model = void> = ComponentOptions & ComponentBindOptions<Props, Model> & {
411
+ /**
412
+ * 弹窗动画名
413
+ * - 不传则默认“fade”
414
+ * - 动画规则:打开弹窗时,为 [transition]-in ;关闭弹窗时,为[transition]-out
415
+ * - - 传入 "scale",则打开弹窗为 "scale-in";关闭弹窗时为 "scale-out"
416
+ */
417
+ transition?: string;
418
+ /**
419
+ * 动画持续时间
420
+ * - 配合 transition 使用;单位ms,默认500ms
421
+ * - 外部传入自定义动画时,传入动画持续时间,否则可能导致关闭时动画失效
422
+ */
423
+ transitionDuration?: number;
424
+ /**
425
+ * 自定义class
426
+ * - 绑定到内容组件根元素上
427
+ * - 可以直接在props中指定,无需特殊设置
428
+ class?: string | string[];
429
+ */
430
+ /**
431
+ * 自定义style
432
+ * - 绑定到内容组件根元素上
433
+ * - 可以直接在props中指定,无需特殊设置
434
+ style?: AllStyle;
435
+ */
436
+ /**
437
+ * 弹窗的z-index值
438
+ * - 无特殊情况,建议不指定,内部会自动生成,确保弹窗正确性
439
+ */
440
+ zIndex?: number;
441
+ };
442
+ /**
443
+ * 弹出组件句柄
444
+ */
445
+ type PopupHandle<T> = {
446
+ /**
447
+ * 组件是否在【弹出窗口】中
448
+ * - popup : 普通弹出弹窗
449
+ * - dialog : 模态对话弹窗
450
+ * - follow : 跟随效果弹窗
451
+ */
452
+ inPopup: Readonly<"popup" | "dialog" | "follow">;
453
+ /**
454
+ * 关闭弹窗
455
+ * @param data 关闭时传递数据
456
+ */
457
+ closePopup(data?: T): void;
458
+ };
459
+ /**
460
+ * 弹窗状态:响应式
461
+ * - open 打开
462
+ * - active 激活,针对Dialog弹窗生效
463
+ * - unactive 非激活,针对Dialog弹窗生效
464
+ * - closed 关闭
465
+ */
466
+ type PopupStatus = ShallowRef<"open" | "active" | "unactive" | "closed">;
467
+ /**
468
+ * 弹窗状态 配置选项
469
+ */
470
+ type PopupStatusOptions = {
471
+ /**
472
+ * 弹窗状态:响应式
473
+ */
474
+ popupStatus: PopupStatus;
475
+ };
476
+ /**
477
+ * 弹窗对象描述器
478
+ * - 给弹窗容器使用,传递过去作为props使用
479
+ */
480
+ type PopupDescriptor<Options extends PopupOptions, ExtOptions> = PopupStatusOptions & {
481
+ /**
482
+ * 弹窗Id
483
+ * - 自动分配,全局唯一
484
+ */
485
+ popupId: string;
486
+ /**
487
+ * 弹窗配置选项
488
+ * - 由外部传递过来的业务数据配置信息
489
+ * - 约束具体弹窗的业务组件和业务组件所需props等数据
490
+ */
491
+ options: Options;
492
+ /**
493
+ * 弹窗扩展配置选项
494
+ * - 由 popup、follow等方法内部组件:如关闭弹窗方法、钩子函数等
495
+ * - 配合业务组件使用的一些配置数据
496
+ */
497
+ extOptions: ExtOptions;
498
+ /**
499
+ * 实际分配的zIndex值
500
+ */
501
+ zIndex: number;
502
+ /**
503
+ * 弹窗动画名
504
+ * - 约束打开、关闭动画;基于 PopupOptions.transition 构建出来的
505
+ * - 具体使用方,将此值绑定的根元素上
506
+ */
507
+ popupTransition: ShallowRef<string>;
508
+ };
509
+
316
510
  /**
317
511
  * 头部配置选项
318
512
  * - title 将作为头部标题,无则不展示标题区域
@@ -470,2391 +664,2240 @@ type WrapperOptions = {
470
664
  type WrapperEvents = FooterEvents;
471
665
 
472
666
  /**
473
- * 树形 数据相关的基础实体结构
474
- * 1、封装一些基础实体;如树形节点数据结构
475
- * 2、配合树形组件使用;如select的多级筛选,树组件等
476
- * 3、封装树的基础共性操作,如显隐判断、搜索查询等
477
- */
478
- /**
479
- * 树节点
480
- * - 仅提供树节点基础属性;可以基于 Extend 为 TreeNode 扩展节点属性
667
+ * 模态弹窗数据结构
481
668
  */
482
- type TreeNode<T, Extend extends Record<string, any> | void = void> = {
483
- /**
484
- * 展示文本
485
- */
486
- text: string;
487
- /**
488
- * 附带数据
489
- */
490
- data?: T;
491
- /**
492
- * 子选择项 数据源
493
- */
494
- children?: TreeNode<T, Extend>[];
495
- } & (Extend extends void ? {} : Extend);
669
+
496
670
  /**
497
- * 树节点 扩展
498
- * - 配合 树上下文 使用
671
+ * 模态弹窗 配置选项
672
+ * - 继承 ComponentOptions ,动态加载组件
673
+ * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
499
674
  */
500
- type TreeNodeExtend = {
675
+ type DialogOptions<Props = void, Model = void> = PopupOptions<Props, Model> & {
501
676
  /**
502
- * 节点Id,确保唯一
503
- * - 不传入则内部自动 newId()
677
+ * 包裹器配置
678
+ * - 若传入配置,则启用弹窗包裹;弹窗打开时使用`Wrapper`包裹弹窗内容组件
504
679
  */
505
- readonly id?: string;
680
+ wrapper?: Pick<WrapperOptions, "header" | "content" | "footer">;
506
681
  /**
507
- * 是否可点击
508
- * - true 此节点可点击,点击时触发 click 事件
509
- * - false 此节点不可点击
682
+ * 禁用【遮罩层】
683
+ * - 目前没实现,先忽略
684
+ maskDisabled?: boolean;
510
685
  */
511
- clickable?: boolean;
512
686
  /**
513
- * 是否可搜索
514
- * - 为true时,此节点可搜索
687
+ * 点击【遮罩层】时是否关闭弹窗
688
+ * - 针对无遮罩层的弹窗,则点击非【弹窗组件】区域时是否关闭
515
689
  */
516
- searchable?: boolean;
690
+ closeOnMask?: boolean;
517
691
  /**
518
- * 是否隐藏
519
- * - true 隐藏 节点 和 子节点
520
- * - 隐藏组件,不参与点击、搜索等
692
+ * 按下【ESC】健时是否关闭弹窗
521
693
  */
522
- hidden?: boolean;
694
+ closeOnEscape?: boolean;
523
695
  /**
524
- * 是否固定
525
- * - true 固定 节点;则节点不参与 搜索、移动等动态操作
696
+ * 模态弹窗的自定义class
697
+ * - 绑定到模态弹窗的根元素上
526
698
  */
527
- fixed?: boolean;
699
+ rootClass?: string | string[];
528
700
  };
529
701
  /**
530
- * 树的基础上下文对象
702
+ * 弹窗组件句柄
703
+ * - 用于在弹窗内容组件中进行模式判断和关闭
531
704
  */
532
- interface ITreeBaseContext<T> {
533
- /**
534
- * 执行搜索
535
- * @param text 搜索文本
536
- */
537
- doSearch(text: string): void;
538
- /**
539
- * 是否是【已激活】节点
540
- * @param node 要判断的节点
541
- * @returns true 是已激活节点,false 否
542
- */
543
- isActived(node: TreeNode<T>): boolean;
544
- /**
545
- * 是否是【补丁】节点
546
- * - 子节点搜索命中时,父级路径上节点没命中,则作父级路径节点作为路径修补节点存在,避免命中子节点展示不出来
547
- * @param node 要判断的节点
548
- * @returns true 是补丁节点,false 不是补丁节点
549
- */
550
- isPatched(node: TreeNode<T>): boolean;
551
- /**
552
- * 是否显示【树节点】
553
- * @param node 要判断的节点
554
- * @param needPatched 是否需要【补丁】节点。true时(补丁节点始终显示);false时(根据hidden和搜索结果判断)
555
- * @returns 能显示返回true;否则返回false
556
- */
557
- isShow(node: TreeNode<T, TreeNodeExtend>, needPatched: boolean): boolean;
558
- /**
559
- * 是否显示指定【树节点】的子节点
560
- * - 不会判断node节点自身是否可显示
561
- * @param node 要判断的节点
562
- * @param needPatched 是否需要【补丁】节点。true时(补丁节点始终显示);false时(根据hidden和搜索结果判断)
563
- * @returns 能显示返回true;否则返回false
564
- */
565
- isShowChildren(node: TreeNode<T, TreeNodeExtend>, needPatched: boolean): boolean;
566
- /**
567
- * 获取指定【树节点】的路径
568
- * @param node 树节点
569
- * @returns 从【顶级节点】->【指定节点】的全路径数据
570
- */
571
- getPath(node: TreeNode<T, TreeNodeExtend>): TreeNode<T, TreeNodeExtend>[];
572
- /**
573
- * 获取指定【树节点】的唯一Key值
574
- * - 相同节点确保唯一,且不变;用于唯一标记此节点
575
- * @param node
576
- * @returns 返回节点唯一Key值
577
- */
578
- getKey(node: TreeNode<T>): string;
579
- }
580
- /**
581
- * 树搜索结果
582
- */
583
- type TreeSearchResult<T> = {
584
- /**
585
- * 匹配上的节点集合
586
- */
587
- matched: TreeNode<T>[];
588
- /**
589
- * 未匹配上的节点集合
590
- */
591
- failed: TreeNode<T>[];
592
- /**
593
- * 搜索时的【补丁】节点集合
594
- * - 子节点搜索命中时,父级路径上节点没命中,则作父级路径节点作为路径修补节点存在,避免命中子节点展示不出来
595
- * - 仅在有搜索条件时成立,补丁节点同时在【failed】节点集合中
596
- */
597
- patched: TreeNode<T>[];
598
- };
599
-
600
- /**
601
- * 搜索组件配置选项
602
- */
603
- type SearchOptions = ReadonlyOptions & PlaceholderOptions & {
705
+ type DialogHandle<T> = PopupHandle<T> & {
604
706
  /**
605
- * 启用【自动完成】
606
- * - true 时,只要文本变化了,就触发 search 事件
607
- * - false 时,只有点击【搜索】按钮,才触发 search 事件
707
+ * 注册监听【弹窗关闭】事件方法
708
+ * - 仅支持注册一次,多次注册以最后一次的为准
709
+ * @param fn 关闭时执行的钩子函数,支持异步;;调用后若返回false时将阻止弹窗关闭
608
710
  */
609
- autoComplete?: boolean;
711
+ onBeforeClose(fn: (data?: T) => false | undefined | Promise<false | undefined>): void;
610
712
  };
611
713
  /**
612
- * 搜索组件事件
714
+ * 弹窗包裹器操作句柄
613
715
  */
614
- type SearchEvents = {
716
+ type DialogWrapperHandle<T> = {
615
717
  /**
616
- * 事件:执行搜索
617
- * @param value 为搜索文本
718
+ * 注册【构建数据】事件方法
719
+ * - 仅在Dialog为使用了wrapper模式时生效,用于在【确认】按钮点击时,构建实际内容组件中的数据
720
+ * - 仅支持注册一次,多次注册以最后一次的为准
721
+ * @param fn 取数据时执行的钩子函数,支持异步;若需要阻止弹窗关闭则`fn`方法直接报错即可
618
722
  */
619
- search: [value: string];
723
+ onBuildData(fn: () => T | Promise<T>): void;
620
724
  };
621
725
 
622
726
  /**
623
- * 树组件 相关实体
624
- * - 基于 snail.core中的TreeNode做扩展
727
+ * 确认弹窗配置选项
728
+ * - title 弹窗标题,默认“提示”
729
+ * - message 确认提示信息;默认“请确认?”;支持html格式内容
625
730
  */
731
+ type ConfirmOptions = TitleOptions & MessageOptions & ConfirmAreaOptions & {};
626
732
 
627
733
  /**
628
- * 树组件 配置选项
734
+ * 图标配置选项
735
+ * - title 作为鼠标移入图标时的提示
629
736
  */
630
- type TreeOptions<T> = {
631
- /**
632
- * 树节点 集合
633
- */
634
- nodes: TreeNodeModel<T>[];
737
+ type IconOptions = TitleOptions & {
635
738
  /**
636
- * 树节点搜索配置
637
- * - 不配置则不启用【搜索】功能
739
+ * 是否为自定义图标
740
+ * - 为true时,外部通过插槽自己绘制图标
741
+ * - 为false时,使用`type`值绘制对应的内置图标
742
+ * - 默认false
638
743
  */
639
- search?: SearchOptions;
744
+ custom?: boolean;
640
745
  /**
641
- * 树节点的配置选项
746
+ * 内置的图标类型
747
+ * - `custom`为false时生效
642
748
  */
643
- nodeOptions?: TreeNodeRenderOptions;
644
- };
645
- /**
646
- * 树组件事件
647
- */
648
- type TreeEvents<T> = TreeNodeEvents<T> & {
749
+ type?: IconType;
649
750
  /**
650
- * 搜索完成后
651
- * @param text 搜索文本
751
+ * 是否是按钮图标
752
+ * - true时,鼠标移入时 cursor:pointer;
652
753
  */
653
- searched: [text: string];
654
- };
655
- /**
656
- * 树节点 组件配置选项
657
- */
658
- type TreeNodeOptions<T> = {
754
+ button?: boolean;
659
755
  /**
660
- * 要渲染的树节点
756
+ * 图标大小
757
+ * - 可指定对象,如 { width: 24, height: 24 },则图标大小为 24 * 24
758
+ * - 可指定数字,如 24,则图标大小为 24 * 24
759
+ * - 默认 24
661
760
  */
662
- node: TreeNodeModel<T>;
761
+ size?: number | {
762
+ width?: number;
763
+ height?: number;
764
+ };
663
765
  /**
664
- * 父节点
766
+ * 图标颜色
665
767
  */
666
- parent?: TreeNodeModel<T>;
768
+ color?: string;
667
769
  /**
668
- * 树节点所处层级
669
- * - 用于控制缩进
770
+ * 鼠标移入时的图标颜色
670
771
  */
671
- level: number;
772
+ hoverColor?: string;
672
773
  /**
673
- * 树节点的配置选项
774
+ * 旋转角度
775
+ * - 默认0
776
+ * - 通过:transform: rotate(1.06); 实现
674
777
  */
675
- options?: TreeNodeRenderOptions;
778
+ rotate?: number;
676
779
  /**
677
- * 树组件的上下文对象
780
+ * 图标透明度
781
+ * - 不传入,默认1
678
782
  */
679
- context: ITreeBaseContext<T>;
680
- };
681
- /**
682
- * 树节点事件
683
- */
684
- type TreeNodeEvents<T> = {
783
+ opacity?: number;
685
784
  /**
686
- * 树节点 点击事件
687
- * @param node 点击的树节点
688
- * @param parents node的父节点路径,从【顶级父节点】->【直属父节点】
785
+ * 图标边样式
689
786
  */
690
- click: [node: TreeNodeModel<T>, parents?: TreeNodeModel<T>[]];
691
- };
692
- /**
693
- * 树节点数据结构
694
- * - 简化外部使用 树节点 时需要频繁写 TreeNode<T, TreeNodeExtend>;
695
- * - 避免和 Vue 组件“tree-node.vue”命名重复
696
- * - 推荐使用时,将此对象做响应式,否则 .hidden 等 更新时,无法实时反应到树上
697
- */
698
- type TreeNodeModel<T> = TreeNode<T, TreeNodeExtend>;
699
- /**
700
- * 树节点 渲染配置选项
701
- */
702
- type TreeNodeRenderOptions = {
787
+ border?: string;
703
788
  /**
704
- * 节点展开层级
705
- * - 不传入则默认展开所有
706
- * - 否则展开传入的层级;从2开始;第一级始终展开;如2则1、2层级展开
707
- * -
789
+ * 图标圆角样式
708
790
  */
709
- expandLevel?: number;
791
+ radius?: string;
710
792
  /**
711
- * 是否禁用【折叠】子节点操作
712
- * - true 时禁用 折叠操作
793
+ * 图标背景样式
713
794
  */
714
- foldDisabled?: boolean;
795
+ background?: string;
715
796
  /**
716
- * 重写树节点
717
- * - true 时,插槽作为完整树节点对象;
718
- * - false 时,插槽仅作为扩展元素,如自定义操作等
797
+ * 图形伸展
798
+ * - svg.viewBox 属性
799
+ * - 为空则默认“0 0 1024 1024”
719
800
  */
720
- rewrite?: boolean;
801
+ viewBox?: string;
721
802
  };
722
803
  /**
723
- * 树节点 插槽配置选项
804
+ * 图标类型
805
+ * - 状态类:
806
+ * - - success 成功图标,对勾
807
+ * - - error 错误
808
+ * - - warn 警告图标
809
+ * - 操作类:
810
+ * - - close 关闭 用作数据删除,弹窗关闭
811
+ * - - trash 垃圾桶图标,常用于【删除】操作
812
+ * - - download 下载
813
+ * - - print 打印
814
+ * - - edit 编辑
815
+ * - - pause 暂停,两道竖线
816
+ * - 指向类:
817
+ * - - arrow 向右箭头
818
+ * - - datepicker 日期选择器
819
+ * - - timepicker 时间选择器
820
+ * - 其他类:
821
+ * - - plus 加号
822
+ * - - subtract 减号
823
+ * - - more 更多,默认垂直三个点
824
+ * - - grip 紧握图标,垂直方向,一般用于拖动句柄
724
825
  */
725
- type TreeNodeSlotOptions<Node> = {
726
- /**
727
- * 当前节点
728
- */
729
- node: Node;
826
+ type IconType = "success" | "error" | "warn" | "close" | "trash" | "download" | "print" | "edit" | "pause" | "arrow" | "datepicker" | "timepicker" | "plus" | "subtract" | "more" | "grip";
827
+
828
+ /**
829
+ * Toast配置选项
830
+ */
831
+ type ToastOptions = {
730
832
  /**
731
- * 父节点
833
+ * 提示类型,基于类型展示图标
732
834
  */
733
- parent?: Node;
835
+ type?: IconType;
734
836
  /**
735
- * 所处层级
837
+ * 提示消息;支持html格式
736
838
  */
737
- level: number;
839
+ message: string;
738
840
  /**
739
- * 点击节点
841
+ * 提示显示时间
842
+ * - 单位毫秒,默认1500ms
740
843
  */
741
- click(): void;
844
+ duration?: number;
742
845
  /**
743
- * 切换【子节点】折叠窗台
846
+ * 关闭按钮是否禁用
744
847
  */
745
- toggle(): void;
848
+ closeDisabled?: boolean;
746
849
  };
747
850
 
748
851
  /**
749
- * Table配置选项
852
+ * 跟随效果 弹窗
750
853
  */
751
- type TableOptions = Pick<ScrollOptions, "scroll" | "barSize"> & {
752
- /**
753
- * 是否启用表格边框
754
- */
755
- border?: boolean;
756
- /**
757
- * 表头样式
758
- * - 约束高度和背景颜色
759
- * - 后期再增加其他的
760
- */
761
- headerStyle?: BaseStyle & HeightStyle;
762
- /**
763
- * 表尾部样式
764
- * - 约束高度和背景颜色
765
- * - 后期再增加其他的
766
- */
767
- footerStyle?: BaseStyle & HeightStyle;
768
- };
769
- /**
770
- * Table 行配置选项
771
- */
772
- type TableRowOptions = HeightStyle & {};
854
+
773
855
  /**
774
- * Table 列配置选项
775
- * - border 样式需要配合TableOptions.border使用,否则会导致边框线重叠
856
+ * 跟随弹窗 配置选项
857
+ * - 传入的组件,根据配置跟随 target 位置和大小;
858
+ * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
776
859
  */
777
- type TableColOptions = BaseStyle & FlexBoxStyle & WidthStyle & BorderStyle & PaddingStyle;
778
-
860
+ type FollowOptions<Props = void, Model = void> = PopupOptions<Props, Model> & FollowPositionOptions;
779
861
  /**
780
- * 排序组件 配置选项
781
- * - 整理部分SortableJs中的配置,不分逻辑不开放
862
+ * 跟随位置 配置选项
863
+ * - 基于此计算出最终的跟随效果
782
864
  */
783
- type SortOptions<T> = {
784
- /**
785
- * 变化器
786
- * - 在此元素值发生变化时,重新刷新排序面板
787
- * - 如在增加元素时,改变此值实现 新元素 可拖拽排序
788
- */
789
- changer: T;
790
- /**
791
- * 拖动哪个元素
792
- * - 传入类样式选择器;如 .table-row
793
- */
794
- draggable: string;
865
+ type FollowPositionOptions = {
795
866
  /**
796
- * 哪个元素启动拖拽
797
- * - 传入类样式选择器;如 .sort-handle
798
- * - 不传入则默认 draggable
799
- * - 若自定义,则传入 draggable 下的dom元素作为启动拖拽的句柄
867
+ * 启用【宽度】跟随
868
+ * - 为true则和 target 宽度保持一致
869
+ * - false时,宽度由 弹出组件 自己维护
870
+ * - 不管是true、还是false,若宽度超过浏览器最大宽度,会进行强制干预
800
871
  */
801
- handle?: string;
872
+ followWidth?: boolean;
802
873
  /**
803
- * 拖动的元素上增加的类样式
804
- * - 执行拖拽时随着鼠标移动元素,脱离文档流了
805
- * - 可自定义一些样式实现拖动元素的高度、宽度自定义等
806
- * - 默认:snail-sort-drag
874
+ * 启用【高度】跟随
875
+ * - 为true则和 target 高度保持一致
876
+ * - false时,高度由 弹出组件 自己维护
877
+ * - 不管是true、还是false,若高度超过浏览器最大高度,会进行强制干预
807
878
  */
808
- dragClass?: string;
879
+ followHeight?: boolean;
809
880
  /**
810
- * 幽灵元素类样式名称
811
- * - 拖动时在面板上占位的元素
812
- * - 默认:snail-sort-ghost
881
+ * x轴方向上的跟随策略
882
+ * - 支持传入一个或者多个,依次尝试选举最优位置(全宽度展示,否则取最大宽度位置)
883
+ * - 不传入则按照默认策略;["start","end","after","before","center","ratio"]
884
+ * - 可选策略值如下:
885
+ * - - start : 起点跟随,和 target 起始位置(left)一致
886
+ * - - end : 终点跟随,和 target 结束位置(right)一致
887
+ * - - center : 中心跟随,和 target 中心位置一致
888
+ * - - before : 之前跟随,组件在 target 左侧展示
889
+ * - - after : 之后跟随,组件在 target 右侧展示
890
+ * - - ratio : 比例跟随,按比例(target中心点/窗口宽度)锚定位置,动态计算left值。
813
891
  */
814
- ghostClass?: string;
892
+ followX?: FollowStrategy | FollowStrategy[];
815
893
  /**
816
- * 过滤器,不需要进行拖动的元素
817
- * - 传入类样式选择器;如 .sort-handle
818
- * - 实现特定子元素不触发拖动排序功能
894
+ * y轴方向上的跟随策略
895
+ * - 支持传入一个或者多个,依次尝试选举最优位置(全高度展示,否则取最大高度位置)
896
+ * - 不传入则按照默认策略;["after","before","start","end","center","ratio"]
897
+ * - 可选策略值如下:
898
+ * - - start : 起点跟随,和 target 起始位置(top)一致
899
+ * - - end : 终点跟随,和 target 结束位置(bottom)一致
900
+ * - - center : 中心跟随,和 target 中心位置一致
901
+ * - - before : 之前跟随,组件在 target 顶部展示
902
+ * - - after : 之后跟随,组件在 target 底部展示
903
+ * - - ratio : 比例跟随,按比例(target中心点/窗口高度)锚定位置,动态计算top值。
819
904
  */
820
- filter?: string;
905
+ followY?: FollowStrategy | FollowStrategy[];
821
906
  /**
822
- * 排序组
823
- * - 组相同时,可跨组拖拽排序
824
- * - 不传入,则内部生成guid
825
- * -
907
+ * x轴方向上 target 之间的留白空间
908
+ * - 默认0; followX 为 center、ratio 时间距失效
909
+ * - 增加间距,提升展示效果
910
+ * -
826
911
  */
827
- group?: string | SortGroupOptions;
912
+ spaceX?: number;
828
913
  /**
829
- * 动画时间
830
- * - 单位ms;默认150ms
914
+ * y轴方向上 target 之间的留白空间
915
+ * - 默认0;followY 为 center、ratio 时间距失效
916
+ * - 增加间距,提升展示效果
831
917
  */
832
- animation?: number;
918
+ spaceY?: number;
833
919
  /**
834
- * 禁用排序效果
835
- * - 为true时,此容器内元素不能拖动,此不构建sortable实例
920
+ * 和 浏览器客户 端之间的留白空间
921
+ * - 弹出组件 和浏览器客户端窗口之间的【留白空间】
922
+ * - 仅在 弹出组件 计算出来位置紧贴浏览器窗口时生效
923
+ * - 若强制指定了 start、end,则对应的起始、结束位置不受此值影响
836
924
  */
837
- disabled?: boolean;
925
+ spaceClient?: number;
838
926
  /**
839
- * 在当前容器内是否禁用拖拽排序
840
- * - 为true时,此容器内部不能拖拽,但可拖动到其他同名group内
841
- * - 初期想用sort,但作Vue组件属性时,bool类型不传值会自动默认false,和初衷不符
927
+ * 点击【遮罩层】时是否关闭弹窗
928
+ * - 则点击非【跟随组件】区域时是否关闭
842
929
  */
843
- sortDisabled?: boolean;
844
- };
845
- /**
846
- * 排序组件的Group属性配置选项
847
- */
848
- type SortGroupOptions = {
930
+ closeOnMask?: boolean;
849
931
  /**
850
- * 排序组名称;
851
- * - 不传入时自动生成
932
+ * 按下【ESC】健时是否关闭弹窗
852
933
  */
853
- name: string;
934
+ closeOnEscape?: boolean;
854
935
  /**
855
- * 定义从这个列表容器移动出去的设置
856
- * - true:列表容器内的列表单元可以被移出;
857
- * - false:列表容器内的列表单元不可以被移出;
858
- * - "clone":列表单元移出,移动的为该元素的副本;
859
- * - function:用来进行pull的函数判断,可以进行复杂逻辑,在函数中return false/true来判断是否移出;
936
+ * window窗口【resize】时是否关闭弹窗
860
937
  */
861
- pull: true | false | "clone" | SortGroupHook;
938
+ closeOnResize?: boolean;
862
939
  /**
863
- * 用来定义往这个列表容器放置列表单元的的设置
864
- * - true:列表容器可以从其他列表容器内放入列表单元;
865
- * - false:与true相反;
866
- * - string|string[]:代表的是group配置项里定义的name值。如['foo','bar']
867
- * - function:用来进行put的函数判断,可以进行复杂逻辑,在函数中return false/true来判断是否放入;
940
+ * target改变时是否关闭弹窗
941
+ * - target尺寸、位置变化
942
+ * - target点击时
868
943
  */
869
- put: true | false | string | string[] | SortGroupHook;
944
+ closeOnTarget?: boolean;
870
945
  };
871
946
  /**
872
- * 排序组件的Group属性钩子
873
- * - 用于pullput中使用,返回false时不执行pull、put操作
874
- * - @param item 移动的元素
875
- * - @param to 目标容器dom元素
876
- * - @param from 来源容器dom元素
947
+ * 跟随策略
948
+ * - 详细值定义,参照 FollowOptions.followX FollowOptions.followY
877
949
  */
878
- type SortGroupHook = (item: HTMLElement, to: HTMLElement, from: HTMLElement) => void;
950
+ type FollowStrategy = "start" | "center" | "end" | "before" | "after" | "ratio";
879
951
  /**
880
- * 排序组件 事件
952
+ * 跟随弹窗 句柄
953
+ * - 用于在 弹窗组件 内部进行模式判断和关闭跟随弹窗
881
954
  */
882
- type SortEvents = {
883
- /**
884
- * 开始拖拽
885
- */
886
- start: [evt: SortEvent];
887
- /**
888
- * 移动中
889
- */
890
- move: [evt: SortEvent, originalEvent: SortEvent];
955
+ type FollowHandle<T> = PopupHandle<T> & {};
956
+ /**
957
+ * 跟随弹窗 扩展配置
958
+ */
959
+ type FollowExtend = PopupStatusOptions & {
891
960
  /**
892
- * 移动到新容器时
961
+ * 跟随的目标元素
893
962
  */
894
- add: [evt: SortEvent];
963
+ target: Element;
895
964
  /**
896
- * 从当前容器移除时
965
+ * x轴方向的跟随策略:响应式
966
+ * - 基于外部传入的跟随策略,计算选举出来的最优策略值
897
967
  */
898
- remove: [evt: SortEvent];
968
+ followX: ShallowRef<FollowStrategy>;
899
969
  /**
900
- * 结束拖拽
970
+ * y轴方向的跟随策略:响应式
971
+ * - 基于外部传入的跟随策略,计算选举出来的最优策略值
901
972
  */
902
- end: [evt: SortEvent];
973
+ followY: ShallowRef<FollowStrategy>;
903
974
  /**
904
- * 元素排序顺序变化
905
- * @param oldIndex 旧位置索引值
906
- * @param newIndex 新顺序索引值
975
+ * Follow弹窗是否【钉住】了
976
+ * - 为true时,closeOnMask、closeOnEscape失效
977
+ * - 满足 子弹窗 点击等操作时,不自动销毁父级弹窗
907
978
  */
908
- update: [oldIndex: number, newIndex: number];
979
+ pinned: ShallowRef<boolean>;
909
980
  };
910
981
  /**
911
- * 排序事件对象
982
+ * 跟随策略 配置选项
912
983
  */
913
- type SortEvent = {
914
- /**
915
- * 目标容器
916
- */
917
- to: HTMLElement;
984
+ type FollowStrategyOptions = {
918
985
  /**
919
- * 来源容器
986
+ * x轴的跟随策略
920
987
  */
921
- from: HTMLElement;
988
+ followX?: FollowStrategy;
922
989
  /**
923
- * 被移动的元素
924
- * - 在`group.pull`配置为 clone 时,此值为原始元素,复制元素放到原来位置了
990
+ * x轴的跟随策略
925
991
  */
926
- item: HTMLElement;
992
+ followY?: FollowStrategy;
993
+ };
994
+ /**
995
+ * 跟随选举结果
996
+ */
997
+ type FollowElectResult = {
927
998
  /**
928
- * 副本的元素
929
- * - 在`group.pull`配置为 clone 时
999
+ * 跟随策略
930
1000
  */
931
- clone: HTMLElement;
1001
+ strategy: FollowStrategy;
932
1002
  /**
933
- * 容器中的原序号
1003
+ * 开始位置:x/top
934
1004
  */
935
- oldIndex: number | undefined;
1005
+ start: number;
936
1006
  /**
937
- * 容器中的新序号
1007
+ * 调整后的尺寸(width/height)
1008
+ * - 为undefined表示无需调整尺寸
938
1009
  */
939
- newIndex: number | undefined;
1010
+ size?: number;
940
1011
  };
941
1012
 
942
1013
  /**
943
- * 组件配置选项
1014
+ * 弹窗管理器
944
1015
  */
945
- type ComponentOptions = {
1016
+ interface IPopupManager {
946
1017
  /**
947
- * 组件名称;
948
- * - 确保组件已注册,否则会加载不出来
1018
+ * 弹出
1019
+ * - 弹窗位置位置、大小、动画效果等由组件自己完成
1020
+ * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
1021
+ * @param options 弹窗配置选项
1022
+ * @returns 弹窗打开结果,外部可手动关闭弹窗
949
1023
  */
950
- name?: string;
1024
+ popup<T, Props = void, Model = void>(options: PopupOptions<Props, Model>): IAsyncScope<T>;
951
1025
  /**
952
- * Vue组件对象
953
- * - name未传入时生效
954
- * - 推荐外部使用 shallowRef 包裹对象,避免响应式的性能问题
955
- */
956
- component?: Component;
1026
+ * 对话框
1027
+ * - 支持指定模态和非模态对话框
1028
+ * - 默认垂直水平居中展示
1029
+ * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
1030
+ * @param options 弹窗配置选项
1031
+ * @returns 弹窗打开结果,外部可手动关闭弹窗
1032
+ */
1033
+ dialog<T, Props = void, Model = void>(options: DialogOptions<Props, Model>): IAsyncScope<T>;
957
1034
  /**
958
- * 组件js文件url地址
959
- * - 支持#号锚点钻取
960
- * - namecomponent未传入时生效
1035
+ * 跟随弹窗
1036
+ * - 跟随指定的target对象,可跟随位置、大小
1037
+ * @see ComponentBindOptions 了解 PropsModel 泛型参数的含义
1038
+ * @param target 跟随的目标元素
1039
+ * @param options 跟随配置选项
1040
+ * @returns 弹窗异步作用域,外部可手动关闭弹窗
961
1041
  */
962
- url?: string;
963
- };
964
- /**
965
- * 提取组件的props类型
966
- * - 有效的 Props 类型:extends Record<string, any>
967
- * - 有效类型则返回 Props 自身;否则无效,为undefined
968
- */
969
- type PropsType<Props> = Props extends Record<string, any> ? Props : undefined;
970
- /**
971
- * 事件发射器类型
972
- * - 将【组件中组件】转换为vue的 defineEmits 类型
973
- * - 用于将组件的事件发射器包裹传递到其他组件、class中使用
974
- */
975
- type EmitterType<Events extends Record<string, any[]>> = {
976
- <K extends keyof Events>(event: K, ...payload: Events[K]): any;
977
- };
978
- /**
979
- * 提取【组件插槽】类型
980
- */
981
- type SlotsType<Slots extends Record<string, any>> = {
982
- [key in keyof Slots]: (props: Slots[key]) => any;
983
- };
984
- /**
985
- * 提取【组件事件】类型
986
- * - 将【组件事件】中的key首字母小写,追加上on前缀;key对应的value为监听函数参数
987
- * - T的类型约束:Record<string, unknown[]>
988
- */
989
- type EventsType<Events> = Events extends Record<string, unknown[]> ? ({
990
- [key in keyof Events as `on${Capitalize<string & key>}`]?: (...args: Events[key]) => void;
991
- }) : never;
992
- /**
993
- * 组件绑定 配置选项
994
- * - Props、Events、Model 为可选泛型,分别约束 props、events、model 属性
995
- * - 若泛型类型无效,则对应属性类型强制为undefined;详细参照对应属性说明
996
- */
997
- type ComponentBindOptions<Props = void, Model = void> = {
1042
+ follow<T, Props = void, Model = void>(target: HTMLElement, options: FollowOptions<Props, Model>): IAsyncScope<T>;
998
1043
  /**
999
- * 传递给组件的属性值,执行 v-bind 绑定
1000
- * - key为属性名称,遵循vue解析规则;若绑定事件,则key为 on事件名称 ,事件名称首字母大写
1001
- * - 通过泛型类型 Props 约束,有效类型:Props extends Record<string, any>
1002
- * @see EventsType<Events> 获取组件事件类型
1044
+ * 打开【确认】弹窗
1045
+ * @param title 弹窗标题
1046
+ * @param message 确认提示信息,支持html片段
1047
+ * @param options 确认弹窗其他配置信息
1048
+ * @returns 弹窗打开结果,外部可手动关闭弹窗
1003
1049
  */
1004
- props?: PropsType<Props>;
1050
+ confirm(title: string, message: string, options?: Omit<ConfirmOptions, "title" | "message">): IAsyncScope<boolean>;
1005
1051
  /**
1006
- * 传递给组件的双向绑定数据,执行 v-model 绑定
1007
- * - 使用 ShallowRef/Ref 包裹;推荐 ShallowRef,仅和组件进行.value值交互,避免深层双向影响性能
1008
- * - 通过泛型类型 Model 约束,有效类型: 非void、never、null、undefined等无效类型
1052
+ * Toast 提示框
1053
+ * @param type 提示类型:成功、失败、、、
1054
+ * @param message 提示消息
1055
+ * @param options 提示框配置选项
1056
+ * @returns 弹窗打开结果,外部可手动关闭弹窗
1009
1057
  */
1010
- model?: Model extends (void | never | null | undefined) ? undefined : (ShallowRef<Model> | Ref<Model>);
1011
- };
1058
+ toast(type: IconType, message: string, options?: Omit<ToastOptions, "type" | "message">): IScope;
1059
+ }
1012
1060
 
1013
1061
  /**
1014
- * 布局组件 数据结构
1062
+ * 使用【弹窗管理器】
1063
+ * @returns 全新的【弹窗管理器】实例+作用域对象
1015
1064
  */
1065
+ declare function usePopup(): IPopupManager & IScope;
1016
1066
 
1017
1067
  /**
1018
- * 布局组件 配置选项
1068
+ * 选择器 相关数据实体
1019
1069
  */
1020
- type LayoutOptions = {
1070
+
1071
+ /**
1072
+ * 接口:选择器管理器
1073
+ */
1074
+ interface IPickerManager {
1021
1075
  /**
1022
- * 布局方向
1023
- * - horizontal 水平布局:左中右
1024
- * - vertical 垂直布局:上中下
1025
- * - 默认为 `horizontal`
1076
+ * 显示【日期】选择器
1077
+ * @param target 哪个元素触发,基于此元素计算位置
1078
+ * @param options 日期选择器配置选项
1079
+ * @param popupOptions 弹窗配置选项;内部根据情况选择属性使用
1080
+ * @returns 异步任务,可销毁日期选择器;可接收日期选择器的选择值
1081
+ */
1082
+ showDate(target: HTMLElement, options?: DatePickerOptions, popupOptions?: PickerPopupOptions): IAsyncScope<string>;
1083
+ /**
1084
+ * 显示【时间】选择控件
1085
+ * @param target 哪个元素触发,基于此元素计算位置
1086
+ * @param options 时间选择控件配置选项
1087
+ * @param popupOptions 弹窗配置选项;内部根据情况选择属性使用
1088
+ * @returns 异步任务,可销毁时间选择控件;可接收时间选择控件的选择值
1026
1089
  */
1027
- direction?: "horizontal" | "vertical";
1090
+ showTime(target: HTMLElement, options?: TimePickerOptions, popupOptions?: PickerPopupOptions): IAsyncScope<string>;
1091
+ }
1092
+ /**
1093
+ * 选择器弹窗配置选项
1094
+ * - 放开一些属性,方便用户做一些自定义
1095
+ */
1096
+ type PickerPopupOptions = {
1028
1097
  /**
1029
- * 主内容区域配置
1030
- * - 对应插槽名:main;主要内容显示区域,处于布局中的【中】区域
1031
- * - 配置主内容区域的滚动条配置
1098
+ * 弹窗模式
1099
+ * - follow 【默认值】跟随弹窗,跟随制定的target
1100
+ * - dialog 模态弹窗
1032
1101
  */
1033
- main?: Pick<LayoutAraeOptions<void>, "scroll" | "class">;
1102
+ mode?: "dialog" | "follow";
1034
1103
  /**
1035
- * 【左侧】区域配置
1036
- * - 对应插槽名`left` ;`mode` 为 `horizontal` 时生效
1037
- * - 配置滚动条和宽度;宽度不配置时,默认 `fit-content`
1038
- * -
1104
+ * 跟随效果
1105
+ * - mode 为 `follow` 生效
1039
1106
  */
1040
- left?: LayoutAraeOptions<WidthStyle>;
1107
+ follow?: FollowPositionOptions;
1041
1108
  /**
1042
- * 【右测】区域配置
1043
- * - 对应插槽名`right` ;`mode` 为 `horizontal` 时生效
1044
- * - 配置滚动条和宽度;宽度不配置时,默认 `fit-content`
1109
+ * 弹窗配置
1110
+ * - mode 为 `dialog` 生效
1045
1111
  */
1046
- right?: LayoutAraeOptions<WidthStyle>;
1112
+ dialog?: Pick<DialogOptions, "closeOnEscape" | "closeOnMask" | "rootClass">;
1113
+ } /** & FollowPositionOptions */;
1114
+ /**
1115
+ * 选择器扩展
1116
+ */
1117
+ type PickerExtend = {
1047
1118
  /**
1048
- * 【顶部】区域配置
1049
- * - 对应插槽名`top`;`mode` 为 `vertical` 时生效
1050
- * - 配置滚动条和高度;高度不配置时,默认 `fit-content`
1051
- * -
1119
+ * 弹窗管理器
1120
+ * - 方便下级再弹窗,公用一个管理器,方便生命周期管理
1052
1121
  */
1053
- top?: LayoutAraeOptions<HeightStyle>;
1122
+ popup: IPopupManager;
1054
1123
  /**
1055
- * 【底部】区域配置
1056
- * - 对应插槽名`bottom`;`mode` 为 `vertical` 时生效
1057
- * - 配置滚动条和高度;高度不配置时,默认 `fit-content`
1124
+ * 选择器对象,方便内部在弹出选择
1125
+ * - 如日期选择器中,在选择时间
1058
1126
  */
1059
- bottom?: LayoutAraeOptions<HeightStyle>;
1127
+ picker: IPickerManager;
1060
1128
  };
1129
+
1061
1130
  /**
1062
- * 布局组件子区域 配置选项
1131
+ * 树形 数据相关的基础实体结构
1132
+ * 1、封装一些基础实体;如树形节点数据结构
1133
+ * 2、配合树形组件使用;如select的多级筛选,树组件等
1134
+ * 3、封装树的基础共性操作,如显隐判断、搜索查询等
1063
1135
  */
1064
- type LayoutAraeOptions<Style extends WidthStyle | HeightStyle | void> = Style & CSSClassOptions & {
1065
- /**
1066
- * 滚动视图配置
1067
- * - 视图属性:滚动条大小、显示时机
1068
- * - 滚动事件:滚动条显隐、滚动到顶部、底部、、、
1069
- * - 不传入则当前区域`overflow:hidden`溢出隐藏
1070
- */
1071
- scroll?: ScrollOptions & EventsType<ScrollEvents>;
1072
- };
1073
1136
  /**
1074
- * 布局组件的子区域项目 描述
1137
+ * 树节点
1138
+ * - 仅提供树节点基础属性;可以基于 Extend 为 TreeNode 扩展节点属性
1075
1139
  */
1076
- type LayoutAreaItem = {
1140
+ type TreeNode<T, Extend extends Record<string, any> | void = void> = {
1077
1141
  /**
1078
- * 是否可滚动
1142
+ * 展示文本
1079
1143
  */
1080
- scrollable: boolean;
1144
+ text: string;
1081
1145
  /**
1082
- * 内容区域元素的类样式名
1146
+ * 附带数据
1083
1147
  */
1084
- class: string[];
1148
+ data?: T;
1085
1149
  /**
1086
- * css样式
1150
+ * 子选择项 数据源
1087
1151
  */
1088
- style: Record<string, string>;
1089
- };
1090
-
1152
+ children?: TreeNode<T, Extend>[];
1153
+ } & (Extend extends void ? {} : Extend);
1091
1154
  /**
1092
- * 动画组件配置选项
1093
- * - 实现组件入/退场的动画效果
1155
+ * 树节点 扩展
1156
+ * - 配合 树上下文 使用
1094
1157
  */
1095
- type MotionOptions = {
1096
- /**
1097
- * 是否是多元素模式
1098
- * - 为true时,则使用 TransitionGroup 组件实现多元素间动画控制
1099
- * - 为false时,则使用 Transition 组件实现单元素动画控制
1100
- */
1101
- multiple?: boolean;
1158
+ type TreeNodeExtend = {
1102
1159
  /**
1103
- * 动画效果
1104
- * - 为Object时,显式指定 `enter`和`leave`样式,此时应使用`animation`实现动画样式
1105
- * - - 可访问`MOTION`使用内置动画效果
1106
- * - 为string时,为动画的根样式,实现动画效果时:
1107
- * - - 入场动画:`${effect}.enter-active` `${effect}.enter-from` `${effect}.enter-to`
1108
- * - - 退场动画:`${effect}.leave-active` `${effect}.leave-from` `${effect}.leave-to`
1109
- * - 为空时,使用`MOTION.fade`值;
1160
+ * 节点Id,确保唯一
1161
+ * - 不传入则内部自动 newId()
1110
1162
  */
1111
- effect?: MotionEffectOptions | string;
1163
+ readonly id?: string;
1112
1164
  /**
1113
- * 动画持续时间,单位ms,默认200ms
1114
- * - `>0`时生效,否则禁用动画
1165
+ * 是否可点击
1166
+ * - true 此节点可点击,点击时触发 click 事件
1167
+ * - false 此节点不可点击
1115
1168
  */
1116
- duration?: number;
1169
+ clickable?: boolean;
1117
1170
  /**
1118
- * 动画模式
1119
- * - default(默认) 入场和退场动画同时执行
1120
- * - in-out 入场动画先执行,退场动画后执行
1121
- * - out-in 退场动画先执行,入场动画后执行
1122
- * - 在多个元素之间切换时生效,一个元素的显隐切换无效果
1171
+ * 是否可搜索
1172
+ * - 为true时,此节点可搜索
1123
1173
  */
1124
- mode?: "in-out" | "out-in" | "default";
1125
- };
1126
- /**
1127
- * 动画效果配置选项
1128
- */
1129
- type MotionEffectOptions = {
1174
+ searchable?: boolean;
1130
1175
  /**
1131
- * 入场进入时的动画效果
1132
- * - 用于初始化入场动画;最终映射成 Transition 组件的 `enter-active-class` 属性
1176
+ * 是否隐藏
1177
+ * - true 隐藏 节点 子节点
1178
+ * - 隐藏组件,不参与点击、搜索等
1133
1179
  */
1134
- enter?: string;
1180
+ hidden?: boolean;
1135
1181
  /**
1136
- * 退场离开时的动画效果
1137
- * - 用于初始化退场动画;最终映射成 Transition 组件的 `leave-active-class` 属性
1182
+ * 是否固定
1183
+ * - true 固定 节点;则节点不参与 搜索、移动等动态操作
1138
1184
  */
1139
- leave?: string;
1185
+ fixed?: boolean;
1140
1186
  };
1141
-
1142
1187
  /**
1143
- * 折叠面板配置选项
1144
- * - title 折叠面板标题
1145
- * - disabled 禁用折叠效果,始终展开
1188
+ * 树的基础上下文对象
1146
1189
  */
1147
- type FoldOptions = DisabledOptions & TitleOptions & {
1190
+ interface ITreeBaseContext<T> {
1148
1191
  /**
1149
- * 副标题
1150
- * - 跟随在title后
1192
+ * 执行搜索
1193
+ * @param text 搜索文本
1151
1194
  */
1152
- subtitle?: string;
1195
+ doSearch(text: string): void;
1153
1196
  /**
1154
- * 面板头部区域配置
1155
- * - 如指定特定的css式
1197
+ * 是否是【已激活】节点
1198
+ * @param node 要判断的节点
1199
+ * @returns true 是已激活节点,false 否
1156
1200
  */
1157
- header?: CSSClassOptions;
1201
+ isActived(node: TreeNode<T>): boolean;
1158
1202
  /**
1159
- * 面板内容区域配置
1160
- * - 如指定特定的css样式
1203
+ * 是否是【补丁】节点
1204
+ * - 子节点搜索命中时,父级路径上节点没命中,则作父级路径节点作为路径修补节点存在,避免命中子节点展示不出来
1205
+ * @param node 要判断的节点
1206
+ * @returns true 是补丁节点,false 不是补丁节点
1161
1207
  */
1162
- body?: CSSClassOptions;
1163
- };
1164
- /**
1165
- * 折叠状态
1166
- * - expand : 展开状态
1167
- * - fold : 折叠状态
1168
- */
1169
- type FoldStatus = "expand" | "fold";
1208
+ isPatched(node: TreeNode<T>): boolean;
1209
+ /**
1210
+ * 是否显示【树节点】
1211
+ * @param node 要判断的节点
1212
+ * @param needPatched 是否需要【补丁】节点。true时(补丁节点始终显示);false时(根据hidden和搜索结果判断)
1213
+ * @returns 能显示返回true;否则返回false
1214
+ */
1215
+ isShow(node: TreeNode<T, TreeNodeExtend>, needPatched: boolean): boolean;
1216
+ /**
1217
+ * 是否显示指定【树节点】的子节点
1218
+ * - 不会判断node节点自身是否可显示
1219
+ * @param node 要判断的节点
1220
+ * @param needPatched 是否需要【补丁】节点。true时(补丁节点始终显示);false时(根据hidden和搜索结果判断)
1221
+ * @returns 能显示返回true;否则返回false
1222
+ */
1223
+ isShowChildren(node: TreeNode<T, TreeNodeExtend>, needPatched: boolean): boolean;
1224
+ /**
1225
+ * 获取指定【树节点】的路径
1226
+ * @param node 树节点
1227
+ * @returns 从【顶级节点】->【指定节点】的全路径数据
1228
+ */
1229
+ getPath(node: TreeNode<T, TreeNodeExtend>): TreeNode<T, TreeNodeExtend>[];
1230
+ /**
1231
+ * 获取指定【树节点】的唯一Key值
1232
+ * - 相同节点确保唯一,且不变;用于唯一标记此节点
1233
+ * @param node
1234
+ * @returns 返回节点唯一Key值
1235
+ */
1236
+ getKey(node: TreeNode<T>): string;
1237
+ }
1170
1238
  /**
1171
- * 折叠面板组件插槽句柄
1172
- * - 将折叠面板状态和操作共享给插槽中自定义组件使用
1239
+ * 树搜索结果
1173
1240
  */
1174
- type FoldSlotHandle = {
1241
+ type TreeSearchResult<T> = {
1175
1242
  /**
1176
- * 获取折叠面板状态
1177
- * @returns
1243
+ * 匹配上的节点集合
1178
1244
  */
1179
- getStatus(): FoldStatus;
1245
+ matched: TreeNode<T>[];
1180
1246
  /**
1181
- * 设置折叠面板状态
1182
- * @param status 新的状态
1247
+ * 未匹配上的节点集合
1183
1248
  */
1184
- setStatus(status: FoldStatus): void;
1249
+ failed: TreeNode<T>[];
1185
1250
  /**
1186
- * 切换面板状态
1187
- * @returns 新的状态
1251
+ * 搜索时的【补丁】节点集合
1252
+ * - 子节点搜索命中时,父级路径上节点没命中,则作父级路径节点作为路径修补节点存在,避免命中子节点展示不出来
1253
+ * - 仅在有搜索条件时成立,补丁节点同时在【failed】节点集合中
1188
1254
  */
1189
- toggle(): FoldStatus;
1255
+ patched: TreeNode<T>[];
1190
1256
  };
1257
+
1191
1258
  /**
1192
- * 折叠面板事件
1259
+ * 搜索组件配置选项
1193
1260
  */
1194
- type FoldEvents = {
1261
+ type SearchOptions = ReadonlyOptions & PlaceholderOptions & {
1195
1262
  /**
1196
- * 折叠状态发生改变时
1197
- * @param status 折叠状态
1263
+ * 启用【自动完成】
1264
+ * - true 时,只要文本变化了,就触发 search 事件
1265
+ * - false 时,只有点击【搜索】按钮,才触发 search 事件
1198
1266
  */
1199
- change: [status: FoldStatus];
1267
+ autoComplete?: boolean;
1268
+ };
1269
+ /**
1270
+ * 搜索组件事件
1271
+ */
1272
+ type SearchEvents = {
1273
+ /**
1274
+ * 事件:执行搜索
1275
+ * @param value 为搜索文本
1276
+ */
1277
+ search: [value: string];
1200
1278
  };
1201
1279
 
1202
1280
  /**
1203
- * 弹性布局组件配置选项
1281
+ * 树组件 相关实体
1282
+ * - 基于 snail.core中的TreeNode做扩展
1204
1283
  */
1205
- type FlexOptions = {
1284
+
1285
+ /**
1286
+ * 树组件 配置选项
1287
+ */
1288
+ type TreeOptions<T> = {
1206
1289
  /**
1207
- * 主轴方向
1208
- * - css属性:flex-direction
1209
- * - 取值范围:
1210
- * - - row(默认值) 水平主轴,起点在左端
1211
- * - - row-reverse 水平主轴,起点在右端
1212
- * - - column 垂直主轴,起点在上沿
1213
- * - - column-reverse 垂直主轴,起点在下沿
1290
+ * 树节点 集合
1214
1291
  */
1215
- direction?: "row" | "column" | "row-reverse" | "column-reverse";
1292
+ nodes: TreeNodeModel<T>[];
1216
1293
  /**
1217
- * 是否换行
1218
- * - css属性:flex-wrap
1219
- * - 取值范围:
1220
- * - - nowrap(默认值) 不换行,所有 flex 项都排在一行
1221
- * - - wrap 换行,第一行在上方
1222
- * - - wrap-reverse 换行,第一行在下方
1294
+ * 树节点搜索配置
1295
+ * - 不配置则不启用【搜索】功能
1223
1296
  */
1224
- wrap?: "nowrap" | "wrap" | "wrap-reverse";
1297
+ search?: SearchOptions;
1225
1298
  /**
1226
- * 行与列之间的间隙(网格间距)
1227
- * - css属性:gap
1228
- * - row-gap、column-gap的缩写
1229
- * - 举例:gap: "10px 20px" 表示行间距为10px,列间距为20px;gap: "10px" 表示行间距和列间距都为10px
1299
+ * 树节点的配置选项
1230
1300
  */
1231
- gap?: string;
1301
+ nodeOptions?: TreeNodeRenderOptions;
1302
+ };
1303
+ /**
1304
+ * 树组件事件
1305
+ */
1306
+ type TreeEvents<T> = TreeNodeEvents<T> & {
1232
1307
  /**
1233
- * 主轴对齐方式
1234
- * - css属性:justify-content
1235
- * - 取值范围:
1236
- * - - start(默认值) 主轴起点对齐
1237
- * - - end 主轴终点对齐
1238
- * - - center 主轴居中对齐
1239
- * - - between 主轴两端对齐,项目之间间隔平均分布
1240
- * - - around 主轴每个项目两侧间隔平均分布
1241
- * - - evenly 主轴每个项目之间间隔平均分布
1308
+ * 搜索完成后
1309
+ * @param text 搜索文本
1242
1310
  */
1243
- main?: "start" | "end" | "center" | "between" | "around" | "evenly";
1311
+ searched: [text: string];
1312
+ };
1313
+ /**
1314
+ * 树节点 组件配置选项
1315
+ */
1316
+ type TreeNodeOptions<T> = {
1244
1317
  /**
1245
- * 交叉轴对齐方式
1246
- * - css属性:align-items
1247
- * - 取值范围:
1248
- * - - stretch(默认值) 交叉轴拉伸对齐(如果项目未设置高度或设为 auto,将占满整个交叉轴)
1249
- * - - start 交叉轴起点对齐
1250
- * - - end 交叉轴终点对齐
1251
- * - - center 交叉轴居中对齐
1252
- * - - baseline 交叉轴第一行文字基线对齐
1318
+ * 要渲染的树节点
1253
1319
  */
1254
- cross?: "start" | "end" | "center" | "stretch" | "baseline";
1320
+ node: TreeNodeModel<T>;
1255
1321
  /**
1256
- * 多行时的交叉轴对齐方式
1257
- * - css属性:align-content
1258
- * - 取值范围:
1259
- * - - stretch(默认值) 交叉轴拉伸对齐(如果项目未设置高度或设为 auto,将占满整个交叉轴)
1260
- * - - start 交叉轴起点对齐
1261
- * - - end 交叉轴终点对齐
1262
- * - - center 交叉轴居中对齐
1263
- * - - between 交叉轴两端对齐,行之间间隔平均分布
1264
- * - - around 交叉轴每行两侧间隔平均分布
1265
- * - - evenly 交叉轴每行之间间隔平均分布
1322
+ * 父节点
1266
1323
  */
1267
- content?: "start" | "end" | "center" | "stretch" | "between" | "around" | "evenly";
1324
+ parent?: TreeNodeModel<T>;
1268
1325
  /**
1269
- * 启用子项修复
1270
- * - 在`justify-content`启用`space-`相关属性时,子项之间会有间隔,当子项数量较少时,可能出现空间过大的问题,特别时多行的最后一样时
1271
- * - 启动后,会基于子项数量补全最后一行缺失的子项数量,来修复空间过大的问题
1272
- * - 推荐仅在所有子项主轴方向尺寸一样时,否则修复可能不准确
1326
+ * 树节点所处层级
1327
+ * - 用于控制缩进
1273
1328
  */
1274
- repairItem?: boolean;
1329
+ level: number;
1275
1330
  /**
1276
- * flex容器的子项数量
1277
- * - 配合 `repairSpace` 构建修复空间的子项数量
1278
- * - 当 `repairSpace` 启用时,自动监听子项数量变化来动态调整修复空间的子项数量;不启用时忽略
1331
+ * 树节点的配置选项
1279
1332
  */
1280
- itemCount?: number;
1333
+ options?: TreeNodeRenderOptions;
1281
1334
  /**
1282
- * flex容器的子项标签名
1283
- * - 配合 `repairSpace` 构建修复空间的子项元素标签名
1284
- * - 默认值为`div`,即子项元素为`<div>`标签
1285
- * - 可配置为其他标签名,如`span`,则子项元素为`<span>`标签
1335
+ * 树组件的上下文对象
1286
1336
  */
1287
- itemTag?: string;
1337
+ context: ITreeBaseContext<T>;
1338
+ };
1339
+ /**
1340
+ * 树节点事件
1341
+ */
1342
+ type TreeNodeEvents<T> = {
1288
1343
  /**
1289
- * flex容器的子项类样式名
1290
- * - 配合 `repairSpace` 构建修复空间的子项元素类样式名
1291
- * - 推荐设置为一个固定值的类样式名,如`flex-item`,来方便用户通过该类样式名来设置子项元素的样式
1292
- * - 构建的子项,会自动追加一个 "repair-item”的类样式名,来方便用户通过该类样式名来设置修复空间子项元素的样式
1344
+ * 树节点 点击事件
1345
+ * @param node 点击的树节点
1346
+ * @param parents node的父节点路径,从【顶级父节点】->【直属父节点】
1293
1347
  */
1294
- itemClass?: string;
1348
+ click: [node: TreeNodeModel<T>, parents?: TreeNodeModel<T>[]];
1295
1349
  };
1296
-
1297
1350
  /**
1298
- * 弹性容器组件 配置选项
1351
+ * 树节点数据结构
1352
+ * - 简化外部使用 树节点 时需要频繁写 TreeNode<T, TreeNodeExtend>;
1353
+ * - 避免和 Vue 组件“tree-node.vue”命名重复
1354
+ * - 推荐使用时,将此对象做响应式,否则 .hidden 等 更新时,无法实时反应到树上
1299
1355
  */
1300
- type ElasticOptions = ScrollOptions & {
1356
+ type TreeNodeModel<T> = TreeNode<T, TreeNodeExtend>;
1357
+ /**
1358
+ * 树节点 渲染配置选项
1359
+ */
1360
+ type TreeNodeRenderOptions = {
1301
1361
  /**
1302
- * 滚动条弹簧效果
1303
- * - x 仅在x轴方向上启用弹簧效果
1304
- * - y 仅在y轴方向上启用弹簧效果
1305
- * - both :同时启用x轴和y轴的弹簧效果
1362
+ * 节点展开层级
1363
+ * - 不传入则默认展开所有
1364
+ * - 否则展开传入的层级;从2开始;第一级始终展开;如2则1、2层级展开
1365
+ * -
1306
1366
  */
1307
- spring?: "x" | "y" | "both";
1367
+ expandLevel?: number;
1308
1368
  /**
1309
- * 是否启用【下拉刷新】功能
1310
- * - `spring` `y/both`时生效
1311
- * - 满足下拉刷新条件后,触发`refresh`事件,处理完成后调用resolve函数,通知完成刷新数据操作
1369
+ * 是否禁用【折叠】子节点操作
1370
+ * - true 时禁用 折叠操作
1312
1371
  */
1313
- downRefresh?: boolean;
1372
+ foldDisabled?: boolean;
1314
1373
  /**
1315
- * 是否启用【上拉加载】功能
1316
- * - `spring` 为 `y/both`时生效
1317
- * - 满足上拉加载条件后,触发`more`事件,处理完成后调用resolve函数,通知完成加载数据操作
1374
+ * 重写树节点
1375
+ * - true 时,插槽作为完整树节点对象;
1376
+ * - false 时,插槽仅作为扩展元素,如自定义操作等
1318
1377
  */
1319
- upMore?: boolean;
1378
+ rewrite?: boolean;
1320
1379
  };
1321
1380
  /**
1322
- * 弹性容器组件 事件监听
1381
+ * 树节点 插槽配置选项
1323
1382
  */
1324
- type ElasticEvents = ScrollEvents & {
1383
+ type TreeNodeSlotOptions<Node> = {
1325
1384
  /**
1326
- * 刷新数据
1327
- * - 配合 `downRefresh`实现下拉刷新功能
1328
- * @param resolve 处理完成后调用resolve函数,通知完成刷新数据操作
1385
+ * 当前节点
1329
1386
  */
1330
- refresh: [resolve: () => void];
1387
+ node: Node;
1331
1388
  /**
1332
- * 加载更多
1333
- * - 配合 `upMore`实现上拉加载功能
1334
- * @param resolve 处理完成后调用resolve函数,通知完成加载数据操作
1389
+ * 父节点
1335
1390
  */
1336
- more: [resolve: () => void];
1337
- };
1338
- /**
1339
- * 弹性组件 对外暴露属性接口
1340
- */
1341
- type ElasticExpose = {
1391
+ parent?: Node;
1342
1392
  /**
1343
- * 加载刷新数据
1344
- * - 触发下拉刷新数据
1345
- * @returns 异步任务对象,外部感知任务执行完成
1393
+ * 所处层级
1346
1394
  */
1347
- loadRefresh(): Promise<void>;
1395
+ level: number;
1348
1396
  /**
1349
- * 加载更多数据
1350
- * - 触发上拉加载更多数据
1351
- * @returns 异步任务对象,外部感知任务执行完成
1397
+ * 点击节点
1352
1398
  */
1353
- loadMore(): Promise<void>;
1399
+ click(): void;
1400
+ /**
1401
+ * 切换【子节点】折叠窗台
1402
+ */
1403
+ toggle(): void;
1354
1404
  };
1405
+
1355
1406
  /**
1356
- * 弹性组件的弹簧状态信息
1407
+ * Table配置选项
1357
1408
  */
1358
- type ElasticSpringStatus = {
1359
- x: number | undefined;
1409
+ type TableOptions = Pick<ScrollOptions, "scroll" | "barSize"> & {
1360
1410
  /**
1361
- * y轴方向的橡皮筋效果偏移量
1411
+ * 是否启用表格边框
1362
1412
  */
1363
- y: number | undefined;
1413
+ border?: boolean;
1414
+ /**
1415
+ * 表头样式
1416
+ * - 约束高度和背景颜色
1417
+ * - 后期再增加其他的
1418
+ */
1419
+ headerStyle?: BaseStyle & HeightStyle;
1420
+ /**
1421
+ * 表尾部样式
1422
+ * - 约束高度和背景颜色
1423
+ * - 后期再增加其他的
1424
+ */
1425
+ footerStyle?: BaseStyle & HeightStyle;
1364
1426
  };
1427
+ /**
1428
+ * Table 行配置选项
1429
+ */
1430
+ type TableRowOptions = HeightStyle & {};
1431
+ /**
1432
+ * Table 列配置选项
1433
+ * - border 样式需要配合TableOptions.border使用,否则会导致边框线重叠
1434
+ */
1435
+ type TableColOptions = BaseStyle & FlexBoxStyle & WidthStyle & BorderStyle & PaddingStyle;
1365
1436
 
1366
1437
  /**
1367
- * 选项菜单 基础配置选项
1438
+ * 排序组件 配置选项
1439
+ * - 整理部分SortableJs中的配置,不分逻辑不开放
1368
1440
  */
1369
- type SelectBaseOptions<T> = {
1441
+ type SortOptions<T> = {
1370
1442
  /**
1371
- * 【选择项】集合
1443
+ * 变化器
1444
+ * - 在此元素值发生变化时,重新刷新排序面板
1445
+ * - 如在增加元素时,改变此值实现 新元素 可拖拽排序
1372
1446
  */
1373
- items: SelectItem<T>[];
1447
+ changer: T;
1374
1448
  /**
1375
- * 搜索功能配置
1376
- * - 不配置则不启用【搜索】功能
1449
+ * 拖动哪个元素
1450
+ * - 传入类样式选择器;如 .table-row
1377
1451
  */
1378
- search?: SearchOptions;
1452
+ draggable: string;
1379
1453
  /**
1380
- * 是否【多选模式】
1381
- * - 为true时,多选,【选择项】后面出【选择】框;底部出【全选】和【清空已选】
1382
- * - items为多级时,不支持【多选模式】;传入会报错
1454
+ * 哪个元素启动拖拽
1455
+ * - 传入类样式选择器;如 .sort-handle
1456
+ * - 不传入则默认 draggable
1457
+ * - 若自定义,则传入 draggable 下的dom元素作为启动拖拽的句柄
1383
1458
  */
1384
- multiple?: boolean;
1459
+ handle?: string;
1385
1460
  /**
1386
- * 是否显示【路径】
1387
- * - 为true时,显示选项的父级文本路径,用“ / ”分割
1388
- * - 仅针对【单选模式】生效
1461
+ * 拖动的元素上增加的类样式
1462
+ * - 执行拖拽时随着鼠标移动元素,脱离文档流了
1463
+ * - 可自定义一些样式实现拖动元素的高度、宽度自定义等
1464
+ * - 默认:snail-sort-drag
1389
1465
  */
1390
- showPath?: boolean;
1466
+ dragClass?: string;
1391
1467
  /**
1392
- * 是否显示【清空已选】按钮
1393
- * - true:则在弹窗的底部显示【清空已选】按钮,点击时清空所有已选选项
1394
- * - 若存在多级选项,仅在第一级弹窗中显示
1468
+ * 幽灵元素类样式名称
1469
+ * - 拖动时在面板上占位的元素
1470
+ * - 默认:snail-sort-ghost
1395
1471
  */
1396
- showClear?: boolean;
1472
+ ghostClass?: string;
1397
1473
  /**
1398
- * 选择项 follow弹窗样式
1399
- * - 支持指定弹窗高度,如最大高度,不指定则默认尽可能展示全
1474
+ * 过滤器,不需要进行拖动的元素
1475
+ * - 传入类样式选择器;如 .sort-handle
1476
+ * - 实现特定子元素不触发拖动排序功能
1400
1477
  */
1401
- popupStyle?: HeightStyle;
1402
- };
1403
- /**
1404
- * 选项菜单 基础事件
1405
- */
1406
- type SelectBaseEvents<T> = {
1478
+ filter?: string;
1407
1479
  /**
1408
- * 选中的【选择项】改变时
1409
- * - @param values 已选的【选择项】,未选中则为空数组:单选时,为【选择项】路径(父->子);其他情况为已选的【选择项】
1480
+ * 排序组
1481
+ * - 组相同时,可跨组拖拽排序
1482
+ * - 不传入,则内部生成guid
1483
+ * - 为
1410
1484
  */
1411
- change: [values: SelectItem<T>[]];
1485
+ group?: string | SortGroupOptions;
1486
+ /**
1487
+ * 动画时间
1488
+ * - 单位ms;默认150ms
1489
+ */
1490
+ animation?: number;
1491
+ /**
1492
+ * 禁用排序效果
1493
+ * - 为true时,此容器内元素不能拖动,此不构建sortable实例
1494
+ */
1495
+ disabled?: boolean;
1496
+ /**
1497
+ * 在当前容器内是否禁用拖拽排序
1498
+ * - 为true时,此容器内部不能拖拽,但可拖动到其他同名group内
1499
+ * - 初期想用sort,但作Vue组件属性时,bool类型不传值会自动默认false,和初衷不符
1500
+ */
1501
+ sortDisabled?: boolean;
1412
1502
  };
1413
1503
  /**
1414
- * 选项菜单组件的【选择项】
1504
+ * 排序组件的Group属性配置选项
1415
1505
  */
1416
- type SelectItem<T> = TreeNode<T, TreeNodeExtend & {
1506
+ type SortGroupOptions = {
1417
1507
  /**
1418
- * 节点类型
1419
- * - group 分组选择项;可包含子节点
1420
- * - item 选择项;默认值;不可包含子节点,即使传入也会忽略
1421
- */
1422
- type?: "group" | "item";
1423
- }>;
1424
- /**
1425
- * 选项菜单组件 配置选项
1426
- * - value 已选的【选择项】;单选时,为【选择项】路径(父->子);其他情况为已选的【选择项】
1427
- */
1428
- type SelectOptions<T> = ReadonlyOptions & PlaceholderOptions & SelectBaseOptions<T> & ValueOptions<SelectItem<T>[]> & {
1429
- /** 父类<see cref="SelectBaseOptions"/>已有属性:
1430
- * items 【选择项】集合
1431
- * search 启用 【搜索】功能
1432
- * searchPlaceholder 搜索框提示语
1433
- * multiple 是否【多选模式】
1434
- * showPath 显示选项路径
1435
- * popupStyle 弹出的选项选择窗体样式
1508
+ * 排序组名称;
1509
+ * - 不传入时自动生成
1436
1510
  */
1511
+ name: string;
1437
1512
  /**
1438
- * 选项分隔符
1439
- * - 单选有多级时的分割路径;默认为 /
1440
- * - 多选时分割多个选项;默认为 、
1513
+ * 定义从这个列表容器移动出去的设置
1514
+ * - true:列表容器内的列表单元可以被移出;
1515
+ * - false:列表容器内的列表单元不可以被移出;
1516
+ * - "clone":列表单元移出,移动的为该元素的副本;
1517
+ * - function:用来进行pull的函数判断,可以进行复杂逻辑,在函数中return false/true来判断是否移出;
1441
1518
  */
1442
- separator?: string;
1519
+ pull: true | false | "clone" | SortGroupHook;
1520
+ /**
1521
+ * 用来定义往这个列表容器放置列表单元的的设置
1522
+ * - true:列表容器可以从其他列表容器内放入列表单元;
1523
+ * - false:与true相反;
1524
+ * - string|string[]:代表的是group配置项里定义的name值。如['foo','bar']
1525
+ * - function:用来进行put的函数判断,可以进行复杂逻辑,在函数中return false/true来判断是否放入;
1526
+ */
1527
+ put: true | false | string | string[] | SortGroupHook;
1443
1528
  };
1444
1529
  /**
1445
- * 选项菜单 组件 事件
1530
+ * 排序组件的Group属性钩子
1531
+ * - 用于pull和put中使用,返回false时不执行pull、put操作
1532
+ * - @param item 移动的元素
1533
+ * - @param to 目标容器dom元素
1534
+ * - @param from 来源容器dom元素
1446
1535
  */
1447
- type SelectEvents<T> = SelectBaseEvents<T> & {};
1536
+ type SortGroupHook = (item: HTMLElement, to: HTMLElement, from: HTMLElement) => void;
1448
1537
  /**
1449
- * 选项菜单 组件的Slot配置选项
1538
+ * 排序组件 事件
1450
1539
  */
1451
- type SelectSlotOptions = {
1540
+ type SortEvents = {
1452
1541
  /**
1453
- * 清空已选【选择项】
1454
- * @param closeFollow 是否关闭【选择项】Follow弹窗
1455
- * @param stopPropagation 是否停止事件冒泡
1542
+ * 开始拖拽
1456
1543
  */
1457
- clear(closeFollow: boolean, stopPropagation: boolean): void;
1458
- };
1459
- /**
1460
- * 【选项菜单】 组件上下文
1461
- */
1462
- interface ISelectContext<T> extends ITreeBaseContext<T> {
1544
+ start: [evt: SortEvent];
1463
1545
  /**
1464
- * 指定节点是否选中了
1465
- * @param multiple 是否是【多选模式】
1466
- * @param item 要判断的节点
1467
- * @returns true 选中,false 未选中
1546
+ * 移动中
1468
1547
  */
1469
- selected(multiple: boolean, item: SelectItem<T>): boolean;
1548
+ move: [evt: SortEvent, originalEvent: SortEvent];
1470
1549
  /**
1471
- * 获取已选【选择项】的展示文本
1472
- * @param multiple 是否是【多选模式】
1473
- * @param showPath 是否显示路径
1474
- * @returns 已选【选择项】的展示文本
1550
+ * 移动到新容器时
1475
1551
  */
1476
- selectedText(multiple: boolean, showPath: boolean): string;
1477
- }
1478
- /**
1479
- * 【选项菜单】 弹窗组件配置选项
1480
- */
1481
- type SelectPopupOptions<T> = SelectBaseOptions<T> & {
1482
- /** 父类<see cref="SelectBaseOptions"/>已有属性:
1483
- * items 选择项 集合
1484
- * search 启用 【搜索】功能
1485
- * searchPlaceholder 搜索框提示语
1486
- * multiple 是否【多选模式】
1552
+ add: [evt: SortEvent];
1553
+ /**
1554
+ * 从当前容器移除时
1487
1555
  */
1556
+ remove: [evt: SortEvent];
1488
1557
  /**
1489
- * 树形上下文
1558
+ * 结束拖拽
1490
1559
  */
1491
- context: ISelectContext<T>;
1560
+ end: [evt: SortEvent];
1492
1561
  /**
1493
- * 第几级 选项弹窗
1494
- * - 从1开始
1562
+ * 元素排序顺序变化
1563
+ * @param oldIndex 旧位置索引值
1564
+ * @param newIndex 新顺序索引值
1495
1565
  */
1496
- level: number;
1566
+ update: [oldIndex: number, newIndex: number];
1497
1567
  };
1498
1568
  /**
1499
- * 【选项菜单】 弹窗组件事件
1569
+ * 排序事件对象
1500
1570
  */
1501
- type SelectPopupEvents<T> = {
1571
+ type SortEvent = {
1502
1572
  /**
1503
- * 清空选项
1573
+ * 目标容器
1504
1574
  */
1505
- clear: [];
1575
+ to: HTMLElement;
1506
1576
  /**
1507
- * 选项点击事件
1508
- * @param path 选中的【选择项】路径;父->子
1577
+ * 来源容器
1509
1578
  */
1510
- click: [path: SelectItem<T>[]];
1511
- };
1512
- /**
1513
- * 【选项菜单】 弹窗组件扩展
1514
- */
1515
- type SelectPopupExtend = {
1579
+ from: HTMLElement;
1516
1580
  /**
1517
- * 子选项弹窗的销毁定时器
1518
- * - 父级弹窗可根据需要销毁定时器,取消子选择弹窗销毁
1519
- * - 鼠标离开弹窗时,做延迟销毁;避免回到 此弹窗 的父【选择项】时,又重新打开此弹窗
1581
+ * 被移动的元素
1582
+ * - 在`group.pull`配置为 clone 时,此值为原始元素,复制元素放到原来位置了
1520
1583
  */
1521
- childDestroyTimer: ShallowRef<IScope>;
1584
+ item: HTMLElement;
1522
1585
  /**
1523
- * 父级弹窗的pin状态
1524
- * - 可在子弹窗中设置为true,这样父级弹窗就不会自动关闭了
1586
+ * 副本的元素
1587
+ * - 在`group.pull`配置为 clone 时
1525
1588
  */
1526
- parentPinned: ShallowRef<boolean>;
1589
+ clone: HTMLElement;
1590
+ /**
1591
+ * 容器中的原序号
1592
+ */
1593
+ oldIndex: number | undefined;
1594
+ /**
1595
+ * 容器中的新序号
1596
+ */
1597
+ newIndex: number | undefined;
1527
1598
  };
1599
+
1528
1600
  /**
1529
- * 【选项菜单】节点 组件配置选项
1601
+ * 布局组件 数据结构
1530
1602
  */
1531
- type SelectNodeOptions<T> = {
1603
+
1604
+ /**
1605
+ * 布局组件 配置选项
1606
+ */
1607
+ type LayoutOptions = {
1532
1608
  /**
1533
- * 是否为【多选模式】
1609
+ * 布局方向
1610
+ * - horizontal 水平布局:左中右
1611
+ * - vertical 垂直布局:上中下
1612
+ * - 默认为 `horizontal`
1534
1613
  */
1535
- multiple: boolean;
1614
+ direction?: "horizontal" | "vertical";
1536
1615
  /**
1537
- * 要展示的节点
1616
+ * 主内容区域配置
1617
+ * - 对应插槽名:main;主要内容显示区域,处于布局中的【中】区域
1618
+ * - 配置主内容区域的滚动条配置
1538
1619
  */
1539
- item: SelectItem<T>;
1620
+ main?: Pick<LayoutAraeOptions<void>, "scroll" | "class">;
1540
1621
  /**
1541
- * 树形上下文
1622
+ * 【左侧】区域配置
1623
+ * - 对应插槽名`left` ;`mode` 为 `horizontal` 时生效
1624
+ * - 配置滚动条和宽度;宽度不配置时,默认 `fit-content`
1625
+ * -
1542
1626
  */
1543
- context: ISelectContext<T>;
1627
+ left?: LayoutAraeOptions<WidthStyle>;
1544
1628
  /**
1545
- * 是否显示子节点
1629
+ * 【右测】区域配置
1630
+ * - 对应插槽名`right` ;`mode` 为 `horizontal` 时生效
1631
+ * - 配置滚动条和宽度;宽度不配置时,默认 `fit-content`
1546
1632
  */
1547
- showChildren: boolean;
1548
- };
1549
- /**
1550
- * 【选项菜单】节点 组件事件
1551
- */
1552
- type SelectNodeEvents<T> = {
1633
+ right?: LayoutAraeOptions<WidthStyle>;
1553
1634
  /**
1554
- * 鼠标进入事件
1555
- * @param el 【选择项】节点dom元素
1556
- * @param item 【选择项】
1557
- * @param parent 父节点
1635
+ * 【顶部】区域配置
1636
+ * - 对应插槽名`top`;`mode` 为 `vertical` 时生效
1637
+ * - 配置滚动条和高度;高度不配置时,默认 `fit-content`
1638
+ * -
1558
1639
  */
1559
- enter: [el: HTMLDivElement, item: SelectItem<T>, parent?: SelectItem<T>];
1640
+ top?: LayoutAraeOptions<HeightStyle>;
1560
1641
  /**
1561
- * 点击事件
1562
- * @param item 【选择项】
1563
- * @param parent 父节点
1642
+ * 【底部】区域配置
1643
+ * - 对应插槽名`bottom`;`mode` 为 `vertical` 时生效
1644
+ * - 配置滚动条和高度;高度不配置时,默认 `fit-content`
1564
1645
  */
1565
- click: [item: SelectItem<T>, parent?: SelectItem<T>];
1646
+ bottom?: LayoutAraeOptions<HeightStyle>;
1566
1647
  };
1567
-
1568
- /**
1569
- * 基础事件实体
1570
- * 1、把一些常用事件,封装为原子结构,方便复用
1571
- * 2、不强制必须复用,根据自身情况
1572
- */
1573
1648
  /**
1574
- * 事件:点击
1649
+ * 布局组件子区域 配置选项
1575
1650
  */
1576
- type ClickEvents = {
1651
+ type LayoutAraeOptions<Style extends WidthStyle | HeightStyle | void> = Style & CSSClassOptions & {
1577
1652
  /**
1578
- * 单击事件
1653
+ * 滚动视图配置
1654
+ * - 视图属性:滚动条大小、显示时机
1655
+ * - 滚动事件:滚动条显隐、滚动到顶部、底部、、、
1656
+ * - 不传入则当前区域`overflow:hidden`溢出隐藏
1579
1657
  */
1580
- click: [];
1658
+ scroll?: ScrollOptions & EventsType<ScrollEvents>;
1581
1659
  };
1582
1660
  /**
1583
- * 事件:值改变
1584
- * - 描述值的改变过程,新值是什么,改变前的旧值是什么
1661
+ * 布局组件的子区域项目 描述
1585
1662
  */
1586
- type ChangeEvents<T> = {
1663
+ type LayoutAreaItem = {
1587
1664
  /**
1588
- * 值改变;约束新旧值
1589
- * @param newValue 新值
1590
- * @param oldValue 旧值
1665
+ * 是否可滚动
1591
1666
  */
1592
- change: [newValue: T, oldValue?: T];
1593
- };
1594
- /**
1595
- * 事件:移动
1596
- * - 可描述数据索引位置变化
1597
- * - 可用于数组元素拖动排序,调整位置等逻辑
1598
- */
1599
- type MoveEvents = {
1667
+ scrollable: boolean;
1600
1668
  /**
1601
- * 移动事件
1602
- * @param fromIndex 从哪个索引位置开始移动
1603
- * @param toIndex 移动到的索引位置
1669
+ * 内容区域元素的类样式名
1604
1670
  */
1605
- move: [fromIndex: number, toIndex: number];
1671
+ class: string[];
1672
+ /**
1673
+ * css样式
1674
+ */
1675
+ style: Record<string, string>;
1606
1676
  };
1677
+
1607
1678
  /**
1608
- * 事件:删除数据
1609
- * - 描述要删除的具体数据
1679
+ * 动画组件配置选项
1680
+ * - 实现组件入/退场的动画效果
1610
1681
  */
1611
- type DeleteEvents<T> = {
1682
+ type MotionOptions = {
1612
1683
  /**
1613
- * 删除事件
1614
- * @param value 要删除的数据
1684
+ * 是否是多元素模式
1685
+ * - 为true时,则使用 TransitionGroup 组件实现多元素间动画控制
1686
+ * - 为false时,则使用 Transition 组件实现单元素动画控制
1615
1687
  */
1616
- delete: [value?: T];
1688
+ multiple?: boolean;
1689
+ /**
1690
+ * 动画效果
1691
+ * - 为Object时,显式指定 `enter`和`leave`样式,此时应使用`animation`实现动画样式
1692
+ * - - 可访问`MOTION`使用内置动画效果
1693
+ * - 为string时,为动画的根样式,实现动画效果时:
1694
+ * - - 入场动画:`${effect}.enter-active` `${effect}.enter-from` `${effect}.enter-to`
1695
+ * - - 退场动画:`${effect}.leave-active` `${effect}.leave-from` `${effect}.leave-to`
1696
+ * - 为空时,使用`MOTION.fade`值;
1697
+ */
1698
+ effect?: MotionEffectOptions | string;
1699
+ /**
1700
+ * 动画持续时间,单位ms,默认200ms
1701
+ * - `>0`时生效,否则禁用动画
1702
+ */
1703
+ duration?: number;
1704
+ /**
1705
+ * 动画模式
1706
+ * - default(默认) 入场和退场动画同时执行
1707
+ * - in-out 入场动画先执行,退场动画后执行
1708
+ * - out-in 退场动画先执行,入场动画后执行
1709
+ * - 在多个元素之间切换时生效,一个元素的显隐切换无效果
1710
+ */
1711
+ mode?: "in-out" | "out-in" | "default";
1617
1712
  };
1618
1713
  /**
1619
- * 事件:关闭
1714
+ * 动画效果配置选项
1620
1715
  */
1621
- type CloseEvents = {
1716
+ type MotionEffectOptions = {
1622
1717
  /**
1623
- * 关闭事件
1718
+ * 入场进入时的动画效果
1719
+ * - 用于初始化入场动画;最终映射成 Transition 组件的 `enter-active-class` 属性
1624
1720
  */
1625
- close: [];
1721
+ enter?: string;
1722
+ /**
1723
+ * 退场离开时的动画效果
1724
+ * - 用于初始化退场动画;最终映射成 Transition 组件的 `leave-active-class` 属性
1725
+ */
1726
+ leave?: string;
1626
1727
  };
1627
1728
 
1628
1729
  /**
1629
- * 数值控件的数据结构
1630
- */
1631
-
1632
- /**
1633
- * 数值组件的基础配置选项
1730
+ * 折叠面板配置选项
1731
+ * - title 折叠面板标题
1732
+ * - disabled 禁用折叠效果,始终展开
1634
1733
  */
1635
- type NumberBaseOptions = {
1734
+ type FoldOptions = DisabledOptions & TitleOptions & {
1636
1735
  /**
1637
- * 最小值
1736
+ * 副标题
1737
+ * - 跟随在title后
1638
1738
  */
1639
- minValue?: number;
1739
+ subtitle?: string;
1640
1740
  /**
1641
- * 最大值
1741
+ * 面板头部区域配置
1742
+ * - 如指定特定的css式
1642
1743
  */
1643
- maxValue?: number;
1744
+ header?: CSSClassOptions;
1644
1745
  /**
1645
- * 值超过阈值(最大值、最小值)时的处理模式
1646
- * - 默认值为 `keep`;可选取值范围:
1647
- * - - `keep` 保持原样值显示,不做任何处理
1648
- * - - `clamp` 截断超出阈值值,低于最小值时直接取最小值,超过最大值时,强制值为最大值
1649
- * - 值超过阈值时,会自动触发事件,事件名`NumberEvents`的`belowMin`和`exceedMax`
1746
+ * 面板内容区域配置
1747
+ * - 如指定特定的css样式
1650
1748
  */
1651
- clamp?: "keep" | "clamp";
1749
+ body?: CSSClassOptions;
1750
+ };
1751
+ /**
1752
+ * 折叠状态
1753
+ * - expand : 展开状态
1754
+ * - fold : 折叠状态
1755
+ */
1756
+ type FoldStatus = "expand" | "fold";
1757
+ /**
1758
+ * 折叠面板组件插槽句柄
1759
+ * - 将折叠面板状态和操作共享给插槽中自定义组件使用
1760
+ */
1761
+ type FoldSlotHandle = {
1652
1762
  /**
1653
- * 精度,保留几位小数
1654
- * - 要求0、正整数,输入小数则强制整数
1655
- * - 负数、不传入则不处理
1763
+ * 获取折叠面板状态
1764
+ * @returns
1656
1765
  */
1657
- precision?: number;
1766
+ getStatus(): FoldStatus;
1658
1767
  /**
1659
- * 对数值进行千分位格式处理
1660
- * - 默认值为 `disabled`;可选值范围:
1661
- * - `disabled` 禁用千分位功能
1662
- * - `inline` 内联千分位功能
1663
- * - `below` 下拉千分位功能
1768
+ * 设置折叠面板状态
1769
+ * @param status 新的状态
1664
1770
  */
1665
- thousands?: "disabled" | "inline" | "below";
1771
+ setStatus(status: FoldStatus): void;
1666
1772
  /**
1667
- * 是否启用数值大写格式化处理
1668
- * - 为true时,转成中文大写值
1669
- * - 单位自动为“元”,不支持美元等
1670
- * - 如金额时,自动转为壹仟壹佰壹拾壹元叁角叁分
1671
- * - 小数点后面只处理两位(角分);剩余不处理
1773
+ * 切换面板状态
1774
+ * @returns 新的状态
1672
1775
  */
1673
- upper?: boolean;
1776
+ toggle(): FoldStatus;
1777
+ };
1778
+ /**
1779
+ * 折叠面板事件
1780
+ */
1781
+ type FoldEvents = {
1674
1782
  /**
1675
- * 格式化时的放大系数
1676
- * - 用于在格式化千分位、大写时,对实际值进行系数放大,value*formatMultiplier
1677
- * - 仅接收正整数,取值规则为10^n,默认1
1678
- * - 千分位格式化时,仅`thousands`为`below`时才进行放到系数处理
1679
- * - 使用示例例:金额是为万元单位时,这里的放大系数就为 “10000”
1783
+ * 折叠状态发生改变时
1784
+ * @param status 折叠状态
1680
1785
  */
1681
- formatMultiplier?: number;
1682
- /**
1683
- * 前缀字符串
1684
- * - 如金额时,可配置前缀 ¥
1685
- */
1686
- prefix?: string;
1687
- /**
1688
- * 后缀字符串
1689
- * - 如金额时,可配置后缀 元/美元、、
1690
- */
1691
- suffix?: string;
1692
- /**
1693
- * 数值控制器
1694
- * - 便捷加减调整数值的控制按钮
1695
- * - 默认值`disabled`;可选值范围:
1696
- * - - `disabled` 时禁用
1697
- * - - `default` 默认模式,左侧 — 右侧 +
1698
- * - - `right` 右侧模式,+ - 都在右侧
1699
- */
1700
- controls?: "disabled" | "default" | "right";
1701
- /**
1702
- * 数值步长值
1703
- * - `controls` 未禁用时生效
1704
- * - 每次+、- 的步长值
1705
- */
1706
- step?: number;
1786
+ change: [status: FoldStatus];
1707
1787
  };
1788
+
1708
1789
  /**
1709
- * 数值组件的配置选项
1710
- */
1711
- type NumberOptions = PlaceholderOptions & ReadonlyOptions & NumberBaseOptions;
1712
- /**
1713
- * 接口:数值格式化器
1790
+ * 弹性布局组件配置选项
1714
1791
  */
1715
- interface INumberFormatter extends Required<Readonly<Pick<NumberBaseOptions, "minValue" | "maxValue" | "precision" | "thousands" | "upper">>> {
1792
+ type FlexOptions = {
1716
1793
  /**
1717
- * 格式化输入文本
1718
- * @param text 输入文本
1719
- * @param isEnd 是否是输入结束,true时,已经输入结束将进行数值精度处理
1720
- * @returns 数值格式化结果
1794
+ * 主轴方向
1795
+ * - css属性:flex-direction
1796
+ * - 取值范围:
1797
+ * - - row(默认值) 水平主轴,起点在左端
1798
+ * - - row-reverse 水平主轴,起点在右端
1799
+ * - - column 垂直主轴,起点在上沿
1800
+ * - - column-reverse 垂直主轴,起点在下沿
1721
1801
  */
1722
- format(text: string, isEnd: boolean): NumberFormatResult;
1802
+ direction?: "row" | "column" | "row-reverse" | "column-reverse";
1723
1803
  /**
1724
- * 进行阈值检测,检测是否超过设定的最大值、最小值
1725
- * @param number 要检测的数值
1726
- * @returns 检测结果,`number` 新的值,`belowMin`是否低于最小值,`exceedMax`是否超过最大值
1804
+ * 是否换行
1805
+ * - css属性:flex-wrap
1806
+ * - 取值范围:
1807
+ * - - nowrap(默认值) 不换行,所有 flex 项都排在一行
1808
+ * - - wrap 换行,第一行在上方
1809
+ * - - wrap-reverse 换行,第一行在下方
1727
1810
  */
1728
- checkThreshold(number: any): {
1729
- number: number;
1730
- belowMin: boolean;
1731
- exceedMax: boolean;
1732
- };
1811
+ wrap?: "nowrap" | "wrap" | "wrap-reverse";
1733
1812
  /**
1734
- * 对数值文本转大写
1735
- * @param result
1736
- * @returns 大写文本值
1813
+ * 行与列之间的间隙(网格间距)
1814
+ * - css属性:gap
1815
+ * - row-gap、column-gap的缩写
1816
+ * - 举例:gap: "10px 20px" 表示行间距为10px,列间距为20px;gap: "10px" 表示行间距和列间距都为10px
1737
1817
  */
1738
- buildUpper(result: NumberFormatResult): string;
1818
+ gap?: string;
1739
1819
  /**
1740
- * 对数值文本进行千分位格式化
1741
- * @param result
1742
- * @returns 格式化后的文本值
1820
+ * 主轴对齐方式
1821
+ * - css属性:justify-content
1822
+ * - 取值范围:
1823
+ * - - start(默认值) 主轴起点对齐
1824
+ * - - end 主轴终点对齐
1825
+ * - - center 主轴居中对齐
1826
+ * - - between 主轴两端对齐,项目之间间隔平均分布
1827
+ * - - around 主轴每个项目两侧间隔平均分布
1828
+ * - - evenly 主轴每个项目之间间隔平均分布
1743
1829
  */
1744
- buildThousands(result: NumberFormatResult): string;
1830
+ main?: "start" | "end" | "center" | "between" | "around" | "evenly";
1745
1831
  /**
1746
- * 基于步长计算值
1747
- * @param number 要重新计算的数值
1748
- * @param isPlus true为+,false为-
1749
- * @returns 新的数值
1832
+ * 交叉轴对齐方式
1833
+ * - css属性:align-items
1834
+ * - 取值范围:
1835
+ * - - stretch(默认值) 交叉轴拉伸对齐(如果项目未设置高度或设为 auto,将占满整个交叉轴)
1836
+ * - - start 交叉轴起点对齐
1837
+ * - - end 交叉轴终点对齐
1838
+ * - - center 交叉轴居中对齐
1839
+ * - - baseline 交叉轴第一行文字基线对齐
1750
1840
  */
1751
- calcByStep(number: number, isPlus: boolean): number;
1752
- }
1753
- /**
1754
- * 数值格式化结果
1755
- */
1756
- type NumberFormatResult = {
1841
+ cross?: "start" | "end" | "center" | "stretch" | "baseline";
1757
1842
  /**
1758
- * 输入是否是有效输入
1759
- * - `- 0 1 2 3 4 5 6 7 8 9 0 .`算是合法输入
1843
+ * 多行时的交叉轴对齐方式
1844
+ * - css属性:align-content
1845
+ * - 取值范围:
1846
+ * - - stretch(默认值) 交叉轴拉伸对齐(如果项目未设置高度或设为 auto,将占满整个交叉轴)
1847
+ * - - start 交叉轴起点对齐
1848
+ * - - end 交叉轴终点对齐
1849
+ * - - center 交叉轴居中对齐
1850
+ * - - between 交叉轴两端对齐,行之间间隔平均分布
1851
+ * - - around 交叉轴每行两侧间隔平均分布
1852
+ * - - evenly 交叉轴每行之间间隔平均分布
1760
1853
  */
1761
- readonly valid: boolean;
1854
+ content?: "start" | "end" | "center" | "stretch" | "between" | "around" | "evenly";
1762
1855
  /**
1763
- * 有效的数值
1764
- * - undefined时,输入无法转换成有效的数值
1856
+ * 启用子项修复
1857
+ * - 在`justify-content`启用`space-`相关属性时,子项之间会有间隔,当子项数量较少时,可能出现空间过大的问题,特别时多行的最后一样时
1858
+ * - 启动后,会基于子项数量补全最后一行缺失的子项数量,来修复空间过大的问题
1859
+ * - 推荐仅在所有子项主轴方向尺寸一样时,否则修复可能不准确
1765
1860
  */
1766
- readonly number: number | undefined;
1861
+ repairItem?: boolean;
1767
1862
  /**
1768
- * 数值的显示文本
1769
- * - 无千分位等处理的数值显示文本
1770
- * - 若需要在行内显示 千分位 格式文本,需要单独处理
1863
+ * flex容器的子项数量
1864
+ * - 配合 `repairSpace` 构建修复空间的子项数量
1865
+ * - `repairSpace` 启用时,自动监听子项数量变化来动态调整修复空间的子项数量;不启用时忽略
1771
1866
  */
1772
- readonly text: string;
1867
+ itemCount?: number;
1773
1868
  /**
1774
- * 格式化数值时发生的错误
1775
- * - 输入数值有效,但是格式化时发生错误了
1869
+ * flex容器的子项标签名
1870
+ * - 配合 `repairSpace` 构建修复空间的子项元素标签名
1871
+ * - 默认值为`div`,即子项元素为`<div>`标签
1872
+ * - 可配置为其他标签名,如`span`,则子项元素为`<span>`标签
1776
1873
  */
1777
- readonly error?: string;
1874
+ itemTag?: string;
1778
1875
  /**
1779
- * 是否是负数
1780
- * - true 时说明以`-`开始;false时为正数
1781
- * - 若为true,但`integerPart`为undefined,则说明仅输入了`-`
1876
+ * flex容器的子项类样式名
1877
+ * - 配合 `repairSpace` 构建修复空间的子项元素类样式名
1878
+ * - 推荐设置为一个固定值的类样式名,如`flex-item`,来方便用户通过该类样式名来设置子项元素的样式
1879
+ * - 构建的子项,会自动追加一个 "repair-item”的类样式名,来方便用户通过该类样式名来设置修复空间子项元素的样式
1782
1880
  */
1783
- readonly isNegative?: boolean;
1881
+ itemClass?: string;
1882
+ };
1883
+
1884
+ /**
1885
+ * 弹性容器组件 配置选项
1886
+ */
1887
+ type ElasticOptions = ScrollOptions & {
1784
1888
  /**
1785
- * 是否是小数
1786
- * - true 时说明有小数点“.”;false 时为整数
1787
- * - 若为true,但`decimalPart`为undefined,则说明是以`.`结尾,还没输入具体的小数部分
1889
+ * 滚动条弹簧效果
1890
+ * - x 仅在x轴方向上启用弹簧效果
1891
+ * - y 仅在y轴方向上启用弹簧效果
1892
+ * - both :同时启用x轴和y轴的弹簧效果
1788
1893
  */
1789
- readonly isDecimal?: boolean;
1894
+ spring?: "x" | "y" | "both";
1790
1895
  /**
1791
- * 数值输入的整数部分
1792
- * - 取整数部分绝对值,如-1.2,仅为1
1896
+ * 是否启用【下拉刷新】功能
1897
+ * - `spring` 为 `y/both`时生效
1898
+ * - 满足下拉刷新条件后,触发`refresh`事件,处理完成后调用resolve函数,通知完成刷新数据操作
1793
1899
  */
1794
- readonly integerPart?: string;
1900
+ downRefresh?: boolean;
1795
1901
  /**
1796
- * 小数部分
1902
+ * 是否启用【上拉加载】功能
1903
+ * - `spring` 为 `y/both`时生效
1904
+ * - 满足上拉加载条件后,触发`more`事件,处理完成后调用resolve函数,通知完成加载数据操作
1797
1905
  */
1798
- readonly decimalPart?: string;
1906
+ upMore?: boolean;
1907
+ };
1908
+ /**
1909
+ * 弹性容器组件 事件监听
1910
+ */
1911
+ type ElasticEvents = ScrollEvents & {
1799
1912
  /**
1800
- * 进行系数放大后的整数部分
1913
+ * 刷新数据
1914
+ * - 配合 `downRefresh`实现下拉刷新功能
1915
+ * @param resolve 处理完成后调用resolve函数,通知完成刷新数据操作
1801
1916
  */
1802
- readonly integerPartAfterMultiplier?: string;
1917
+ refresh: [resolve: () => void];
1803
1918
  /**
1804
- * 进行系数放大后的小数部分
1919
+ * 加载更多
1920
+ * - 配合 `upMore`实现上拉加载功能
1921
+ * @param resolve 处理完成后调用resolve函数,通知完成加载数据操作
1805
1922
  */
1806
- readonly decimalPartAfterMultiplier?: string;
1923
+ more: [resolve: () => void];
1807
1924
  };
1808
1925
  /**
1809
- * 数值组件的事件选项
1926
+ * 弹性组件 对外暴露属性接口
1810
1927
  */
1811
- type NumberEvents = ChangeEvents<number> & {
1928
+ type ElasticExpose = {
1812
1929
  /**
1813
- * 数值发生错误时
1814
- * - 若超过最大的精度范围
1815
- * - 其他未知异常等
1816
- * @param reason 错误原因
1930
+ * 加载刷新数据
1931
+ * - 触发下拉刷新数据
1932
+ * @returns 异步任务对象,外部感知任务执行完成
1817
1933
  */
1818
- error: [reason: string];
1934
+ loadRefresh(): Promise<void>;
1819
1935
  /**
1820
- * 小于最小值
1821
- * @param value 当前值
1822
- * @param minValue 最小值
1936
+ * 加载更多数据
1937
+ * - 触发上拉加载更多数据
1938
+ * @returns 异步任务对象,外部感知任务执行完成
1823
1939
  */
1824
- belowMin: [value: number, minValue: number];
1940
+ loadMore(): Promise<void>;
1941
+ };
1942
+ /**
1943
+ * 弹性组件的弹簧状态信息
1944
+ */
1945
+ type ElasticSpringStatus = {
1946
+ x: number | undefined;
1825
1947
  /**
1826
- * 超过最大值
1827
- * @param value 当前值
1828
- * @param maxValue 最大值
1948
+ * y轴方向的橡皮筋效果偏移量
1829
1949
  */
1830
- exceedMax: [value: number, maxValue: number];
1950
+ y: number | undefined;
1831
1951
  };
1832
1952
 
1833
1953
  /**
1834
- * 图标配置选项
1835
- * - title 作为鼠标移入图标时的提示
1954
+ * 选项菜单 基础配置选项
1836
1955
  */
1837
- type IconOptions = TitleOptions & {
1956
+ type SelectBaseOptions<T> = {
1838
1957
  /**
1839
- * 是否为自定义图标
1840
- * - 为true时,外部通过插槽自己绘制图标
1841
- * - 为false时,使用`type`值绘制对应的内置图标
1842
- * - 默认false
1958
+ * 【选择项】集合
1843
1959
  */
1844
- custom?: boolean;
1960
+ items: SelectItem<T>[];
1845
1961
  /**
1846
- * 内置的图标类型
1847
- * - `custom`为false时生效
1962
+ * 搜索功能配置
1963
+ * - 不配置则不启用【搜索】功能
1848
1964
  */
1849
- type?: IconType;
1965
+ search?: SearchOptions;
1850
1966
  /**
1851
- * 是否是按钮图标
1852
- * - true时,鼠标移入时 cursor:pointer;
1967
+ * 是否【多选模式】
1968
+ * - true时,多选,【选择项】后面出【选择】框;底部出【全选】和【清空已选】
1969
+ * - items为多级时,不支持【多选模式】;传入会报错
1853
1970
  */
1854
- button?: boolean;
1971
+ multiple?: boolean;
1855
1972
  /**
1856
- * 图标大小
1857
- * - 可指定对象,如 { width: 24, height: 24 },则图标大小为 24 * 24
1858
- * - 可指定数字,如 24,则图标大小为 24 * 24
1859
- * - 默认 24
1973
+ * 是否显示【路径】
1974
+ * - 为true时,显示选项的父级文本路径,用“ / ”分割
1975
+ * - 仅针对【单选模式】生效
1860
1976
  */
1861
- size?: number | {
1862
- width?: number;
1863
- height?: number;
1864
- };
1977
+ showPath?: boolean;
1865
1978
  /**
1866
- * 图标颜色
1979
+ * 是否显示【清空已选】按钮
1980
+ * - true:则在弹窗的底部显示【清空已选】按钮,点击时清空所有已选选项
1981
+ * - 若存在多级选项,仅在第一级弹窗中显示
1867
1982
  */
1868
- color?: string;
1983
+ showClear?: boolean;
1869
1984
  /**
1870
- * 鼠标移入时的图标颜色
1985
+ * 选择项 follow弹窗样式
1986
+ * - 支持指定弹窗高度,如最大高度,不指定则默认尽可能展示全
1871
1987
  */
1872
- hoverColor?: string;
1988
+ popupStyle?: HeightStyle;
1989
+ };
1990
+ /**
1991
+ * 选项菜单 基础事件
1992
+ */
1993
+ type SelectBaseEvents<T> = {
1873
1994
  /**
1874
- * 旋转角度
1875
- * - 默认0
1876
- * - 通过:transform: rotate(1.06); 实现
1995
+ * 选中的【选择项】改变时
1996
+ * - @param values 已选的【选择项】,未选中则为空数组:单选时,为【选择项】路径(父->子);其他情况为已选的【选择项】
1877
1997
  */
1878
- rotate?: number;
1998
+ change: [values: SelectItem<T>[]];
1999
+ };
2000
+ /**
2001
+ * 选项菜单组件的【选择项】
2002
+ */
2003
+ type SelectItem<T> = TreeNode<T, TreeNodeExtend & {
1879
2004
  /**
1880
- * 图标透明度
1881
- * - 不传入,默认1
2005
+ * 节点类型
2006
+ * - group 分组选择项;可包含子节点
2007
+ * - item 选择项;默认值;不可包含子节点,即使传入也会忽略
2008
+ */
2009
+ type?: "group" | "item";
2010
+ }>;
2011
+ /**
2012
+ * 选项菜单组件 配置选项
2013
+ * - value 已选的【选择项】;单选时,为【选择项】路径(父->子);其他情况为已选的【选择项】
2014
+ */
2015
+ type SelectOptions<T> = ReadonlyOptions & PlaceholderOptions & SelectBaseOptions<T> & ValueOptions<SelectItem<T>[]> & {
2016
+ /** 父类<see cref="SelectBaseOptions"/>已有属性:
2017
+ * items 【选择项】集合
2018
+ * search 启用 【搜索】功能
2019
+ * searchPlaceholder 搜索框提示语
2020
+ * multiple 是否【多选模式】
2021
+ * showPath 显示选项路径
2022
+ * popupStyle 弹出的选项选择窗体样式
1882
2023
  */
1883
- opacity?: number;
1884
2024
  /**
1885
- * 图形伸展
1886
- * - svg.viewBox 属性
1887
- * - 为空则默认“0 0 1024 1024”
2025
+ * 选项分隔符
2026
+ * - 单选有多级时的分割路径;默认为 /
2027
+ * - 多选时分割多个选项;默认为
1888
2028
  */
1889
- viewBox?: string;
2029
+ separator?: string;
1890
2030
  };
1891
2031
  /**
1892
- * 图标类型
1893
- * - 状态类:
1894
- * - - success 成功图标,对勾
1895
- * - - error 错误
1896
- * - - warn 警告图标
1897
- * - 操作类:
1898
- * - - close 关闭 用作数据删除,弹窗关闭
1899
- * - - trash 垃圾桶图标,常用于【删除】操作
1900
- * - - download 下载
1901
- * - - print 打印
1902
- * - - edit 编辑
1903
- * - 指向类:
1904
- * - - arrow 向右箭头
1905
- * - - datepicker 日期选择器
1906
- * - - timepicker 时间选择器
1907
- * - 其他类:
1908
- * - - plus 加号
1909
- * - - subtract 减号
1910
- * - - more 更多,默认垂直三个点
1911
- * - - grip 紧握图标,垂直方向,一般用于拖动句柄
1912
- */
1913
- type IconType = "success" | "error" | "warn" | "close" | "trash" | "download" | "print" | "edit" | "arrow" | "datepicker" | "timepicker" | "plus" | "subtract" | "more" | "grip";
1914
-
1915
- /**
1916
- * 检查选项 数据结构
2032
+ * 选项菜单 组件 事件
1917
2033
  */
1918
-
2034
+ type SelectEvents<T> = SelectBaseEvents<T> & {};
1919
2035
  /**
1920
- * 选择 组件配置选项
2036
+ * 选项菜单 组件的Slot配置选项
1921
2037
  */
1922
- type ChooseOptions<T> = ReadonlyOptions & {
1923
- /**
1924
- * 是否为多选模式
1925
- * - true 多选模式,可以选中items中多个选项
1926
- * - false 单选模式,只能选中items中的一个选项
1927
- */
1928
- multi?: boolean;
1929
- /**
1930
- * 选项类型
1931
- * - radio: 单选框样式
1932
- * - checkbox: 多选框样式
1933
- */
1934
- type: "radio" | "checkbox";
1935
- /**
1936
- * 显示模式
1937
- * - native 原生默认,浏览器自己渲染;不同浏览器效果不一致
1938
- * - beautiful 美化模式,不同浏览器下效果通义
1939
- */
1940
- mode?: "native" | "beautiful";
2038
+ type SelectSlotOptions = {
1941
2039
  /**
1942
- * 选项布局
1943
- * - 默认值:horizontal
1944
- * - 可选值:
1945
- * - - horizontal 水平布局;所有选项一行
1946
- * - - vertical 垂直布局;每个选项一行
2040
+ * 清空已选【选择项】
2041
+ * @param closeFollow 是否关闭【选择项】Follow弹窗
2042
+ * @param stopPropagation 是否停止事件冒泡
1947
2043
  */
1948
- layout?: "horizontal" | "vertical";
2044
+ clear(closeFollow: boolean, stopPropagation: boolean): void;
2045
+ };
2046
+ /**
2047
+ * 【选项菜单】 组件上下文
2048
+ */
2049
+ interface ISelectContext<T> extends ITreeBaseContext<T> {
1949
2050
  /**
1950
- * 待选项目
1951
- * text 可不传入
2051
+ * 指定节点是否选中了
2052
+ * @param multiple 是否是【多选模式】
2053
+ * @param item 要判断的节点
2054
+ * @returns true 选中,false 未选中
1952
2055
  */
1953
- items: ChooseItem<T>[];
2056
+ selected(multiple: boolean, item: SelectItem<T>): boolean;
1954
2057
  /**
1955
- * 选项自定义样式
1956
- * - 可指定选项宽度、高度、外边距
2058
+ * 获取已选【选择项】的展示文本
2059
+ * @param multiple 是否是【多选模式】
2060
+ * @param showPath 是否显示路径
2061
+ * @returns 已选【选择项】的展示文本
1957
2062
  */
1958
- itemStyle?: WidthStyle & HeightStyle & MarginStyle;
1959
- };
2063
+ selectedText(multiple: boolean, showPath: boolean): string;
2064
+ }
1960
2065
  /**
1961
- * 选择项
2066
+ * 【选项菜单】 弹窗组件配置选项
1962
2067
  */
1963
- type ChooseItem<T> = {
1964
- /**
1965
- * 选项文本
2068
+ type SelectPopupOptions<T> = SelectBaseOptions<T> & {
2069
+ /** 父类<see cref="SelectBaseOptions"/>已有属性:
2070
+ * items 选择项 集合
2071
+ * search 启用 【搜索】功能
2072
+ * searchPlaceholder 搜索框提示语
2073
+ * multiple 是否【多选模式】
1966
2074
  */
1967
- text?: string;
1968
2075
  /**
1969
- * 选项值
2076
+ * 树形上下文
1970
2077
  */
1971
- value: T;
2078
+ context: ISelectContext<T>;
1972
2079
  /**
1973
- * 选项描述信息,一般作为解释使用
2080
+ * 第几级 选项弹窗
2081
+ * - 从1开始
1974
2082
  */
1975
- description?: string;
2083
+ level: number;
1976
2084
  };
1977
2085
  /**
1978
- * 选择 组件事件
2086
+ * 【选项菜单】 弹窗组件事件
1979
2087
  */
1980
- type ChooseEvents<T> = {
2088
+ type SelectPopupEvents<T> = {
1981
2089
  /**
1982
- * 值改变 事件
1983
- * - values 为当前选中值;单选时为单个值,多选时为值数组
2090
+ * 清空选项
1984
2091
  */
1985
- change: [values: T | T[]];
2092
+ clear: [];
2093
+ /**
2094
+ * 选项点击事件
2095
+ * @param path 选中的【选择项】路径;父->子
2096
+ */
2097
+ click: [path: SelectItem<T>[]];
1986
2098
  };
1987
-
1988
2099
  /**
1989
- * 按钮配置选项
2100
+ * 【选项菜单】 弹窗组件扩展
1990
2101
  */
1991
- type ButtonOptions = TitleOptions & {
2102
+ type SelectPopupExtend = {
1992
2103
  /**
1993
- * 按钮尺寸
1994
- * - max : 120 X 40
1995
- * - middle 90 X 32
1996
- * - normal : 54 X 28
1997
- * - small : 30 X 20
2104
+ * 子选项弹窗的销毁定时器
2105
+ * - 父级弹窗可根据需要销毁定时器,取消子选择弹窗销毁
2106
+ * - 鼠标离开弹窗时,做延迟销毁;避免回到 此弹窗 的父【选择项】时,又重新打开此弹窗
1998
2107
  */
1999
- size: "max" | "middle" | "normal" | "small";
2108
+ childDestroyTimer: ShallowRef<IScope>;
2000
2109
  /**
2001
- * 按钮类型
2002
- * - primary: 主按钮:蓝色背景
2003
- * - default: 默认按钮:白色背景
2004
- * - link :链接式按钮:蓝色字体颜色,无边框
2110
+ * 父级弹窗的pin状态
2111
+ * - 可在子弹窗中设置为true,这样父级弹窗就不会自动关闭了
2005
2112
  */
2006
- type: "primary" | "default" | "link";
2113
+ parentPinned: ShallowRef<boolean>;
2007
2114
  };
2008
-
2009
2115
  /**
2010
- * 可操作项组件 的配置选项
2011
- * - disabled 为true时,不响应操作项触发
2116
+ * 【选项菜单】节点 组件配置选项
2012
2117
  */
2013
- type ActionOptions = DisabledOptions & {
2118
+ type SelectNodeOptions<T> = {
2014
2119
  /**
2015
- * 触发方式
2016
- * - always :始终显示一个触发图标,点击图标弹出操作项
2017
- * - hover:鼠标移入显示一个触发图标,点击图标弹出操作项
2018
- * - long-press:长摁直接弹出操作项
2120
+ * 是否为【多选模式】
2019
2121
  */
2020
- trigger: "always" | "hover" | "long-press";
2122
+ multiple: boolean;
2021
2123
  /**
2022
- * 显示模式
2023
- * - popup:弹出显示操作项
2024
- * - inline:内联显示操作项
2124
+ * 要展示的节点
2025
2125
  */
2126
+ item: SelectItem<T>;
2026
2127
  /**
2027
- * 可用操作项
2128
+ * 树形上下文
2028
2129
  */
2029
- actions: ActionItem[];
2130
+ context: ISelectContext<T>;
2131
+ /**
2132
+ * 是否显示子节点
2133
+ */
2134
+ showChildren: boolean;
2030
2135
  };
2031
2136
  /**
2032
- * 操作项集合 组件渲染配置选项
2137
+ * 【选项菜单】节点 组件事件
2033
2138
  */
2034
- type ActionItemsOptions = {
2139
+ type SelectNodeEvents<T> = {
2035
2140
  /**
2036
- * 展示模式
2037
- * - horizontal 水平展示
2038
- * - vertical 垂直展示
2141
+ * 鼠标进入事件
2142
+ * @param el 【选择项】节点dom元素
2143
+ * @param item 【选择项】
2144
+ * @param parent 父节点
2039
2145
  */
2040
- mode: "horizontal" | "vertical";
2146
+ enter: [el: HTMLDivElement, item: SelectItem<T>, parent?: SelectItem<T>];
2041
2147
  /**
2042
- * 要渲染的操作项
2148
+ * 点击事件
2149
+ * @param item 【选择项】
2150
+ * @param parent 父节点
2043
2151
  */
2044
- actions: ActionItem[];
2152
+ click: [item: SelectItem<T>, parent?: SelectItem<T>];
2045
2153
  };
2154
+
2046
2155
  /**
2047
- * 一个操作项的配置
2048
- */
2049
- type ActionItem = {
2050
- /**
2051
- * 操作项编码
2052
- * - 确保唯一
2053
- */
2054
- code: string;
2055
- /**
2056
- * 操作项名称
2057
- * - 确保唯一
2058
- */
2059
- name: string;
2060
- /**
2061
- * 操作项颜色
2062
- */
2063
- color?: string;
2064
- /**
2065
- * 操作项移入时颜色
2066
- */
2067
- hoverColor?: string;
2156
+ * 基础事件实体
2157
+ * 1、把一些常用事件,封装为原子结构,方便复用
2158
+ * 2、不强制必须复用,根据自身情况
2159
+ */
2160
+ /**
2161
+ * 事件:点击
2162
+ */
2163
+ type ClickEvents = {
2068
2164
  /**
2069
- * 操作项图标
2165
+ * 单击事件
2166
+ * @param evt 事件对象
2070
2167
  */
2071
- icon?: Pick<IconOptions, "type" | "size" | "title">;
2168
+ click: [evt?: MouseEvent | TouchEvent | PointerEvent];
2072
2169
  };
2073
2170
  /**
2074
- * 可操作向组件 插槽句柄
2171
+ * 事件:值改变
2172
+ * - 描述值的改变过程,新值是什么,改变前的旧值是什么
2075
2173
  */
2076
- type ActionSlotHandle = {
2077
- /**
2078
- * 操作项是否激活显示
2079
- */
2080
- isActived(): boolean;
2174
+ type ChangeEvents<T> = {
2081
2175
  /**
2082
- * 触发操作项显示
2176
+ * 值改变;约束新旧值
2177
+ * @param newValue 新值
2178
+ * @param oldValue 旧值
2083
2179
  */
2084
- trigger(): void;
2180
+ change: [newValue: T, oldValue?: T];
2085
2181
  };
2086
2182
  /**
2087
- * 可操作项组件 的事件
2183
+ * 事件:移动
2184
+ * - 可描述数据索引位置变化
2185
+ * - 可用于数组元素拖动排序,调整位置等逻辑
2088
2186
  */
2089
- type ActionEvents = {
2187
+ type MoveEvents = {
2090
2188
  /**
2091
- * 操作项激活时
2092
- * @param code 操作项的code
2189
+ * 移动事件
2190
+ * @param fromIndex 从哪个索引位置开始移动
2191
+ * @param toIndex 移动到的索引位置
2093
2192
  */
2094
- trigger: [code: string];
2193
+ move: [fromIndex: number, toIndex: number];
2095
2194
  };
2096
-
2097
2195
  /**
2098
- * 输入框配置选项
2099
- * - title 将作为 输入框标题区域文本;不传入则不展示 标题区域,仅展示输入框
2100
- * - 暂不提供 disabled 逻辑
2196
+ * 事件:删除数据
2197
+ * - 描述要删除的具体数据
2101
2198
  */
2102
- type InputOptions = ReadonlyOptions & /*DisabledOptions & */ PlaceholderOptions & TitleOptions & {
2103
- /**
2104
- * 输入框类型
2105
- * - text: 文本输入框
2106
- * - number: 数字输入框
2107
- * - password: 密码输入框
2108
- */
2109
- type?: "text" | "number" | "password";
2110
- /**
2111
- * 输入框是否必填
2112
- * - 必填,则验证不通过时,显示错误信息
2113
- * - 必填时,显示必填标记,红色 * 号
2114
- */
2115
- required?: boolean;
2199
+ type DeleteEvents<T> = {
2116
2200
  /**
2117
- * 标题区域样式
2118
- * - 对齐方式
2119
- * - 标题区域宽度
2201
+ * 删除事件
2202
+ * @param value 要删除的数据
2120
2203
  */
2121
- titleStyle?: BaseStyle & WidthStyle & FlexBoxStyle;
2204
+ delete: [value?: T];
2122
2205
  };
2123
2206
  /**
2124
- * 输入框事件
2207
+ * 事件:关闭
2125
2208
  */
2126
- type InputEvents = {
2127
- /**
2128
- * 输入框点击时
2129
- */
2130
- click: [];
2209
+ type CloseEvents = {
2131
2210
  /**
2132
- * 输入框内容发生改变时
2133
- * @param value 输入框内容
2211
+ * 关闭事件
2134
2212
  */
2135
- change: [value: string];
2213
+ close: [];
2136
2214
  };
2137
2215
 
2138
2216
  /**
2139
- * 接口:响应式管理器
2217
+ * 数值控件的数据结构
2140
2218
  */
2141
- interface IReactiveManager {
2142
- /**
2143
- * 响应式【过渡】变量值
2144
- * - 通过设置 rv.value 的值来实现.value值过渡
2145
- * - 执行顺序 from、to
2146
- * - 开始时,设置 rv.value 值为 from;延迟time时间后,强制销毁scope
2147
- * - 销毁scope时,强制将 rv.value 值设置为 to 值
2148
- * @param rv 响应式变量对象
2149
- * @param effect 过渡效果配置,约束 from end 样式
2150
- * @param time 过渡持续时间,到时间后销毁作用域
2151
- * @returns 作用域对象,可销毁【值过渡】效果
2152
- */
2153
- transition<T>(rv: ReactiveVar<T>, effect: {
2154
- from: T;
2155
- to: T;
2156
- }, time: number): IScope;
2219
+
2220
+ /**
2221
+ * 数值组件的基础配置选项
2222
+ */
2223
+ type NumberBaseOptions = {
2157
2224
  /**
2158
- * 响应式【加载】任务
2159
- * - 任务运行时,设置loading.value=true
2160
- * - 任务完成后,设置loading.value=false
2161
- * - 可通过delay值,延迟执行 loading.value=false 操作
2162
- * - 可在api请求等耗时操作任务过程中,实现响应式显隐Loading组件
2163
- * @param task 要运行的任务
2164
- * @param loading 正在加载的响应式变量
2165
- * @param delay 延迟时间,单位ms;不传则不延迟
2166
- * @returns 任务自身
2225
+ * 最小值
2167
2226
  */
2168
- load<T>(task: Promise<T>, loading: ReactiveVar<boolean>, delay: number): Promise<RunResult<T>>;
2227
+ minValue?: number;
2169
2228
  /**
2170
- * 监听器:监听单个值变化
2171
- * - 内部利用vue的watch逻辑实现
2172
- * - 自动进行生命周期管理,作用域销毁时自动清理watch监听
2173
- * - 仅实现简化版本watch监听;复杂的监听逻辑,自行使用watch方法
2174
- * @param source 监听源
2175
- * @param callback 回调方法:可接收新旧值变化
2176
- * @param deep 是否进行深度监听;默认false
2177
- * @returns 监听作用域,destroy可销毁监听
2229
+ * 最大值
2178
2230
  */
2179
- watcher<T>(source: WatchSource<T>, callback: (newValue: T, oldValue: T) => void, deep?: boolean): IScope;
2180
- }
2181
- /**
2182
- * 响应式变量
2183
- */
2184
- type ReactiveVar<T> = ShallowRef<T> | Ref<T>;
2185
-
2186
- /**
2187
- * 开关组件 配置选项
2188
- */
2189
- type SwitchOptions = ReadonlyOptions & {
2231
+ maxValue?: number;
2190
2232
  /**
2191
- * 类型,决定开启/关闭状态的渲染效果
2192
- * - switch 开关类型,默认效果
2193
- * - radio 单选框效果,圆角边框
2194
- * - checkbox 复选框效果,矩形边框
2233
+ * 值超过阈值(最大值、最小值)时的处理模式
2234
+ * - 默认值为 `keep`;可选取值范围:
2235
+ * - - `keep` 保持原样值显示,不做任何处理
2236
+ * - - `clamp` 截断超出阈值值,低于最小值时直接取最小值,超过最大值时,强制值为最大值
2237
+ * - 值超过阈值时,会自动触发事件,事件名`NumberEvents`的`belowMin`和`exceedMax`
2195
2238
  */
2196
- type?: "switch" | "radio" | "checkbox";
2197
- };
2198
- /**
2199
- * 开关 事件
2200
- */
2201
- type SwitchEvents = {
2239
+ clamp?: "keep" | "clamp";
2202
2240
  /**
2203
- * 开关 状态变化时
2204
- * @param value 开启、还是关闭
2241
+ * 精度,保留几位小数
2242
+ * - 要求0、正整数,输入小数则强制整数
2243
+ * - 负数、不传入则不处理
2205
2244
  */
2206
- change: [value: boolean];
2207
- };
2208
-
2209
- /**
2210
- * 多行文本框组件配置选项
2211
- */
2212
- type TextareaOptions = ReadonlyOptions & PlaceholderOptions & {
2245
+ precision?: number;
2213
2246
  /**
2214
- * 是否自适应高度
2215
- * - 传入true时,根据文本框内容,自动调整高度
2216
- * - 若传入maxRows,则自动高度不会超过maxRows
2247
+ * 对数值进行千分位格式处理
2248
+ * - 默认值为 `disabled`;可选值范围:
2249
+ * - `disabled` 禁用千分位功能
2250
+ * - `inline` 内联千分位功能
2251
+ * - `below` 下拉千分位功能
2217
2252
  */
2218
- autoHeight: boolean;
2253
+ thousands?: "disabled" | "inline" | "below";
2219
2254
  /**
2220
- * 最小行数
2221
- * - 作为默认行数
2222
- * - 不传入则默认4
2255
+ * 是否启用数值大写格式化处理
2256
+ * - 为true时,转成中文大写值
2257
+ * - 单位自动为“元”,不支持美元等
2258
+ * - 如金额时,自动转为壹仟壹佰壹拾壹元叁角叁分
2259
+ * - 小数点后面只处理两位(角分);剩余不处理
2223
2260
  */
2224
- minRows?: number;
2261
+ upper?: boolean;
2225
2262
  /**
2226
- * 最大行数
2227
- * - 不传入则默认10
2228
- * - `autoHeight`为true时生效;
2263
+ * 格式化时的放大系数
2264
+ * - 用于在格式化千分位、大写时,对实际值进行系数放大,value*formatMultiplier
2265
+ * - 仅接收正整数,取值规则为10^n,默认1
2266
+ * - 千分位格式化时,仅`thousands`为`below`时才进行放到系数处理
2267
+ * - 使用示例例:金额是为万元单位时,这里的放大系数就为 “10000”
2229
2268
  */
2230
- maxRows?: number;
2231
- };
2232
- /**
2233
- * 多行文本框组件事件
2234
- */
2235
- type TextareaEvents = {
2269
+ formatMultiplier?: number;
2236
2270
  /**
2237
- * 获取焦点时
2271
+ * 前缀字符串
2272
+ * - 如金额时,可配置前缀 ¥
2238
2273
  */
2239
- focus: [];
2274
+ prefix?: string;
2240
2275
  /**
2241
- * 输入时
2242
- * @param value 输入框内容
2276
+ * 后缀字符串
2277
+ * - 如金额时,可配置后缀 元/美元、、
2243
2278
  */
2244
- input: [value: string];
2279
+ suffix?: string;
2245
2280
  /**
2246
- * 失焦时
2247
- * @param value 输入框内容
2281
+ * 数值控制器
2282
+ * - 便捷加减调整数值的控制按钮
2283
+ * - 默认值`disabled`;可选值范围:
2284
+ * - - `disabled` 时禁用
2285
+ * - - `default` 默认模式,左侧 — 右侧 +
2286
+ * - - `right` 右侧模式,+ - 都在右侧
2248
2287
  */
2249
- blur: [value: string];
2288
+ controls?: "disabled" | "default" | "right";
2250
2289
  /**
2251
- * 输入框内容发生改变时
2252
- * @param value 输入框内容
2290
+ * 数值步长值
2291
+ * - `controls` 未禁用时生效
2292
+ * - 每次+、- 的步长值
2253
2293
  */
2254
- change: [value: string];
2294
+ step?: number;
2255
2295
  };
2256
-
2257
- /**
2258
- * 使用【响应式管理器】
2259
- * - 请在Vue组件的setup中使用此方法,否则 getCurrentScope 方法无法取到值
2260
- * @returns 全新的【响应式管理器】+作用域
2261
- */
2262
- declare function useReactive(): IReactiveManager & IScope;
2263
-
2264
- /**
2265
- * 树的基础组件信息
2266
- * 1、组件基础上下文 默认实现
2267
- */
2268
-
2269
2296
  /**
2270
- * 使用【树上下文】
2271
- * @param nodes 树节点集合
2272
- * @param activeNodeRef 当前激活的树节点引用;不传入,则无法实现 isActived 判断
2273
- * @returns 上下文对象+作用域
2274
- */
2275
- declare function useTreeContext<T>(nodes: TreeNode<T, TreeNodeExtend>[], activeNodeRef?: ShallowRef<TreeNode<T, TreeNodeExtend>>): ITreeBaseContext<T> & IScope;
2276
-
2277
- /**
2278
- * Vue App助手类,做一些app实例的辅助性工作
2279
- */
2280
-
2281
- /** 私有类型:App类型
2282
- * - normal 普通app实例
2283
- * - popup 弹窗app实例;包括 Dialog、Follow等所有弹窗
2284
- */
2285
- type AppType = "normal" | "popup";
2286
- /**
2287
- * app实例创建完之后的回调通知
2288
- * @param fn 回调通知
2289
- * @returns 通知句柄,可销毁回调通知,一般在外部销毁时执行
2290
- */
2291
- declare function onAppCreated(fn: (app: App, type?: AppType) => void): IScope;
2292
- /**
2293
- * 触发app创建后事件
2294
- * @param app 创建的app实例
2295
- * @param type app创建类型;满足区分特定app实例使用
2296
- * @returns app自身
2297
- */
2298
- declare function triggerAppCreated(app: App, type?: AppType): App;
2299
-
2300
- /**
2301
- * 图标助手类
2302
- */
2303
-
2304
- /**
2305
- * 获取内置图标绘制路径
2306
- * @param iconType 图标类型
2307
- * @returns 图标路径
2308
- */
2309
- declare function getBuiltinIcon(iconType: IconType): string[];
2310
-
2311
- /**
2312
- * 动态加载组件 组件配置选项
2313
- */
2314
- type DynamicOptions<Props = void> = ComponentOptions & Pick<ComponentBindOptions<Props>, "props">;
2315
-
2316
- /**
2317
- * 挂载指定的Vue组件
2318
- * - 权限构建的vue app实例,挂载传入的组件
2319
- * @param target 挂载的目标元素
2320
- * @param options 挂载配置选项
2321
- * @param onDestroyed 监听【调用方】的销毁时机,用于自动销毁挂载的实力
2322
- * @returns 作用域对象,销毁挂载实例
2323
- */
2324
- declare function mount<Props>(target: HTMLElement, options: DynamicOptions<Props>, onDestroyed?: (fn: () => void) => void): IScope;
2325
-
2326
- /**
2327
- * 运动组件的助手方法变量
2297
+ * 数值组件的配置选项
2328
2298
  */
2299
+ type NumberOptions = PlaceholderOptions & ReadonlyOptions & NumberBaseOptions;
2329
2300
  /**
2330
- * 运行效果常量
2301
+ * 接口:数值格式化器
2331
2302
  */
2332
- declare const MOTION: Readonly<{
2333
- /** 淡入淡出;进入时 `opacity:0~1`;退出时 `opacity:1~0`*/
2334
- fade: {
2335
- enter: string;
2336
- leave: string;
2337
- };
2338
- /** 缩放进入:进入时 `scale:0~1`;退出时 `scale:1~0`*/
2339
- scale: {
2340
- enter: string;
2341
- leave: string;
2342
- };
2343
- /** 旋转:进入时 `rotate:360deg~0`;退出时 `rotate:0~360deg`*/
2344
- rotate: {
2345
- enter: string;
2346
- leave: string;
2347
- };
2348
- /** 顶部进入退出:进入时`translateY:-100%~0`;退出时`translateY:0~-100%`*/
2349
- top: {
2350
- enter: string;
2351
- leave: string;
2352
- };
2353
- /** 顶部进入底部退出:进入时`translateY:-100%~0`;退出时`translateY:0~100%`*/
2354
- topBottom: {
2355
- enter: string;
2356
- leave: string;
2357
- };
2358
- /** 底部进入退出:进入时`translateY:100%~0`;退出时`translateY:0~100%`*/
2359
- bottom: {
2360
- enter: string;
2361
- leave: string;
2362
- };
2363
- /** 底部进入顶部退出:进入时`translateY:100%~0`;退出时`translateY:0~-100%`*/
2364
- bottomTop: {
2365
- enter: string;
2366
- leave: string;
2367
- };
2368
- /** 左侧进入退出:进入时`translateX:-100%~0`;退出时`translateX:0~-100%`*/
2369
- left: {
2370
- enter: string;
2371
- leave: string;
2372
- };
2373
- /** 左侧进入右侧退出:进入时`translateX:-100%~0`;退出时`translateX:0~100%`*/
2374
- leftRight: {
2375
- enter: string;
2376
- leave: string;
2377
- };
2378
- /** 右侧进入右侧退出:进入时`translateX:100%~0`;退出时`translateX:0~100%`*/
2379
- right: {
2380
- enter: string;
2381
- leave: string;
2382
- };
2383
- /** 右侧进入左侧退出:进入时`translateX:100%~0`;退出时`translateX:0~-100%`*/
2384
- rightLeft: {
2385
- enter: string;
2386
- leave: string;
2303
+ interface INumberFormatter extends Required<Readonly<Pick<NumberBaseOptions, "minValue" | "maxValue" | "precision" | "thousands" | "upper">>> {
2304
+ /**
2305
+ * 格式化输入文本
2306
+ * @param text 输入文本
2307
+ * @param isEnd 是否是输入结束,true时,已经输入结束将进行数值精度处理
2308
+ * @returns 数值格式化结果
2309
+ */
2310
+ format(text: string, isEnd: boolean): NumberFormatResult;
2311
+ /**
2312
+ * 进行阈值检测,检测是否超过设定的最大值、最小值
2313
+ * @param number 要检测的数值
2314
+ * @returns 检测结果,`number` 新的值,`belowMin`是否低于最小值,`exceedMax`是否超过最大值
2315
+ */
2316
+ checkThreshold(number: any): {
2317
+ number: number;
2318
+ belowMin: boolean;
2319
+ exceedMax: boolean;
2387
2320
  };
2388
- }>;
2389
-
2390
- /**
2391
- * 公共通用数据结构:
2392
- * 1、在弹窗、模态弹窗、跟随弹窗的效果下复用
2393
- */
2394
-
2321
+ /**
2322
+ * 对数值文本转大写
2323
+ * @param result
2324
+ * @returns 大写文本值
2325
+ */
2326
+ buildUpper(result: NumberFormatResult): string;
2327
+ /**
2328
+ * 对数值文本进行千分位格式化
2329
+ * @param result
2330
+ * @returns 格式化后的文本值
2331
+ */
2332
+ buildThousands(result: NumberFormatResult): string;
2333
+ /**
2334
+ * 基于步长计算值
2335
+ * @param number 要重新计算的数值
2336
+ * @param isPlus true为+,false为-
2337
+ * @returns 新的数值
2338
+ */
2339
+ calcByStep(number: number, isPlus: boolean): number;
2340
+ }
2395
2341
  /**
2396
- * 弹窗配置选项
2397
- * - 约束弹出组件信息
2398
- * - 弹出组件时传递的参数信息
2399
- * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
2342
+ * 数值格式化结果
2400
2343
  */
2401
- type PopupOptions<Props = void, Model = void> = ComponentOptions & ComponentBindOptions<Props, Model> & {
2344
+ type NumberFormatResult = {
2402
2345
  /**
2403
- * 弹窗动画名
2404
- * - 不传则默认“fade”
2405
- * - 动画规则:打开弹窗时,为 [transition]-in ;关闭弹窗时,为[transition]-out
2406
- * - - 传入 "scale",则打开弹窗为 "scale-in";关闭弹窗时为 "scale-out"
2346
+ * 输入是否是有效输入
2347
+ * - `- 0 1 2 3 4 5 6 7 8 9 0 .`算是合法输入
2407
2348
  */
2408
- transition?: string;
2349
+ readonly valid: boolean;
2409
2350
  /**
2410
- * 动画持续时间
2411
- * - 配合 transition 使用;单位ms,默认500ms
2412
- * - 外部传入自定义动画时,传入动画持续时间,否则可能导致关闭时动画失效
2351
+ * 有效的数值
2352
+ * - undefined时,输入无法转换成有效的数值
2413
2353
  */
2414
- transitionDuration?: number;
2354
+ readonly number: number | undefined;
2415
2355
  /**
2416
- * 自定义class
2417
- * - 绑定到内容组件根元素上
2418
- * - 可以直接在props中指定,无需特殊设置
2419
- class?: string | string[];
2356
+ * 数值的显示文本
2357
+ * - 无千分位等处理的数值显示文本
2358
+ * - 若需要在行内显示 千分位 格式文本,需要单独处理
2420
2359
  */
2360
+ readonly text: string;
2421
2361
  /**
2422
- * 自定义style
2423
- * - 绑定到内容组件根元素上
2424
- * - 可以直接在props中指定,无需特殊设置
2425
- style?: AllStyle;
2362
+ * 格式化数值时发生的错误
2363
+ * - 输入数值有效,但是格式化时发生错误了
2426
2364
  */
2365
+ readonly error?: string;
2427
2366
  /**
2428
- * 弹窗的z-index值
2429
- * - 无特殊情况,建议不指定,内部会自动生成,确保弹窗正确性
2367
+ * 是否是负数
2368
+ * - true 时说明以`-`开始;false时为正数
2369
+ * - 若为true,但`integerPart`为undefined,则说明仅输入了`-`
2430
2370
  */
2431
- zIndex?: number;
2432
- };
2433
- /**
2434
- * 弹出组件句柄
2435
- */
2436
- type PopupHandle<T> = {
2371
+ readonly isNegative?: boolean;
2437
2372
  /**
2438
- * 组件是否在【弹出窗口】中
2439
- * - popup : 普通弹出弹窗
2440
- * - dialog : 模态对话弹窗
2441
- * - follow : 跟随效果弹窗
2373
+ * 是否是小数
2374
+ * - true 时说明有小数点“.”;false 时为整数
2375
+ * - 若为true,但`decimalPart`为undefined,则说明是以`.`结尾,还没输入具体的小数部分
2442
2376
  */
2443
- inPopup: Readonly<"popup" | "dialog" | "follow">;
2377
+ readonly isDecimal?: boolean;
2444
2378
  /**
2445
- * 关闭弹窗
2446
- * @param data 关闭时传递数据
2379
+ * 数值输入的整数部分
2380
+ * - 取整数部分绝对值,如-1.2,仅为1
2447
2381
  */
2448
- closePopup(data?: T): void;
2449
- };
2450
- /**
2451
- * 弹窗状态:响应式
2452
- * - open 打开
2453
- * - active 激活,针对Dialog弹窗生效
2454
- * - unactive 非激活,针对Dialog弹窗生效
2455
- * - closed 关闭
2456
- */
2457
- type PopupStatus = ShallowRef<"open" | "active" | "unactive" | "closed">;
2458
- /**
2459
- * 弹窗状态 配置选项
2460
- */
2461
- type PopupStatusOptions = {
2382
+ readonly integerPart?: string;
2462
2383
  /**
2463
- * 弹窗状态:响应式
2384
+ * 小数部分
2464
2385
  */
2465
- popupStatus: PopupStatus;
2466
- };
2467
- /**
2468
- * 弹窗对象描述器
2469
- * - 给弹窗容器使用,传递过去作为props使用
2470
- */
2471
- type PopupDescriptor<Options extends PopupOptions, ExtOptions> = PopupStatusOptions & {
2386
+ readonly decimalPart?: string;
2472
2387
  /**
2473
- * 弹窗Id
2474
- * - 自动分配,全局唯一
2388
+ * 进行系数放大后的整数部分
2475
2389
  */
2476
- popupId: string;
2390
+ readonly integerPartAfterMultiplier?: string;
2477
2391
  /**
2478
- * 弹窗配置选项
2479
- * - 由外部传递过来的业务数据配置信息
2480
- * - 约束具体弹窗的业务组件和业务组件所需props等数据
2392
+ * 进行系数放大后的小数部分
2481
2393
  */
2482
- options: Options;
2394
+ readonly decimalPartAfterMultiplier?: string;
2395
+ };
2396
+ /**
2397
+ * 数值组件的事件选项
2398
+ */
2399
+ type NumberEvents = ChangeEvents<number> & {
2483
2400
  /**
2484
- * 弹窗扩展配置选项
2485
- * - 由 popup、follow等方法内部组件:如关闭弹窗方法、钩子函数等
2486
- * - 配合业务组件使用的一些配置数据
2401
+ * 数值发生错误时
2402
+ * - 若超过最大的精度范围
2403
+ * - 其他未知异常等
2404
+ * @param reason 错误原因
2487
2405
  */
2488
- extOptions: ExtOptions;
2406
+ error: [reason: string];
2489
2407
  /**
2490
- * 实际分配的zIndex值
2408
+ * 小于最小值
2409
+ * @param value 当前值
2410
+ * @param minValue 最小值
2491
2411
  */
2492
- zIndex: number;
2412
+ belowMin: [value: number, minValue: number];
2493
2413
  /**
2494
- * 弹窗动画名
2495
- * - 约束打开、关闭动画;基于 PopupOptions.transition 构建出来的
2496
- * - 具体使用方,将此值绑定的根元素上
2414
+ * 超过最大值
2415
+ * @param value 当前值
2416
+ * @param maxValue 最大值
2497
2417
  */
2498
- popupTransition: ShallowRef<string>;
2418
+ exceedMax: [value: number, maxValue: number];
2499
2419
  };
2500
2420
 
2501
2421
  /**
2502
- * 模态弹窗数据结构
2422
+ * 检查选项 数据结构
2503
2423
  */
2504
2424
 
2505
2425
  /**
2506
- * 模态弹窗 配置选项
2507
- * - 继承 ComponentOptions ,动态加载组件
2508
- * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
2426
+ * 选择 组件配置选项
2509
2427
  */
2510
- type DialogOptions<Props = void, Model = void> = PopupOptions<Props, Model> & {
2428
+ type ChooseOptions<T> = ReadonlyOptions & {
2511
2429
  /**
2512
- * 包裹器配置
2513
- * - 若传入配置,则启用弹窗包裹;弹窗打开时使用`Wrapper`包裹弹窗内容组件
2430
+ * 是否为多选模式
2431
+ * - true 多选模式,可以选中items中多个选项
2432
+ * - false 单选模式,只能选中items中的一个选项
2514
2433
  */
2515
- wrapper?: Pick<WrapperOptions, "header" | "content" | "footer">;
2434
+ multi?: boolean;
2516
2435
  /**
2517
- * 禁用【遮罩层】
2518
- * - 目前没实现,先忽略
2519
- maskDisabled?: boolean;
2436
+ * 选项类型
2437
+ * - radio: 单选框样式
2438
+ * - checkbox: 多选框样式
2520
2439
  */
2440
+ type: "radio" | "checkbox";
2521
2441
  /**
2522
- * 点击【遮罩层】时是否关闭弹窗
2523
- * - 针对无遮罩层的弹窗,则点击非【弹窗组件】区域时是否关闭
2442
+ * 显示模式
2443
+ * - native 原生默认,浏览器自己渲染;不同浏览器效果不一致
2444
+ * - beautiful 美化模式,不同浏览器下效果通义
2524
2445
  */
2525
- closeOnMask?: boolean;
2446
+ mode?: "native" | "beautiful";
2526
2447
  /**
2527
- * 按下【ESC】健时是否关闭弹窗
2448
+ * 选项布局
2449
+ * - 默认值:horizontal
2450
+ * - 可选值:
2451
+ * - - horizontal 水平布局;所有选项一行
2452
+ * - - vertical 垂直布局;每个选项一行
2528
2453
  */
2529
- closeOnEscape?: boolean;
2454
+ layout?: "horizontal" | "vertical";
2530
2455
  /**
2531
- * 模态弹窗的自定义class
2532
- * - 绑定到模态弹窗的根元素上
2456
+ * 待选项目
2457
+ * text 可不传入
2533
2458
  */
2534
- rootClass?: string | string[];
2459
+ items: ChooseItem<T>[];
2460
+ /**
2461
+ * 选项自定义样式
2462
+ * - 可指定选项宽度、高度、外边距
2463
+ */
2464
+ itemStyle?: WidthStyle & HeightStyle & MarginStyle;
2535
2465
  };
2536
2466
  /**
2537
- * 弹窗组件句柄
2538
- * - 用于在弹窗内容组件中进行模式判断和关闭
2467
+ * 选择项
2539
2468
  */
2540
- type DialogHandle<T> = PopupHandle<T> & {
2469
+ type ChooseItem<T> = {
2541
2470
  /**
2542
- * 注册监听【弹窗关闭】事件方法
2543
- * - 仅支持注册一次,多次注册以最后一次的为准
2544
- * @param fn 关闭时执行的钩子函数,支持异步;;调用后若返回false时将阻止弹窗关闭
2471
+ * 选项文本
2545
2472
  */
2546
- onBeforeClose(fn: (data?: T) => false | undefined | Promise<false | undefined>): void;
2473
+ text?: string;
2474
+ /**
2475
+ * 选项值
2476
+ */
2477
+ value: T;
2478
+ /**
2479
+ * 选项描述信息,一般作为解释使用
2480
+ */
2481
+ description?: string;
2547
2482
  };
2548
2483
  /**
2549
- * 弹窗包裹器操作句柄
2484
+ * 选择 组件事件
2550
2485
  */
2551
- type DialogWrapperHandle<T> = {
2486
+ type ChooseEvents<T> = {
2552
2487
  /**
2553
- * 注册【构建数据】事件方法
2554
- * - 仅在Dialog为使用了wrapper模式时生效,用于在【确认】按钮点击时,构建实际内容组件中的数据
2555
- * - 仅支持注册一次,多次注册以最后一次的为准
2556
- * @param fn 取数据时执行的钩子函数,支持异步;若需要阻止弹窗关闭则`fn`方法直接报错即可
2488
+ * 值改变 事件
2489
+ * - values 为当前选中值;单选时为单个值,多选时为值数组
2557
2490
  */
2558
- onBuildData(fn: () => T | Promise<T>): void;
2491
+ change: [values: T | T[]];
2559
2492
  };
2560
2493
 
2561
2494
  /**
2562
- * 确认弹窗配置选项
2563
- * - title 弹窗标题,默认“提示”
2564
- * - message 确认提示信息;默认“请确认?”;支持html格式内容
2495
+ * 按钮配置选项
2565
2496
  */
2566
- type ConfirmOptions = TitleOptions & MessageOptions & ConfirmAreaOptions & {};
2497
+ type ButtonOptions = TitleOptions & {
2498
+ /**
2499
+ * 按钮尺寸
2500
+ * - max : 120 X 40
2501
+ * - middle : 90 X 32
2502
+ * - normal : 54 X 28
2503
+ * - small : 30 X 20
2504
+ */
2505
+ size: "max" | "middle" | "normal" | "small";
2506
+ /**
2507
+ * 按钮类型
2508
+ * - primary: 主按钮:蓝色背景
2509
+ * - default: 默认按钮:白色背景
2510
+ * - link :链接式按钮:蓝色字体颜色,无边框
2511
+ */
2512
+ type: "primary" | "default" | "link";
2513
+ };
2567
2514
 
2568
2515
  /**
2569
- * Toast配置选项
2516
+ * 可操作项组件 的配置选项
2517
+ * - disabled 为true时,不响应操作项触发
2570
2518
  */
2571
- type ToastOptions = {
2519
+ type ActionOptions = DisabledOptions & {
2572
2520
  /**
2573
- * 提示类型,基于类型展示图标
2521
+ * 触发方式
2522
+ * - always :始终显示一个触发图标,点击图标弹出操作项
2523
+ * - hover:鼠标移入显示一个触发图标,点击图标弹出操作项
2524
+ * - long-press:长摁直接弹出操作项
2574
2525
  */
2575
- type?: IconType;
2526
+ trigger: "always" | "hover" | "long-press";
2576
2527
  /**
2577
- * 提示消息;支持html格式
2528
+ * 显示模式
2529
+ * - popup:弹出显示操作项
2530
+ * - inline:内联显示操作项
2578
2531
  */
2579
- message: string;
2580
2532
  /**
2581
- * 提示显示时间
2582
- * - 单位毫秒,默认1500ms
2533
+ * 可用操作项
2583
2534
  */
2584
- duration?: number;
2535
+ actions: ActionItem[];
2536
+ } & Pick<FollowPositionOptions, "followX" | "followY" | "spaceX" | "spaceY">;
2537
+ /**
2538
+ * 操作项集合 组件渲染配置选项
2539
+ */
2540
+ type ActionItemsOptions = {
2585
2541
  /**
2586
- * 关闭按钮是否禁用
2542
+ * 展示模式
2543
+ * - horizontal 水平展示
2544
+ * - vertical 垂直展示
2587
2545
  */
2588
- closeDisabled?: boolean;
2546
+ mode: "horizontal" | "vertical";
2547
+ /**
2548
+ * 要渲染的操作项
2549
+ */
2550
+ actions: ActionItem[];
2589
2551
  };
2590
-
2591
- /**
2592
- * 跟随效果 弹窗
2593
- */
2594
-
2595
- /**
2596
- * 跟随弹窗 配置选项
2597
- * - 传入的组件,根据配置跟随 target 位置和大小;
2598
- * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
2599
- */
2600
- type FollowOptions<Props = void, Model = void> = PopupOptions<Props, Model> & FollowPositionOptions;
2601
2552
  /**
2602
- * 跟随位置 配置选项
2603
- * - 基于此计算出最终的跟随效果
2553
+ * 一个操作项的配置
2604
2554
  */
2605
- type FollowPositionOptions = {
2555
+ type ActionItem = {
2606
2556
  /**
2607
- * 启用【宽度】跟随
2608
- * - 为true则和 target 宽度保持一致
2609
- * - false时,宽度由 弹出组件 自己维护
2610
- * - 不管是true、还是false,若宽度超过浏览器最大宽度,会进行强制干预
2557
+ * 操作项编码
2558
+ * - 确保唯一
2611
2559
  */
2612
- followWidth?: boolean;
2560
+ code: string;
2613
2561
  /**
2614
- * 启用【高度】跟随
2615
- * - 为true则和 target 高度保持一致
2616
- * - false时,高度由 弹出组件 自己维护
2617
- * - 不管是true、还是false,若高度超过浏览器最大高度,会进行强制干预
2562
+ * 操作项名称
2563
+ * - 确保唯一
2618
2564
  */
2619
- followHeight?: boolean;
2565
+ name: string;
2620
2566
  /**
2621
- * x轴方向上的跟随策略
2622
- * - 支持传入一个或者多个,依次尝试选举最优位置(全宽度展示,否则取最大宽度位置)
2623
- * - 不传入则按照默认策略;["start","end","after","before","center","ratio"]
2624
- * - 可选策略值如下:
2625
- * - - start : 起点跟随,和 target 起始位置(left)一致
2626
- * - - end : 终点跟随,和 target 结束位置(right)一致
2627
- * - - center : 中心跟随,和 target 中心位置一致
2628
- * - - before : 之前跟随,组件在 target 左侧展示
2629
- * - - after : 之后跟随,组件在 target 右侧展示
2630
- * - - ratio : 比例跟随,按比例(target中心点/窗口宽度)锚定位置,动态计算left值。
2567
+ * 操作项颜色
2631
2568
  */
2632
- followX?: FollowStrategy | FollowStrategy[];
2569
+ color?: string;
2633
2570
  /**
2634
- * y轴方向上的跟随策略
2635
- * - 支持传入一个或者多个,依次尝试选举最优位置(全高度展示,否则取最大高度位置)
2636
- * - 不传入则按照默认策略;["after","before","start","end","center","ratio"]
2637
- * - 可选策略值如下:
2638
- * - - start : 起点跟随,和 target 起始位置(top)一致
2639
- * - - end : 终点跟随,和 target 结束位置(bottom)一致
2640
- * - - center : 中心跟随,和 target 中心位置一致
2641
- * - - before : 之前跟随,组件在 target 顶部展示
2642
- * - - after : 之后跟随,组件在 target 底部展示
2643
- * - - ratio : 比例跟随,按比例(target中心点/窗口高度)锚定位置,动态计算top值。
2571
+ * 操作项移入时颜色
2644
2572
  */
2645
- followY?: FollowStrategy | FollowStrategy[];
2573
+ hoverColor?: string;
2646
2574
  /**
2647
- * x轴方向上 target 之间的留白空间
2648
- * - 默认0; followX 为 center、ratio 时间距失效
2649
- * - 增加间距,提升展示效果
2650
- * -
2575
+ * 操作项图标
2651
2576
  */
2652
- spaceX?: number;
2577
+ icon?: Pick<IconOptions, "type" | "size" | "title">;
2578
+ };
2579
+ /**
2580
+ * 可操作向组件 插槽句柄
2581
+ */
2582
+ type ActionSlotHandle = {
2653
2583
  /**
2654
- * y轴方向上 target 之间的留白空间
2655
- * - 默认0;followY 为 center、ratio 时间距失效
2656
- * - 增加间距,提升展示效果
2584
+ * 操作项是否激活显示
2657
2585
  */
2658
- spaceY?: number;
2586
+ isActived(): boolean;
2659
2587
  /**
2660
- * 和 浏览器客户 端之间的留白空间
2661
- * - 弹出组件 和浏览器客户端窗口之间的【留白空间】
2662
- * - 仅在 弹出组件 计算出来位置紧贴浏览器窗口时生效
2663
- * - 若强制指定了 start、end,则对应的起始、结束位置不受此值影响
2588
+ * 触发操作项显示
2664
2589
  */
2665
- spaceClient?: number;
2590
+ trigger(): void;
2591
+ };
2592
+ /**
2593
+ * 可操作项组件 的事件
2594
+ */
2595
+ type ActionEvents = {
2666
2596
  /**
2667
- * 点击【遮罩层】时是否关闭弹窗
2668
- * - 则点击非【跟随组件】区域时是否关闭
2597
+ * 操作项激活时
2598
+ * @param code 操作项的code
2669
2599
  */
2670
- closeOnMask?: boolean;
2600
+ trigger: [code: string];
2601
+ };
2602
+
2603
+ /**
2604
+ * 输入框配置选项
2605
+ * - title 将作为 输入框标题区域文本;不传入则不展示 标题区域,仅展示输入框
2606
+ * - 暂不提供 disabled 逻辑
2607
+ */
2608
+ type InputOptions = ReadonlyOptions & /*DisabledOptions & */ PlaceholderOptions & TitleOptions & {
2671
2609
  /**
2672
- * 按下【ESC】健时是否关闭弹窗
2610
+ * 输入框类型
2611
+ * - text: 文本输入框
2612
+ * - number: 数字输入框
2613
+ * - password: 密码输入框
2673
2614
  */
2674
- closeOnEscape?: boolean;
2615
+ type?: "text" | "number" | "password";
2675
2616
  /**
2676
- * window窗口【resize】时是否关闭弹窗
2617
+ * 输入框是否必填
2618
+ * - 必填,则验证不通过时,显示错误信息
2619
+ * - 必填时,显示必填标记,红色 * 号
2677
2620
  */
2678
- closeOnResize?: boolean;
2621
+ required?: boolean;
2679
2622
  /**
2680
- * target改变时是否关闭弹窗
2681
- * - target尺寸、位置变化
2682
- * - target点击时
2623
+ * 标题区域样式
2624
+ * - 对齐方式
2625
+ * - 标题区域宽度
2683
2626
  */
2684
- closeOnTarget?: boolean;
2627
+ titleStyle?: BaseStyle & WidthStyle & FlexBoxStyle;
2685
2628
  };
2686
2629
  /**
2687
- * 跟随策略
2688
- * - 详细值定义,参照 FollowOptions.followX 和 FollowOptions.followY
2689
- */
2690
- type FollowStrategy = "start" | "center" | "end" | "before" | "after" | "ratio";
2691
- /**
2692
- * 跟随弹窗 句柄
2693
- * - 用于在 弹窗组件 内部进行模式判断和关闭跟随弹窗
2630
+ * 输入框事件
2694
2631
  */
2695
- type FollowHandle<T> = PopupHandle<T> & {};
2632
+ type InputEvents = {
2633
+ /**
2634
+ * 输入框点击时
2635
+ */
2636
+ click: [];
2637
+ /**
2638
+ * 输入框内容发生改变时
2639
+ * @param value 输入框内容
2640
+ */
2641
+ change: [value: string];
2642
+ };
2643
+
2696
2644
  /**
2697
- * 跟随弹窗 扩展配置
2645
+ * 接口:响应式管理器
2698
2646
  */
2699
- type FollowExtend = PopupStatusOptions & {
2647
+ interface IReactiveManager {
2700
2648
  /**
2701
- * 跟随的目标元素
2649
+ * 响应式【过渡】变量值
2650
+ * - 通过设置 rv.value 的值来实现.value值过渡
2651
+ * - 执行顺序 from、to
2652
+ * - 开始时,设置 rv.value 值为 from;延迟time时间后,强制销毁scope
2653
+ * - 销毁scope时,强制将 rv.value 值设置为 to 值
2654
+ * @param rv 响应式变量对象
2655
+ * @param effect 过渡效果配置,约束 from end 样式
2656
+ * @param time 过渡持续时间,到时间后销毁作用域
2657
+ * @returns 作用域对象,可销毁【值过渡】效果
2702
2658
  */
2703
- target: Element;
2659
+ transition<T>(rv: ReactiveVar<T>, effect: {
2660
+ from: T;
2661
+ to: T;
2662
+ }, time: number): IScope;
2704
2663
  /**
2705
- * x轴方向的跟随策略:响应式
2706
- * - 基于外部传入的跟随策略,计算选举出来的最优策略值
2664
+ * 响应式【加载】任务
2665
+ * - 任务运行时,设置loading.value=true
2666
+ * - 任务完成后,设置loading.value=false
2667
+ * - 可通过delay值,延迟执行 loading.value=false 操作
2668
+ * - 可在api请求等耗时操作任务过程中,实现响应式显隐Loading组件
2669
+ * @param task 要运行的任务
2670
+ * @param loading 正在加载的响应式变量
2671
+ * @param delay 延迟时间,单位ms;不传则不延迟
2672
+ * @returns 任务自身
2707
2673
  */
2708
- followX: ShallowRef<FollowStrategy>;
2674
+ load<T>(task: Promise<T>, loading: ReactiveVar<boolean>, delay: number): Promise<RunResult<T>>;
2709
2675
  /**
2710
- * y轴方向的跟随策略:响应式
2711
- * - 基于外部传入的跟随策略,计算选举出来的最优策略值
2676
+ * 监听器:监听单个值变化
2677
+ * - 内部利用vue的watch逻辑实现
2678
+ * - 自动进行生命周期管理,作用域销毁时自动清理watch监听
2679
+ * - 仅实现简化版本watch监听;复杂的监听逻辑,自行使用watch方法
2680
+ * @param source 监听源
2681
+ * @param callback 回调方法:可接收新旧值变化
2682
+ * @param deep 是否进行深度监听;默认false
2683
+ * @returns 监听作用域,destroy可销毁监听
2712
2684
  */
2713
- followY: ShallowRef<FollowStrategy>;
2685
+ watcher<T>(source: WatchSource<T>, callback: (newValue: T, oldValue: T) => void, deep?: boolean): IScope;
2686
+ }
2687
+ /**
2688
+ * 响应式变量
2689
+ */
2690
+ type ReactiveVar<T> = ShallowRef<T> | Ref<T>;
2691
+
2692
+ /**
2693
+ * 开关组件 配置选项
2694
+ */
2695
+ type SwitchOptions = ReadonlyOptions & {
2714
2696
  /**
2715
- * Follow弹窗是否【钉住】了
2716
- * - 为true时,closeOnMask、closeOnEscape失效
2717
- * - 满足 子弹窗 点击等操作时,不自动销毁父级弹窗
2697
+ * 类型,决定开启/关闭状态的渲染效果
2698
+ * - switch 开关类型,默认效果
2699
+ * - radio 单选框效果,圆角边框
2700
+ * - checkbox 复选框效果,矩形边框
2718
2701
  */
2719
- pinned: ShallowRef<boolean>;
2702
+ type?: "switch" | "radio" | "checkbox";
2720
2703
  };
2721
2704
  /**
2722
- * 跟随策略 配置选项
2705
+ * 开关 事件
2723
2706
  */
2724
- type FollowStrategyOptions = {
2725
- /**
2726
- * x轴的跟随策略
2727
- */
2728
- followX?: FollowStrategy;
2707
+ type SwitchEvents = {
2729
2708
  /**
2730
- * x轴的跟随策略
2709
+ * 开关 状态变化时
2710
+ * @param value 开启、还是关闭
2731
2711
  */
2732
- followY?: FollowStrategy;
2712
+ change: [value: boolean];
2733
2713
  };
2714
+
2734
2715
  /**
2735
- * 跟随选举结果
2716
+ * 多行文本框组件配置选项
2736
2717
  */
2737
- type FollowElectResult = {
2718
+ type TextareaOptions = ReadonlyOptions & PlaceholderOptions & {
2738
2719
  /**
2739
- * 跟随策略
2720
+ * 是否自适应高度
2721
+ * - 传入true时,根据文本框内容,自动调整高度
2722
+ * - 若传入maxRows,则自动高度不会超过maxRows
2740
2723
  */
2741
- strategy: FollowStrategy;
2724
+ autoHeight: boolean;
2742
2725
  /**
2743
- * 开始位置:x/top
2726
+ * 最小行数
2727
+ * - 作为默认行数
2728
+ * - 不传入则默认4
2744
2729
  */
2745
- start: number;
2730
+ minRows?: number;
2746
2731
  /**
2747
- * 调整后的尺寸(width/height)
2748
- * - 为undefined表示无需调整尺寸
2732
+ * 最大行数
2733
+ * - 不传入则默认10
2734
+ * - `autoHeight`为true时生效;
2749
2735
  */
2750
- size?: number;
2736
+ maxRows?: number;
2751
2737
  };
2752
-
2753
2738
  /**
2754
- * 弹窗管理器
2739
+ * 多行文本框组件事件
2755
2740
  */
2756
- interface IPopupManager {
2757
- /**
2758
- * 弹出
2759
- * - 弹窗位置位置、大小、动画效果等由组件自己完成
2760
- * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
2761
- * @param options 弹窗配置选项
2762
- * @returns 弹窗打开结果,外部可手动关闭弹窗
2763
- */
2764
- popup<T, Props = void, Model = void>(options: PopupOptions<Props, Model>): IAsyncScope<T>;
2741
+ type TextareaEvents = {
2765
2742
  /**
2766
- * 对话框
2767
- * - 支持指定模态和非模态对话框
2768
- * - 默认垂直水平居中展示
2769
- * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
2770
- * @param options 弹窗配置选项
2771
- * @returns 弹窗打开结果,外部可手动关闭弹窗
2743
+ * 获取焦点时
2772
2744
  */
2773
- dialog<T, Props = void, Model = void>(options: DialogOptions<Props, Model>): IAsyncScope<T>;
2745
+ focus: [];
2774
2746
  /**
2775
- * 跟随弹窗
2776
- * - 跟随指定的target对象,可跟随位置、大小
2777
- * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
2778
- * @param target 跟随的目标元素
2779
- * @param options 跟随配置选项
2780
- * @returns 弹窗异步作用域,外部可手动关闭弹窗
2747
+ * 输入时
2748
+ * @param value 输入框内容
2781
2749
  */
2782
- follow<T, Props = void, Model = void>(target: HTMLElement, options: FollowOptions<Props, Model>): IAsyncScope<T>;
2750
+ input: [value: string];
2783
2751
  /**
2784
- * 打开【确认】弹窗
2785
- * @param title 弹窗标题
2786
- * @param message 确认提示信息,支持html片段
2787
- * @param options 确认弹窗其他配置信息
2788
- * @returns 弹窗打开结果,外部可手动关闭弹窗
2752
+ * 失焦时
2753
+ * @param value 输入框内容
2789
2754
  */
2790
- confirm(title: string, message: string, options?: Omit<ConfirmOptions, "title" | "message">): IAsyncScope<boolean>;
2755
+ blur: [value: string];
2791
2756
  /**
2792
- * Toast 提示框
2793
- * @param type 提示类型:成功、失败、、、
2794
- * @param message 提示消息
2795
- * @param options 提示框配置选项
2796
- * @returns 弹窗打开结果,外部可手动关闭弹窗
2757
+ * 输入框内容发生改变时
2758
+ * @param value 输入框内容
2797
2759
  */
2798
- toast(type: IconType, message: string, options?: Omit<ToastOptions, "type" | "message">): IScope;
2799
- }
2760
+ change: [value: string];
2761
+ };
2800
2762
 
2801
2763
  /**
2802
- * 选择器 相关数据实体
2764
+ * 使用【响应式管理器】
2765
+ * - 请在Vue组件的setup中使用此方法,否则 getCurrentScope 方法无法取到值
2766
+ * @returns 全新的【响应式管理器】+作用域
2803
2767
  */
2768
+ declare function useReactive(): IReactiveManager & IScope;
2804
2769
 
2805
2770
  /**
2806
- * 接口:选择器管理器
2771
+ * 树的基础组件信息
2772
+ * 1、组件基础上下文 默认实现
2807
2773
  */
2808
- interface IPickerManager {
2809
- /**
2810
- * 显示【日期】选择器
2811
- * @param target 哪个元素触发,基于此元素计算位置
2812
- * @param options 日期选择器配置选项
2813
- * @param popupOptions 弹窗配置选项;内部根据情况选择属性使用
2814
- * @returns 异步任务,可销毁日期选择器;可接收日期选择器的选择值
2815
- */
2816
- showDate(target: HTMLElement, options?: DatePickerOptions, popupOptions?: PickerPopupOptions): IAsyncScope<string>;
2817
- /**
2818
- * 显示【时间】选择控件
2819
- * @param target 哪个元素触发,基于此元素计算位置
2820
- * @param options 时间选择控件配置选项
2821
- * @param popupOptions 弹窗配置选项;内部根据情况选择属性使用
2822
- * @returns 异步任务,可销毁时间选择控件;可接收时间选择控件的选择值
2823
- */
2824
- showTime(target: HTMLElement, options?: TimePickerOptions, popupOptions?: PickerPopupOptions): IAsyncScope<string>;
2825
- }
2774
+
2826
2775
  /**
2827
- * 选择器弹窗配置选项
2828
- * - 放开一些属性,方便用户做一些自定义
2776
+ * 使用【树上下文】
2777
+ * @param nodes 树节点集合
2778
+ * @param activeNodeRef 当前激活的树节点引用;不传入,则无法实现 isActived 判断
2779
+ * @returns 上下文对象+作用域
2829
2780
  */
2830
- type PickerPopupOptions = FollowPositionOptions;
2781
+ declare function useTreeContext<T>(nodes: TreeNode<T, TreeNodeExtend>[], activeNodeRef?: ShallowRef<TreeNode<T, TreeNodeExtend>>): ITreeBaseContext<T> & IScope;
2782
+
2831
2783
  /**
2832
- * 选择器扩展
2784
+ * Vue App助手类,做一些app实例的辅助性工作
2833
2785
  */
2834
- type PickerExtend = {
2835
- /**
2836
- * 弹窗管理器
2837
- * - 方便下级再弹窗,公用一个管理器,方便生命周期管理
2838
- */
2839
- popup: IPopupManager;
2840
- /**
2841
- * 选择器对象,方便内部在弹出选择
2842
- * - 如日期选择器中,在选择时间
2843
- */
2844
- picker: IPickerManager;
2845
- };
2786
+
2787
+ /** 私有类型:App类型
2788
+ * - normal 普通app实例
2789
+ * - popup 弹窗app实例;包括 Dialog、Follow等所有弹窗
2790
+ */
2791
+ type AppType = "normal" | "popup";
2792
+ /**
2793
+ * app实例创建完之后的回调通知
2794
+ * @param fn 回调通知
2795
+ * @returns 通知句柄,可销毁回调通知,一般在外部销毁时执行
2796
+ */
2797
+ declare function onAppCreated(fn: (app: App, type?: AppType) => void): IScope;
2798
+ /**
2799
+ * 触发app创建后事件
2800
+ * @param app 创建的app实例
2801
+ * @param type app创建类型;满足区分特定app实例使用
2802
+ * @returns app自身
2803
+ */
2804
+ declare function triggerAppCreated(app: App, type?: AppType): App;
2846
2805
 
2847
2806
  /**
2848
- * 使用选择器
2849
- * @returns 选择器实例+作用域对象
2807
+ * 图标助手类
2850
2808
  */
2851
- declare function usePicker(): IPickerManager & IScope;
2852
2809
 
2853
2810
  /**
2854
- * 使用【弹窗管理器】
2855
- * @returns 全新的【弹窗管理器】实例+作用域对象
2811
+ * 获取内置图标绘制路径
2812
+ * @param iconType 图标类型
2813
+ * @returns 图标路径
2856
2814
  */
2857
- declare function usePopup(): IPopupManager & IScope;
2815
+ declare function getBuiltinIcon(iconType: IconType): string[];
2816
+
2817
+ /**
2818
+ * 动态加载组件 组件配置选项
2819
+ */
2820
+ type DynamicOptions<Props = void> = ComponentOptions & Pick<ComponentBindOptions<Props>, "props">;
2821
+
2822
+ /**
2823
+ * 挂载指定的Vue组件
2824
+ * - 权限构建的vue app实例,挂载传入的组件
2825
+ * @param target 挂载的目标元素
2826
+ * @param options 挂载配置选项
2827
+ * @param onDestroyed 监听【调用方】的销毁时机,用于自动销毁挂载的实力
2828
+ * @returns 作用域对象,销毁挂载实例
2829
+ */
2830
+ declare function mount<Props>(target: HTMLElement, options: DynamicOptions<Props>, onDestroyed?: (fn: () => void) => void): IScope;
2831
+
2832
+ /**
2833
+ * 运动组件的助手方法变量
2834
+ */
2835
+ /**
2836
+ * 运行效果常量
2837
+ */
2838
+ declare const MOTION: Readonly<{
2839
+ /** 淡入淡出;进入时 `opacity:0~1`;退出时 `opacity:1~0`*/
2840
+ fade: {
2841
+ enter: string;
2842
+ leave: string;
2843
+ };
2844
+ /** 缩放进入:进入时 `scale:0~1`;退出时 `scale:1~0`*/
2845
+ scale: {
2846
+ enter: string;
2847
+ leave: string;
2848
+ };
2849
+ /** 旋转:进入时 `rotate:360deg~0`;退出时 `rotate:0~360deg`*/
2850
+ rotate: {
2851
+ enter: string;
2852
+ leave: string;
2853
+ };
2854
+ /** 顶部进入退出:进入时`translateY:-100%~0`;退出时`translateY:0~-100%`*/
2855
+ top: {
2856
+ enter: string;
2857
+ leave: string;
2858
+ };
2859
+ /** 顶部进入底部退出:进入时`translateY:-100%~0`;退出时`translateY:0~100%`*/
2860
+ topBottom: {
2861
+ enter: string;
2862
+ leave: string;
2863
+ };
2864
+ /** 底部进入退出:进入时`translateY:100%~0`;退出时`translateY:0~100%`*/
2865
+ bottom: {
2866
+ enter: string;
2867
+ leave: string;
2868
+ };
2869
+ /** 底部进入顶部退出:进入时`translateY:100%~0`;退出时`translateY:0~-100%`*/
2870
+ bottomTop: {
2871
+ enter: string;
2872
+ leave: string;
2873
+ };
2874
+ /** 左侧进入退出:进入时`translateX:-100%~0`;退出时`translateX:0~-100%`*/
2875
+ left: {
2876
+ enter: string;
2877
+ leave: string;
2878
+ };
2879
+ /** 左侧进入右侧退出:进入时`translateX:-100%~0`;退出时`translateX:0~100%`*/
2880
+ leftRight: {
2881
+ enter: string;
2882
+ leave: string;
2883
+ };
2884
+ /** 右侧进入右侧退出:进入时`translateX:100%~0`;退出时`translateX:0~100%`*/
2885
+ right: {
2886
+ enter: string;
2887
+ leave: string;
2888
+ };
2889
+ /** 右侧进入左侧退出:进入时`translateX:100%~0`;退出时`translateX:0~-100%`*/
2890
+ rightLeft: {
2891
+ enter: string;
2892
+ leave: string;
2893
+ };
2894
+ }>;
2895
+
2896
+ /**
2897
+ * 使用选择器
2898
+ * @returns 选择器实例+作用域对象
2899
+ */
2900
+ declare function usePicker(): IPickerManager & IScope;
2858
2901
 
2859
2902
  declare const components: {
2860
2903
  Action: {
@@ -2893,18 +2936,28 @@ declare const components: {
2893
2936
  };
2894
2937
  });
2895
2938
  Button: {
2896
- new (...args: any[]): vue.CreateComponentPublicInstanceWithMixins<Readonly<ButtonOptions> & Readonly<{}>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, vue.PublicProps, {}, false, {}, {}, vue.GlobalComponents, vue.GlobalDirectives, string, {}, any, vue.ComponentProvideOptions, {
2939
+ new (...args: any[]): vue.CreateComponentPublicInstanceWithMixins<Readonly<ButtonOptions> & Readonly<{
2940
+ onClick?: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
2941
+ }>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
2942
+ click: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
2943
+ }, vue.PublicProps, {}, false, {}, {}, vue.GlobalComponents, vue.GlobalDirectives, string, {}, any, vue.ComponentProvideOptions, {
2897
2944
  P: {};
2898
2945
  B: {};
2899
2946
  D: {};
2900
2947
  C: {};
2901
2948
  M: {};
2902
2949
  Defaults: {};
2903
- }, Readonly<ButtonOptions> & Readonly<{}>, {}, {}, {}, {}, {}>;
2950
+ }, Readonly<ButtonOptions> & Readonly<{
2951
+ onClick?: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
2952
+ }>, {}, {}, {}, {}, {}>;
2904
2953
  __isFragment?: never;
2905
2954
  __isTeleport?: never;
2906
2955
  __isSuspense?: never;
2907
- } & vue.ComponentOptionsBase<Readonly<ButtonOptions> & Readonly<{}>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, {}, {}, string, {}, vue.GlobalComponents, vue.GlobalDirectives, string, vue.ComponentProvideOptions> & vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & (new () => {
2956
+ } & vue.ComponentOptionsBase<Readonly<ButtonOptions> & Readonly<{
2957
+ onClick?: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
2958
+ }>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
2959
+ click: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
2960
+ }, string, {}, {}, string, {}, vue.GlobalComponents, vue.GlobalDirectives, string, vue.ComponentProvideOptions> & vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & (new () => {
2908
2961
  $slots: {
2909
2962
  default?: (props: {}) => any;
2910
2963
  };
@@ -2994,18 +3047,28 @@ declare const components: {
2994
3047
  };
2995
3048
  });
2996
3049
  Icon: {
2997
- new (...args: any[]): vue.CreateComponentPublicInstanceWithMixins<Readonly<IconOptions> & Readonly<{}>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, vue.PublicProps, {}, true, {}, {}, vue.GlobalComponents, vue.GlobalDirectives, string, {}, any, vue.ComponentProvideOptions, {
3050
+ new (...args: any[]): vue.CreateComponentPublicInstanceWithMixins<Readonly<IconOptions> & Readonly<{
3051
+ onClick?: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
3052
+ }>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3053
+ click: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
3054
+ }, vue.PublicProps, {}, true, {}, {}, vue.GlobalComponents, vue.GlobalDirectives, string, {}, any, vue.ComponentProvideOptions, {
2998
3055
  P: {};
2999
3056
  B: {};
3000
3057
  D: {};
3001
3058
  C: {};
3002
3059
  M: {};
3003
3060
  Defaults: {};
3004
- }, Readonly<IconOptions> & Readonly<{}>, {}, {}, {}, {}, {}>;
3061
+ }, Readonly<IconOptions> & Readonly<{
3062
+ onClick?: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
3063
+ }>, {}, {}, {}, {}, {}>;
3005
3064
  __isFragment?: never;
3006
3065
  __isTeleport?: never;
3007
3066
  __isSuspense?: never;
3008
- } & vue.ComponentOptionsBase<Readonly<IconOptions> & Readonly<{}>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, {}, {}, string, {}, vue.GlobalComponents, vue.GlobalDirectives, string, vue.ComponentProvideOptions> & vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & (new () => {
3067
+ } & vue.ComponentOptionsBase<Readonly<IconOptions> & Readonly<{
3068
+ onClick?: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
3069
+ }>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3070
+ click: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
3071
+ }, string, {}, {}, string, {}, vue.GlobalComponents, vue.GlobalDirectives, string, vue.ComponentProvideOptions> & vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & (new () => {
3009
3072
  $slots: {
3010
3073
  default?: (props: {}) => any;
3011
3074
  };
@@ -3017,8 +3080,8 @@ declare const components: {
3017
3080
  } & {
3018
3081
  modelValue?: string;
3019
3082
  }, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3020
- change: (value: string) => any;
3021
3083
  click: () => any;
3084
+ change: (value: string) => any;
3022
3085
  "update:modelValue": (value: string) => any;
3023
3086
  }, string, vue.PublicProps, Readonly<ReadonlyOptions & PlaceholderOptions & TitleOptions & {
3024
3087
  type?: "text" | "number" | "password";
@@ -3027,8 +3090,8 @@ declare const components: {
3027
3090
  } & {
3028
3091
  modelValue?: string;
3029
3092
  }> & Readonly<{
3030
- onChange?: (value: string) => any;
3031
3093
  onClick?: () => any;
3094
+ onChange?: (value: string) => any;
3032
3095
  "onUpdate:modelValue"?: (value: string) => any;
3033
3096
  }>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
3034
3097
  Number: vue.DefineComponent<PlaceholderOptions & ReadonlyOptions & NumberBaseOptions & {
@@ -3637,35 +3700,47 @@ declare const components: {
3637
3700
  DatePicker: vue.DefineComponent<ReadonlyOptions & {
3638
3701
  value?: string;
3639
3702
  format?: snail_core.DateFormat;
3703
+ mode?: "default" | "simple";
3640
3704
  min?: string;
3641
3705
  max?: string;
3642
3706
  minPickTime?: string;
3643
3707
  maxPickTime?: string;
3644
- } & DatetimeDisabledOptions, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3708
+ } & DatetimeDisabledOptions & {
3709
+ popup?: PickerPopupOptions;
3710
+ }, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3645
3711
  change: (newValue: string, oldValue?: string) => any;
3646
3712
  }, string, vue.PublicProps, Readonly<ReadonlyOptions & {
3647
3713
  value?: string;
3648
3714
  format?: snail_core.DateFormat;
3715
+ mode?: "default" | "simple";
3649
3716
  min?: string;
3650
3717
  max?: string;
3651
3718
  minPickTime?: string;
3652
3719
  maxPickTime?: string;
3653
- } & DatetimeDisabledOptions> & Readonly<{
3720
+ } & DatetimeDisabledOptions & {
3721
+ popup?: PickerPopupOptions;
3722
+ }> & Readonly<{
3654
3723
  onChange?: (newValue: string, oldValue?: string) => any;
3655
3724
  }>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
3656
3725
  TimePicker: vue.DefineComponent<ReadonlyOptions & {
3657
3726
  value?: string;
3658
3727
  format?: "HH:mm:ss" | "HH:mm";
3728
+ mode?: "default" | "simple";
3659
3729
  min?: string;
3660
3730
  max?: string;
3661
- } & DatetimeDisabledOptions, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3731
+ } & DatetimeDisabledOptions & {
3732
+ popup?: PickerPopupOptions;
3733
+ }, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3662
3734
  change: (newValue: string, oldValue?: string) => any;
3663
3735
  }, string, vue.PublicProps, Readonly<ReadonlyOptions & {
3664
3736
  value?: string;
3665
3737
  format?: "HH:mm:ss" | "HH:mm";
3738
+ mode?: "default" | "simple";
3666
3739
  min?: string;
3667
3740
  max?: string;
3668
- } & DatetimeDisabledOptions> & Readonly<{
3741
+ } & DatetimeDisabledOptions & {
3742
+ popup?: PickerPopupOptions;
3743
+ }> & Readonly<{
3669
3744
  onChange?: (newValue: string, oldValue?: string) => any;
3670
3745
  }>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
3671
3746
  DragVerify: vue.DefineComponent<DragVerifyOptions, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {} & {