@gtcx/templates 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.
- package/dist/components/audit-trail.d.ts +19 -0
- package/dist/components/audit-trail.d.ts.map +1 -0
- package/dist/components/bulk-actions.d.ts +16 -0
- package/dist/components/bulk-actions.d.ts.map +1 -0
- package/dist/components/kpi-card.d.ts +15 -0
- package/dist/components/kpi-card.d.ts.map +1 -0
- package/dist/components/page-header.d.ts +9 -0
- package/dist/components/page-header.d.ts.map +1 -0
- package/dist/components/section-card.d.ts +10 -0
- package/dist/components/section-card.d.ts.map +1 -0
- package/dist/index.cjs +757 -0
- package/dist/index.d.cts +282 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1433 -0
- package/dist/index.mjs +1386 -0
- package/dist/template-frame.d.ts +19 -0
- package/dist/template-frame.d.ts.map +1 -0
- package/dist/templates/activity.d.ts +24 -0
- package/dist/templates/activity.d.ts.map +1 -0
- package/dist/templates/auth-shell.d.ts +11 -0
- package/dist/templates/auth-shell.d.ts.map +1 -0
- package/dist/templates/billing.d.ts +35 -0
- package/dist/templates/billing.d.ts.map +1 -0
- package/dist/templates/dashboard.d.ts +37 -0
- package/dist/templates/dashboard.d.ts.map +1 -0
- package/dist/templates/detail.d.ts +33 -0
- package/dist/templates/detail.d.ts.map +1 -0
- package/dist/templates/error.d.ts +12 -0
- package/dist/templates/error.d.ts.map +1 -0
- package/dist/templates/invite.d.ts +22 -0
- package/dist/templates/invite.d.ts.map +1 -0
- package/dist/templates/list.d.ts +48 -0
- package/dist/templates/list.d.ts.map +1 -0
- package/dist/templates/members.d.ts +28 -0
- package/dist/templates/members.d.ts.map +1 -0
- package/dist/templates/notifications.d.ts +24 -0
- package/dist/templates/notifications.d.ts.map +1 -0
- package/dist/templates/profile.d.ts +31 -0
- package/dist/templates/profile.d.ts.map +1 -0
- package/dist/templates/projects.d.ts +27 -0
- package/dist/templates/projects.d.ts.map +1 -0
- package/dist/templates/security.d.ts +34 -0
- package/dist/templates/security.d.ts.map +1 -0
- package/dist/templates/settings.d.ts +19 -0
- package/dist/templates/settings.d.ts.map +1 -0
- package/dist/templates/wizard.d.ts +22 -0
- package/dist/templates/wizard.d.ts.map +1 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { BreadcrumbItem, TemplateAction, TemplateFilters, TemplateProps } from './types';
|
|
3
|
+
export interface TemplateFrameProps<TData = unknown, TFilterState = unknown> {
|
|
4
|
+
title: string;
|
|
5
|
+
subtitle?: string;
|
|
6
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
7
|
+
data?: TData;
|
|
8
|
+
actions?: TemplateAction[];
|
|
9
|
+
filters?: TemplateFilters<TFilterState>;
|
|
10
|
+
audit?: TemplateProps<TData>['audit'];
|
|
11
|
+
layout?: TemplateProps<TData>['layout'];
|
|
12
|
+
children: React.ReactNode;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* TemplateFrame: standard page scaffold following ADR-0003 conventions.
|
|
16
|
+
* Composes PageHeader + optional filters slot + content slot + optional audit summary.
|
|
17
|
+
*/
|
|
18
|
+
export declare function TemplateFrame<TData = unknown, TFilterState = unknown>({ title, subtitle, breadcrumbs, data: _data, actions, filters, audit, layout, children, }: TemplateFrameProps<TData, TFilterState>): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=template-frame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-frame.d.ts","sourceRoot":"","sources":["../src/template-frame.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAK9F,MAAM,WAAW,kBAAkB,CAAC,KAAK,GAAG,OAAO,EAAE,YAAY,GAAG,OAAO;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,GAAG,OAAO,EAAE,YAAY,GAAG,OAAO,EAAE,EACrE,KAAK,EACL,QAAQ,EACR,WAAW,EACX,IAAI,EAAE,KAAK,EACX,OAAO,EACP,OAAO,EACP,KAAK,EACL,MAAM,EACN,QAAQ,GACT,EAAE,kBAAkB,CAAC,KAAK,EAAE,YAAY,CAAC,2CA0DzC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { BreadcrumbItem, TemplateAction, TemplateProps } from '../types';
|
|
3
|
+
export interface ActivityEvent {
|
|
4
|
+
id: string;
|
|
5
|
+
timestamp: string;
|
|
6
|
+
actor: {
|
|
7
|
+
name: string;
|
|
8
|
+
avatar?: string;
|
|
9
|
+
};
|
|
10
|
+
action: string;
|
|
11
|
+
target?: string;
|
|
12
|
+
type?: 'info' | 'success' | 'warning' | 'error';
|
|
13
|
+
detail?: ReactNode;
|
|
14
|
+
}
|
|
15
|
+
export interface ActivityData {
|
|
16
|
+
events?: ActivityEvent[];
|
|
17
|
+
}
|
|
18
|
+
export interface ActivityTemplateProps extends TemplateProps<ActivityData> {
|
|
19
|
+
title?: string;
|
|
20
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
21
|
+
actions?: TemplateAction[];
|
|
22
|
+
}
|
|
23
|
+
export declare function ActivityTemplate({ title, breadcrumbs, actions, data, audit, layout, }: ActivityTemplateProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/templates/activity.tsx"],"names":[],"mappings":"AACA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAsB,SAAQ,aAAa,CAAC,YAAY,CAAC;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B;AASD,wBAAgB,gBAAgB,CAAC,EAC/B,KAAkB,EAClB,WAAW,EACX,OAAO,EACP,IAAI,EACJ,KAAK,EACL,MAAM,GACP,EAAE,qBAAqB,2CAuCvB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface AuthShellProps {
|
|
3
|
+
brand?: ReactNode;
|
|
4
|
+
title?: string;
|
|
5
|
+
subtitle?: string;
|
|
6
|
+
footer?: ReactNode;
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
maxWidth?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function AuthShell({ brand, title, subtitle, footer, children, maxWidth, }: AuthShellProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=auth-shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-shell.d.ts","sourceRoot":"","sources":["../../src/templates/auth-shell.tsx"],"names":[],"mappings":"AACA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI9C,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAc,GACf,EAAE,cAAc,2CAuDhB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { BreadcrumbItem, TemplateAction, TemplateProps } from '../types';
|
|
2
|
+
export interface BillingPlan {
|
|
3
|
+
name: string;
|
|
4
|
+
price: string;
|
|
5
|
+
interval?: string;
|
|
6
|
+
features?: string[];
|
|
7
|
+
isCurrent?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface PaymentMethod {
|
|
10
|
+
type: string;
|
|
11
|
+
last4: string;
|
|
12
|
+
expiry?: string;
|
|
13
|
+
isDefault?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface Invoice {
|
|
16
|
+
id: string;
|
|
17
|
+
date: string;
|
|
18
|
+
amount: string;
|
|
19
|
+
status: 'paid' | 'pending' | 'overdue';
|
|
20
|
+
}
|
|
21
|
+
export interface BillingData {
|
|
22
|
+
currentPlan?: BillingPlan;
|
|
23
|
+
plans?: BillingPlan[];
|
|
24
|
+
paymentMethods?: PaymentMethod[];
|
|
25
|
+
invoices?: Invoice[];
|
|
26
|
+
}
|
|
27
|
+
export interface BillingTemplateProps extends TemplateProps<BillingData> {
|
|
28
|
+
title?: string;
|
|
29
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
30
|
+
actions?: TemplateAction[];
|
|
31
|
+
onChangePlan?: (plan: BillingPlan) => void;
|
|
32
|
+
onAddPaymentMethod?: () => void;
|
|
33
|
+
}
|
|
34
|
+
export declare function BillingTemplate({ title, breadcrumbs, actions, data, audit, layout, onChangePlan: _onChangePlan, onAddPaymentMethod: _onAddPaymentMethod, }: BillingTemplateProps): import("react/jsx-runtime").JSX.Element;
|
|
35
|
+
//# sourceMappingURL=billing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/templates/billing.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,oBAAqB,SAAQ,aAAa,CAAC,WAAW,CAAC;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC3C,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAiB,EACjB,WAAW,EACX,OAAO,EACP,IAAI,EACJ,KAAK,EACL,MAAM,EACN,YAAY,EAAE,aAAa,EAC3B,kBAAkB,EAAE,mBAAmB,GACxC,EAAE,oBAAoB,2CA6FtB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { type KpiTrend } from '../components/kpi-card';
|
|
3
|
+
import type { BreadcrumbItem, TemplateAction, TemplateFilters, TemplateProps } from '../types';
|
|
4
|
+
export interface DashboardKpi {
|
|
5
|
+
key: string;
|
|
6
|
+
label: string;
|
|
7
|
+
value: ReactNode;
|
|
8
|
+
delta?: ReactNode;
|
|
9
|
+
trend?: KpiTrend;
|
|
10
|
+
helpText?: string;
|
|
11
|
+
icon?: ReactNode;
|
|
12
|
+
onClick?: () => void;
|
|
13
|
+
}
|
|
14
|
+
export interface DashboardPanel {
|
|
15
|
+
key: string;
|
|
16
|
+
title: string;
|
|
17
|
+
subtitle?: string;
|
|
18
|
+
extra?: ReactNode;
|
|
19
|
+
content: ReactNode;
|
|
20
|
+
span?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface DashboardData {
|
|
23
|
+
kpis?: DashboardKpi[];
|
|
24
|
+
panels?: DashboardPanel[];
|
|
25
|
+
}
|
|
26
|
+
export interface DashboardTemplateProps<TFilterState = unknown> {
|
|
27
|
+
title: string;
|
|
28
|
+
subtitle?: string;
|
|
29
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
30
|
+
data?: DashboardData;
|
|
31
|
+
actions?: TemplateAction[];
|
|
32
|
+
filters?: TemplateFilters<TFilterState>;
|
|
33
|
+
audit?: TemplateProps<DashboardData>['audit'];
|
|
34
|
+
layout?: TemplateProps<DashboardData>['layout'];
|
|
35
|
+
}
|
|
36
|
+
export declare function DashboardTemplate<TFilterState = unknown>({ title, subtitle, breadcrumbs, data, actions, filters, audit, layout, }: DashboardTemplateProps<TFilterState>): import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
//# sourceMappingURL=dashboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/templates/dashboard.tsx"],"names":[],"mappings":"AACA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAW,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE/F,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,SAAS,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB,CAAC,YAAY,GAAG,OAAO;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC;CACjD;AAED,wBAAgB,iBAAiB,CAAC,YAAY,GAAG,OAAO,EAAE,EACxD,KAAK,EACL,QAAQ,EACR,WAAW,EACX,IAAI,EACJ,OAAO,EACP,OAAO,EACP,KAAK,EACL,MAAM,GACP,EAAE,sBAAsB,CAAC,YAAY,CAAC,2CAgDtC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { DescriptionsProps } from 'antd';
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
import { type AuditEvent } from '../components/audit-trail';
|
|
4
|
+
import type { BreadcrumbItem, TemplateAction, TemplateProps } from '../types';
|
|
5
|
+
export interface DetailSection {
|
|
6
|
+
key: string;
|
|
7
|
+
title: string;
|
|
8
|
+
extra?: ReactNode;
|
|
9
|
+
content: ReactNode;
|
|
10
|
+
}
|
|
11
|
+
export interface DetailSummary {
|
|
12
|
+
items: DescriptionsProps['items'];
|
|
13
|
+
columns?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface DetailAuditTrail {
|
|
16
|
+
title?: string;
|
|
17
|
+
events: AuditEvent[];
|
|
18
|
+
loading?: boolean;
|
|
19
|
+
onLoadMore?: () => void;
|
|
20
|
+
}
|
|
21
|
+
export interface DetailData {
|
|
22
|
+
summary?: DetailSummary;
|
|
23
|
+
sections?: DetailSection[];
|
|
24
|
+
auditTrail?: DetailAuditTrail;
|
|
25
|
+
}
|
|
26
|
+
export interface DetailTemplateProps extends TemplateProps<DetailData> {
|
|
27
|
+
title: string;
|
|
28
|
+
subtitle?: string;
|
|
29
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
30
|
+
actions?: TemplateAction[];
|
|
31
|
+
}
|
|
32
|
+
export declare function DetailTemplate({ title, subtitle, breadcrumbs, data, actions, audit, layout, }: DetailTemplateProps): import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
//# sourceMappingURL=detail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detail.d.ts","sourceRoot":"","sources":["../../src/templates/detail.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAGxE,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAoB,SAAQ,aAAa,CAAC,UAAU,CAAC;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,IAAI,EACJ,OAAO,EACP,KAAK,EACL,MAAM,GACP,EAAE,mBAAmB,2CA0CrB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { TemplateAction } from '../types';
|
|
3
|
+
export type ErrorStatus = 401 | 403 | 404 | 500;
|
|
4
|
+
export interface ErrorPageTemplateProps {
|
|
5
|
+
status: ErrorStatus;
|
|
6
|
+
title?: string;
|
|
7
|
+
message?: ReactNode;
|
|
8
|
+
actions?: TemplateAction[];
|
|
9
|
+
extra?: ReactNode;
|
|
10
|
+
}
|
|
11
|
+
export declare function ErrorPageTemplate({ status, title, message, actions, extra, }: ErrorPageTemplateProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/templates/error.tsx"],"names":[],"mappings":"AACA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAuBhD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,KAAK,GACN,EAAE,sBAAsB,2CAmDxB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { BreadcrumbItem, TemplateAction, TemplateProps } from '../types';
|
|
3
|
+
export interface InviteReward {
|
|
4
|
+
label: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
icon?: ReactNode;
|
|
7
|
+
}
|
|
8
|
+
export interface InviteData {
|
|
9
|
+
referralLink?: string;
|
|
10
|
+
referralCode?: string;
|
|
11
|
+
totalInvites?: number;
|
|
12
|
+
acceptedInvites?: number;
|
|
13
|
+
rewards?: InviteReward[];
|
|
14
|
+
}
|
|
15
|
+
export interface InviteTemplateProps extends TemplateProps<InviteData> {
|
|
16
|
+
title?: string;
|
|
17
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
18
|
+
actions?: TemplateAction[];
|
|
19
|
+
onCopyLink?: () => void;
|
|
20
|
+
}
|
|
21
|
+
export declare function InviteTemplate({ title, breadcrumbs, actions, data, audit, layout, onCopyLink, }: InviteTemplateProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=invite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invite.d.ts","sourceRoot":"","sources":["../../src/templates/invite.tsx"],"names":[],"mappings":"AACA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI9C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAoB,SAAQ,aAAa,CAAC,UAAU,CAAC;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAyB,EACzB,WAAW,EACX,OAAO,EACP,IAAI,EACJ,KAAK,EACL,MAAM,EACN,UAAU,GACX,EAAE,mBAAmB,2CAwErB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { TableProps } from 'antd';
|
|
2
|
+
import { type ReactNode, type Key } from 'react';
|
|
3
|
+
import type { BreadcrumbItem, TemplateAction, TemplateFilters, TemplateProps } from '../types';
|
|
4
|
+
export interface ListData<TItem> {
|
|
5
|
+
items: TItem[];
|
|
6
|
+
loading?: boolean;
|
|
7
|
+
total?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ListExportSpec {
|
|
10
|
+
key: string;
|
|
11
|
+
label: string;
|
|
12
|
+
onExport: () => void;
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
icon?: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
export interface ListBulkAction {
|
|
17
|
+
key: string;
|
|
18
|
+
label: string;
|
|
19
|
+
kind?: 'primary' | 'secondary' | 'danger' | 'link';
|
|
20
|
+
onAction: (selectedRowKeys: Key[]) => void;
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface ListSelection {
|
|
24
|
+
enabled: boolean;
|
|
25
|
+
bulkActions?: ListBulkAction[];
|
|
26
|
+
selectedRowKeys?: Key[];
|
|
27
|
+
onSelectionChange?: (next: Key[]) => void;
|
|
28
|
+
/** Custom aria-label for row checkboxes. Falls back to name/title/key. */
|
|
29
|
+
getAriaLabel?: (record: unknown, index?: number) => string;
|
|
30
|
+
}
|
|
31
|
+
export interface ListTemplateProps<TItem, TFilterState = unknown> {
|
|
32
|
+
title: string;
|
|
33
|
+
subtitle?: string;
|
|
34
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
35
|
+
data?: ListData<TItem>;
|
|
36
|
+
actions?: TemplateAction[];
|
|
37
|
+
filters?: TemplateFilters<TFilterState>;
|
|
38
|
+
audit?: TemplateProps<ListData<TItem>>['audit'];
|
|
39
|
+
layout?: TemplateProps<ListData<TItem>>['layout'];
|
|
40
|
+
table: Omit<TableProps<TItem>, 'dataSource' | 'loading'> & {
|
|
41
|
+
rowKey: TableProps<TItem>['rowKey'];
|
|
42
|
+
};
|
|
43
|
+
selection?: ListSelection;
|
|
44
|
+
exports?: ListExportSpec[];
|
|
45
|
+
tools?: ReactNode;
|
|
46
|
+
}
|
|
47
|
+
export declare function ListTemplate<TItem extends object, TFilterState = unknown>({ title, subtitle, breadcrumbs, data, actions, filters, audit, layout, table, selection, exports: exportSpecs, tools, }: ListTemplateProps<TItem, TFilterState>): import("react/jsx-runtime").JSX.Element;
|
|
48
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/templates/list.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AACvC,OAAc,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAIxD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE/F,MAAM,WAAW,QAAQ,CAAC,KAAK;IAC7B,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnD,QAAQ,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAC1C,0EAA0E;IAC1E,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAC5D;AAED,MAAM,WAAW,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClD,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC,GAAG;QACzD,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;KACrC,CAAC;IACF,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,KAAK,SAAS,MAAM,EAAE,YAAY,GAAG,OAAO,EAAE,EACzE,KAAK,EACL,QAAQ,EACR,WAAW,EACX,IAAI,EACJ,OAAO,EACP,OAAO,EACP,KAAK,EACL,MAAM,EACN,KAAK,EACL,SAAS,EACT,OAAO,EAAE,WAAW,EACpB,KAAK,GACN,EAAE,iBAAiB,CAAC,KAAK,EAAE,YAAY,CAAC,2CAyFxC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { BreadcrumbItem, TemplateAction, TemplateProps } from '../types';
|
|
2
|
+
export interface TeamMember {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
email: string;
|
|
6
|
+
avatar?: string;
|
|
7
|
+
role: string;
|
|
8
|
+
status?: 'active' | 'invited' | 'inactive';
|
|
9
|
+
joinedAt?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface TeamRole {
|
|
12
|
+
name: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
memberCount: number;
|
|
15
|
+
}
|
|
16
|
+
export interface MembersData {
|
|
17
|
+
members?: TeamMember[];
|
|
18
|
+
roles?: TeamRole[];
|
|
19
|
+
totalMembers?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface MembersTemplateProps extends TemplateProps<MembersData> {
|
|
22
|
+
title?: string;
|
|
23
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
24
|
+
actions?: TemplateAction[];
|
|
25
|
+
onInvite?: () => void;
|
|
26
|
+
}
|
|
27
|
+
export declare function MembersTemplate({ title, breadcrumbs, actions, data, audit, layout, }: MembersTemplateProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=members.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../src/templates/members.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAqB,SAAQ,aAAa,CAAC,WAAW,CAAC;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAsB,EACtB,WAAW,EACX,OAAO,EACP,IAAI,EACJ,KAAK,EACL,MAAM,GACP,EAAE,oBAAoB,2CAwFtB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { BreadcrumbItem, TemplateAction, TemplateProps } from '../types';
|
|
2
|
+
export interface NotificationChannel {
|
|
3
|
+
key: string;
|
|
4
|
+
label: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
email?: boolean;
|
|
7
|
+
push?: boolean;
|
|
8
|
+
sms?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface NotificationGroup {
|
|
11
|
+
title: string;
|
|
12
|
+
channels: NotificationChannel[];
|
|
13
|
+
}
|
|
14
|
+
export interface NotificationsData {
|
|
15
|
+
groups?: NotificationGroup[];
|
|
16
|
+
}
|
|
17
|
+
export interface NotificationsTemplateProps extends TemplateProps<NotificationsData> {
|
|
18
|
+
title?: string;
|
|
19
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
20
|
+
actions?: TemplateAction[];
|
|
21
|
+
onToggle?: (channelKey: string, method: 'email' | 'push' | 'sms', value: boolean) => void;
|
|
22
|
+
}
|
|
23
|
+
export declare function NotificationsTemplate({ title, breadcrumbs, actions, data, audit, layout, onToggle, }: NotificationsTemplateProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/templates/notifications.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA2B,SAAQ,aAAa,CAAC,iBAAiB,CAAC;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC3F;AAED,wBAAgB,qBAAqB,CAAC,EACpC,KAAuB,EACvB,WAAW,EACX,OAAO,EACP,IAAI,EACJ,KAAK,EACL,MAAM,EACN,QAAQ,GACT,EAAE,0BAA0B,2CA4E5B"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { BreadcrumbItem, TemplateAction, TemplateProps } from '../types';
|
|
3
|
+
export interface ProfileStat {
|
|
4
|
+
label: string;
|
|
5
|
+
value: string | number;
|
|
6
|
+
}
|
|
7
|
+
export interface ProfileTab {
|
|
8
|
+
key: string;
|
|
9
|
+
label: string;
|
|
10
|
+
content: ReactNode;
|
|
11
|
+
}
|
|
12
|
+
export interface ProfileData {
|
|
13
|
+
name: string;
|
|
14
|
+
avatar?: string;
|
|
15
|
+
bio?: string;
|
|
16
|
+
role?: string;
|
|
17
|
+
tags?: string[];
|
|
18
|
+
stats?: ProfileStat[];
|
|
19
|
+
tabs?: ProfileTab[];
|
|
20
|
+
details?: {
|
|
21
|
+
label: string;
|
|
22
|
+
value: ReactNode;
|
|
23
|
+
}[];
|
|
24
|
+
}
|
|
25
|
+
export interface ProfileTemplateProps extends TemplateProps<ProfileData> {
|
|
26
|
+
title?: string;
|
|
27
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
28
|
+
actions?: TemplateAction[];
|
|
29
|
+
}
|
|
30
|
+
export declare function ProfileTemplate({ title, breadcrumbs, actions, data, filters: _filters, audit, layout, }: ProfileTemplateProps): import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/templates/profile.tsx"],"names":[],"mappings":"AACA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,oBAAqB,SAAQ,aAAa,CAAC,WAAW,CAAC;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,WAAW,EACX,OAAO,EACP,IAAI,EACJ,OAAO,EAAE,QAAQ,EACjB,KAAK,EACL,MAAM,GACP,EAAE,oBAAoB,2CAsFtB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { BreadcrumbItem, TemplateAction, TemplateProps } from '../types';
|
|
2
|
+
export interface ProjectMember {
|
|
3
|
+
name: string;
|
|
4
|
+
avatar?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface Project {
|
|
7
|
+
id: string;
|
|
8
|
+
title: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
status?: 'active' | 'completed' | 'on-hold' | 'archived';
|
|
11
|
+
progress?: number;
|
|
12
|
+
members?: ProjectMember[];
|
|
13
|
+
dueDate?: string;
|
|
14
|
+
tags?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface ProjectsData {
|
|
17
|
+
projects?: Project[];
|
|
18
|
+
columns?: 2 | 3;
|
|
19
|
+
}
|
|
20
|
+
export interface ProjectsTemplateProps extends TemplateProps<ProjectsData> {
|
|
21
|
+
title?: string;
|
|
22
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
23
|
+
actions?: TemplateAction[];
|
|
24
|
+
onProjectClick?: (project: Project) => void;
|
|
25
|
+
}
|
|
26
|
+
export declare function ProjectsTemplate({ title, breadcrumbs, actions, data, audit, layout, onProjectClick, }: ProjectsTemplateProps): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/templates/projects.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CACjB;AAED,MAAM,WAAW,qBAAsB,SAAQ,aAAa,CAAC,YAAY,CAAC;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7C;AASD,wBAAgB,gBAAgB,CAAC,EAC/B,KAAkB,EAClB,WAAW,EACX,OAAO,EACP,IAAI,EACJ,KAAK,EACL,MAAM,EACN,cAAc,GACf,EAAE,qBAAqB,2CAuFvB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { BreadcrumbItem, TemplateAction, TemplateProps } from '../types';
|
|
2
|
+
export interface SecuritySession {
|
|
3
|
+
id: string;
|
|
4
|
+
device: string;
|
|
5
|
+
location?: string;
|
|
6
|
+
lastActive: string;
|
|
7
|
+
isCurrent?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface SecurityDevice {
|
|
10
|
+
name: string;
|
|
11
|
+
type: string;
|
|
12
|
+
lastSeen: string;
|
|
13
|
+
trusted?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface SecurityLog {
|
|
16
|
+
timestamp: string;
|
|
17
|
+
action: string;
|
|
18
|
+
ip?: string;
|
|
19
|
+
status: 'success' | 'warning' | 'failure';
|
|
20
|
+
}
|
|
21
|
+
export interface SecurityData {
|
|
22
|
+
twoFactorEnabled?: boolean;
|
|
23
|
+
sessions?: SecuritySession[];
|
|
24
|
+
devices?: SecurityDevice[];
|
|
25
|
+
securityLog?: SecurityLog[];
|
|
26
|
+
passwordLastChanged?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface SecurityTemplateProps extends TemplateProps<SecurityData> {
|
|
29
|
+
title?: string;
|
|
30
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
31
|
+
actions?: TemplateAction[];
|
|
32
|
+
}
|
|
33
|
+
export declare function SecurityTemplate({ title, breadcrumbs, actions, data, audit, layout, }: SecurityTemplateProps): import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/templates/security.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAsB,SAAQ,aAAa,CAAC,YAAY,CAAC;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAkB,EAClB,WAAW,EACX,OAAO,EACP,IAAI,EACJ,KAAK,EACL,MAAM,GACP,EAAE,qBAAqB,2CA2FvB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { BreadcrumbItem, TemplateAction, TemplateProps } from '../types';
|
|
3
|
+
export interface SettingsSection {
|
|
4
|
+
key: string;
|
|
5
|
+
title: string;
|
|
6
|
+
subtitle?: string;
|
|
7
|
+
content: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
export interface SettingsData {
|
|
10
|
+
sections: SettingsSection[];
|
|
11
|
+
}
|
|
12
|
+
export interface SettingsTemplateProps extends TemplateProps<SettingsData> {
|
|
13
|
+
title: string;
|
|
14
|
+
subtitle?: string;
|
|
15
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
16
|
+
actions?: TemplateAction[];
|
|
17
|
+
}
|
|
18
|
+
export declare function SettingsTemplate({ title, subtitle, breadcrumbs, actions, data, filters, audit, layout, }: SettingsTemplateProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/templates/settings.tsx"],"names":[],"mappings":"AACA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI9C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAsB,SAAQ,aAAa,CAAC,YAAY,CAAC;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,OAAO,EACP,IAAI,EACJ,OAAO,EACP,KAAK,EACL,MAAM,GACP,EAAE,qBAAqB,2CAuBvB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { BreadcrumbItem, TemplateAction, TemplateProps } from '../types';
|
|
3
|
+
export interface WizardStep {
|
|
4
|
+
key: string;
|
|
5
|
+
title: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
content: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
export interface WizardData {
|
|
10
|
+
steps: WizardStep[];
|
|
11
|
+
currentStep?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface WizardTemplateProps extends TemplateProps<WizardData> {
|
|
14
|
+
title: string;
|
|
15
|
+
subtitle?: string;
|
|
16
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
17
|
+
actions?: TemplateAction[];
|
|
18
|
+
/** Called when the user clicks a step in the step indicator. */
|
|
19
|
+
onStepChange?: (step: number) => void;
|
|
20
|
+
}
|
|
21
|
+
export declare function WizardTemplate({ title, subtitle, breadcrumbs, actions, data, filters, audit, layout, onStepChange, }: WizardTemplateProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../src/templates/wizard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAoB,SAAQ,aAAa,CAAC,UAAU,CAAC;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,gEAAgE;IAChE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,OAAO,EACP,IAAI,EACJ,OAAO,EACP,KAAK,EACL,MAAM,EACN,YAAY,GACb,EAAE,mBAAmB,2CAsCrB"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Template API types following ADR-0003 conventions.
|
|
4
|
+
* All templates should accept these standardized props for consistency.
|
|
5
|
+
*/
|
|
6
|
+
export interface BreadcrumbItem {
|
|
7
|
+
label: string;
|
|
8
|
+
href?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface PageHeaderAction {
|
|
11
|
+
key: string;
|
|
12
|
+
label: string;
|
|
13
|
+
onClick?: () => void;
|
|
14
|
+
kind?: 'primary' | 'secondary' | 'danger' | 'link';
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
ariaLabel?: string;
|
|
17
|
+
icon?: ReactNode;
|
|
18
|
+
}
|
|
19
|
+
export interface TemplateAction {
|
|
20
|
+
key: string;
|
|
21
|
+
label: string;
|
|
22
|
+
onAction?: () => void;
|
|
23
|
+
kind?: 'primary' | 'secondary' | 'danger' | 'link';
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
ariaLabel?: string;
|
|
26
|
+
icon?: ReactNode;
|
|
27
|
+
}
|
|
28
|
+
export interface TemplateAudit {
|
|
29
|
+
summary?: string;
|
|
30
|
+
lastUpdatedAt?: string;
|
|
31
|
+
lastUpdatedBy?: string;
|
|
32
|
+
sourceSystem?: string;
|
|
33
|
+
evidenceUrl?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface TemplateFilters<TState = unknown> {
|
|
36
|
+
state: TState;
|
|
37
|
+
onChange: (next: TState) => void;
|
|
38
|
+
content?: ReactNode;
|
|
39
|
+
}
|
|
40
|
+
export interface TemplateLayoutOverrides {
|
|
41
|
+
contentPadding?: number;
|
|
42
|
+
showBreadcrumbs?: boolean;
|
|
43
|
+
}
|
|
44
|
+
export interface TemplateProps<TData = unknown> {
|
|
45
|
+
data?: TData;
|
|
46
|
+
actions?: TemplateAction[];
|
|
47
|
+
filters?: TemplateFilters;
|
|
48
|
+
audit?: TemplateAudit;
|
|
49
|
+
layout?: TemplateLayoutOverrides;
|
|
50
|
+
}
|
|
51
|
+
export declare function templateActionsToPageHeaderActions(actions: TemplateAction[]): PageHeaderAction[];
|
|
52
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe,CAAC,MAAM,GAAG,OAAO;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa,CAAC,KAAK,GAAG,OAAO;IAC5C,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,uBAAuB,CAAC;CAClC;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,gBAAgB,EAAE,CAUhG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@gtcx/templates",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "GTCX page templates — DashboardTemplate, ListTemplate, DetailTemplate, WizardTemplate, etc.",
|
|
5
|
+
"main": "dist/index.cjs",
|
|
6
|
+
"module": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.cjs"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"sideEffects": false,
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsup && tsc --emitDeclarationOnly --declaration --outDir dist",
|
|
18
|
+
"dev": "tsup src/index.ts --format esm,cjs --dts --watch",
|
|
19
|
+
"lint": "eslint src/",
|
|
20
|
+
"typecheck": "tsc --noEmit",
|
|
21
|
+
"test": "vitest run"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@gtcx/tokens": "workspace:*",
|
|
25
|
+
"@gtcx/utils": "workspace:*",
|
|
26
|
+
"@ant-design/icons": "^5.2.0",
|
|
27
|
+
"antd": "^5.12.0"
|
|
28
|
+
},
|
|
29
|
+
"peerDependencies": {
|
|
30
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/react": "^18.0.0",
|
|
34
|
+
"tsup": "^8.0.0",
|
|
35
|
+
"typescript": "^5.0.0"
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"README.md"
|
|
40
|
+
],
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
}
|
|
44
|
+
}
|