@yoyaflow/yoya-ui 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yoyaflow/yoya-ui",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "description": "A browser-native JS UI library with declarative HTML authoring: component library, router, i18n, theming and layout, works with or without a build tool, SSR-ready.",
5
5
  "type": "module",
6
6
  "private": false,
package/types/core.d.ts CHANGED
@@ -450,6 +450,69 @@ export function vStateNode<S extends Record<string, unknown> = Record<string, un
450
450
  config: StateNodeConfig<S>
451
451
  ): StateNodeComponent<S>;
452
452
 
453
+ // ---------------------------------------------------------------------------
454
+ // Request
455
+ // ---------------------------------------------------------------------------
456
+
457
+ /** 请求传输层:RequestBase.submit() 会调用它,返回统一包装结构(如 Result.from 的 raw)。 */
458
+ export type RequestSubmit = (request: RequestCommand) => unknown;
459
+
460
+ /** 注册请求传输层;传 null 清除注册。 */
461
+ export function configureRequest(options?: { submit?: RequestSubmit | null }): RequestSubmit | null;
462
+
463
+ /** 请求实例:描述请求与映射,方法由 RequestBase 或子类提供。 */
464
+ export interface RequestCommand {
465
+ address(): string;
466
+ method(): string;
467
+ headers(): Record<string, string>;
468
+ cookies(): string | null;
469
+ body(): unknown;
470
+ params(): Record<string, unknown>;
471
+ submit(): unknown;
472
+ toItem?: (row: unknown) => unknown;
473
+ toDetail?: (data: unknown) => unknown;
474
+ [key: string]: unknown;
475
+ }
476
+
477
+ /** 请求基类:定义请求描述与提交的默认逻辑,子类覆写或扩展。 */
478
+ export class RequestBase {
479
+ method(): string;
480
+ headers(): Record<string, string>;
481
+ cookies(): string | null;
482
+ body(): unknown;
483
+ params(): Record<string, unknown>;
484
+ address(): string;
485
+ submit(): unknown;
486
+ }
487
+
488
+ // ---------------------------------------------------------------------------
489
+ // Result
490
+ // ---------------------------------------------------------------------------
491
+
492
+ export type ResultKind = 'detail' | 'list' | 'page';
493
+
494
+ /** 统一返回结构:自动判断 detail / list / page 并完成映射,失败时 from 抛错。 */
495
+ export class Result<T = unknown> {
496
+ ok: boolean;
497
+ code: string;
498
+ msg: string | null;
499
+ showType: number;
500
+ data: T;
501
+ kind: ResultKind;
502
+ pageNum: number | null;
503
+ pageSize: number | null;
504
+ total: number | null;
505
+ readonly isSuccess: boolean;
506
+ readonly pages: number;
507
+
508
+ constructor(init?: Partial<Result<T>>);
509
+
510
+ static from<T = unknown>(
511
+ raw: unknown,
512
+ command?: { toItem?: (item: unknown) => unknown; toDetail?: (data: unknown) => unknown }
513
+ ): Result<T>;
514
+ }
515
+
453
516
  // ---------------------------------------------------------------------------
454
517
  // Theme
455
518
  // ---------------------------------------------------------------------------
@@ -474,6 +537,30 @@ export function resolveYoyaMode(): 'light' | 'dark';
474
537
  export function setYoyaTheme(name?: string, options?: ThemePersistOptions): string;
475
538
  export function getYoyaTheme(): string;
476
539
 
540
+ /** Binds a document-level event listener (outside click, drag, Escape, scroll). */
541
+ export function bindDocumentEvent(
542
+ type: string,
543
+ handler: (event: Event) => void,
544
+ options?: AddEventListenerOptions | boolean
545
+ ): () => void;
546
+
547
+ /** Removes a document-level event listener. */
548
+ export function unbindDocumentEvent(
549
+ type: string,
550
+ handler: (event: Event) => void,
551
+ options?: AddEventListenerOptions | boolean
552
+ ): void;
553
+
554
+ /** Binds a window-level global listener (scroll / resize / popstate). */
555
+ export function bindWindowEvent(
556
+ type: string,
557
+ handler: (event: Event) => void,
558
+ options?: AddEventListenerOptions | boolean
559
+ ): () => void;
560
+
561
+ /** Injects a <style> into <head>; dataAttribute is used for dedup and identification. */
562
+ export function injectDocumentStyle(styleText: string, dataAttribute?: string | null): HTMLStyleElement | null;
563
+
477
564
  /** Initializes theme mode/name from explicit values or persisted storage. */
478
565
  export function initYoyaTheme(options?: InitYoyaThemeOptions): {
479
566
  mode: YoyaMode;
@@ -271,6 +271,83 @@ export class VScroll extends HtmlElementNode {
271
271
  check(): VScroll;
272
272
  }
273
273
 
274
+ // ---------------------------------------------------------------------------
275
+ // Tree Ranger
276
+ // ---------------------------------------------------------------------------
277
+
278
+ export interface TreeRangerColumnContext {
279
+ column: number;
280
+ offset: number;
281
+ page: number;
282
+ pageSize: number;
283
+ selection: unknown[];
284
+ selections: unknown[];
285
+ }
286
+
287
+ export interface TreeRangerLoadResult {
288
+ hasMore?: boolean;
289
+ items: unknown[];
290
+ pageSize?: number;
291
+ }
292
+
293
+ export interface TreeRangerColumn {
294
+ icon?: (item: unknown, index: number) => ChildInput;
295
+ itemText?: (item: unknown) => string;
296
+ pageSize?: number;
297
+ title?: ChildInput;
298
+ load?: (
299
+ context: TreeRangerColumnContext
300
+ ) => Promise<TreeRangerLoadResult | unknown[]> | TreeRangerLoadResult | unknown[];
301
+ renderItem?: (item: unknown, index: number) => ChildInput;
302
+ itemKey?: (item: unknown) => unknown;
303
+ }
304
+
305
+ export interface TreeRangerChangePayload {
306
+ current: number;
307
+ detail: unknown;
308
+ selections: unknown[];
309
+ type: string;
310
+ }
311
+
312
+ export interface TreeRangerOptions {
313
+ ariaLabel?: string;
314
+ columns?: TreeRangerColumn[];
315
+ columnWidth?: number;
316
+ emptyText?: string;
317
+ itemHeight?: number;
318
+ loadingText?: string;
319
+ minSize?: number;
320
+ overscan?: number;
321
+ visibleColumns?: number;
322
+ change?: (payload: TreeRangerChangePayload) => void;
323
+ onChange?: (payload: TreeRangerChangePayload) => void;
324
+ }
325
+
326
+ export interface TreeRanger {
327
+ ariaLabel(value?: string): TreeRanger;
328
+ columns(): TreeRangerColumn[];
329
+ columns(value: TreeRangerColumn[]): TreeRanger;
330
+ itemHeight(value?: number): number | TreeRanger;
331
+ overscan(value?: number): number | TreeRanger;
332
+ columnWidth(value?: number): number | TreeRanger;
333
+ minSize(value?: number): number | TreeRanger;
334
+ visibleColumns(value?: number): number | TreeRanger;
335
+ selectedKeys(): unknown[];
336
+ selectedItems(): unknown[];
337
+ current(): number;
338
+ back(): TreeRanger;
339
+ reload(): TreeRanger;
340
+ refresh(): TreeRanger;
341
+ render(): HtmlElementNode;
342
+ change(handler: (payload: TreeRangerChangePayload) => void): TreeRanger;
343
+ onChange(handler: (payload: TreeRangerChangePayload) => void): TreeRanger;
344
+ [key: string]: any;
345
+ }
346
+
347
+ export function vTreeRanger(setup?: TreeRangerColumn[] | TreeRangerOptions | SetupCallback<TreeRanger>): TreeRanger;
348
+ export const treeRanger: typeof vTreeRanger;
349
+ export function vTreeRangerColumn(setup?: unknown): unknown;
350
+
274
351
  // ---------------------------------------------------------------------------
275
352
  // Table
276
353
  // ---------------------------------------------------------------------------
package/types/form.d.ts CHANGED
@@ -66,6 +66,27 @@ export class VColorPicker extends HtmlElementNode {
66
66
  ): VColorPicker;
67
67
  }
68
68
 
69
+ /** SVG icon picker with a dialog: opens an icon grid for selection. */
70
+ export class VSvgIconPicker extends HtmlElementNode {
71
+ value(): string | null;
72
+ value(next: string | null): VSvgIconPicker;
73
+ clearValue(): VSvgIconPicker;
74
+ disabled(): boolean;
75
+ disabled(next: boolean): VSvgIconPicker;
76
+ name(): string;
77
+ name(next: string): VSvgIconPicker;
78
+ required(): boolean;
79
+ required(next: boolean): VSvgIconPicker;
80
+ icons(): string[];
81
+ icons(next: Array<string | { icon: () => any; name: string }>): VSvgIconPicker;
82
+ open(value?: boolean): VSvgIconPicker;
83
+ close(): VSvgIconPicker;
84
+ toggle(): VSvgIconPicker;
85
+ change(): Array<(name: string | null, picker: VSvgIconPicker) => void>;
86
+ change(handler: (name: string | null, picker: VSvgIconPicker) => void): VSvgIconPicker;
87
+ onChange(handler: (name: string | null, picker: VSvgIconPicker) => void): VSvgIconPicker;
88
+ }
89
+
69
90
  /** Slider input with min/max/step constraints. */
70
91
  export class VSlider extends HtmlElementNode {
71
92
  value(): number;
package/types/svg.d.ts CHANGED
@@ -137,6 +137,7 @@ export function FolderOutlined(): SvgElementNode;
137
137
  export function FolderOpenOutlined(): SvgElementNode;
138
138
  export function HeartOutlined(): SvgElementNode;
139
139
  export function HomeOutlined(): SvgElementNode;
140
+ export function ImageOutlined(): SvgElementNode;
140
141
  export function InfoOutlined(): SvgElementNode;
141
142
  export function LockOutlined(): SvgElementNode;
142
143
  export function LogoutOutlined(): SvgElementNode;