@tribe-nest/forge 3.50.0 → 3.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/package.json +2 -2
  2. package/src/data/queries/useCohortEnrolment.ts +87 -0
  3. package/src/data/queries/useMyCourses.ts +42 -0
  4. package/src/data/queries/useWebsiteAgent.ts +2 -0
  5. package/src/i18n/de.json +52 -1
  6. package/src/i18n/en.json +52 -1
  7. package/src/index.ts +2 -0
  8. package/src/types/models.ts +20 -0
  9. package/src/ui/headless/agent/_tests/pathExclusion.spec.ts +52 -0
  10. package/src/ui/headless/agent/_tests/useCurrentPath.spec.tsx +54 -0
  11. package/src/ui/headless/agent/pathExclusion.ts +53 -0
  12. package/src/ui/headless/agent/useAiAgent.ts +10 -1
  13. package/src/ui/headless/agent/useCurrentPath.ts +49 -0
  14. package/src/ui/headless/cohort/useCohortCheckout.ts +180 -0
  15. package/src/ui/index.ts +7 -0
  16. package/src/ui/styled/AccountDashboard.tsx +102 -1
  17. package/src/ui/styled/AiAgentWidget.tsx +3 -2
  18. package/src/ui/styled/BlogPost.tsx +1 -1
  19. package/src/ui/styled/ChatRoom.tsx +2 -2
  20. package/src/ui/styled/Checkout.tsx +125 -125
  21. package/src/ui/styled/CoachingBooking.tsx +1 -1
  22. package/src/ui/styled/CoachingDetail.tsx +4 -4
  23. package/src/ui/styled/CohortCheckout.tsx +450 -0
  24. package/src/ui/styled/CohortConfirmation.tsx +259 -0
  25. package/src/ui/styled/CohortPage.tsx +16 -0
  26. package/src/ui/styled/CourseDetail.tsx +4 -4
  27. package/src/ui/styled/EventDetail.tsx +4 -4
  28. package/src/ui/styled/PaystackPayButton.tsx +1 -1
  29. package/src/ui/styled/PodcastEpisode.tsx +1 -1
  30. package/src/ui/styled/ProductDetail.tsx +4 -4
  31. package/src/ui/styled/_tests/CohortCheckout.spec.tsx +232 -0
  32. package/src/ui/styled/_tests/packagedCssIsCurrent.spec.ts +43 -0
  33. package/src/ui/styled/_tests/utilityPrefix.spec.ts +156 -0
  34. package/src/ui/styled/broadcast/BroadcastMoqStage.tsx +1 -1
  35. package/src/ui/styled/chat/ChatThreadPanel.tsx +1 -1
  36. package/src/ui/styled/forge-utilities.css +463 -731
  37. package/src/ui/styled/members/MemberCallsCalendar.tsx +2 -2
  38. package/src/ui/styled/members/MemberHomeLayout.tsx +4 -4
  39. package/src/ui/styled/members/MemberPostsFeed.tsx +1 -1
  40. package/src/ui/styled/members/PostCollectionsGrid.tsx +1 -1
  41. package/src/ui/styled/musicLinkStyles.tsx +4 -4
@@ -171,7 +171,7 @@ export function MemberCallsCalendar({
171
171
  (below). Both open the same details modal on tap. `minmax(0, 1fr)`
172
172
  rather than `1fr` so a long title in a cell cannot force the grid
173
173
  wider than its container. */}
174
- <div className="hidden sm:block">
174
+ <div className="fg:hidden fg:sm:block">
175
175
  <div style={{ display: "grid", gridTemplateColumns: "repeat(7, minmax(0, 1fr))", gap: 4 }}>
176
176
  {WEEKDAYS.map((day) => (
177
177
  <div key={day} style={{ fontSize: 11, fontWeight: 700, color: t.muted, padding: "4px 6px" }}>
@@ -232,7 +232,7 @@ export function MemberCallsCalendar({
232
232
  {/* The phone face: an agenda, not a grid. A vertical list cannot overflow
233
233
  a narrow screen sideways, and every row is a comfortable tap target
234
234
  that opens the same details modal. Only days WITH a call appear. */}
235
- <div className="sm:hidden">
235
+ <div className="fg:sm:hidden">
236
236
  <div style={{ display: "flex", flexDirection: "column", gap: 12 }}>
237
237
  {calendar.days
238
238
  .filter((day) => day.inMonth && day.calls.length > 0)
@@ -66,13 +66,13 @@ export function MemberHomeLayout({
66
66
 
67
67
  return (
68
68
  <div
69
- className={`flex w-full flex-col lg:flex-row lg:items-start lg:gap-8 ${className ?? ""}`}
69
+ className={`fg:flex fg:w-full fg:flex-col fg:lg:flex-row fg:lg:items-start fg:lg:gap-8 ${className ?? ""}`}
70
70
  style={{ color: t.text, fontFamily: t.fontFamily, ...style }}
71
71
  >
72
72
  {/* Top tab bar — small screens (horizontally scrollable, no burger). */}
73
73
  <nav
74
74
  aria-label="Member home"
75
- className="flex w-full gap-1 overflow-x-auto lg:hidden"
75
+ className="fg:flex fg:w-full fg:gap-1 fg:overflow-x-auto fg:lg:hidden"
76
76
  style={{ borderBottom: `1px solid ${t.border}`, paddingBottom: 8, marginBottom: 16 }}
77
77
  >
78
78
  {isReady ? visibleItems.map(renderItem) : null}
@@ -81,7 +81,7 @@ export function MemberHomeLayout({
81
81
  {/* Side nav — lg and up. */}
82
82
  <nav
83
83
  aria-label="Member home"
84
- className="sticky top-4 hidden w-52 shrink-0 flex-col gap-1 lg:flex"
84
+ className="fg:sticky fg:top-4 fg:hidden fg:w-52 fg:shrink-0 fg:flex-col fg:gap-1 fg:lg:flex"
85
85
  style={{
86
86
  border: `1px solid ${t.border}`,
87
87
  borderRadius: t.cornerRadius,
@@ -92,7 +92,7 @@ export function MemberHomeLayout({
92
92
  {isReady ? visibleItems.map(renderItem) : null}
93
93
  </nav>
94
94
 
95
- <main className="min-w-0 w-full flex-1">{children}</main>
95
+ <main className="fg:min-w-0 fg:w-full fg:flex-1">{children}</main>
96
96
  </div>
97
97
  );
98
98
  }
@@ -114,7 +114,7 @@ export function MemberPostsFeed({
114
114
  </div>
115
115
 
116
116
  {/* Filters: type chips + tier select + saved toggle */}
117
- <div className="flex flex-wrap items-center gap-2">
117
+ <div className="fg:flex fg:flex-wrap fg:items-center fg:gap-2">
118
118
  {chip("All", !feed.type && !feed.savedOnly, () => {
119
119
  feed.setType("");
120
120
  feed.setSavedOnly(false);
@@ -97,7 +97,7 @@ export function PostCollectionsGrid({
97
97
  {list.hasActiveFilters ? "No collections found matching your filters" : "No collections yet"}
98
98
  </p>
99
99
  ) : (
100
- <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
100
+ <div className="fg:grid fg:grid-cols-1 fg:gap-4 fg:sm:grid-cols-2">
101
101
  {list.collections.map((collection) => (
102
102
  <CollectionCard
103
103
  key={collection.id}
@@ -153,7 +153,7 @@ const anchorProps = (platform: string, url: string, onClick: LayoutParts["onDest
153
153
  function ServiceRows({ parts, surface }: { parts: LayoutParts; surface: string }) {
154
154
  const { t, destinations, metaFor, onDestinationClick } = parts;
155
155
  return (
156
- <div className="tn-ml-rows" style={{ width: "100%", display: "flex", flexDirection: "column", gap: 10 }}>
156
+ <div className="fg:tn-ml-rows" style={{ width: "100%", display: "flex", flexDirection: "column", gap: 10 }}>
157
157
  {destinations.map((d) => {
158
158
  const meta = metaFor(d.platform);
159
159
  return (
@@ -415,11 +415,11 @@ function SplitLayout({ parts }: { parts: LayoutParts }) {
415
415
  return (
416
416
  <>
417
417
  <style>{SPLIT_CSS}</style>
418
- <div className="tn-ml-split" style={column(430)}>
419
- <div className="tn-ml-split-art" style={{ display: "flex", justifyContent: "center", width: "100%" }}>
418
+ <div className="fg:tn-ml-split" style={column(430)}>
419
+ <div className="fg:tn-ml-split-art" style={{ display: "flex", justifyContent: "center", width: "100%" }}>
420
420
  {parts.artwork(250)}
421
421
  </div>
422
- <div className="tn-ml-split-text" style={{ width: "100%", display: "flex", flexDirection: "column" }}>
422
+ <div className="fg:tn-ml-split-text" style={{ width: "100%", display: "flex", flexDirection: "column" }}>
423
423
  <Heading parts={parts} align="left" size={27} />
424
424
  <ListHeading parts={parts} />
425
425
  <ServiceRows parts={parts} surface={parts.t.surface} />