@gcsa/console-core 0.1.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.
Files changed (85) hide show
  1. package/dist/gcsaChat.d.ts +6 -0
  2. package/dist/gcsaChat.d.ts.map +1 -0
  3. package/dist/gcsaChat.js +31 -0
  4. package/dist/gcsaClipboard.d.ts +2 -0
  5. package/dist/gcsaClipboard.d.ts.map +1 -0
  6. package/dist/gcsaClipboard.js +30 -0
  7. package/dist/gcsaCssLength.d.ts +3 -0
  8. package/dist/gcsaCssLength.d.ts.map +1 -0
  9. package/dist/gcsaCssLength.js +6 -0
  10. package/dist/gcsaDate.d.ts +15 -0
  11. package/dist/gcsaDate.d.ts.map +1 -0
  12. package/dist/gcsaDate.js +12 -0
  13. package/dist/gcsaDateTimeValue.d.ts +8 -0
  14. package/dist/gcsaDateTimeValue.d.ts.map +1 -0
  15. package/dist/gcsaDateTimeValue.js +16 -0
  16. package/dist/gcsaLocale.d.ts +109 -0
  17. package/dist/gcsaLocale.d.ts.map +1 -0
  18. package/dist/gcsaLocale.js +320 -0
  19. package/dist/gcsaMarkdown.d.ts +2 -0
  20. package/dist/gcsaMarkdown.d.ts.map +1 -0
  21. package/dist/gcsaMarkdown.js +19 -0
  22. package/dist/gcsaMenu.d.ts +21 -0
  23. package/dist/gcsaMenu.d.ts.map +1 -0
  24. package/dist/gcsaMenu.js +20 -0
  25. package/dist/gcsaMessage.d.ts +3 -0
  26. package/dist/gcsaMessage.d.ts.map +1 -0
  27. package/dist/gcsaMessage.js +1 -0
  28. package/dist/gcsaPagination.d.ts +13 -0
  29. package/dist/gcsaPagination.d.ts.map +1 -0
  30. package/dist/gcsaPagination.js +52 -0
  31. package/dist/gcsaPopupCollision.d.ts +22 -0
  32. package/dist/gcsaPopupCollision.d.ts.map +1 -0
  33. package/dist/gcsaPopupCollision.js +66 -0
  34. package/dist/gcsaPopupPositioning.d.ts +30 -0
  35. package/dist/gcsaPopupPositioning.d.ts.map +1 -0
  36. package/dist/gcsaPopupPositioning.js +18 -0
  37. package/dist/gcsaPopupStyles.d.ts +51 -0
  38. package/dist/gcsaPopupStyles.d.ts.map +1 -0
  39. package/dist/gcsaPopupStyles.js +115 -0
  40. package/dist/gcsaSize.d.ts +9 -0
  41. package/dist/gcsaSize.d.ts.map +1 -0
  42. package/dist/gcsaSize.js +13 -0
  43. package/dist/gcsaTableEvents.d.ts +27 -0
  44. package/dist/gcsaTableEvents.d.ts.map +1 -0
  45. package/dist/gcsaTableEvents.js +13 -0
  46. package/dist/gcsaTableLayout.d.ts +23 -0
  47. package/dist/gcsaTableLayout.d.ts.map +1 -0
  48. package/dist/gcsaTableLayout.js +36 -0
  49. package/dist/gcsaTableMigration.d.ts +34 -0
  50. package/dist/gcsaTableMigration.d.ts.map +1 -0
  51. package/dist/gcsaTableMigration.js +65 -0
  52. package/dist/gcsaTablePreferences.d.ts +16 -0
  53. package/dist/gcsaTablePreferences.d.ts.map +1 -0
  54. package/dist/gcsaTablePreferences.js +53 -0
  55. package/dist/gcsaTableRows.d.ts +8 -0
  56. package/dist/gcsaTableRows.d.ts.map +1 -0
  57. package/dist/gcsaTableRows.js +29 -0
  58. package/dist/gcsaTime.d.ts +23 -0
  59. package/dist/gcsaTime.d.ts.map +1 -0
  60. package/dist/gcsaTime.js +63 -0
  61. package/dist/index.d.ts +163 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +30 -0
  64. package/package.json +37 -0
  65. package/src/gcsaChat.ts +35 -0
  66. package/src/gcsaClipboard.ts +28 -0
  67. package/src/gcsaCssLength.ts +5 -0
  68. package/src/gcsaDate.ts +30 -0
  69. package/src/gcsaDateTimeValue.ts +18 -0
  70. package/src/gcsaLocale.ts +431 -0
  71. package/src/gcsaMarkdown.ts +19 -0
  72. package/src/gcsaMenu.ts +43 -0
  73. package/src/gcsaMessage.ts +3 -0
  74. package/src/gcsaPagination.ts +68 -0
  75. package/src/gcsaPopupCollision.ts +111 -0
  76. package/src/gcsaPopupPositioning.ts +57 -0
  77. package/src/gcsaPopupStyles.ts +137 -0
  78. package/src/gcsaSize.ts +29 -0
  79. package/src/gcsaTableEvents.ts +36 -0
  80. package/src/gcsaTableLayout.ts +69 -0
  81. package/src/gcsaTableMigration.ts +104 -0
  82. package/src/gcsaTablePreferences.ts +61 -0
  83. package/src/gcsaTableRows.ts +36 -0
  84. package/src/gcsaTime.ts +83 -0
  85. package/src/index.ts +237 -0
@@ -0,0 +1,20 @@
1
+ export function navItemsToMenuItems(items) {
2
+ return items.map(item => ({
3
+ key: item.key,
4
+ label: item.label,
5
+ iconKey: item.iconKey,
6
+ href: item.href
7
+ }));
8
+ }
9
+ export function collectGcsaMenuBranchKeys(items) {
10
+ const keys = [];
11
+ for (const item of items) {
12
+ if (item.type === 'group' || item.type === 'divider')
13
+ continue;
14
+ if (item.children?.length) {
15
+ keys.push(item.key);
16
+ keys.push(...collectGcsaMenuBranchKeys(item.children));
17
+ }
18
+ }
19
+ return keys;
20
+ }
@@ -0,0 +1,3 @@
1
+ export type GcsaMessageType = 'success' | 'error' | 'info';
2
+ export declare const GCSA_MESSAGE_DURATION_MS = 3200;
3
+ //# sourceMappingURL=gcsaMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcsaMessage.d.ts","sourceRoot":"","sources":["../src/gcsaMessage.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3D,eAAO,MAAM,wBAAwB,OAAO,CAAC"}
@@ -0,0 +1 @@
1
+ export const GCSA_MESSAGE_DURATION_MS = 3200;
@@ -0,0 +1,13 @@
1
+ export type GcsaPaginationItem = number | 'ellipsis-start' | 'ellipsis-end';
2
+ export type GcsaPaginationAlign = 'left' | 'center' | 'right';
3
+ export type GcsaPaginationLayoutPart = 'total' | 'sizes' | 'prev' | 'pager' | 'next' | 'jumper';
4
+ export declare const GCSA_PAGINATION_LAYOUT_PARTS: readonly ["total", "sizes", "prev", "pager", "next", "jumper"];
5
+ export declare function parseGcsaPaginationLayout(layout: string | readonly GcsaPaginationLayoutPart[]): GcsaPaginationLayoutPart[];
6
+ export declare function resolveGcsaPaginationLayout(options: {
7
+ layout?: string | readonly GcsaPaginationLayoutPart[];
8
+ showPageSize?: boolean;
9
+ showJumper?: boolean;
10
+ }): GcsaPaginationLayoutPart[];
11
+ export declare function getGcsaPaginationAlignClass(align?: GcsaPaginationAlign): string;
12
+ export declare function getGcsaPaginationItems(page: number, totalPages: number, maxVisible?: number): GcsaPaginationItem[];
13
+ //# sourceMappingURL=gcsaPagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcsaPagination.d.ts","sourceRoot":"","sources":["../src/gcsaPagination.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAE5E,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9D,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEhG,eAAO,MAAM,4BAA4B,gEAOe,CAAC;AAIzD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,GAAG,SAAS,wBAAwB,EAAE,GACnD,wBAAwB,EAAE,CAU5B;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE;IACnD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,wBAAwB,EAAE,CAAC;IACtD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,wBAAwB,EAAE,CAS7B;AAED,wBAAgB,2BAA2B,CAAC,KAAK,GAAE,mBAA6B,GAAG,MAAM,CAExF;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,kBAAkB,EAAE,CAiB7G"}
@@ -0,0 +1,52 @@
1
+ export const GCSA_PAGINATION_LAYOUT_PARTS = [
2
+ 'total',
3
+ 'sizes',
4
+ 'prev',
5
+ 'pager',
6
+ 'next',
7
+ 'jumper'
8
+ ];
9
+ const paginationLayoutPartSet = new Set(GCSA_PAGINATION_LAYOUT_PARTS);
10
+ export function parseGcsaPaginationLayout(layout) {
11
+ const parts = typeof layout === 'string'
12
+ ? layout
13
+ .split(',')
14
+ .map(part => part.trim())
15
+ .filter(Boolean)
16
+ : [...layout];
17
+ return parts.filter((part) => paginationLayoutPartSet.has(part));
18
+ }
19
+ export function resolveGcsaPaginationLayout(options) {
20
+ if (options.layout) {
21
+ return parseGcsaPaginationLayout(options.layout);
22
+ }
23
+ const parts = ['prev', 'pager', 'next'];
24
+ if (options.showPageSize)
25
+ parts.push('sizes');
26
+ if (options.showJumper)
27
+ parts.push('jumper');
28
+ return parts;
29
+ }
30
+ export function getGcsaPaginationAlignClass(align = 'right') {
31
+ return `gcsa-pagination--align-${align}`;
32
+ }
33
+ export function getGcsaPaginationItems(page, totalPages, maxVisible = 7) {
34
+ const count = Math.max(1, Math.floor(totalPages));
35
+ const current = Math.min(Math.max(1, Math.floor(page)), count);
36
+ const visible = Math.max(5, Math.floor(maxVisible));
37
+ if (count <= visible)
38
+ return Array.from({ length: count }, (_, index) => index + 1);
39
+ const innerCount = visible - 2;
40
+ let start = Math.max(2, current - Math.floor(innerCount / 2));
41
+ let end = Math.min(count - 1, start + innerCount - 1);
42
+ start = Math.max(2, end - innerCount + 1);
43
+ const items = [1];
44
+ if (start > 2)
45
+ items.push('ellipsis-start');
46
+ for (let value = start; value <= end; value += 1)
47
+ items.push(value);
48
+ if (end < count - 1)
49
+ items.push('ellipsis-end');
50
+ items.push(count);
51
+ return items;
52
+ }
@@ -0,0 +1,22 @@
1
+ import { type Middleware } from '@floating-ui/dom';
2
+ import { createGcsaPopupPositioning, type GcsaPopupPositioningOptions } from './gcsaPopupPositioning';
3
+ export type GcsaPopupRect = {
4
+ x: number;
5
+ y: number;
6
+ width: number;
7
+ height: number;
8
+ };
9
+ export type GcsaViewportRect = {
10
+ width: number;
11
+ height: number;
12
+ };
13
+ /** 与 Zag popper get-placement 对齐的 middleware 组合 */
14
+ export declare function buildGcsaPopupMiddleware(options: ReturnType<typeof createGcsaPopupPositioning>): Middleware[];
15
+ export declare function computeGcsaPopupPosition(reference: Element, floating: HTMLElement, options?: GcsaPopupPositioningOptions): Promise<import("@floating-ui/dom").ComputePositionReturn>;
16
+ export declare function getFloatingBox(position: {
17
+ x: number;
18
+ y: number;
19
+ }, floating: Element): GcsaPopupRect;
20
+ /** 断言浮层在视口内并保留 overflowPadding */
21
+ export declare function assertFloatingWithinViewport(box: GcsaPopupRect, viewport: GcsaViewportRect, overflowPadding?: number): string[];
22
+ //# sourceMappingURL=gcsaPopupCollision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcsaPopupCollision.d.ts","sourceRoot":"","sources":["../src/gcsaPopupCollision.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,UAAU,EAEhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,EAC1B,KAAK,2BAA2B,EACjC,MAAM,wBAAwB,CAAC;AAEhC,MAAM,MAAM,aAAa,GAAG;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,mDAAmD;AACnD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,UAAU,CAAC,OAAO,0BAA0B,CAAC,GACrD,UAAU,EAAE,CA4Bd;AAED,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,WAAW,EACrB,OAAO,GAAE,2BAAgC,6DAQ1C;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAClC,QAAQ,EAAE,OAAO,GAChB,aAAa,CAQf;AAED,kCAAkC;AAClC,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,gBAAgB,EAC1B,eAAe,SAAI,YAoBpB"}
@@ -0,0 +1,66 @@
1
+ import { computePosition, flip, limitShift, offset, shift, size } from '@floating-ui/dom';
2
+ import { createGcsaPopupPositioning } from './gcsaPopupPositioning';
3
+ /** 与 Zag popper get-placement 对齐的 middleware 组合 */
4
+ export function buildGcsaPopupMiddleware(options) {
5
+ const middleware = [
6
+ offset(options.gutter),
7
+ flip({ padding: options.overflowPadding }),
8
+ shift({
9
+ padding: options.overflowPadding,
10
+ mainAxis: options.slide,
11
+ crossAxis: options.overlap,
12
+ limiter: limitShift()
13
+ }),
14
+ size({
15
+ padding: options.overflowPadding,
16
+ apply({ elements, rects, availableWidth, availableHeight }) {
17
+ const floating = elements.floating;
18
+ floating.style.setProperty('--reference-width', `${Math.round(rects.reference.width)}px`);
19
+ floating.style.setProperty('--reference-height', `${Math.round(rects.reference.height)}px`);
20
+ floating.style.setProperty('--available-width', `${Math.floor(availableWidth)}px`);
21
+ floating.style.setProperty('--available-height', `${Math.floor(availableHeight)}px`);
22
+ if (options.sameWidth) {
23
+ floating.style.width = `${Math.round(rects.reference.width)}px`;
24
+ }
25
+ if (options.fitViewport) {
26
+ floating.style.maxWidth = `${Math.floor(availableWidth)}px`;
27
+ }
28
+ }
29
+ })
30
+ ];
31
+ return middleware;
32
+ }
33
+ export async function computeGcsaPopupPosition(reference, floating, options = {}) {
34
+ const config = createGcsaPopupPositioning(options);
35
+ return computePosition(reference, floating, {
36
+ placement: config.placement,
37
+ strategy: config.strategy,
38
+ middleware: buildGcsaPopupMiddleware(config)
39
+ });
40
+ }
41
+ export function getFloatingBox(position, floating) {
42
+ const rect = floating.getBoundingClientRect();
43
+ return {
44
+ x: position.x,
45
+ y: position.y,
46
+ width: rect.width,
47
+ height: rect.height
48
+ };
49
+ }
50
+ /** 断言浮层在视口内并保留 overflowPadding */
51
+ export function assertFloatingWithinViewport(box, viewport, overflowPadding = 8) {
52
+ const errors = [];
53
+ if (box.x < overflowPadding) {
54
+ errors.push(`left overflow: x=${box.x} < padding=${overflowPadding}`);
55
+ }
56
+ if (box.y < overflowPadding) {
57
+ errors.push(`top overflow: y=${box.y} < padding=${overflowPadding}`);
58
+ }
59
+ if (box.x + box.width > viewport.width - overflowPadding) {
60
+ errors.push(`right overflow: x+w=${box.x + box.width} > viewport-padding=${viewport.width - overflowPadding}`);
61
+ }
62
+ if (box.y + box.height > viewport.height - overflowPadding) {
63
+ errors.push(`bottom overflow: y+h=${box.y + box.height} > viewport-padding=${viewport.height - overflowPadding}`);
64
+ }
65
+ return errors;
66
+ }
@@ -0,0 +1,30 @@
1
+ /** Ark UI / Zag Popper 通用方位(与 Floating UI placement 对齐) */
2
+ export type GcsaPopupPlacement = 'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end';
3
+ export type GcsaPopupPositioningOptions = {
4
+ placement?: GcsaPopupPlacement;
5
+ gutter?: number;
6
+ strategy?: 'fixed' | 'absolute';
7
+ sameWidth?: boolean;
8
+ fitViewport?: boolean;
9
+ flip?: boolean;
10
+ slide?: boolean;
11
+ /** zag 用 overlap 开启横向 shift,避免贴边触发器时面板溢出视口 */
12
+ overlap?: boolean;
13
+ overflowPadding?: number;
14
+ };
15
+ /**
16
+ * 统一浮层定位:flip / slide / overlap 默认开启,减少贴边溢出。
17
+ * 供 Select、Menu、Popover、Tooltip、DatePicker 等复用。
18
+ */
19
+ export declare function createGcsaPopupPositioning(options?: GcsaPopupPositioningOptions): {
20
+ fitViewport?: boolean | undefined;
21
+ sameWidth?: boolean | undefined;
22
+ placement: GcsaPopupPlacement;
23
+ gutter: number;
24
+ strategy: "fixed" | "absolute";
25
+ flip: boolean;
26
+ slide: boolean;
27
+ overlap: boolean;
28
+ overflowPadding: number;
29
+ };
30
+ //# sourceMappingURL=gcsaPopupPositioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcsaPopupPositioning.d.ts","sourceRoot":"","sources":["../src/gcsaPopupPositioning.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,MAAM,kBAAkB,GAC1B,KAAK,GACL,WAAW,GACX,SAAS,GACT,OAAO,GACP,aAAa,GACb,WAAW,GACX,QAAQ,GACR,cAAc,GACd,YAAY,GACZ,MAAM,GACN,YAAY,GACZ,UAAU,CAAC;AAEf,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,2BAAgC;;;;;;;;;;EAwBnF"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 统一浮层定位:flip / slide / overlap 默认开启,减少贴边溢出。
3
+ * 供 Select、Menu、Popover、Tooltip、DatePicker 等复用。
4
+ */
5
+ export function createGcsaPopupPositioning(options = {}) {
6
+ const { placement = 'bottom-start', gutter = 8, strategy = 'fixed', sameWidth, fitViewport, flip = true, slide = true, overlap = true, overflowPadding = 8 } = options;
7
+ return {
8
+ placement,
9
+ gutter,
10
+ strategy,
11
+ flip,
12
+ slide,
13
+ overlap,
14
+ overflowPadding,
15
+ ...(sameWidth === undefined ? {} : { sameWidth }),
16
+ ...(fitViewport === undefined ? {} : { fitViewport })
17
+ };
18
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * 浮层样式契约:与 packages/styles/src/console-ui.css 保持同步。
3
+ * 测试会校验 CSS 中是否仍包含这些规则,防止 padding / 碰撞变量被改坏。
4
+ */
5
+ export declare const GCSA_POPUP_OVERFLOW_PADDING = 8;
6
+ export declare const GCSA_POPUP_VIEWPORT_CSS_INSET = 16;
7
+ export declare const GCSA_POPUP_STYLE_CONTRACT: {
8
+ readonly selectContent: {
9
+ readonly selector: ".gcsa-select-content";
10
+ readonly maxWidth: "var(--available-width, 100vw)";
11
+ readonly minWidth: "min(160px, var(--reference-width, 160px))";
12
+ };
13
+ readonly selectList: {
14
+ readonly selector: ".gcsa-select-list";
15
+ readonly padding: "4px";
16
+ };
17
+ readonly selectItem: {
18
+ readonly selector: ".gcsa-select-item";
19
+ readonly padding: "8px 10px";
20
+ };
21
+ readonly tooltip: {
22
+ readonly selector: ".gcsa-tooltip";
23
+ readonly padding: "6px 12px";
24
+ readonly maxWidth: "min(240px, var(--available-width, calc(100vw - 16px)))";
25
+ };
26
+ readonly popover: {
27
+ readonly selector: ".gcsa-popover";
28
+ readonly padding: "12px 14px";
29
+ readonly maxWidth: "min(320px, var(--available-width, calc(100vw - 16px)))";
30
+ };
31
+ readonly dropdown: {
32
+ readonly selector: ".gcsa-dropdown";
33
+ readonly maxWidth: "var(--available-width, calc(100vw - 16px))";
34
+ };
35
+ readonly dateTimePicker: {
36
+ readonly selector: ".gcsa-date-picker__content.gcsa-datetime-picker__content";
37
+ readonly maxWidth: "var(--available-width, calc(100vw - 16px))";
38
+ };
39
+ };
40
+ export type GcsaPopupStyleRule = {
41
+ selector: string;
42
+ padding?: string;
43
+ minWidth?: string;
44
+ maxWidth?: string;
45
+ };
46
+ export declare function stripCssComments(css: string): string;
47
+ export declare function extractCssRuleBlocks(css: string, selector: string): string[];
48
+ export declare function extractCssRuleBlock(css: string, selector: string): string | null;
49
+ export declare function cssBlockIncludes(block: string, declaration: string): boolean;
50
+ export declare function validatePopupStyleContract(css: string, contract: Record<string, GcsaPopupStyleRule>): string[];
51
+ //# sourceMappingURL=gcsaPopupStyles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcsaPopupStyles.d.ts","sourceRoot":"","sources":["../src/gcsaPopupStyles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAEhD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC5B,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAsD5E;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGhF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAE5E;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,YAmBnG"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * 浮层样式契约:与 packages/styles/src/console-ui.css 保持同步。
3
+ * 测试会校验 CSS 中是否仍包含这些规则,防止 padding / 碰撞变量被改坏。
4
+ */
5
+ export const GCSA_POPUP_OVERFLOW_PADDING = 8;
6
+ export const GCSA_POPUP_VIEWPORT_CSS_INSET = 16;
7
+ export const GCSA_POPUP_STYLE_CONTRACT = {
8
+ selectContent: {
9
+ selector: '.gcsa-select-content',
10
+ maxWidth: 'var(--available-width, 100vw)',
11
+ minWidth: 'min(160px, var(--reference-width, 160px))'
12
+ },
13
+ selectList: {
14
+ selector: '.gcsa-select-list',
15
+ padding: '4px'
16
+ },
17
+ selectItem: {
18
+ selector: '.gcsa-select-item',
19
+ padding: '8px 10px'
20
+ },
21
+ tooltip: {
22
+ selector: '.gcsa-tooltip',
23
+ padding: '6px 12px',
24
+ maxWidth: 'min(240px, var(--available-width, calc(100vw - 16px)))'
25
+ },
26
+ popover: {
27
+ selector: '.gcsa-popover',
28
+ padding: '12px 14px',
29
+ maxWidth: 'min(320px, var(--available-width, calc(100vw - 16px)))'
30
+ },
31
+ dropdown: {
32
+ selector: '.gcsa-dropdown',
33
+ maxWidth: 'var(--available-width, calc(100vw - 16px))'
34
+ },
35
+ dateTimePicker: {
36
+ selector: '.gcsa-date-picker__content.gcsa-datetime-picker__content',
37
+ maxWidth: 'var(--available-width, calc(100vw - 16px))'
38
+ }
39
+ };
40
+ export function stripCssComments(css) {
41
+ return css.replace(/\/\*[\s\S]*?\*\//g, '');
42
+ }
43
+ export function extractCssRuleBlocks(css, selector) {
44
+ const normalized = stripCssComments(css);
45
+ const blocks = [];
46
+ let depth = 0;
47
+ let index = 0;
48
+ while (index < normalized.length) {
49
+ const char = normalized[index];
50
+ if (char === '{') {
51
+ depth += 1;
52
+ index += 1;
53
+ continue;
54
+ }
55
+ if (char === '}') {
56
+ depth = Math.max(0, depth - 1);
57
+ index += 1;
58
+ continue;
59
+ }
60
+ if (depth !== 0 || char === '@') {
61
+ index += 1;
62
+ continue;
63
+ }
64
+ const braceStart = normalized.indexOf('{', index);
65
+ if (braceStart === -1) {
66
+ break;
67
+ }
68
+ const selectorPart = normalized.slice(index, braceStart).trim();
69
+ let ruleDepth = 1;
70
+ let cursor = braceStart + 1;
71
+ while (cursor < normalized.length && ruleDepth > 0) {
72
+ if (normalized[cursor] === '{') {
73
+ ruleDepth += 1;
74
+ }
75
+ if (normalized[cursor] === '}') {
76
+ ruleDepth -= 1;
77
+ }
78
+ cursor += 1;
79
+ }
80
+ const block = normalized.slice(braceStart + 1, cursor - 1);
81
+ const selectors = selectorPart.split(',').map((part) => part.trim());
82
+ if (selectors.includes(selector)) {
83
+ blocks.push(block);
84
+ }
85
+ index = cursor;
86
+ }
87
+ return blocks;
88
+ }
89
+ export function extractCssRuleBlock(css, selector) {
90
+ const blocks = extractCssRuleBlocks(css, selector);
91
+ return blocks.length ? blocks.join('\n') : null;
92
+ }
93
+ export function cssBlockIncludes(block, declaration) {
94
+ return block.replace(/\s+/g, ' ').includes(declaration.replace(/\s+/g, ' '));
95
+ }
96
+ export function validatePopupStyleContract(css, contract) {
97
+ const failures = [];
98
+ for (const [name, rule] of Object.entries(contract)) {
99
+ const block = extractCssRuleBlock(css, rule.selector);
100
+ if (!block) {
101
+ failures.push(`${name}: missing selector ${rule.selector}`);
102
+ continue;
103
+ }
104
+ if (rule.padding && !cssBlockIncludes(block, `padding: ${rule.padding}`)) {
105
+ failures.push(`${name}: expected padding ${rule.padding}`);
106
+ }
107
+ if (rule.minWidth && !cssBlockIncludes(block, `min-width: ${rule.minWidth}`)) {
108
+ failures.push(`${name}: expected min-width ${rule.minWidth}`);
109
+ }
110
+ if (rule.maxWidth && !cssBlockIncludes(block, `max-width: ${rule.maxWidth}`)) {
111
+ failures.push(`${name}: expected max-width ${rule.maxWidth}`);
112
+ }
113
+ }
114
+ return failures;
115
+ }
@@ -0,0 +1,9 @@
1
+ import type { GcsaButtonSize } from './index';
2
+ /** 表单/控件密度,对齐 Ant Design:small / middle / large */
3
+ export type GcsaComponentSize = 'sm' | 'md' | 'lg';
4
+ export declare const GCSA_DEFAULT_COMPONENT_SIZE: GcsaComponentSize;
5
+ export declare function resolveGcsaComponentSize(propSize: GcsaComponentSize | undefined, configSize?: GcsaComponentSize): GcsaComponentSize;
6
+ export declare function resolveGcsaButtonSize(propSize: GcsaButtonSize | undefined, configSize?: GcsaComponentSize): GcsaButtonSize;
7
+ /** e.g. gcsaControlSizeClass('gcsa-text-control', 'md') → 'gcsa-text-control--md' */
8
+ export declare function gcsaControlSizeClass(prefix: string, size?: GcsaComponentSize): string;
9
+ //# sourceMappingURL=gcsaSize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcsaSize.d.ts","sourceRoot":"","sources":["../src/gcsaSize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,mDAAmD;AACnD,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnD,eAAO,MAAM,2BAA2B,EAAE,iBAAwB,CAAC;AAEnE,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,EACvC,UAAU,GAAE,iBAA+C,GAC1D,iBAAiB,CAEnB;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,cAAc,GAAG,SAAS,EACpC,UAAU,GAAE,iBAA+C,GAC1D,cAAc,CAGhB;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,iBAA+C,GACpD,MAAM,CAER"}
@@ -0,0 +1,13 @@
1
+ export const GCSA_DEFAULT_COMPONENT_SIZE = 'md';
2
+ export function resolveGcsaComponentSize(propSize, configSize = GCSA_DEFAULT_COMPONENT_SIZE) {
3
+ return propSize ?? configSize;
4
+ }
5
+ export function resolveGcsaButtonSize(propSize, configSize = GCSA_DEFAULT_COMPONENT_SIZE) {
6
+ if (propSize)
7
+ return propSize;
8
+ return configSize;
9
+ }
10
+ /** e.g. gcsaControlSizeClass('gcsa-text-control', 'md') → 'gcsa-text-control--md' */
11
+ export function gcsaControlSizeClass(prefix, size = GCSA_DEFAULT_COMPONENT_SIZE) {
12
+ return `${prefix}--${size}`;
13
+ }
@@ -0,0 +1,27 @@
1
+ export type GcsaTableSortingEntry = {
2
+ id: string;
3
+ desc: boolean;
4
+ };
5
+ export type GcsaTableSortOrder = 'ascending' | 'descending' | null;
6
+ export type GcsaTableSortChange = {
7
+ prop: string | null;
8
+ order: GcsaTableSortOrder;
9
+ };
10
+ /** Stable column metadata exposed by legacy-compatible row/cell events. */
11
+ export type GcsaTableColumnInfo = {
12
+ id: string;
13
+ prop: string;
14
+ label: string;
15
+ width?: string;
16
+ minWidth?: string;
17
+ fixed?: 'left' | 'right' | true;
18
+ };
19
+ export type GcsaTableHeaderEvent = {
20
+ column: GcsaTableColumnInfo;
21
+ event: MouseEvent;
22
+ };
23
+ /** Maps the first TanStack sort entry to the payload used by Element tables. */
24
+ export declare function getGcsaTableSortChange(sorting: GcsaTableSortingEntry[]): GcsaTableSortChange;
25
+ /** Maps Element-style imperative sorting arguments to TanStack state. */
26
+ export declare function getGcsaTableSorting(prop: string, order: GcsaTableSortOrder): GcsaTableSortingEntry[];
27
+ //# sourceMappingURL=gcsaTableEvents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcsaTableEvents.d.ts","sourceRoot":"","sources":["../src/gcsaTableEvents.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,YAAY,GAAG,IAAI,CAAC;AAEnE,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,kBAAkB,CAAC;CAC3B,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,mBAAmB,CAI5F;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,qBAAqB,EAAE,CAGpG"}
@@ -0,0 +1,13 @@
1
+ /** Maps the first TanStack sort entry to the payload used by Element tables. */
2
+ export function getGcsaTableSortChange(sorting) {
3
+ const primary = sorting[0];
4
+ if (!primary)
5
+ return { prop: null, order: null };
6
+ return { prop: primary.id, order: primary.desc ? 'descending' : 'ascending' };
7
+ }
8
+ /** Maps Element-style imperative sorting arguments to TanStack state. */
9
+ export function getGcsaTableSorting(prop, order) {
10
+ if (!prop || !order)
11
+ return [];
12
+ return [{ id: prop, desc: order === 'descending' }];
13
+ }
@@ -0,0 +1,23 @@
1
+ export declare const GCSA_TABLE_EXPAND_COLUMN_WIDTH = 44;
2
+ export declare const GCSA_TABLE_SELECTION_COLUMN_WIDTH = 48;
3
+ export declare const GCSA_TABLE_DEFAULT_COLUMN_MIN_WIDTH = 120;
4
+ export declare const GCSA_TABLE_MIN_WIDTH_FLOOR = 640;
5
+ export type GcsaTableLayoutColumn = {
6
+ id: string;
7
+ fixed?: 'left' | 'right' | true;
8
+ width?: string;
9
+ minWidth?: string;
10
+ };
11
+ export type GcsaTableFixedOffsetOptions = {
12
+ expandable?: boolean;
13
+ selectable?: boolean;
14
+ fixedSelection?: boolean;
15
+ expandColumnWidth?: number;
16
+ selectionColumnWidth?: number;
17
+ columnWidths?: Record<string, number>;
18
+ };
19
+ export declare function getGcsaTableMinWidth(columns: GcsaTableLayoutColumn[], options?: GcsaTableFixedOffsetOptions & {
20
+ defaultColumnMinWidth?: number;
21
+ }): number;
22
+ export declare function getGcsaTableFixedOffset(columns: GcsaTableLayoutColumn[], id: string, direction: 'left' | 'right', options?: GcsaTableFixedOffsetOptions): number;
23
+ //# sourceMappingURL=gcsaTableLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcsaTableLayout.d.ts","sourceRoot":"","sources":["../src/gcsaTableLayout.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,KAAK,CAAC;AACjD,eAAO,MAAM,iCAAiC,KAAK,CAAC;AACpD,eAAO,MAAM,mCAAmC,MAAM,CAAC;AACvD,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC,CAAC;AAaF,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,EAAE,EAChC,OAAO,GAAE,2BAA2B,GAAG;IAAE,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7E,MAAM,CAWR;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,qBAAqB,EAAE,EAChC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,GAAG,OAAO,EAC3B,OAAO,GAAE,2BAAgC,UAgB1C"}
@@ -0,0 +1,36 @@
1
+ export const GCSA_TABLE_EXPAND_COLUMN_WIDTH = 44;
2
+ export const GCSA_TABLE_SELECTION_COLUMN_WIDTH = 48;
3
+ export const GCSA_TABLE_DEFAULT_COLUMN_MIN_WIDTH = 120;
4
+ export const GCSA_TABLE_MIN_WIDTH_FLOOR = 640;
5
+ function controlWidth(value, fallback) {
6
+ return Number.isFinite(value) && value > 0 ? value : fallback;
7
+ }
8
+ function columnWidth(column, widths) {
9
+ const override = widths[column.id];
10
+ if (Number.isFinite(override) && override > 0)
11
+ return override;
12
+ const parsed = Number.parseFloat(column.width ?? column.minWidth ?? '');
13
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
14
+ }
15
+ export function getGcsaTableMinWidth(columns, options = {}) {
16
+ const defaultColumnMinWidth = options.defaultColumnMinWidth ?? GCSA_TABLE_DEFAULT_COLUMN_MIN_WIDTH;
17
+ const dataWidth = columns.reduce((sum, column) => sum + (columnWidth(column, options.columnWidths ?? {}) || defaultColumnMinWidth), 0);
18
+ const leadingControls = (options.expandable ? controlWidth(options.expandColumnWidth, GCSA_TABLE_EXPAND_COLUMN_WIDTH) : 0) +
19
+ (options.selectable ? controlWidth(options.selectionColumnWidth, GCSA_TABLE_SELECTION_COLUMN_WIDTH) : 0);
20
+ return Math.max(GCSA_TABLE_MIN_WIDTH_FLOOR, dataWidth + leadingControls);
21
+ }
22
+ export function getGcsaTableFixedOffset(columns, id, direction, options = {}) {
23
+ const targetIndex = columns.findIndex(column => column.id === id);
24
+ if (targetIndex < 0)
25
+ return 0;
26
+ const leadingControlWidth = direction === 'left' && options.selectable && options.fixedSelection
27
+ ? controlWidth(options.selectionColumnWidth, GCSA_TABLE_SELECTION_COLUMN_WIDTH) +
28
+ (options.expandable ? controlWidth(options.expandColumnWidth, GCSA_TABLE_EXPAND_COLUMN_WIDTH) : 0)
29
+ : 0;
30
+ const candidates = direction === 'left'
31
+ ? columns.slice(0, targetIndex)
32
+ : columns.slice(targetIndex + 1);
33
+ return candidates
34
+ .filter(column => (column.fixed === true ? 'left' : column.fixed) === direction)
35
+ .reduce((offset, column) => offset + columnWidth(column, options.columnWidths ?? {}), leadingControlWidth);
36
+ }
@@ -0,0 +1,34 @@
1
+ import type { GcsaTableColumn, GcsaTableColumnFixed } from './index';
2
+ export type GcsaLegacyTableColumn<T> = Omit<Partial<GcsaTableColumn<T>>, 'sortable' | 'width' | 'minWidth' | 'id' | 'formatter' | 'columns'> & {
3
+ id?: string;
4
+ prop?: keyof T & string;
5
+ label?: string;
6
+ type?: 'selection' | 'index' | 'expand';
7
+ index?: number | ((index: number) => number | string);
8
+ selectable?: (row: T, index: number) => boolean;
9
+ sortable?: boolean | 'custom';
10
+ width?: string | number;
11
+ minWidth?: string | number;
12
+ 'min-width'?: string | number;
13
+ showOverflowTooltip?: boolean;
14
+ 'show-overflow-tooltip'?: boolean;
15
+ sortMethod?: (a: T, b: T) => number;
16
+ 'sort-method'?: (a: T, b: T) => number;
17
+ formatter?: (row: T, column: GcsaLegacyTableColumn<T>, value: unknown, index: number) => unknown;
18
+ children?: GcsaLegacyTableColumn<T>[];
19
+ fixed?: GcsaTableColumnFixed;
20
+ };
21
+ export type GcsaTableMigration<T> = {
22
+ columns: GcsaTableColumn<T>[];
23
+ selectable: boolean | ((row: T, index: number) => boolean);
24
+ expandable: boolean;
25
+ fixedSelection: boolean;
26
+ selectionColumnWidth?: number;
27
+ expandColumnWidth?: number;
28
+ };
29
+ export type GcsaTableMigrationOptions = {
30
+ page?: number;
31
+ pageSize?: number;
32
+ };
33
+ export declare function normalizeGcsaTableColumns<T extends Record<string, unknown>>(columns: GcsaLegacyTableColumn<T>[], options?: GcsaTableMigrationOptions): GcsaTableMigration<T>;
34
+ //# sourceMappingURL=gcsaTableMigration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcsaTableMigration.d.ts","sourceRoot":"","sources":["../src/gcsaTableMigration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAErE,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,IAAI,GAAG,WAAW,GAAG,SAAS,CAAC,GAAG;IAC7I,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC,CAAC;IACtD,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC;IACpC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC;IACvC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACjG,QAAQ,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI;IAClC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9B,UAAU,EAAE,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAC3D,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzE,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAAE,EACnC,OAAO,GAAE,yBAA8B,GACtC,kBAAkB,CAAC,CAAC,CAAC,CA2DvB"}