@burdenoff/microfe-billing 2026.614.1 → 2026.623.2
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/billing/BillingAdminRoutes.js +7 -6
- package/dist/billing/BillingAdminRoutes.js.map +1 -1
- package/dist/billing/BillingRoot.js +1 -1
- package/dist/billing/BillingRoot.js.map +1 -1
- package/dist/billing/modules/addons/components/FloatingCartDrawer.js +22 -22
- package/dist/billing/modules/addons/components/FloatingCartDrawer.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonCreatePage.js +31 -31
- package/dist/billing/modules/addons/pages/AddonCreatePage.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonDetailPage.js +39 -39
- package/dist/billing/modules/addons/pages/AddonDetailPage.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonEditPage.js +29 -29
- package/dist/billing/modules/addons/pages/AddonEditPage.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonsListPage.js +91 -91
- package/dist/billing/modules/addons/pages/AddonsListPage.js.map +1 -1
- package/dist/billing/modules/analytics/pages/AnalyticsPage.js +40 -40
- package/dist/billing/modules/analytics/pages/AnalyticsPage.js.map +1 -1
- package/dist/billing/modules/billing/pages/InvoiceDetailPage.js +115 -115
- package/dist/billing/modules/billing/pages/InvoiceDetailPage.js.map +1 -1
- package/dist/billing/modules/billing/pages/InvoicesListPage.js +75 -72
- package/dist/billing/modules/billing/pages/InvoicesListPage.js.map +1 -1
- package/dist/billing/modules/billing/pages/RefundsPage.js +126 -126
- package/dist/billing/modules/billing/pages/RefundsPage.js.map +1 -1
- package/dist/billing/modules/billing/pages/UserRefundsPage.js +45 -45
- package/dist/billing/modules/billing/pages/UserRefundsPage.js.map +1 -1
- package/dist/billing/modules/checkout/components/BillingAccountSelector.js +25 -25
- package/dist/billing/modules/checkout/components/BillingAccountSelector.js.map +1 -1
- package/dist/billing/modules/checkout/components/CompleteBillingAccountModal.js +31 -35
- package/dist/billing/modules/checkout/components/CompleteBillingAccountModal.js.map +1 -1
- package/dist/billing/modules/checkout/components/CreditsAmountInput.js +9 -9
- package/dist/billing/modules/checkout/components/CreditsAmountInput.js.map +1 -1
- package/dist/billing/modules/checkout/components/OrderSummary.js +31 -31
- package/dist/billing/modules/checkout/components/OrderSummary.js.map +1 -1
- package/dist/billing/modules/checkout/components/PromoCodeInput.js +8 -8
- package/dist/billing/modules/checkout/components/PromoCodeInput.js.map +1 -1
- package/dist/billing/modules/checkout/components/RazorpayPaymentButton.js +5 -5
- package/dist/billing/modules/checkout/components/RazorpayPaymentButton.js.map +1 -1
- package/dist/billing/modules/checkout/components/SimpleAutoPayToggle.js +9 -9
- package/dist/billing/modules/checkout/components/SimpleAutoPayToggle.js.map +1 -1
- package/dist/billing/modules/checkout/components/StripePaymentForm.js +21 -21
- package/dist/billing/modules/checkout/components/StripePaymentForm.js.map +1 -1
- package/dist/billing/modules/checkout/components/SubscriptionSelector.js +11 -11
- package/dist/billing/modules/checkout/components/SubscriptionSelector.js.map +1 -1
- package/dist/billing/modules/checkout/components/UnifiedPaymentMethodSelector.js +31 -31
- package/dist/billing/modules/checkout/components/UnifiedPaymentMethodSelector.js.map +1 -1
- package/dist/billing/modules/checkout/components/WorkspaceQuotaAssignmentModal.js +23 -23
- package/dist/billing/modules/checkout/components/WorkspaceQuotaAssignmentModal.js.map +1 -1
- package/dist/billing/modules/checkout/pages/CheckoutPage.js +91 -91
- package/dist/billing/modules/checkout/pages/CheckoutPage.js.map +1 -1
- package/dist/billing/modules/coupons/pages/CouponDetailPage.js +62 -62
- package/dist/billing/modules/coupons/pages/CouponDetailPage.js.map +1 -1
- package/dist/billing/modules/coupons/pages/CouponsListPage.js +72 -60
- package/dist/billing/modules/coupons/pages/CouponsListPage.js.map +1 -1
- package/dist/billing/modules/coupons/pages/CreateCouponPage.js +66 -66
- package/dist/billing/modules/coupons/pages/CreateCouponPage.js.map +1 -1
- package/dist/billing/modules/coupons/pages/EditCouponPage.js +46 -46
- package/dist/billing/modules/coupons/pages/EditCouponPage.js.map +1 -1
- package/dist/billing/modules/credits/pages/AdminCreditsPage.js +19 -19
- package/dist/billing/modules/credits/pages/AdminCreditsPage.js.map +1 -1
- package/dist/billing/modules/credits/pages/CreditTransactionsPage.js +37 -37
- package/dist/billing/modules/credits/pages/CreditTransactionsPage.js.map +1 -1
- package/dist/billing/modules/credits/pages/CreditWithdrawalPage.js +90 -90
- package/dist/billing/modules/credits/pages/CreditWithdrawalPage.js.map +1 -1
- package/dist/billing/modules/credits/pages/CreditsPage.js +41 -41
- package/dist/billing/modules/credits/pages/CreditsPage.js.map +1 -1
- package/dist/billing/modules/dashboard/components/ActiveSubscriptionCard.js +31 -31
- package/dist/billing/modules/dashboard/components/ActiveSubscriptionCard.js.map +1 -1
- package/dist/billing/modules/dashboard/components/AddPaymentMethodModal.js +35 -35
- package/dist/billing/modules/dashboard/components/AddPaymentMethodModal.js.map +1 -1
- package/dist/billing/modules/dashboard/components/BillingAccountCard.js +24 -24
- package/dist/billing/modules/dashboard/components/BillingAccountCard.js.map +1 -1
- package/dist/billing/modules/dashboard/components/CreateBillingAccountModal.js +99 -99
- package/dist/billing/modules/dashboard/components/CreateBillingAccountModal.js.map +1 -1
- package/dist/billing/modules/dashboard/components/PaymentMethodsSection.js +23 -23
- package/dist/billing/modules/dashboard/components/PaymentMethodsSection.js.map +1 -1
- package/dist/billing/modules/dashboard/components/RecommendedAddonsSection.js +22 -22
- package/dist/billing/modules/dashboard/components/RecommendedAddonsSection.js.map +1 -1
- package/dist/billing/modules/dashboard/pages/OverviewPage.js +58 -58
- package/dist/billing/modules/dashboard/pages/OverviewPage.js.map +1 -1
- package/dist/billing/modules/discounts/pages/DiscountsListPage.js +126 -126
- package/dist/billing/modules/discounts/pages/DiscountsListPage.js.map +1 -1
- package/dist/billing/modules/earnings/pages/PayoutAdminPage.js +83 -79
- package/dist/billing/modules/earnings/pages/PayoutAdminPage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanAssignFreePage.js +16 -16
- package/dist/billing/modules/plans/pages/PlanAssignFreePage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanBrowseDetailPage.js +40 -40
- package/dist/billing/modules/plans/pages/PlanBrowseDetailPage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanCreatePage.js +35 -35
- package/dist/billing/modules/plans/pages/PlanCreatePage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanDetailPage.js +57 -57
- package/dist/billing/modules/plans/pages/PlanDetailPage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanEditPage.js +35 -35
- package/dist/billing/modules/plans/pages/PlanEditPage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlansBrowsePage.js +57 -57
- package/dist/billing/modules/plans/pages/PlansBrowsePage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlansListPage.js +52 -52
- package/dist/billing/modules/plans/pages/PlansListPage.js.map +1 -1
- package/dist/billing/modules/promotions/pages/CreatePromotionPage.js +40 -39
- package/dist/billing/modules/promotions/pages/CreatePromotionPage.js.map +1 -1
- package/dist/billing/modules/promotions/pages/PromotionsListPage.js +22 -19
- package/dist/billing/modules/promotions/pages/PromotionsListPage.js.map +1 -1
- package/dist/billing/modules/quota/pages/QuotaTemplateCreatePage.js +34 -34
- package/dist/billing/modules/quota/pages/QuotaTemplateCreatePage.js.map +1 -1
- package/dist/billing/modules/quota/pages/QuotaTemplateDetailPage.js +47 -47
- package/dist/billing/modules/quota/pages/QuotaTemplateDetailPage.js.map +1 -1
- package/dist/billing/modules/quota/pages/QuotaTemplateEditPage.js +39 -39
- package/dist/billing/modules/quota/pages/QuotaTemplateEditPage.js.map +1 -1
- package/dist/billing/modules/quota/pages/QuotaTemplatesListPage.js +52 -52
- package/dist/billing/modules/quota/pages/QuotaTemplatesListPage.js.map +1 -1
- package/dist/billing/modules/subscriptions/components/ManageSeatsModal.js +23 -23
- package/dist/billing/modules/subscriptions/components/ManageSeatsModal.js.map +1 -1
- package/dist/billing/modules/subscriptions/pages/SubscriptionDetailPage.js +259 -246
- package/dist/billing/modules/subscriptions/pages/SubscriptionDetailPage.js.map +1 -1
- package/dist/billing/modules/subscriptions/pages/SubscriptionsListPage.js +88 -85
- package/dist/billing/modules/subscriptions/pages/SubscriptionsListPage.js.map +1 -1
- package/dist/billing/modules/subscriptions/pages/UpgradeSubscriptionPage.js +51 -51
- package/dist/billing/modules/subscriptions/pages/UpgradeSubscriptionPage.js.map +1 -1
- package/dist/billing/modules/usage/pages/UsagePage.js +206 -196
- package/dist/billing/modules/usage/pages/UsagePage.js.map +1 -1
- package/dist/billing/shared/components/ServerError.js +4 -4
- package/dist/billing/shared/components/ServerError.js.map +1 -1
- package/dist/billing/shared/components/StatCard.js +11 -33
- package/dist/billing/shared/components/StatCard.js.map +1 -1
- package/dist/billing/shared/ui/Card.js +15 -0
- package/dist/billing/shared/ui/Card.js.map +1 -0
- package/dist/billing/shared/ui/MetricCard.js +44 -0
- package/dist/billing/shared/ui/MetricCard.js.map +1 -0
- package/dist/billing/shared/ui/ProgressBar.js +30 -0
- package/dist/billing/shared/ui/ProgressBar.js.map +1 -0
- package/dist/billing/shared/ui/SectionHeader.js +2 -0
- package/dist/billing/shared/ui/StatusPill.js +28 -0
- package/dist/billing/shared/ui/StatusPill.js.map +1 -0
- package/dist/billing/shared/ui/index.js +5 -0
- package/dist/billing/shared/utils/tokens.js +13 -30
- package/dist/billing/shared/utils/tokens.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,37 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import { MetricCard as e } from "../ui/MetricCard.js";
|
|
2
|
+
import "../ui/index.js";
|
|
3
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
4
|
//#region src/billing/shared/components/StatCard.tsx
|
|
4
|
-
var
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
children: [/* @__PURE__ */ t("p", {
|
|
12
|
-
className: "text-sm font-medium text-muted-foreground",
|
|
13
|
-
children: r
|
|
14
|
-
}), a && /* @__PURE__ */ t("div", {
|
|
15
|
-
className: "text-muted-foreground",
|
|
16
|
-
children: a
|
|
17
|
-
})]
|
|
18
|
-
}),
|
|
19
|
-
/* @__PURE__ */ t("p", {
|
|
20
|
-
className: "text-2xl font-bold text-foreground mt-2",
|
|
21
|
-
children: i
|
|
22
|
-
}),
|
|
23
|
-
o && c && /* @__PURE__ */ n("p", {
|
|
24
|
-
className: `text-xs mt-1 ${c.text}`,
|
|
25
|
-
children: [
|
|
26
|
-
o.isPositive ? "+" : "",
|
|
27
|
-
o.value,
|
|
28
|
-
"%"
|
|
29
|
-
]
|
|
30
|
-
})
|
|
31
|
-
]
|
|
32
|
-
});
|
|
33
|
-
};
|
|
5
|
+
var n = ({ label: n, value: r, icon: i, trend: a, className: o = "" }) => /* @__PURE__ */ t(e, {
|
|
6
|
+
label: n,
|
|
7
|
+
value: r,
|
|
8
|
+
icon: i,
|
|
9
|
+
trend: a,
|
|
10
|
+
className: o
|
|
11
|
+
});
|
|
34
12
|
//#endregion
|
|
35
|
-
export {
|
|
13
|
+
export { n as StatCard };
|
|
36
14
|
|
|
37
15
|
//# sourceMappingURL=StatCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatCard.js","names":[],"sources":["../../../../src/billing/shared/components/StatCard.tsx"],"sourcesContent":["/**\n * Shared Stat Card Component\n * Displays a metric with label and value\n */\n\nimport type { FC, ReactNode } from 'react';\nimport {
|
|
1
|
+
{"version":3,"file":"StatCard.js","names":[],"sources":["../../../../src/billing/shared/components/StatCard.tsx"],"sourcesContent":["/**\n * Shared Stat Card Component\n * Displays a metric with label and value\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { MetricCard } from '../ui';\n\ninterface StatCardProps {\n label: string;\n value: string | number;\n icon?: ReactNode;\n trend?: {\n value: number;\n isPositive: boolean;\n };\n className?: string;\n}\n\nexport const StatCard: FC<StatCardProps> = ({ label, value, icon, trend, className = '' }) => {\n return <MetricCard label={label} value={value} icon={icon} trend={trend} className={className} />;\n};\n"],"mappings":";;;;AAmBA,IAAa,KAA+B,EAAE,UAAO,UAAO,SAAM,UAAO,eAAY,SAC5E,kBAAC,GAAD;CAAmB;CAAc;CAAa;CAAa;CAAkB;CAAa,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { cn as t } from "@burdenoff/fe-libs/shared/utils";
|
|
3
|
+
//#region src/billing/shared/ui/Card.tsx
|
|
4
|
+
function n({ children: n, className: r, interactive: i = !1, selected: a = !1, as: o, onClick: s, ...c }) {
|
|
5
|
+
return /* @__PURE__ */ e(o ?? "div", {
|
|
6
|
+
onClick: s,
|
|
7
|
+
className: t("rounded-card border border-border-subtle bg-bg-surface shadow-elevation-1", i && "transition-all duration-200 ease-[var(--motion-easing-out)] hover:border-border-strong hover:shadow-elevation-2 hover:-translate-y-0.5", a && "ring-1 ring-[var(--color-focus-ring)] border-border-strong", s && "cursor-pointer text-left", r),
|
|
8
|
+
...c,
|
|
9
|
+
children: n
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { n as Card };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=Card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card.js","names":[],"sources":["../../../../src/billing/shared/ui/Card.tsx"],"sourcesContent":["/**\n * Boff UI — Card primitive\n *\n * The workhorse surface for the billing MFE. Renders the canonical Boff UI\n * card recipe: `rounded-card border border-border-subtle bg-bg-surface\n * shadow-elevation-1`. Set `interactive` for the hover-lift treatment and\n * `selected` for the accent-soft selected state.\n *\n * Visual-only primitive — no business logic.\n */\n\nimport type { ElementType, ReactNode } from 'react';\nimport { cn } from '@burdenoff/fe-libs/shared/utils';\n\ninterface CardProps {\n children: ReactNode;\n className?: string;\n /** Apply hover lift + stronger border/elevation (use for clickable cards). */\n interactive?: boolean;\n /** Apply the accent-soft selected ring/wash. */\n selected?: boolean;\n /** Render as a different element (e.g. 'section', 'article'). Defaults to 'div'. */\n as?: ElementType;\n onClick?: () => void;\n /** Passthrough for data-tour and other data-* hooks. */\n [key: `data-${string}`]: string | undefined;\n}\n\nexport function Card({\n children,\n className,\n interactive = false,\n selected = false,\n as,\n onClick,\n ...rest\n}: CardProps) {\n const Component = as ?? 'div';\n return (\n <Component\n onClick={onClick}\n className={cn(\n 'rounded-card border border-border-subtle bg-bg-surface shadow-elevation-1',\n interactive &&\n 'transition-all duration-200 ease-[var(--motion-easing-out)] hover:border-border-strong hover:shadow-elevation-2 hover:-translate-y-0.5',\n selected && 'ring-1 ring-[var(--color-focus-ring)] border-border-strong',\n onClick && 'cursor-pointer text-left',\n className\n )}\n {...rest}\n >\n {children}\n </Component>\n );\n}\n"],"mappings":";;;AA4BA,SAAgB,EAAK,EACnB,aACA,cACA,iBAAc,IACd,cAAW,IACX,OACA,YACA,GAAG,KACS;AAEZ,QACE,kBAFgB,KAAM,OAEtB;EACW;EACT,WAAW,EACT,6EACA,KACE,0IACF,KAAY,8DACZ,KAAW,4BACX,EACD;EACD,GAAI;EAEH;EACS,CAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Fragment as e, jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
2
|
+
import { cn as r } from "@burdenoff/fe-libs/shared/utils";
|
|
3
|
+
//#region src/billing/shared/ui/MetricCard.tsx
|
|
4
|
+
function i({ label: i, value: a, icon: o, trend: s, onClick: c, isActive: l = !1, className: u, ...d }) {
|
|
5
|
+
let f = r("rounded-card border border-border-subtle bg-bg-surface shadow-elevation-1 p-5 text-left", c && "w-full transition-all duration-200 ease-[var(--motion-easing-out)] hover:border-border-strong hover:shadow-elevation-2 hover:-translate-y-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", l && "ring-1 ring-[var(--color-focus-ring)] border-border-strong", u), p = /* @__PURE__ */ n(e, { children: [
|
|
6
|
+
/* @__PURE__ */ n("div", {
|
|
7
|
+
className: "flex items-start justify-between gap-3",
|
|
8
|
+
children: [/* @__PURE__ */ t("p", {
|
|
9
|
+
className: "text-sm text-text-secondary",
|
|
10
|
+
children: i
|
|
11
|
+
}), o && /* @__PURE__ */ t("span", {
|
|
12
|
+
className: "flex size-9 shrink-0 items-center justify-center rounded-lg bg-[var(--color-accent-soft)] text-text-primary",
|
|
13
|
+
children: o
|
|
14
|
+
})]
|
|
15
|
+
}),
|
|
16
|
+
/* @__PURE__ */ t("p", {
|
|
17
|
+
className: "mt-2 text-2xl font-semibold tabular-nums text-text-primary",
|
|
18
|
+
children: a
|
|
19
|
+
}),
|
|
20
|
+
s && /* @__PURE__ */ n("p", {
|
|
21
|
+
className: r("mt-1 text-xs font-medium", s.isPositive ? "text-status-success-text" : "text-status-error-text"),
|
|
22
|
+
children: [
|
|
23
|
+
s.isPositive ? "+" : "",
|
|
24
|
+
s.value,
|
|
25
|
+
"%"
|
|
26
|
+
]
|
|
27
|
+
})
|
|
28
|
+
] });
|
|
29
|
+
return c ? /* @__PURE__ */ t("button", {
|
|
30
|
+
type: "button",
|
|
31
|
+
onClick: c,
|
|
32
|
+
className: f,
|
|
33
|
+
...d,
|
|
34
|
+
children: p
|
|
35
|
+
}) : /* @__PURE__ */ t("div", {
|
|
36
|
+
className: f,
|
|
37
|
+
...d,
|
|
38
|
+
children: p
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { i as MetricCard };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=MetricCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetricCard.js","names":[],"sources":["../../../../src/billing/shared/ui/MetricCard.tsx"],"sourcesContent":["/**\n * Boff UI — MetricCard primitive\n *\n * Stat/metric card following the Boff UI recipe: small muted label, large\n * tabular-nums value, optional trend, and an optional icon in an accent-soft\n * tile. One question per card. Can render as a button when `onClick` is\n * provided (used by the usage dashboard's filterable stats).\n *\n * Visual-only primitive.\n */\n\nimport type { ReactNode } from 'react';\nimport { cn } from '@burdenoff/fe-libs/shared/utils';\n\ninterface MetricCardTrend {\n value: number;\n isPositive: boolean;\n}\n\ninterface MetricCardProps {\n label: ReactNode;\n value: ReactNode;\n icon?: ReactNode;\n trend?: MetricCardTrend;\n /** When provided, renders an interactive button (with selected ring when active). */\n onClick?: () => void;\n isActive?: boolean;\n className?: string;\n /** Passthrough for data-tour and other data-* hooks. */\n [key: `data-${string}`]: string | undefined;\n}\n\nexport function MetricCard({\n label,\n value,\n icon,\n trend,\n onClick,\n isActive = false,\n className,\n ...rest\n}: MetricCardProps) {\n const base = cn(\n 'rounded-card border border-border-subtle bg-bg-surface shadow-elevation-1 p-5 text-left',\n onClick &&\n 'w-full transition-all duration-200 ease-[var(--motion-easing-out)] hover:border-border-strong hover:shadow-elevation-2 hover:-translate-y-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]',\n isActive && 'ring-1 ring-[var(--color-focus-ring)] border-border-strong',\n className\n );\n\n const inner = (\n <>\n <div className=\"flex items-start justify-between gap-3\">\n <p className=\"text-sm text-text-secondary\">{label}</p>\n {icon && (\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-lg bg-[var(--color-accent-soft)] text-text-primary\">\n {icon}\n </span>\n )}\n </div>\n <p className=\"mt-2 text-2xl font-semibold tabular-nums text-text-primary\">{value}</p>\n {trend && (\n <p\n className={cn(\n 'mt-1 text-xs font-medium',\n trend.isPositive ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n {trend.isPositive ? '+' : ''}\n {trend.value}%\n </p>\n )}\n </>\n );\n\n if (onClick) {\n return (\n <button type=\"button\" onClick={onClick} className={base} {...rest}>\n {inner}\n </button>\n );\n }\n\n return (\n <div className={base} {...rest}>\n {inner}\n </div>\n );\n}\n"],"mappings":";;;AAgCA,SAAgB,EAAW,EACzB,UACA,UACA,SACA,UACA,YACA,cAAW,IACX,cACA,GAAG,KACe;CAClB,IAAM,IAAO,EACX,2FACA,KACE,8OACF,KAAY,8DACZ,EACD,EAEK,IACJ,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAA+B;IAAU,CAAA,EACrD,KACC,kBAAC,QAAD;IAAM,WAAU;cACb;IACI,CAAA,CAEL;;EACN,kBAAC,KAAD;GAAG,WAAU;aAA8D;GAAU,CAAA;EACpF,KACC,kBAAC,KAAD;GACE,WAAW,EACT,4BACA,EAAM,aAAa,6BAA6B,yBACjD;aAJH;IAMG,EAAM,aAAa,MAAM;IACzB,EAAM;IAAM;IACX;;EAEL,EAAA,CAAA;AAWL,QARI,IAEA,kBAAC,UAAD;EAAQ,MAAK;EAAkB;EAAS,WAAW;EAAM,GAAI;YAC1D;EACM,CAAA,GAKX,kBAAC,OAAD;EAAK,WAAW;EAAM,GAAI;YACvB;EACG,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { cn as t } from "@burdenoff/fe-libs/shared/utils";
|
|
3
|
+
//#region src/billing/shared/ui/ProgressBar.tsx
|
|
4
|
+
var n = {
|
|
5
|
+
success: "bg-status-success-bg",
|
|
6
|
+
warning: "bg-status-warning-bg",
|
|
7
|
+
error: "bg-status-error-bg",
|
|
8
|
+
info: "bg-status-info-bg",
|
|
9
|
+
neutral: "bg-text-muted",
|
|
10
|
+
primary: "bg-action-primary-bg"
|
|
11
|
+
};
|
|
12
|
+
function r({ value: r, status: i = "primary", size: a = "md", className: o, "aria-label": s }) {
|
|
13
|
+
let c = Math.min(100, Math.max(0, r));
|
|
14
|
+
return /* @__PURE__ */ e("div", {
|
|
15
|
+
className: t("w-full overflow-hidden rounded-full bg-bg-sunken", a === "sm" ? "h-1.5" : "h-2.5", o),
|
|
16
|
+
role: "progressbar",
|
|
17
|
+
"aria-valuenow": Math.round(c),
|
|
18
|
+
"aria-valuemin": 0,
|
|
19
|
+
"aria-valuemax": 100,
|
|
20
|
+
"aria-label": s,
|
|
21
|
+
children: /* @__PURE__ */ e("div", {
|
|
22
|
+
className: t("h-full rounded-full transition-all duration-300 ease-[var(--motion-easing-out)]", n[i]),
|
|
23
|
+
style: { width: `${c}%` }
|
|
24
|
+
})
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { r as ProgressBar };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=ProgressBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressBar.js","names":[],"sources":["../../../../src/billing/shared/ui/ProgressBar.tsx"],"sourcesContent":["/**\n * Boff UI — ProgressBar primitive\n *\n * Quota / usage progress bar with status-driven fill colors. Track uses the\n * sunken surface; the fill maps the billing `SemanticStatus` palette to the\n * canonical status tokens. Clamps the value to 0-100.\n *\n * Visual-only primitive.\n */\n\nimport { cn } from '@burdenoff/fe-libs/shared/utils';\nimport type { SemanticStatus } from '../utils/tokens';\n\nconst FILL_TONE: Record<SemanticStatus, string> = {\n success: 'bg-status-success-bg',\n warning: 'bg-status-warning-bg',\n error: 'bg-status-error-bg',\n info: 'bg-status-info-bg',\n neutral: 'bg-text-muted',\n primary: 'bg-action-primary-bg',\n};\n\ninterface ProgressBarProps {\n /** Percentage 0-100. */\n value: number;\n /** Status tone for the fill color. Defaults to a neutral/primary fill. */\n status?: SemanticStatus;\n /** Bar height: sm = h-1.5, md = h-2.5. */\n size?: 'sm' | 'md';\n className?: string;\n /** Accessible label for the progress meter. */\n 'aria-label'?: string;\n}\n\nexport function ProgressBar({\n value,\n status = 'primary',\n size = 'md',\n className,\n 'aria-label': ariaLabel,\n}: ProgressBarProps) {\n const clamped = Math.min(100, Math.max(0, value));\n return (\n <div\n className={cn(\n 'w-full overflow-hidden rounded-full bg-bg-sunken',\n size === 'sm' ? 'h-1.5' : 'h-2.5',\n className\n )}\n role=\"progressbar\"\n aria-valuenow={Math.round(clamped)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={ariaLabel}\n >\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300 ease-[var(--motion-easing-out)]',\n FILL_TONE[status]\n )}\n style={{ width: `${clamped}%` }}\n />\n </div>\n );\n}\n"],"mappings":";;;AAaA,IAAM,IAA4C;CAChD,SAAS;CACT,SAAS;CACT,OAAO;CACP,MAAM;CACN,SAAS;CACT,SAAS;CACV;AAcD,SAAgB,EAAY,EAC1B,UACA,YAAS,WACT,UAAO,MACP,cACA,cAAc,KACK;CACnB,IAAM,IAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,EAAM,CAAC;AACjD,QACE,kBAAC,OAAD;EACE,WAAW,EACT,oDACA,MAAS,OAAO,UAAU,SAC1B,EACD;EACD,MAAK;EACL,iBAAe,KAAK,MAAM,EAAQ;EAClC,iBAAe;EACf,iBAAe;EACf,cAAY;YAEZ,kBAAC,OAAD;GACE,WAAW,EACT,mFACA,EAAU,GACX;GACD,OAAO,EAAE,OAAO,GAAG,EAAQ,IAAI;GAC/B,CAAA;EACE,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as e, jsxs as t } from "react/jsx-runtime";
|
|
2
|
+
import { cn as n } from "@burdenoff/fe-libs/shared/utils";
|
|
3
|
+
//#region src/billing/shared/ui/StatusPill.tsx
|
|
4
|
+
var r = {
|
|
5
|
+
success: "bg-status-success-bg-subtle text-status-success-text",
|
|
6
|
+
warning: "bg-status-warning-bg-subtle text-status-warning-text",
|
|
7
|
+
error: "bg-status-error-bg-subtle text-status-error-text",
|
|
8
|
+
info: "bg-status-info-bg-subtle text-status-info-text",
|
|
9
|
+
neutral: "bg-bg-sunken text-text-secondary",
|
|
10
|
+
primary: "bg-[var(--color-accent-soft)] text-text-link"
|
|
11
|
+
}, i = {
|
|
12
|
+
success: "bg-status-success-bg",
|
|
13
|
+
warning: "bg-status-warning-bg",
|
|
14
|
+
error: "bg-status-error-bg",
|
|
15
|
+
info: "bg-status-info-bg",
|
|
16
|
+
neutral: "bg-text-muted",
|
|
17
|
+
primary: "bg-action-primary-bg"
|
|
18
|
+
};
|
|
19
|
+
function a({ status: a, children: o, dot: s = !1, pulse: c = !1, className: l }) {
|
|
20
|
+
return /* @__PURE__ */ t("span", {
|
|
21
|
+
className: n("inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium", r[a], l),
|
|
22
|
+
children: [s && /* @__PURE__ */ e("span", { className: n("size-1.5 rounded-full", i[a], c && "animate-pulse") }), o]
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { a as StatusPill };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=StatusPill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusPill.js","names":[],"sources":["../../../../src/billing/shared/ui/StatusPill.tsx"],"sourcesContent":["/**\n * Boff UI — StatusPill primitive\n *\n * Subtle status badge following the Boff UI recipe\n * (`bg-status-*-bg-subtle text-status-*-text`, neutral =\n * `bg-bg-sunken text-text-secondary`). Always keeps the text label and an\n * optional dot — never color-only. Maps the billing module's existing\n * `SemanticStatus` palette to the canonical tokens.\n *\n * Visual-only primitive.\n */\n\nimport type { ReactNode } from 'react';\nimport { cn } from '@burdenoff/fe-libs/shared/utils';\nimport type { SemanticStatus } from '../utils/tokens';\n\nconst PILL_TONE: Record<SemanticStatus, string> = {\n success: 'bg-status-success-bg-subtle text-status-success-text',\n warning: 'bg-status-warning-bg-subtle text-status-warning-text',\n error: 'bg-status-error-bg-subtle text-status-error-text',\n info: 'bg-status-info-bg-subtle text-status-info-text',\n neutral: 'bg-bg-sunken text-text-secondary',\n primary: 'bg-[var(--color-accent-soft)] text-text-link',\n};\n\nconst DOT_TONE: Record<SemanticStatus, string> = {\n success: 'bg-status-success-bg',\n warning: 'bg-status-warning-bg',\n error: 'bg-status-error-bg',\n info: 'bg-status-info-bg',\n neutral: 'bg-text-muted',\n primary: 'bg-action-primary-bg',\n};\n\ninterface StatusPillProps {\n status: SemanticStatus;\n children: ReactNode;\n /** Show a leading status dot. */\n dot?: boolean;\n /** Pulse the dot (e.g. live / offline indicators). */\n pulse?: boolean;\n className?: string;\n}\n\nexport function StatusPill({\n status,\n children,\n dot = false,\n pulse = false,\n className,\n}: StatusPillProps) {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium',\n PILL_TONE[status],\n className\n )}\n >\n {dot && (\n <span className={cn('size-1.5 rounded-full', DOT_TONE[status], pulse && 'animate-pulse')} />\n )}\n {children}\n </span>\n );\n}\n"],"mappings":";;;AAgBA,IAAM,IAA4C;CAChD,SAAS;CACT,SAAS;CACT,OAAO;CACP,MAAM;CACN,SAAS;CACT,SAAS;CACV,EAEK,IAA2C;CAC/C,SAAS;CACT,SAAS;CACT,OAAO;CACP,MAAM;CACN,SAAS;CACT,SAAS;CACV;AAYD,SAAgB,EAAW,EACzB,WACA,aACA,SAAM,IACN,WAAQ,IACR,gBACkB;AAClB,QACE,kBAAC,QAAD;EACE,WAAW,EACT,mFACA,EAAU,IACV,EACD;YALH,CAOG,KACC,kBAAC,QAAD,EAAM,WAAW,EAAG,yBAAyB,EAAS,IAAS,KAAS,gBAAgB,EAAI,CAAA,EAE7F,EACI"}
|
|
@@ -36,11 +36,11 @@ var e = {
|
|
|
36
36
|
icon: "text-status-neutral-text"
|
|
37
37
|
},
|
|
38
38
|
primary: {
|
|
39
|
-
bg: "bg-
|
|
40
|
-
text: "text-
|
|
41
|
-
border: "border-
|
|
42
|
-
dot: "bg-primary",
|
|
43
|
-
icon: "text-
|
|
39
|
+
bg: "bg-[var(--color-accent-soft)]",
|
|
40
|
+
text: "text-text-link",
|
|
41
|
+
border: "border-border-strong",
|
|
42
|
+
dot: "bg-action-primary-bg",
|
|
43
|
+
icon: "text-text-link"
|
|
44
44
|
}
|
|
45
45
|
};
|
|
46
46
|
function t(t) {
|
|
@@ -51,23 +51,6 @@ function n(e) {
|
|
|
51
51
|
return `${n.bg} ${n.text} ${n.border} border`;
|
|
52
52
|
}
|
|
53
53
|
var r = {
|
|
54
|
-
positive: {
|
|
55
|
-
text: "text-status-success-text",
|
|
56
|
-
icon: "text-status-success-bg"
|
|
57
|
-
},
|
|
58
|
-
negative: {
|
|
59
|
-
text: "text-status-error-text",
|
|
60
|
-
icon: "text-status-error-bg"
|
|
61
|
-
},
|
|
62
|
-
neutral: {
|
|
63
|
-
text: "text-status-neutral-text",
|
|
64
|
-
icon: "text-status-neutral-text"
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
function i(e) {
|
|
68
|
-
return e === null ? r.neutral : e ? r.positive : r.negative;
|
|
69
|
-
}
|
|
70
|
-
var a = {
|
|
71
54
|
healthy: {
|
|
72
55
|
bar: "bg-status-success-bg",
|
|
73
56
|
track: "bg-status-success-bg-subtle"
|
|
@@ -81,26 +64,26 @@ var a = {
|
|
|
81
64
|
track: "bg-status-error-bg-subtle"
|
|
82
65
|
}
|
|
83
66
|
};
|
|
84
|
-
function
|
|
85
|
-
return e >= 90 ?
|
|
67
|
+
function i(e) {
|
|
68
|
+
return e >= 90 ? r.critical : e >= 75 ? r.warning : r.healthy;
|
|
86
69
|
}
|
|
87
|
-
var
|
|
70
|
+
var a = {
|
|
88
71
|
plan: {
|
|
89
72
|
bg: "bg-status-info-bg-subtle",
|
|
90
73
|
text: "text-status-info-text",
|
|
91
74
|
border: "border-status-info-border"
|
|
92
75
|
},
|
|
93
76
|
addon: {
|
|
94
|
-
bg: "bg-
|
|
95
|
-
text: "text-
|
|
96
|
-
border: "border-
|
|
77
|
+
bg: "bg-[var(--color-accent-soft)]",
|
|
78
|
+
text: "text-text-link",
|
|
79
|
+
border: "border-border-strong"
|
|
97
80
|
},
|
|
98
81
|
credits: {
|
|
99
82
|
bg: "bg-status-warning-bg-subtle",
|
|
100
83
|
text: "text-status-warning-text",
|
|
101
84
|
border: "border-status-warning-border"
|
|
102
85
|
}
|
|
103
|
-
},
|
|
86
|
+
}, o = {
|
|
104
87
|
success: {
|
|
105
88
|
container: "bg-status-success-bg-subtle border-status-success-border",
|
|
106
89
|
text: "text-status-success-text",
|
|
@@ -123,6 +106,6 @@ var s = {
|
|
|
123
106
|
}
|
|
124
107
|
};
|
|
125
108
|
//#endregion
|
|
126
|
-
export {
|
|
109
|
+
export { o as alertTokens, a as categoryTokens, i as getProgressTokens, n as getStatusBadgeTokens, t as getStatusTokens, r as progressTokens, e as statusTokens };
|
|
127
110
|
|
|
128
111
|
//# sourceMappingURL=tokens.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","names":[],"sources":["../../../../src/billing/shared/utils/tokens.ts"],"sourcesContent":["/**\n * Semantic Design Tokens for Billing Module\n *\n * Maps semantic status colors to fe-libs design tokens.\n * This ensures consistent theming across all micro-frontends.\n *\n * Token Reference (from fe-libs):\n * - Status: --color-status-{success|warning|error|info}-{bg|bgSubtle|text|border}\n * - Action: --color-action-{primary|secondary|danger}-{bg|bgHover|text}\n * - Text: --color-text-{primary|secondary|muted}\n * - Background: --color-bg-{canvas|surface|elevated|sunken}\n */\n\n// ============================================================================\n// Status Color Token Mappings\n// ============================================================================\n\nexport type SemanticStatus = 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'primary';\n\nexport interface StatusTokenClasses {\n /** Background for subtle/badge usage */\n bg: string;\n /** Text color */\n text: string;\n /** Border color */\n border: string;\n /** Dot/indicator color */\n dot: string;\n /** Icon color */\n icon: string;\n}\n\n/**\n * Semantic status color classes using design tokens\n * These map to CSS custom properties defined in fe-libs\n */\nexport const statusTokens: Record<SemanticStatus, StatusTokenClasses> = {\n success: {\n bg: 'bg-status-success-bg-subtle',\n text: 'text-status-success-text',\n border: 'border-status-success-border',\n dot: 'bg-status-success-bg',\n icon: 'text-status-success-bg',\n },\n warning: {\n bg: 'bg-status-warning-bg-subtle',\n text: 'text-status-warning-text',\n border: 'border-status-warning-border',\n dot: 'bg-status-warning-bg',\n icon: 'text-status-warning-bg',\n },\n error: {\n bg: 'bg-status-error-bg-subtle',\n text: 'text-status-error-text',\n border: 'border-status-error-border',\n dot: 'bg-status-error-bg',\n icon: 'text-status-error-bg',\n },\n info: {\n bg: 'bg-status-info-bg-subtle',\n text: 'text-status-info-text',\n border: 'border-status-info-border',\n dot: 'bg-status-info-bg',\n icon: 'text-status-info-bg',\n },\n neutral: {\n bg: 'bg-status-neutral-bg-subtle',\n text: 'text-status-neutral-text',\n border: 'border-status-neutral-border',\n dot: 'bg-status-neutral-bg',\n icon: 'text-status-neutral-text',\n },\n primary: {\n bg: 'bg-
|
|
1
|
+
{"version":3,"file":"tokens.js","names":[],"sources":["../../../../src/billing/shared/utils/tokens.ts"],"sourcesContent":["/**\n * Semantic Design Tokens for Billing Module\n *\n * Maps semantic status colors to fe-libs design tokens.\n * This ensures consistent theming across all micro-frontends.\n *\n * Token Reference (from fe-libs):\n * - Status: --color-status-{success|warning|error|info}-{bg|bgSubtle|text|border}\n * - Action: --color-action-{primary|secondary|danger}-{bg|bgHover|text}\n * - Text: --color-text-{primary|secondary|muted}\n * - Background: --color-bg-{canvas|surface|elevated|sunken}\n */\n\n// ============================================================================\n// Status Color Token Mappings\n// ============================================================================\n\nexport type SemanticStatus = 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'primary';\n\nexport interface StatusTokenClasses {\n /** Background for subtle/badge usage */\n bg: string;\n /** Text color */\n text: string;\n /** Border color */\n border: string;\n /** Dot/indicator color */\n dot: string;\n /** Icon color */\n icon: string;\n}\n\n/**\n * Semantic status color classes using design tokens\n * These map to CSS custom properties defined in fe-libs\n */\nexport const statusTokens: Record<SemanticStatus, StatusTokenClasses> = {\n success: {\n bg: 'bg-status-success-bg-subtle',\n text: 'text-status-success-text',\n border: 'border-status-success-border',\n dot: 'bg-status-success-bg',\n icon: 'text-status-success-bg',\n },\n warning: {\n bg: 'bg-status-warning-bg-subtle',\n text: 'text-status-warning-text',\n border: 'border-status-warning-border',\n dot: 'bg-status-warning-bg',\n icon: 'text-status-warning-bg',\n },\n error: {\n bg: 'bg-status-error-bg-subtle',\n text: 'text-status-error-text',\n border: 'border-status-error-border',\n dot: 'bg-status-error-bg',\n icon: 'text-status-error-bg',\n },\n info: {\n bg: 'bg-status-info-bg-subtle',\n text: 'text-status-info-text',\n border: 'border-status-info-border',\n dot: 'bg-status-info-bg',\n icon: 'text-status-info-bg',\n },\n neutral: {\n bg: 'bg-status-neutral-bg-subtle',\n text: 'text-status-neutral-text',\n border: 'border-status-neutral-border',\n dot: 'bg-status-neutral-bg',\n icon: 'text-status-neutral-text',\n },\n primary: {\n bg: 'bg-[var(--color-accent-soft)]',\n text: 'text-text-link',\n border: 'border-border-strong',\n dot: 'bg-action-primary-bg',\n icon: 'text-text-link',\n },\n};\n\n/**\n * Get status token classes for a given status\n */\nexport function getStatusTokens(status: SemanticStatus): StatusTokenClasses {\n return statusTokens[status] || statusTokens.neutral;\n}\n\n/**\n * Get combined badge classes for a status\n */\nexport function getStatusBadgeTokens(status: SemanticStatus): string {\n const tokens = getStatusTokens(status);\n return `${tokens.bg} ${tokens.text} ${tokens.border} border`;\n}\n\n// ============================================================================\n// Trend/Change Indicators\n// ============================================================================\n\nexport const trendTokens = {\n positive: {\n text: 'text-status-success-text',\n icon: 'text-status-success-bg',\n },\n negative: {\n text: 'text-status-error-text',\n icon: 'text-status-error-bg',\n },\n neutral: {\n text: 'text-status-neutral-text',\n icon: 'text-status-neutral-text',\n },\n};\n\n/**\n * Get trend indicator classes\n */\nexport function getTrendTokens(isPositive: boolean | null) {\n if (isPositive === null) return trendTokens.neutral;\n return isPositive ? trendTokens.positive : trendTokens.negative;\n}\n\n// ============================================================================\n// Progress Bar Colors\n// ============================================================================\n\nexport const progressTokens = {\n healthy: {\n bar: 'bg-status-success-bg',\n track: 'bg-status-success-bg-subtle',\n },\n warning: {\n bar: 'bg-status-warning-bg',\n track: 'bg-status-warning-bg-subtle',\n },\n critical: {\n bar: 'bg-status-error-bg',\n track: 'bg-status-error-bg-subtle',\n },\n};\n\n/**\n * Get progress bar colors based on percentage\n */\nexport function getProgressTokens(percentage: number) {\n if (percentage >= 90) return progressTokens.critical;\n if (percentage >= 75) return progressTokens.warning;\n return progressTokens.healthy;\n}\n\n// ============================================================================\n// Category/Type Badge Colors\n// ============================================================================\n\nexport const categoryTokens = {\n plan: {\n bg: 'bg-status-info-bg-subtle',\n text: 'text-status-info-text',\n border: 'border-status-info-border',\n },\n addon: {\n bg: 'bg-[var(--color-accent-soft)]',\n text: 'text-text-link',\n border: 'border-border-strong',\n },\n credits: {\n bg: 'bg-status-warning-bg-subtle',\n text: 'text-status-warning-text',\n border: 'border-status-warning-border',\n },\n};\n\n/**\n * Get category badge classes\n */\nexport function getCategoryTokens(category: 'plan' | 'addon' | 'credits') {\n return categoryTokens[category] || categoryTokens.plan;\n}\n\n// ============================================================================\n// Alert/Banner Colors\n// ============================================================================\n\nexport const alertTokens = {\n success: {\n container: 'bg-status-success-bg-subtle border-status-success-border',\n text: 'text-status-success-text',\n icon: 'text-status-success-bg',\n },\n warning: {\n container: 'bg-status-warning-bg-subtle border-status-warning-border',\n text: 'text-status-warning-text',\n icon: 'text-status-warning-bg',\n },\n error: {\n container: 'bg-status-error-bg-subtle border-status-error-border',\n text: 'text-status-error-text',\n icon: 'text-status-error-bg',\n },\n info: {\n container: 'bg-status-info-bg-subtle border-status-info-border',\n text: 'text-status-info-text',\n icon: 'text-status-info-bg',\n },\n};\n\n/**\n * Get alert/banner classes\n */\nexport function getAlertTokens(type: 'success' | 'warning' | 'error' | 'info') {\n return alertTokens[type];\n}\n"],"mappings":";AAoCA,IAAa,IAA2D;CACtE,SAAS;EACP,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,KAAK;EACL,MAAM;EACP;CACD,SAAS;EACP,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,KAAK;EACL,MAAM;EACP;CACD,OAAO;EACL,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,KAAK;EACL,MAAM;EACP;CACD,MAAM;EACJ,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,KAAK;EACL,MAAM;EACP;CACD,SAAS;EACP,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,KAAK;EACL,MAAM;EACP;CACD,SAAS;EACP,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,KAAK;EACL,MAAM;EACP;CACF;AAKD,SAAgB,EAAgB,GAA4C;AAC1E,QAAO,EAAa,MAAW,EAAa;;AAM9C,SAAgB,EAAqB,GAAgC;CACnE,IAAM,IAAS,EAAgB,EAAO;AACtC,QAAO,GAAG,EAAO,GAAG,GAAG,EAAO,KAAK,GAAG,EAAO,OAAO;;AAkCtD,IAAa,IAAiB;CAC5B,SAAS;EACP,KAAK;EACL,OAAO;EACR;CACD,SAAS;EACP,KAAK;EACL,OAAO;EACR;CACD,UAAU;EACR,KAAK;EACL,OAAO;EACR;CACF;AAKD,SAAgB,EAAkB,GAAoB;AAGpD,QAFI,KAAc,KAAW,EAAe,WACxC,KAAc,KAAW,EAAe,UACrC,EAAe;;AAOxB,IAAa,IAAiB;CAC5B,MAAM;EACJ,IAAI;EACJ,MAAM;EACN,QAAQ;EACT;CACD,OAAO;EACL,IAAI;EACJ,MAAM;EACN,QAAQ;EACT;CACD,SAAS;EACP,IAAI;EACJ,MAAM;EACN,QAAQ;EACT;CACF,EAaY,IAAc;CACzB,SAAS;EACP,WAAW;EACX,MAAM;EACN,MAAM;EACP;CACD,SAAS;EACP,WAAW;EACX,MAAM;EACN,MAAM;EACP;CACD,OAAO;EACL,WAAW;EACX,MAAM;EACN,MAAM;EACP;CACD,MAAM;EACJ,WAAW;EACX,MAAM;EACN,MAAM;EACP;CACF"}
|