@burdenoff/microfe-atheletebridge 2026.625.2 → 2026.628.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/atheletebridge/AthleteBridgeRoot.js +49 -129
- package/dist/atheletebridge/AthleteBridgeRoot.js.map +1 -1
- package/dist/atheletebridge/AthleteBridgeRoutes.js +65 -184
- package/dist/atheletebridge/AthleteBridgeRoutes.js.map +1 -1
- package/dist/atheletebridge/components/CursorPager.js +34 -0
- package/dist/atheletebridge/components/CursorPager.js.map +1 -0
- package/dist/atheletebridge/components/FilterSelect.js +22 -0
- package/dist/atheletebridge/components/FilterSelect.js.map +1 -0
- package/dist/atheletebridge/components/FixtureCard.js +76 -0
- package/dist/atheletebridge/components/FixtureCard.js.map +1 -0
- package/dist/atheletebridge/components/LoadingState.js +36 -0
- package/dist/atheletebridge/components/LoadingState.js.map +1 -0
- package/dist/atheletebridge/components/ProgramCard.js +69 -0
- package/dist/atheletebridge/components/ProgramCard.js.map +1 -0
- package/dist/atheletebridge/components/SessionCard.js +76 -0
- package/dist/atheletebridge/components/SessionCard.js.map +1 -0
- package/dist/atheletebridge/components/StatusBadge.js +44 -35
- package/dist/atheletebridge/components/StatusBadge.js.map +1 -1
- package/dist/atheletebridge/components/TeamCard.js +81 -0
- package/dist/atheletebridge/components/TeamCard.js.map +1 -0
- package/dist/atheletebridge/components/domain.js +47 -0
- package/dist/atheletebridge/components/domain.js.map +1 -0
- package/dist/atheletebridge/components/form.js +29 -0
- package/dist/atheletebridge/components/form.js.map +1 -0
- package/dist/atheletebridge/context/AthleteBridgeContext.js +6 -6
- package/dist/atheletebridge/context/AthleteBridgeContext.js.map +1 -1
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +342 -165
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -1
- package/dist/atheletebridge/index.js +1 -1
- package/dist/atheletebridge/pages/DashboardPage.js +169 -0
- package/dist/atheletebridge/pages/DashboardPage.js.map +1 -0
- package/dist/atheletebridge/pages/StandingsPage.js +166 -0
- package/dist/atheletebridge/pages/StandingsPage.js.map +1 -0
- package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js +201 -0
- package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js.map +1 -0
- package/dist/atheletebridge/pages/fixtures/FixtureFormPage.js +205 -0
- package/dist/atheletebridge/pages/fixtures/FixtureFormPage.js.map +1 -0
- package/dist/atheletebridge/pages/fixtures/FixturesListPage.js +92 -0
- package/dist/atheletebridge/pages/fixtures/FixturesListPage.js.map +1 -0
- package/dist/atheletebridge/pages/programs/ProgramDetailPage.js +374 -0
- package/dist/atheletebridge/pages/programs/ProgramDetailPage.js.map +1 -0
- package/dist/atheletebridge/pages/programs/ProgramFormPage.js +207 -0
- package/dist/atheletebridge/pages/programs/ProgramFormPage.js.map +1 -0
- package/dist/atheletebridge/pages/programs/ProgramsListPage.js +113 -0
- package/dist/atheletebridge/pages/programs/ProgramsListPage.js.map +1 -0
- package/dist/atheletebridge/pages/sessions/SessionDetailPage.js +224 -0
- package/dist/atheletebridge/pages/sessions/SessionDetailPage.js.map +1 -0
- package/dist/atheletebridge/pages/sessions/SessionFormPage.js +206 -0
- package/dist/atheletebridge/pages/sessions/SessionFormPage.js.map +1 -0
- package/dist/atheletebridge/pages/sessions/SessionsListPage.js +92 -0
- package/dist/atheletebridge/pages/sessions/SessionsListPage.js.map +1 -0
- package/dist/atheletebridge/pages/teams/TeamDetailPage.js +350 -0
- package/dist/atheletebridge/pages/teams/TeamDetailPage.js.map +1 -0
- package/dist/atheletebridge/pages/teams/TeamFormPage.js +222 -0
- package/dist/atheletebridge/pages/teams/TeamFormPage.js.map +1 -0
- package/dist/atheletebridge/pages/teams/TeamsListPage.js +101 -0
- package/dist/atheletebridge/pages/teams/TeamsListPage.js.map +1 -0
- package/dist/atheletebridge/store/atheletebridgeStore.js +2 -13
- package/dist/atheletebridge/store/atheletebridgeStore.js.map +1 -1
- package/dist/atheletebridge/utils/datetime.js +10 -0
- package/dist/atheletebridge/utils/datetime.js.map +1 -0
- package/dist/atheletebridge/utils/formatters.js +1 -4
- package/dist/atheletebridge/utils/formatters.js.map +1 -1
- package/package.json +1 -1
- package/dist/atheletebridge/components/InvestmentCard.js +0 -96
- package/dist/atheletebridge/components/InvestmentCard.js.map +0 -1
- package/dist/atheletebridge/components/RatingDisplay.js +0 -35
- package/dist/atheletebridge/components/RatingDisplay.js.map +0 -1
- package/dist/atheletebridge/mocks/data.js +0 -1517
- package/dist/atheletebridge/mocks/data.js.map +0 -1
- package/dist/atheletebridge/mocks/users.js +0 -34
- package/dist/atheletebridge/mocks/users.js.map +0 -1
- package/dist/atheletebridge/pages/HomePage.js +0 -936
- package/dist/atheletebridge/pages/HomePage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/AdminAnalyticsPage.js +0 -653
- package/dist/atheletebridge/pages/admin/AdminAnalyticsPage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/AdminDashboard.js +0 -671
- package/dist/atheletebridge/pages/admin/AdminDashboard.js.map +0 -1
- package/dist/atheletebridge/pages/admin/AdminFinancialPage.js +0 -429
- package/dist/atheletebridge/pages/admin/AdminFinancialPage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/AdminOrdersPage.js +0 -667
- package/dist/atheletebridge/pages/admin/AdminOrdersPage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/AdminProfilePage.js +0 -261
- package/dist/atheletebridge/pages/admin/AdminProfilePage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/AdminSettingsPage.js +0 -653
- package/dist/atheletebridge/pages/admin/AdminSettingsPage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/CartManagementPage.js +0 -876
- package/dist/atheletebridge/pages/admin/CartManagementPage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/UserManagementPage.js +0 -900
- package/dist/atheletebridge/pages/admin/UserManagementPage.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/AnalyticsDashboard.js +0 -839
- package/dist/atheletebridge/pages/cart-owner/AnalyticsDashboard.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/BusinessSettingsPage.js +0 -704
- package/dist/atheletebridge/pages/cart-owner/BusinessSettingsPage.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/CartOwnerDashboard.js +0 -792
- package/dist/atheletebridge/pages/cart-owner/CartOwnerDashboard.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/CartOwnerProfilePage.js +0 -891
- package/dist/atheletebridge/pages/cart-owner/CartOwnerProfilePage.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/CartServiceConfigPage.js +0 -633
- package/dist/atheletebridge/pages/cart-owner/CartServiceConfigPage.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/InventoryManagementPage.js +0 -913
- package/dist/atheletebridge/pages/cart-owner/InventoryManagementPage.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/OrderManagementPage.js +0 -881
- package/dist/atheletebridge/pages/cart-owner/OrderManagementPage.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/StaffManagementPage.js +0 -841
- package/dist/atheletebridge/pages/cart-owner/StaffManagementPage.js.map +0 -1
- package/dist/atheletebridge/pages/common/HelpSupportPage.js +0 -1319
- package/dist/atheletebridge/pages/common/HelpSupportPage.js.map +0 -1
- package/dist/atheletebridge/pages/common/NotificationCenterPage.js +0 -674
- package/dist/atheletebridge/pages/common/NotificationCenterPage.js.map +0 -1
- package/dist/atheletebridge/pages/common/SettingsPage.js +0 -972
- package/dist/atheletebridge/pages/common/SettingsPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/BookingDetailsPage.js +0 -602
- package/dist/atheletebridge/pages/customer/BookingDetailsPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/CartDetailPage.js +0 -656
- package/dist/atheletebridge/pages/customer/CartDetailPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/CartDiscoveryPage.js +0 -558
- package/dist/atheletebridge/pages/customer/CartDiscoveryPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/CheckoutPage.js +0 -536
- package/dist/atheletebridge/pages/customer/CheckoutPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/CustomerDashboard.js +0 -539
- package/dist/atheletebridge/pages/customer/CustomerDashboard.js.map +0 -1
- package/dist/atheletebridge/pages/customer/CustomerProfilePage.js +0 -657
- package/dist/atheletebridge/pages/customer/CustomerProfilePage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/DirectServiceBookingPage.js +0 -635
- package/dist/atheletebridge/pages/customer/DirectServiceBookingPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/FavoritesPage.js +0 -486
- package/dist/atheletebridge/pages/customer/FavoritesPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/OrderHistoryPage.js +0 -447
- package/dist/atheletebridge/pages/customer/OrderHistoryPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/OrderTrackingPage.js +0 -393
- package/dist/atheletebridge/pages/customer/OrderTrackingPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/PaymentMethodsPage.js +0 -494
- package/dist/atheletebridge/pages/customer/PaymentMethodsPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/ReviewsPage.js +0 -615
- package/dist/atheletebridge/pages/customer/ReviewsPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/SavedAddressesPage.js +0 -451
- package/dist/atheletebridge/pages/customer/SavedAddressesPage.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestmentDetailsPage.js +0 -881
- package/dist/atheletebridge/pages/investor/InvestmentDetailsPage.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestmentOpportunitiesPage.js +0 -945
- package/dist/atheletebridge/pages/investor/InvestmentOpportunitiesPage.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestorAnalyticsPage.js +0 -686
- package/dist/atheletebridge/pages/investor/InvestorAnalyticsPage.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestorDashboard.js +0 -453
- package/dist/atheletebridge/pages/investor/InvestorDashboard.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestorInvestmentsPage.js +0 -405
- package/dist/atheletebridge/pages/investor/InvestorInvestmentsPage.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestorPortfolioPage.js +0 -577
- package/dist/atheletebridge/pages/investor/InvestorPortfolioPage.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestorProfilePage.js +0 -1069
- package/dist/atheletebridge/pages/investor/InvestorProfilePage.js.map +0 -1
- package/dist/atheletebridge/pages/worker/TaskDetailsPage.js +0 -530
- package/dist/atheletebridge/pages/worker/TaskDetailsPage.js.map +0 -1
- package/dist/atheletebridge/pages/worker/WorkerDashboard.js +0 -669
- package/dist/atheletebridge/pages/worker/WorkerDashboard.js.map +0 -1
- package/dist/atheletebridge/pages/worker/WorkerOrdersPage.js +0 -681
- package/dist/atheletebridge/pages/worker/WorkerOrdersPage.js.map +0 -1
- package/dist/atheletebridge/pages/worker/WorkerProfilePage.js +0 -691
- package/dist/atheletebridge/pages/worker/WorkerProfilePage.js.map +0 -1
- package/dist/atheletebridge/pages/worker/WorkerSchedulePage.js +0 -588
- package/dist/atheletebridge/pages/worker/WorkerSchedulePage.js.map +0 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { ChevronLeft as t, ChevronRight as n } from "lucide-react";
|
|
3
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
4
|
+
//#region src/atheletebridge/components/CursorPager.tsx
|
|
5
|
+
var a = ({ page: a, hasMore: o, onPrev: s, onNext: c, className: l }) => {
|
|
6
|
+
let u = a > 0;
|
|
7
|
+
return !u && !o ? null : /* @__PURE__ */ i("div", {
|
|
8
|
+
className: e("flex items-center justify-end gap-2", l),
|
|
9
|
+
children: [
|
|
10
|
+
/* @__PURE__ */ i("button", {
|
|
11
|
+
type: "button",
|
|
12
|
+
onClick: s,
|
|
13
|
+
disabled: !u,
|
|
14
|
+
className: "inline-flex items-center gap-1 rounded-lg border border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken disabled:cursor-not-allowed disabled:opacity-50",
|
|
15
|
+
children: [/* @__PURE__ */ r(t, { className: "h-4 w-4" }), " Previous"]
|
|
16
|
+
}),
|
|
17
|
+
/* @__PURE__ */ i("span", {
|
|
18
|
+
className: "px-2 text-sm tabular-nums text-text-secondary",
|
|
19
|
+
children: ["Page ", a + 1]
|
|
20
|
+
}),
|
|
21
|
+
/* @__PURE__ */ i("button", {
|
|
22
|
+
type: "button",
|
|
23
|
+
onClick: c,
|
|
24
|
+
disabled: !o,
|
|
25
|
+
className: "inline-flex items-center gap-1 rounded-lg border border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken disabled:cursor-not-allowed disabled:opacity-50",
|
|
26
|
+
children: ["Next ", /* @__PURE__ */ r(n, { className: "h-4 w-4" })]
|
|
27
|
+
})
|
|
28
|
+
]
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
export { a as CursorPager };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=CursorPager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CursorPager.js","names":[],"sources":["../../../src/atheletebridge/components/CursorPager.tsx"],"sourcesContent":["/**\n * Cursor Pager\n * @module atheletebridge/components\n *\n * Offset-based pager driving the svc PaginationInput. The svc connections\n * expose `pageInfo.hasMore`; combined with the page index this yields a calm\n * prev/next control. Tokens only, no movement.\n */\n\nimport type { FC } from 'react';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../utils/cn';\n\ninterface CursorPagerProps {\n page: number;\n hasMore: boolean;\n onPrev: () => void;\n onNext: () => void;\n className?: string;\n}\n\nexport const CursorPager: FC<CursorPagerProps> = ({ page, hasMore, onPrev, onNext, className }) => {\n const canPrev = page > 0;\n\n if (!canPrev && !hasMore) return null;\n\n return (\n <div className={cn('flex items-center justify-end gap-2', className)}>\n <button\n type=\"button\"\n onClick={onPrev}\n disabled={!canPrev}\n className=\"inline-flex items-center gap-1 rounded-lg border border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <ChevronLeft className=\"h-4 w-4\" /> Previous\n </button>\n <span className=\"px-2 text-sm tabular-nums text-text-secondary\">Page {page + 1}</span>\n <button\n type=\"button\"\n onClick={onNext}\n disabled={!hasMore}\n className=\"inline-flex items-center gap-1 rounded-lg border border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Next <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n );\n};\n"],"mappings":";;;;AAqBA,IAAa,KAAqC,EAAE,SAAM,YAAS,WAAQ,WAAQ,mBAAgB;CACjG,IAAM,IAAU,IAAO;AAIvB,QAFI,CAAC,KAAW,CAAC,IAAgB,OAG/B,kBAAC,OAAD;EAAK,WAAW,EAAG,uCAAuC,EAAU;YAApE;GACE,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,UAAU,CAAC;IACX,WAAU;cAJZ,CAME,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA,EAAA,YAC5B;;GACT,kBAAC,QAAD;IAAM,WAAU;cAAhB,CAAgE,SAAM,IAAO,EAAS;;GACtF,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,UAAU,CAAC;IACX,WAAU;cAJZ,CAKC,SACM,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA,CAClC;;GACL"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
|
+
//#region src/atheletebridge/components/FilterSelect.tsx
|
|
4
|
+
function r({ value: r, onChange: i, options: a, allLabel: o, ariaLabel: s, className: c }) {
|
|
5
|
+
return /* @__PURE__ */ n("select", {
|
|
6
|
+
"aria-label": s,
|
|
7
|
+
value: r,
|
|
8
|
+
onChange: (e) => i(e.target.value),
|
|
9
|
+
className: e("rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary", "focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", c),
|
|
10
|
+
children: [/* @__PURE__ */ t("option", {
|
|
11
|
+
value: "",
|
|
12
|
+
children: o
|
|
13
|
+
}), a.map((e) => /* @__PURE__ */ t("option", {
|
|
14
|
+
value: e.value,
|
|
15
|
+
children: e.label
|
|
16
|
+
}, e.value))]
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { r as FilterSelect };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=FilterSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterSelect.js","names":[],"sources":["../../../src/atheletebridge/components/FilterSelect.tsx"],"sourcesContent":["/**\n * Filter Select\n * @module atheletebridge/components\n *\n * A small, accessible native-select filter styled with semantic tokens.\n * Generic over the option value type so callers stay strictly typed.\n */\n\nimport { cn } from '../utils/cn';\n\nexport interface FilterOption<T extends string> {\n value: T;\n label: string;\n}\n\ninterface FilterSelectProps<T extends string> {\n value: T | '';\n onChange: (value: T | '') => void;\n options: ReadonlyArray<FilterOption<T>>;\n /** Label shown for the \"no filter\" option. */\n allLabel: string;\n ariaLabel: string;\n className?: string;\n}\n\nexport function FilterSelect<T extends string>({\n value,\n onChange,\n options,\n allLabel,\n ariaLabel,\n className,\n}: FilterSelectProps<T>) {\n return (\n <select\n aria-label={ariaLabel}\n value={value}\n onChange={(e) => onChange(e.target.value as T | '')}\n className={cn(\n 'rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary',\n 'focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n className\n )}\n >\n <option value=\"\">{allLabel}</option>\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n"],"mappings":";;;AAyBA,SAAgB,EAA+B,EAC7C,UACA,aACA,YACA,aACA,cACA,gBACuB;AACvB,QACE,kBAAC,UAAD;EACE,cAAY;EACL;EACP,WAAW,MAAM,EAAS,EAAE,OAAO,MAAgB;EACnD,WAAW,EACT,0FACA,wEACA,EACD;YARH,CAUE,kBAAC,UAAD;GAAQ,OAAM;aAAI;GAAkB,CAAA,EACnC,EAAQ,KAAK,MACZ,kBAAC,UAAD;GAAwB,OAAO,EAAI;aAChC,EAAI;GACE,EAFI,EAAI,MAER,CACT,CACK"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { StatusBadge as t } from "./StatusBadge.js";
|
|
3
|
+
import { FIXTURE_TYPE_LABELS as n } from "./domain.js";
|
|
4
|
+
import { formatDate as r } from "../utils/formatters.js";
|
|
5
|
+
import { CalendarClock as i, MapPin as a } from "lucide-react";
|
|
6
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
7
|
+
import { GlassCard as c } from "@burdenoff/fe-libs/ui";
|
|
8
|
+
//#region src/atheletebridge/components/FixtureCard.tsx
|
|
9
|
+
var l = ({ fixture: l, onClick: u }) => {
|
|
10
|
+
let d = l.homeTeam?.name ?? "Home", f = l.awayTeam?.name ?? (l.awayTeamId ? "Away" : "TBD"), p = l.homeScore !== null && l.awayScore !== null;
|
|
11
|
+
return /* @__PURE__ */ s(c, {
|
|
12
|
+
treatment: "metric",
|
|
13
|
+
role: "button",
|
|
14
|
+
tabIndex: 0,
|
|
15
|
+
onClick: u,
|
|
16
|
+
onKeyDown: (e) => {
|
|
17
|
+
(e.key === "Enter" || e.key === " ") && (e.preventDefault(), u?.());
|
|
18
|
+
},
|
|
19
|
+
className: e("cursor-pointer p-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]"),
|
|
20
|
+
children: [
|
|
21
|
+
/* @__PURE__ */ s("div", {
|
|
22
|
+
className: "flex items-center justify-between gap-3",
|
|
23
|
+
children: [/* @__PURE__ */ o("span", {
|
|
24
|
+
className: "inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary",
|
|
25
|
+
children: n[l.type]
|
|
26
|
+
}), /* @__PURE__ */ o(t, { status: l.status })]
|
|
27
|
+
}),
|
|
28
|
+
/* @__PURE__ */ s("div", {
|
|
29
|
+
className: "mt-4 flex items-center justify-between gap-3",
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ o("span", {
|
|
32
|
+
className: "flex-1 truncate text-right text-sm font-semibold text-text-primary",
|
|
33
|
+
children: d
|
|
34
|
+
}),
|
|
35
|
+
/* @__PURE__ */ o("span", {
|
|
36
|
+
className: "shrink-0 rounded-lg bg-bg-sunken px-3 py-1 text-sm font-bold tabular-nums text-text-primary",
|
|
37
|
+
children: p ? `${l.homeScore} : ${l.awayScore}` : "vs"
|
|
38
|
+
}),
|
|
39
|
+
/* @__PURE__ */ o("span", {
|
|
40
|
+
className: "flex-1 truncate text-left text-sm font-semibold text-text-primary",
|
|
41
|
+
children: f
|
|
42
|
+
})
|
|
43
|
+
]
|
|
44
|
+
}),
|
|
45
|
+
/* @__PURE__ */ s("div", {
|
|
46
|
+
className: "mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary",
|
|
47
|
+
children: [
|
|
48
|
+
/* @__PURE__ */ s("span", {
|
|
49
|
+
className: "flex items-center gap-1",
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ o(i, { className: "h-3.5 w-3.5" }),
|
|
52
|
+
" ",
|
|
53
|
+
r(l.scheduledAt)
|
|
54
|
+
]
|
|
55
|
+
}),
|
|
56
|
+
l.venue && /* @__PURE__ */ s("span", {
|
|
57
|
+
className: "flex items-center gap-1 truncate",
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ o(a, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
60
|
+
" ",
|
|
61
|
+
l.venue
|
|
62
|
+
]
|
|
63
|
+
}),
|
|
64
|
+
l.competition && /* @__PURE__ */ o("span", {
|
|
65
|
+
className: "truncate",
|
|
66
|
+
children: l.competition
|
|
67
|
+
})
|
|
68
|
+
]
|
|
69
|
+
})
|
|
70
|
+
]
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
//#endregion
|
|
74
|
+
export { l as FixtureCard };
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=FixtureCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FixtureCard.js","names":[],"sources":["../../../src/atheletebridge/components/FixtureCard.tsx"],"sourcesContent":["/**\n * Fixture Card\n * @module atheletebridge/components\n */\n\nimport type { FC } from 'react';\nimport { CalendarClock, MapPin } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from './StatusBadge';\nimport { FIXTURE_TYPE_LABELS } from './domain';\nimport { formatDate } from '../utils/formatters';\nimport { cn } from '../utils/cn';\nimport type { AthFixture } from '../types';\n\ninterface FixtureCardProps {\n fixture: AthFixture;\n onClick?: () => void;\n}\n\nexport const FixtureCard: FC<FixtureCardProps> = ({ fixture, onClick }) => {\n const homeName = fixture.homeTeam?.name ?? 'Home';\n const awayName = fixture.awayTeam?.name ?? (fixture.awayTeamId ? 'Away' : 'TBD');\n const hasScore = fixture.homeScore !== null && fixture.awayScore !== null;\n\n return (\n <GlassCard\n treatment=\"metric\"\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }}\n className={cn(\n 'cursor-pointer p-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {FIXTURE_TYPE_LABELS[fixture.type]}\n </span>\n <StatusBadge status={fixture.status} />\n </div>\n\n <div className=\"mt-4 flex items-center justify-between gap-3\">\n <span className=\"flex-1 truncate text-right text-sm font-semibold text-text-primary\">\n {homeName}\n </span>\n <span className=\"shrink-0 rounded-lg bg-bg-sunken px-3 py-1 text-sm font-bold tabular-nums text-text-primary\">\n {hasScore ? `${fixture.homeScore} : ${fixture.awayScore}` : 'vs'}\n </span>\n <span className=\"flex-1 truncate text-left text-sm font-semibold text-text-primary\">\n {awayName}\n </span>\n </div>\n\n <div className=\"mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <CalendarClock className=\"h-3.5 w-3.5\" /> {formatDate(fixture.scheduledAt)}\n </span>\n {fixture.venue && (\n <span className=\"flex items-center gap-1 truncate\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0\" /> {fixture.venue}\n </span>\n )}\n {fixture.competition && (\n <span className=\"truncate\">{fixture.competition}</span>\n )}\n </div>\n </GlassCard>\n );\n};\n"],"mappings":";;;;;;;;AAmBA,IAAa,KAAqC,EAAE,YAAS,iBAAc;CACzE,IAAM,IAAW,EAAQ,UAAU,QAAQ,QACrC,IAAW,EAAQ,UAAU,SAAS,EAAQ,aAAa,SAAS,QACpE,IAAW,EAAQ,cAAc,QAAQ,EAAQ,cAAc;AAErE,QACE,kBAAC,GAAD;EACE,WAAU;EACV,MAAK;EACL,UAAU;EACD;EACT,YAAY,MAAM;AAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,KAAW;;EAGf,WAAW,EACT,kHACD;YAbH;GAeE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,QAAD;KAAM,WAAU;eACb,EAAoB,EAAQ;KACxB,CAAA,EACP,kBAAC,GAAD,EAAa,QAAQ,EAAQ,QAAU,CAAA,CACnC;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,QAAD;MAAM,WAAU;gBACb;MACI,CAAA;KACP,kBAAC,QAAD;MAAM,WAAU;gBACb,IAAW,GAAG,EAAQ,UAAU,KAAK,EAAQ,cAAc;MACvD,CAAA;KACP,kBAAC,QAAD;MAAM,WAAU;gBACb;MACI,CAAA;KACH;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD,EAAe,WAAU,eAAgB,CAAA;;OAAE,EAAW,EAAQ,YAAY;OACrE;;KACN,EAAQ,SACP,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD,EAAQ,WAAU,wBAAyB,CAAA;;OAAE,EAAQ;OAChD;;KAER,EAAQ,eACP,kBAAC,QAAD;MAAM,WAAU;gBAAY,EAAQ;MAAmB,CAAA;KAErD;;GACI"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { AlertCircle as t, Loader2 as n } from "lucide-react";
|
|
3
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
4
|
+
//#region src/atheletebridge/components/LoadingState.tsx
|
|
5
|
+
var a = ({ label: t = "Loading…", className: a }) => /* @__PURE__ */ i("div", {
|
|
6
|
+
className: e("flex min-h-[40vh] flex-col items-center justify-center gap-3", a),
|
|
7
|
+
role: "status",
|
|
8
|
+
"aria-live": "polite",
|
|
9
|
+
children: [/* @__PURE__ */ r(n, { className: "h-8 w-8 animate-spin text-text-secondary" }), /* @__PURE__ */ r("p", {
|
|
10
|
+
className: "text-sm text-text-secondary",
|
|
11
|
+
children: t
|
|
12
|
+
})]
|
|
13
|
+
}), o = ({ title: n = "Something went wrong", message: a = "We could not load this data. Please try again.", onRetry: o, className: s }) => /* @__PURE__ */ i("div", {
|
|
14
|
+
className: e("flex min-h-[40vh] flex-col items-center justify-center gap-3 text-center", s),
|
|
15
|
+
children: [
|
|
16
|
+
/* @__PURE__ */ r(t, { className: "h-10 w-10 text-status-error-text" }),
|
|
17
|
+
/* @__PURE__ */ r("h3", {
|
|
18
|
+
className: "text-lg font-semibold text-text-primary",
|
|
19
|
+
children: n
|
|
20
|
+
}),
|
|
21
|
+
/* @__PURE__ */ r("p", {
|
|
22
|
+
className: "max-w-sm text-sm text-text-secondary",
|
|
23
|
+
children: a
|
|
24
|
+
}),
|
|
25
|
+
o && /* @__PURE__ */ r("button", {
|
|
26
|
+
type: "button",
|
|
27
|
+
onClick: o,
|
|
28
|
+
className: "mt-2 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken",
|
|
29
|
+
children: "Try again"
|
|
30
|
+
})
|
|
31
|
+
]
|
|
32
|
+
});
|
|
33
|
+
//#endregion
|
|
34
|
+
export { o as ErrorState, a as LoadingState };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=LoadingState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoadingState.js","names":[],"sources":["../../../src/atheletebridge/components/LoadingState.tsx"],"sourcesContent":["/**\n * Loading / Error State Components\n * @module atheletebridge/components\n *\n * Small calm, centered states shared across list and detail pages.\n */\n\nimport type { FC } from 'react';\nimport { AlertCircle, Loader2 } from 'lucide-react';\nimport { cn } from '../utils/cn';\n\ninterface LoadingStateProps {\n label?: string;\n className?: string;\n}\n\nexport const LoadingState: FC<LoadingStateProps> = ({ label = 'Loading…', className }) => (\n <div\n className={cn('flex min-h-[40vh] flex-col items-center justify-center gap-3', className)}\n role=\"status\"\n aria-live=\"polite\"\n >\n <Loader2 className=\"h-8 w-8 animate-spin text-text-secondary\" />\n <p className=\"text-sm text-text-secondary\">{label}</p>\n </div>\n);\n\ninterface ErrorStateProps {\n title?: string;\n message?: string;\n onRetry?: () => void;\n className?: string;\n}\n\nexport const ErrorState: FC<ErrorStateProps> = ({\n title = 'Something went wrong',\n message = 'We could not load this data. Please try again.',\n onRetry,\n className,\n}) => (\n <div\n className={cn('flex min-h-[40vh] flex-col items-center justify-center gap-3 text-center', className)}\n >\n <AlertCircle className=\"h-10 w-10 text-status-error-text\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">{title}</h3>\n <p className=\"max-w-sm text-sm text-text-secondary\">{message}</p>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"mt-2 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n Try again\n </button>\n )}\n </div>\n);\n"],"mappings":";;;;AAgBA,IAAa,KAAuC,EAAE,WAAQ,YAAY,mBACxE,kBAAC,OAAD;CACE,WAAW,EAAG,gEAAgE,EAAU;CACxF,MAAK;CACL,aAAU;WAHZ,CAKE,kBAAC,GAAD,EAAS,WAAU,4CAA6C,CAAA,EAChE,kBAAC,KAAD;EAAG,WAAU;YAA+B;EAAU,CAAA,CAClD;IAUK,KAAmC,EAC9C,WAAQ,wBACR,aAAU,kDACV,YACA,mBAEA,kBAAC,OAAD;CACE,WAAW,EAAG,4EAA4E,EAAU;WADtG;EAGE,kBAAC,GAAD,EAAa,WAAU,oCAAqC,CAAA;EAC5D,kBAAC,MAAD;GAAI,WAAU;aAA2C;GAAW,CAAA;EACpE,kBAAC,KAAD;GAAG,WAAU;aAAwC;GAAY,CAAA;EAChE,KACC,kBAAC,UAAD;GACE,MAAK;GACL,SAAS;GACT,WAAU;aACX;GAEQ,CAAA;EAEP"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { StatusBadge as t } from "./StatusBadge.js";
|
|
3
|
+
import { PROGRAM_LEVEL_LABELS as n, SPORT_ICONS as r, SPORT_LABELS as i } from "./domain.js";
|
|
4
|
+
import { CalendarRange as a, Copy as o } from "lucide-react";
|
|
5
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
6
|
+
import { GlassCard as l } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
//#region src/atheletebridge/components/ProgramCard.tsx
|
|
8
|
+
var u = ({ program: u, onClick: d }) => {
|
|
9
|
+
let f = r[u.sport];
|
|
10
|
+
return /* @__PURE__ */ c(l, {
|
|
11
|
+
treatment: "metric",
|
|
12
|
+
role: "button",
|
|
13
|
+
tabIndex: 0,
|
|
14
|
+
onClick: d,
|
|
15
|
+
onKeyDown: (e) => {
|
|
16
|
+
(e.key === "Enter" || e.key === " ") && (e.preventDefault(), d?.());
|
|
17
|
+
},
|
|
18
|
+
className: e("cursor-pointer p-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]"),
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ c("div", {
|
|
21
|
+
className: "flex items-start justify-between gap-3",
|
|
22
|
+
children: [/* @__PURE__ */ c("div", {
|
|
23
|
+
className: "flex items-center gap-3 min-w-0",
|
|
24
|
+
children: [/* @__PURE__ */ s("div", {
|
|
25
|
+
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-[var(--color-accent-soft)] text-text-primary",
|
|
26
|
+
children: /* @__PURE__ */ s(f, { className: "h-5 w-5" })
|
|
27
|
+
}), /* @__PURE__ */ c("div", {
|
|
28
|
+
className: "min-w-0",
|
|
29
|
+
children: [/* @__PURE__ */ s("h3", {
|
|
30
|
+
className: "truncate text-base font-semibold text-text-primary",
|
|
31
|
+
children: u.name
|
|
32
|
+
}), /* @__PURE__ */ c("p", {
|
|
33
|
+
className: "text-sm text-text-secondary",
|
|
34
|
+
children: [
|
|
35
|
+
i[u.sport],
|
|
36
|
+
" · ",
|
|
37
|
+
n[u.level]
|
|
38
|
+
]
|
|
39
|
+
})]
|
|
40
|
+
})]
|
|
41
|
+
}), /* @__PURE__ */ s(t, { status: u.status })]
|
|
42
|
+
}),
|
|
43
|
+
u.summary && /* @__PURE__ */ s("p", {
|
|
44
|
+
className: "mt-3 line-clamp-2 text-sm text-text-secondary",
|
|
45
|
+
children: u.summary
|
|
46
|
+
}),
|
|
47
|
+
/* @__PURE__ */ c("div", {
|
|
48
|
+
className: "mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary",
|
|
49
|
+
children: [/* @__PURE__ */ c("span", {
|
|
50
|
+
className: "flex items-center gap-1",
|
|
51
|
+
children: [
|
|
52
|
+
/* @__PURE__ */ s(a, { className: "h-3.5 w-3.5" }),
|
|
53
|
+
" ",
|
|
54
|
+
u.weeks,
|
|
55
|
+
" ",
|
|
56
|
+
u.weeks === 1 ? "week" : "weeks"
|
|
57
|
+
]
|
|
58
|
+
}), u.isTemplate && /* @__PURE__ */ c("span", {
|
|
59
|
+
className: "flex items-center gap-1",
|
|
60
|
+
children: [/* @__PURE__ */ s(o, { className: "h-3.5 w-3.5" }), " Template"]
|
|
61
|
+
})]
|
|
62
|
+
})
|
|
63
|
+
]
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
//#endregion
|
|
67
|
+
export { u as ProgramCard };
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=ProgramCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgramCard.js","names":[],"sources":["../../../src/atheletebridge/components/ProgramCard.tsx"],"sourcesContent":["/**\n * Program Card\n * @module atheletebridge/components\n */\n\nimport type { FC } from 'react';\nimport { CalendarRange, Copy } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from './StatusBadge';\nimport { SPORT_ICONS, SPORT_LABELS, PROGRAM_LEVEL_LABELS } from './domain';\nimport { cn } from '../utils/cn';\nimport type { AthProgram } from '../types';\n\ninterface ProgramCardProps {\n program: AthProgram;\n onClick?: () => void;\n}\n\nexport const ProgramCard: FC<ProgramCardProps> = ({ program, onClick }) => {\n const SportIcon = SPORT_ICONS[program.sport];\n\n return (\n <GlassCard\n treatment=\"metric\"\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }}\n className={cn(\n 'cursor-pointer p-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-3 min-w-0\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-[var(--color-accent-soft)] text-text-primary\">\n <SportIcon className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{program.name}</h3>\n <p className=\"text-sm text-text-secondary\">\n {SPORT_LABELS[program.sport]} · {PROGRAM_LEVEL_LABELS[program.level]}\n </p>\n </div>\n </div>\n <StatusBadge status={program.status} />\n </div>\n\n {program.summary && (\n <p className=\"mt-3 line-clamp-2 text-sm text-text-secondary\">{program.summary}</p>\n )}\n\n <div className=\"mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <CalendarRange className=\"h-3.5 w-3.5\" /> {program.weeks}{' '}\n {program.weeks === 1 ? 'week' : 'weeks'}\n </span>\n {program.isTemplate && (\n <span className=\"flex items-center gap-1\">\n <Copy className=\"h-3.5 w-3.5\" /> Template\n </span>\n )}\n </div>\n </GlassCard>\n );\n};\n"],"mappings":";;;;;;;AAkBA,IAAa,KAAqC,EAAE,YAAS,iBAAc;CACzE,IAAM,IAAY,EAAY,EAAQ;AAEtC,QACE,kBAAC,GAAD;EACE,WAAU;EACV,MAAK;EACL,UAAU;EACD;EACT,YAAY,MAAM;AAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,KAAW;;EAGf,WAAW,EACT,kHACD;YAbH;GAeE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;MAC7B,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAAsD,EAAQ;OAAU,CAAA,EACtF,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAa,EAAQ;QAAO;QAAI,EAAqB,EAAQ;QAC5D;SACA;QACF;QACN,kBAAC,GAAD,EAAa,QAAQ,EAAQ,QAAU,CAAA,CACnC;;GAEL,EAAQ,WACP,kBAAC,KAAD;IAAG,WAAU;cAAiD,EAAQ;IAAY,CAAA;GAGpF,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,QAAD;KAAM,WAAU;eAAhB;MACE,kBAAC,GAAD,EAAe,WAAU,eAAgB,CAAA;;MAAE,EAAQ;MAAO;MACzD,EAAQ,UAAU,IAAI,SAAS;MAC3B;QACN,EAAQ,cACP,kBAAC,QAAD;KAAM,WAAU;eAAhB,CACE,kBAAC,GAAD,EAAM,WAAU,eAAgB,CAAA,EAAA,YAC3B;OAEL;;GACI"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { StatusBadge as t } from "./StatusBadge.js";
|
|
3
|
+
import { SESSION_TYPE_LABELS as n } from "./domain.js";
|
|
4
|
+
import { formatDate as r, formatDuration as i } from "../utils/formatters.js";
|
|
5
|
+
import { CalendarClock as a, Clock as o, MapPin as s, Star as c, Video as l } from "lucide-react";
|
|
6
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
7
|
+
import { GlassCard as f } from "@burdenoff/fe-libs/ui";
|
|
8
|
+
//#region src/atheletebridge/components/SessionCard.tsx
|
|
9
|
+
var p = ({ session: p, onClick: m }) => /* @__PURE__ */ d(f, {
|
|
10
|
+
treatment: "metric",
|
|
11
|
+
role: "button",
|
|
12
|
+
tabIndex: 0,
|
|
13
|
+
onClick: m,
|
|
14
|
+
onKeyDown: (e) => {
|
|
15
|
+
(e.key === "Enter" || e.key === " ") && (e.preventDefault(), m?.());
|
|
16
|
+
},
|
|
17
|
+
className: e("cursor-pointer p-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]"),
|
|
18
|
+
children: [/* @__PURE__ */ d("div", {
|
|
19
|
+
className: "flex items-start justify-between gap-3",
|
|
20
|
+
children: [/* @__PURE__ */ d("div", {
|
|
21
|
+
className: "min-w-0",
|
|
22
|
+
children: [/* @__PURE__ */ u("h3", {
|
|
23
|
+
className: "truncate text-base font-semibold text-text-primary",
|
|
24
|
+
children: p.title
|
|
25
|
+
}), /* @__PURE__ */ u("p", {
|
|
26
|
+
className: "text-sm text-text-secondary",
|
|
27
|
+
children: n[p.type]
|
|
28
|
+
})]
|
|
29
|
+
}), /* @__PURE__ */ u(t, { status: p.status })]
|
|
30
|
+
}), /* @__PURE__ */ d("div", {
|
|
31
|
+
className: "mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary",
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ d("span", {
|
|
34
|
+
className: "flex items-center gap-1",
|
|
35
|
+
children: [
|
|
36
|
+
/* @__PURE__ */ u(a, { className: "h-3.5 w-3.5" }),
|
|
37
|
+
" ",
|
|
38
|
+
r(p.scheduledAt)
|
|
39
|
+
]
|
|
40
|
+
}),
|
|
41
|
+
/* @__PURE__ */ d("span", {
|
|
42
|
+
className: "flex items-center gap-1",
|
|
43
|
+
children: [
|
|
44
|
+
/* @__PURE__ */ u(o, { className: "h-3.5 w-3.5" }),
|
|
45
|
+
" ",
|
|
46
|
+
i(p.durationMin)
|
|
47
|
+
]
|
|
48
|
+
}),
|
|
49
|
+
p.type === "IN_PERSON" && p.location && /* @__PURE__ */ d("span", {
|
|
50
|
+
className: "flex items-center gap-1 truncate",
|
|
51
|
+
children: [
|
|
52
|
+
/* @__PURE__ */ u(s, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
53
|
+
" ",
|
|
54
|
+
p.location
|
|
55
|
+
]
|
|
56
|
+
}),
|
|
57
|
+
p.type !== "IN_PERSON" && p.meetingUrl && /* @__PURE__ */ d("span", {
|
|
58
|
+
className: "flex items-center gap-1",
|
|
59
|
+
children: [/* @__PURE__ */ u(l, { className: "h-3.5 w-3.5" }), " Online"]
|
|
60
|
+
}),
|
|
61
|
+
p.rating !== null && /* @__PURE__ */ d("span", {
|
|
62
|
+
className: "flex items-center gap-1",
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ u(c, { className: "h-3.5 w-3.5" }),
|
|
65
|
+
" ",
|
|
66
|
+
p.rating,
|
|
67
|
+
"/5"
|
|
68
|
+
]
|
|
69
|
+
})
|
|
70
|
+
]
|
|
71
|
+
})]
|
|
72
|
+
});
|
|
73
|
+
//#endregion
|
|
74
|
+
export { p as SessionCard };
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=SessionCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionCard.js","names":[],"sources":["../../../src/atheletebridge/components/SessionCard.tsx"],"sourcesContent":["/**\n * Session Card\n * @module atheletebridge/components\n */\n\nimport type { FC } from 'react';\nimport { CalendarClock, Clock, Star, Video, MapPin } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from './StatusBadge';\nimport { SESSION_TYPE_LABELS } from './domain';\nimport { formatDate, formatDuration } from '../utils/formatters';\nimport { cn } from '../utils/cn';\nimport type { AthSession } from '../types';\n\ninterface SessionCardProps {\n session: AthSession;\n onClick?: () => void;\n}\n\nexport const SessionCard: FC<SessionCardProps> = ({ session, onClick }) => (\n <GlassCard\n treatment=\"metric\"\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }}\n className={cn(\n 'cursor-pointer p-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{session.title}</h3>\n <p className=\"text-sm text-text-secondary\">{SESSION_TYPE_LABELS[session.type]}</p>\n </div>\n <StatusBadge status={session.status} />\n </div>\n\n <div className=\"mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <CalendarClock className=\"h-3.5 w-3.5\" /> {formatDate(session.scheduledAt)}\n </span>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3.5 w-3.5\" /> {formatDuration(session.durationMin)}\n </span>\n {session.type === 'IN_PERSON' && session.location && (\n <span className=\"flex items-center gap-1 truncate\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0\" /> {session.location}\n </span>\n )}\n {session.type !== 'IN_PERSON' && session.meetingUrl && (\n <span className=\"flex items-center gap-1\">\n <Video className=\"h-3.5 w-3.5\" /> Online\n </span>\n )}\n {session.rating !== null && (\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3.5 w-3.5\" /> {session.rating}/5\n </span>\n )}\n </div>\n </GlassCard>\n);\n"],"mappings":";;;;;;;;AAmBA,IAAa,KAAqC,EAAE,YAAS,iBAC3D,kBAAC,GAAD;CACE,WAAU;CACV,MAAK;CACL,UAAU;CACD;CACT,YAAY,MAAM;AAChB,GAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,KAAW;;CAGf,WAAW,EACT,kHACD;WAbH,CAeE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cAAsD,EAAQ;IAAW,CAAA,EACvF,kBAAC,KAAD;IAAG,WAAU;cAA+B,EAAoB,EAAQ;IAAU,CAAA,CAC9E;MACN,kBAAC,GAAD,EAAa,QAAQ,EAAQ,QAAU,CAAA,CACnC;KAEN,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,QAAD;IAAM,WAAU;cAAhB;KACE,kBAAC,GAAD,EAAe,WAAU,eAAgB,CAAA;;KAAE,EAAW,EAAQ,YAAY;KACrE;;GACP,kBAAC,QAAD;IAAM,WAAU;cAAhB;KACE,kBAAC,GAAD,EAAO,WAAU,eAAgB,CAAA;;KAAE,EAAe,EAAQ,YAAY;KACjE;;GACN,EAAQ,SAAS,eAAe,EAAQ,YACvC,kBAAC,QAAD;IAAM,WAAU;cAAhB;KACE,kBAAC,GAAD,EAAQ,WAAU,wBAAyB,CAAA;;KAAE,EAAQ;KAChD;;GAER,EAAQ,SAAS,eAAe,EAAQ,cACvC,kBAAC,QAAD;IAAM,WAAU;cAAhB,CACE,kBAAC,GAAD,EAAO,WAAU,eAAgB,CAAA,EAAA,UAC5B;;GAER,EAAQ,WAAW,QAClB,kBAAC,QAAD;IAAM,WAAU;cAAhB;KACE,kBAAC,GAAD,EAAM,WAAU,eAAgB,CAAA;;KAAE,EAAQ;KAAO;KAC5C;;GAEL;IACI"}
|
|
@@ -1,45 +1,54 @@
|
|
|
1
1
|
import { cn as e } from "../utils/cn.js";
|
|
2
|
-
import { jsx as t } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
3
|
//#region src/atheletebridge/components/StatusBadge.tsx
|
|
4
|
-
var
|
|
5
|
-
success: "bg-
|
|
6
|
-
warning: "bg-
|
|
7
|
-
destructive: "bg-status-error-bg
|
|
8
|
-
secondary: "bg-
|
|
9
|
-
info: "bg-
|
|
10
|
-
outline: "border border-border-
|
|
11
|
-
},
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
preparing: "warning",
|
|
19
|
-
ready: "success",
|
|
20
|
-
out_for_delivery: "info",
|
|
21
|
-
delivered: "success",
|
|
22
|
-
cancelled: "destructive",
|
|
23
|
-
refunded: "outline",
|
|
24
|
-
funded: "success",
|
|
25
|
-
returning: "info",
|
|
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
|
+
destructive: "bg-status-error-bg-subtle text-status-error-text",
|
|
8
|
+
secondary: "bg-bg-sunken text-text-secondary",
|
|
9
|
+
info: "bg-[var(--color-accent-soft)] text-text-primary",
|
|
10
|
+
outline: "border border-border-seam text-text-primary"
|
|
11
|
+
}, i = new Set([
|
|
12
|
+
"live",
|
|
13
|
+
"active",
|
|
14
|
+
"confirmed",
|
|
15
|
+
"in_progress"
|
|
16
|
+
]), a = {
|
|
17
|
+
forming: "warning",
|
|
26
18
|
active: "success",
|
|
27
19
|
inactive: "secondary",
|
|
28
|
-
draft: "secondary",
|
|
29
20
|
archived: "outline",
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
21
|
+
trial: "info",
|
|
22
|
+
injured: "warning",
|
|
23
|
+
suspended: "destructive",
|
|
24
|
+
released: "secondary",
|
|
25
|
+
scheduled: "info",
|
|
26
|
+
live: "success",
|
|
27
|
+
completed: "success",
|
|
28
|
+
postponed: "warning",
|
|
29
|
+
cancelled: "destructive",
|
|
30
|
+
draft: "secondary",
|
|
31
|
+
published: "success",
|
|
32
|
+
requested: "warning",
|
|
33
|
+
confirmed: "info",
|
|
34
|
+
no_show: "destructive",
|
|
35
|
+
planned: "info",
|
|
36
|
+
skipped: "secondary"
|
|
34
37
|
};
|
|
35
|
-
function
|
|
36
|
-
return e.replace(/_/g, " ").replace(/\b\w/g, (e) => e.toUpperCase());
|
|
38
|
+
function o(e) {
|
|
39
|
+
return e.replace(/_/g, " ").toLowerCase().replace(/\b\w/g, (e) => e.toUpperCase());
|
|
37
40
|
}
|
|
38
|
-
var
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
var s = ({ status: s, className: c }) => {
|
|
42
|
+
let l = s.toLowerCase(), u = a[l] ?? "secondary", d = i.has(l);
|
|
43
|
+
return /* @__PURE__ */ n("span", {
|
|
44
|
+
className: e("inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium", r[u], c),
|
|
45
|
+
children: [d && /* @__PURE__ */ t("span", {
|
|
46
|
+
"aria-hidden": "true",
|
|
47
|
+
className: "size-1.5 rounded-full bg-current motion-safe:animate-vc-glow-pulse"
|
|
48
|
+
}), o(s)]
|
|
49
|
+
});
|
|
50
|
+
};
|
|
42
51
|
//#endregion
|
|
43
|
-
export {
|
|
52
|
+
export { s as StatusBadge };
|
|
44
53
|
|
|
45
54
|
//# sourceMappingURL=StatusBadge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/atheletebridge/components/StatusBadge.tsx"],"sourcesContent":["/**\n * Status Badge Component\n * @module atheletebridge/components\n *\n * A colored badge based on status value with semantic color
|
|
1
|
+
{"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/atheletebridge/components/StatusBadge.tsx"],"sourcesContent":["/**\n * Status Badge Component\n * @module atheletebridge/components\n *\n * A colored badge based on a domain status value, with semantic-token color\n * mapping for the AthleteBridge lifecycle states (teams, members, fixtures,\n * programs, sessions, workouts). Uses semantic tokens only — never raw colors.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface StatusBadgeProps {\n status: string;\n className?: string;\n}\n\ntype BadgeVariant = 'success' | 'warning' | 'destructive' | 'secondary' | 'info' | 'outline';\n\nconst variantStyles: Record<BadgeVariant, string> = {\n success: 'bg-status-success-bg-subtle text-status-success-text',\n warning: 'bg-status-warning-bg-subtle text-status-warning-text',\n destructive: 'bg-status-error-bg-subtle text-status-error-text',\n secondary: 'bg-bg-sunken text-text-secondary',\n info: 'bg-[var(--color-accent-soft)] text-text-primary',\n outline: 'border border-border-seam text-text-primary',\n};\n\n// Statuses that represent a \"live\" / in-progress condition get a subtle,\n// opacity-only glow pulse (reduced-motion safe via motion-safe:).\nconst liveStatuses = new Set(['live', 'active', 'confirmed', 'in_progress']);\n\nconst statusVariantMap: Record<string, BadgeVariant> = {\n // Team status\n forming: 'warning',\n active: 'success',\n inactive: 'secondary',\n archived: 'outline',\n\n // Member status\n trial: 'info',\n injured: 'warning',\n suspended: 'destructive',\n released: 'secondary',\n\n // Fixture status\n scheduled: 'info',\n live: 'success',\n completed: 'success',\n postponed: 'warning',\n cancelled: 'destructive',\n\n // Program status\n draft: 'secondary',\n published: 'success',\n\n // Session status\n requested: 'warning',\n confirmed: 'info',\n no_show: 'destructive',\n\n // Workout status\n planned: 'info',\n skipped: 'secondary',\n};\n\nfunction formatStatusLabel(status: string): string {\n return status\n .replace(/_/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport const StatusBadge: FC<StatusBadgeProps> = ({ status, className }) => {\n const key = status.toLowerCase();\n const variant = statusVariantMap[key] ?? 'secondary';\n const isLive = liveStatuses.has(key);\n\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 variantStyles[variant],\n className\n )}\n >\n {isLive && (\n <span\n aria-hidden=\"true\"\n className=\"size-1.5 rounded-full bg-current motion-safe:animate-vc-glow-pulse\"\n />\n )}\n {formatStatusLabel(status)}\n </span>\n );\n};\n"],"mappings":";;;AAmBA,IAAM,IAA8C;CAClD,SAAS;CACT,SAAS;CACT,aAAa;CACb,WAAW;CACX,MAAM;CACN,SAAS;CACV,EAIK,IAAe,IAAI,IAAI;CAAC;CAAQ;CAAU;CAAa;CAAc,CAAC,EAEtE,IAAiD;CAErD,SAAS;CACT,QAAQ;CACR,UAAU;CACV,UAAU;CAGV,OAAO;CACP,SAAS;CACT,WAAW;CACX,UAAU;CAGV,WAAW;CACX,MAAM;CACN,WAAW;CACX,WAAW;CACX,WAAW;CAGX,OAAO;CACP,WAAW;CAGX,WAAW;CACX,WAAW;CACX,SAAS;CAGT,SAAS;CACT,SAAS;CACV;AAED,SAAS,EAAkB,GAAwB;AACjD,QAAO,EACJ,QAAQ,MAAM,IAAI,CAClB,aAAa,CACb,QAAQ,UAAU,MAAS,EAAK,aAAa,CAAC;;AAGnD,IAAa,KAAqC,EAAE,WAAQ,mBAAgB;CAC1E,IAAM,IAAM,EAAO,aAAa,EAC1B,IAAU,EAAiB,MAAQ,aACnC,IAAS,EAAa,IAAI,EAAI;AAEpC,QACE,kBAAC,QAAD;EACE,WAAW,EACT,mFACA,EAAc,IACd,EACD;YALH,CAOG,KACC,kBAAC,QAAD;GACE,eAAY;GACZ,WAAU;GACV,CAAA,EAEH,EAAkB,EAAO,CACrB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { StatusBadge as t } from "./StatusBadge.js";
|
|
3
|
+
import { SPORT_ICONS as n, SPORT_LABELS as r } from "./domain.js";
|
|
4
|
+
import { CalendarDays as i, MapPin as a, Users as o } from "lucide-react";
|
|
5
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
6
|
+
import { GlassCard as l } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
//#region src/atheletebridge/components/TeamCard.tsx
|
|
8
|
+
var u = ({ team: u, onClick: d }) => {
|
|
9
|
+
let f = n[u.sport];
|
|
10
|
+
return /* @__PURE__ */ c(l, {
|
|
11
|
+
treatment: "metric",
|
|
12
|
+
role: "button",
|
|
13
|
+
tabIndex: 0,
|
|
14
|
+
onClick: d,
|
|
15
|
+
onKeyDown: (e) => {
|
|
16
|
+
(e.key === "Enter" || e.key === " ") && (e.preventDefault(), d?.());
|
|
17
|
+
},
|
|
18
|
+
className: e("cursor-pointer p-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]"),
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ c("div", {
|
|
21
|
+
className: "flex items-start justify-between gap-3",
|
|
22
|
+
children: [/* @__PURE__ */ c("div", {
|
|
23
|
+
className: "flex items-center gap-3 min-w-0",
|
|
24
|
+
children: [/* @__PURE__ */ s("div", {
|
|
25
|
+
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-[var(--color-accent-soft)] text-text-primary",
|
|
26
|
+
children: /* @__PURE__ */ s(f, { className: "h-5 w-5" })
|
|
27
|
+
}), /* @__PURE__ */ c("div", {
|
|
28
|
+
className: "min-w-0",
|
|
29
|
+
children: [/* @__PURE__ */ s("h3", {
|
|
30
|
+
className: "truncate text-base font-semibold text-text-primary",
|
|
31
|
+
children: u.name
|
|
32
|
+
}), /* @__PURE__ */ s("p", {
|
|
33
|
+
className: "text-sm text-text-secondary",
|
|
34
|
+
children: r[u.sport]
|
|
35
|
+
})]
|
|
36
|
+
})]
|
|
37
|
+
}), /* @__PURE__ */ s(t, { status: u.status })]
|
|
38
|
+
}),
|
|
39
|
+
/* @__PURE__ */ c("div", {
|
|
40
|
+
className: "mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary",
|
|
41
|
+
children: [
|
|
42
|
+
u.ageGroup && /* @__PURE__ */ c("span", {
|
|
43
|
+
className: "flex items-center gap-1",
|
|
44
|
+
children: [
|
|
45
|
+
/* @__PURE__ */ s(o, { className: "h-3.5 w-3.5" }),
|
|
46
|
+
" ",
|
|
47
|
+
u.ageGroup
|
|
48
|
+
]
|
|
49
|
+
}),
|
|
50
|
+
u.season && /* @__PURE__ */ c("span", {
|
|
51
|
+
className: "flex items-center gap-1",
|
|
52
|
+
children: [
|
|
53
|
+
/* @__PURE__ */ s(i, { className: "h-3.5 w-3.5" }),
|
|
54
|
+
" ",
|
|
55
|
+
u.season
|
|
56
|
+
]
|
|
57
|
+
}),
|
|
58
|
+
u.homeVenue && /* @__PURE__ */ c("span", {
|
|
59
|
+
className: "flex items-center gap-1 truncate",
|
|
60
|
+
children: [
|
|
61
|
+
/* @__PURE__ */ s(a, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
62
|
+
" ",
|
|
63
|
+
u.homeVenue
|
|
64
|
+
]
|
|
65
|
+
})
|
|
66
|
+
]
|
|
67
|
+
}),
|
|
68
|
+
u.tags.length > 0 && /* @__PURE__ */ s("div", {
|
|
69
|
+
className: "mt-3 flex flex-wrap gap-1.5",
|
|
70
|
+
children: u.tags.slice(0, 4).map((e) => /* @__PURE__ */ s("span", {
|
|
71
|
+
className: "inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary",
|
|
72
|
+
children: e
|
|
73
|
+
}, e))
|
|
74
|
+
})
|
|
75
|
+
]
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
//#endregion
|
|
79
|
+
export { u as TeamCard };
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=TeamCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TeamCard.js","names":[],"sources":["../../../src/atheletebridge/components/TeamCard.tsx"],"sourcesContent":["/**\n * Team Card\n * @module atheletebridge/components\n */\n\nimport type { FC } from 'react';\nimport { Users, MapPin, CalendarDays } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from './StatusBadge';\nimport { SPORT_ICONS, SPORT_LABELS } from './domain';\nimport { cn } from '../utils/cn';\nimport type { AthTeam } from '../types';\n\ninterface TeamCardProps {\n team: AthTeam;\n onClick?: () => void;\n}\n\nexport const TeamCard: FC<TeamCardProps> = ({ team, onClick }) => {\n const SportIcon = SPORT_ICONS[team.sport];\n\n return (\n <GlassCard\n treatment=\"metric\"\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }}\n className={cn(\n 'cursor-pointer p-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-3 min-w-0\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-[var(--color-accent-soft)] text-text-primary\">\n <SportIcon className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{team.name}</h3>\n <p className=\"text-sm text-text-secondary\">{SPORT_LABELS[team.sport]}</p>\n </div>\n </div>\n <StatusBadge status={team.status} />\n </div>\n\n <div className=\"mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary\">\n {team.ageGroup && (\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3.5 w-3.5\" /> {team.ageGroup}\n </span>\n )}\n {team.season && (\n <span className=\"flex items-center gap-1\">\n <CalendarDays className=\"h-3.5 w-3.5\" /> {team.season}\n </span>\n )}\n {team.homeVenue && (\n <span className=\"flex items-center gap-1 truncate\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0\" /> {team.homeVenue}\n </span>\n )}\n </div>\n\n {team.tags.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {team.tags.slice(0, 4).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </GlassCard>\n );\n};\n"],"mappings":";;;;;;;AAkBA,IAAa,KAA+B,EAAE,SAAM,iBAAc;CAChE,IAAM,IAAY,EAAY,EAAK;AAEnC,QACE,kBAAC,GAAD;EACE,WAAU;EACV,MAAK;EACL,UAAU;EACD;EACT,YAAY,MAAM;AAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,KAAW;;EAGf,WAAW,EACT,kHACD;YAbH;GAeE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;MAC7B,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAAsD,EAAK;OAAU,CAAA,EACnF,kBAAC,KAAD;OAAG,WAAU;iBAA+B,EAAa,EAAK;OAAW,CAAA,CACrE;QACF;QACN,kBAAC,GAAD,EAAa,QAAQ,EAAK,QAAU,CAAA,CAChC;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACG,EAAK,YACJ,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD,EAAO,WAAU,eAAgB,CAAA;;OAAE,EAAK;OACnC;;KAER,EAAK,UACJ,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD,EAAc,WAAU,eAAgB,CAAA;;OAAE,EAAK;OAC1C;;KAER,EAAK,aACJ,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD,EAAQ,WAAU,wBAAyB,CAAA;;OAAE,EAAK;OAC7C;;KAEL;;GAEL,EAAK,KAAK,SAAS,KAClB,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAK,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,MAC1B,kBAAC,QAAD;KAEE,WAAU;eAET;KACI,EAJA,EAIA,CACP;IACE,CAAA;GAEE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Activity as e, Dumbbell as t, Footprints as n, Gamepad2 as r, Trophy as i, Volleyball as a, Waves as o } from "lucide-react";
|
|
2
|
+
//#region src/atheletebridge/components/domain.ts
|
|
3
|
+
var s = {
|
|
4
|
+
ATHLETICS: n,
|
|
5
|
+
BASKETBALL: a,
|
|
6
|
+
CRICKET: i,
|
|
7
|
+
ESPORTS: r,
|
|
8
|
+
FOOTBALL: a,
|
|
9
|
+
OTHER: e,
|
|
10
|
+
SWIMMING: o,
|
|
11
|
+
TENNIS: t
|
|
12
|
+
}, c = {
|
|
13
|
+
ATHLETICS: "Athletics",
|
|
14
|
+
BASKETBALL: "Basketball",
|
|
15
|
+
CRICKET: "Cricket",
|
|
16
|
+
ESPORTS: "Esports",
|
|
17
|
+
FOOTBALL: "Football",
|
|
18
|
+
OTHER: "Other",
|
|
19
|
+
SWIMMING: "Swimming",
|
|
20
|
+
TENNIS: "Tennis"
|
|
21
|
+
}, l = {
|
|
22
|
+
BEGINNER: "Beginner",
|
|
23
|
+
INTERMEDIATE: "Intermediate",
|
|
24
|
+
ADVANCED: "Advanced",
|
|
25
|
+
ELITE: "Elite"
|
|
26
|
+
}, u = {
|
|
27
|
+
PLAYER: "Player",
|
|
28
|
+
CAPTAIN: "Captain",
|
|
29
|
+
COACH: "Coach",
|
|
30
|
+
ASSISTANT_COACH: "Assistant Coach",
|
|
31
|
+
PHYSIO: "Physio",
|
|
32
|
+
MANAGER: "Manager"
|
|
33
|
+
}, d = {
|
|
34
|
+
FRIENDLY: "Friendly",
|
|
35
|
+
LEAGUE: "League",
|
|
36
|
+
CUP: "Cup",
|
|
37
|
+
TOURNAMENT: "Tournament",
|
|
38
|
+
SCRIMMAGE: "Scrimmage"
|
|
39
|
+
}, f = {
|
|
40
|
+
IN_PERSON: "In Person",
|
|
41
|
+
ONLINE: "Online",
|
|
42
|
+
HYBRID: "Hybrid"
|
|
43
|
+
};
|
|
44
|
+
//#endregion
|
|
45
|
+
export { d as FIXTURE_TYPE_LABELS, u as MEMBER_ROLE_LABELS, l as PROGRAM_LEVEL_LABELS, f as SESSION_TYPE_LABELS, s as SPORT_ICONS, c as SPORT_LABELS };
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=domain.js.map
|