@yoyaflow/yoya-ui 0.2.0 → 0.3.0

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.0",
3
+ "version": "0.3.0",
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
  // ---------------------------------------------------------------------------
@@ -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/ssr.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { ComponentLike, I18n, ViewNode } from './core.js';
2
+ import type { HtmlElementNode } from './html.js';
2
3
 
3
4
  export type PageFactory<S = unknown> = (state: S) => ViewNode | ComponentLike | PageFactory<S>;
4
5
 
@@ -79,3 +80,45 @@ export function hydrate<S = unknown>(
79
80
  state?: S | null,
80
81
  options?: SsrI18nOption<S>
81
82
  ): ViewNode;
83
+
84
+ /** Document builder node used by renderPage: head/body callbacks build the page. */
85
+ export class PageDocumentNode extends HtmlElementNode {
86
+ head(callback: (node: HtmlElementNode, state: unknown) => void): PageDocumentNode;
87
+ body(callback: (node: HtmlElementNode, state: unknown) => void): PageDocumentNode;
88
+ vBody(...args: unknown[]): PageDocumentNode;
89
+ }
90
+
91
+ export interface RenderPageConfig<S = unknown> {
92
+ page: (page: PageDocumentNode, state: S | null) => void;
93
+ }
94
+
95
+ export interface RenderPageOptions<S = unknown> extends SsrI18nOption<S> {
96
+ /** Per-request dictionary; builds an I18n instance from state.lang. */
97
+ messages?: Record<string, any>;
98
+ maxNodes?: number;
99
+ /** State container id. Defaults to "__YOYA_DATA__". */
100
+ stateId?: string;
101
+ /** Hydration container id. Defaults to "app". */
102
+ containerId?: string;
103
+ /** Client entry script src. Defaults to "/client.js". */
104
+ client?: string;
105
+ }
106
+
107
+ /** Renders a complete HTML document from DSL-defined head/body. */
108
+ export function renderPage<S = unknown>(
109
+ config: RenderPageConfig<S>,
110
+ state?: S | null,
111
+ options?: RenderPageOptions<S>
112
+ ): string;
113
+
114
+ export interface HydrateOrMountOptions<S = unknown> extends SsrI18nOption<S> {
115
+ messages?: Record<string, any>;
116
+ stateId?: string;
117
+ target?: string | ParentNode;
118
+ }
119
+
120
+ /** Client bootstrap: reads state and hydrates or mounts in one call. */
121
+ export function hydrateOrMount<S = unknown>(
122
+ component: ViewNode | ComponentLike | PageFactory<S>,
123
+ options?: HydrateOrMountOptions<S>
124
+ ): ViewNode | null;
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;
@@ -1,4 +1,9 @@
1
1
  /**
2
- * Entry types for `yoya-ui/ssr`: server-side rendering helpers.
2
+ * Entry types for `yoya-ui/ssr`: server-side complete entry
3
+ * (core + html + layout + router + i18n + rendering helpers).
3
4
  */
5
+ export * from './core.js';
6
+ export * from './html.js';
7
+ export * from './layout.js';
8
+ export * from './router.js';
4
9
  export * from './ssr.js';