@fluid-app/portal-sdk 0.1.319 → 0.1.321

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 (69) hide show
  1. package/dist/{AddressAutocompleteInput-8xNYPEV4.cjs → AddressAutocompleteInput-CQLCLiwR.cjs} +2 -2
  2. package/dist/{AddressAutocompleteInput-8xNYPEV4.cjs.map → AddressAutocompleteInput-CQLCLiwR.cjs.map} +1 -1
  3. package/dist/{AddressAutocompleteInput-ZW2jxW38.mjs → AddressAutocompleteInput-PJBI9E5E.mjs} +2 -2
  4. package/dist/{AddressAutocompleteInput-ZW2jxW38.mjs.map → AddressAutocompleteInput-PJBI9E5E.mjs.map} +1 -1
  5. package/dist/{CalendarWidget-DiwCPlG4.cjs → CalendarWidget-BMAo4qi6.cjs} +188 -65
  6. package/dist/CalendarWidget-BMAo4qi6.cjs.map +1 -0
  7. package/dist/{CalendarWidget-DSEvJxob.mjs → CalendarWidget-BntrqUnu.mjs} +190 -67
  8. package/dist/CalendarWidget-BntrqUnu.mjs.map +1 -0
  9. package/dist/{FluidProvider-DpVglTUh.cjs → FluidProvider-BIeO1i4r.cjs} +13 -12
  10. package/dist/{FluidProvider-DpVglTUh.cjs.map → FluidProvider-BIeO1i4r.cjs.map} +1 -1
  11. package/dist/{FluidProvider-D62CrRD0.mjs → FluidProvider-LqejfvZ-.mjs} +13 -12
  12. package/dist/{FluidProvider-D62CrRD0.mjs.map → FluidProvider-LqejfvZ-.mjs.map} +1 -1
  13. package/dist/{MessagingScreen-CM1DXem2.cjs → MessagingScreen-BBkqLkcx.cjs} +2 -2
  14. package/dist/{MessagingScreen-CM1DXem2.cjs.map → MessagingScreen-BBkqLkcx.cjs.map} +1 -1
  15. package/dist/{MessagingScreen-DgaDi9MP.mjs → MessagingScreen-BRcAo9ux.mjs} +2 -2
  16. package/dist/{MessagingScreen-DgaDi9MP.mjs.map → MessagingScreen-BRcAo9ux.mjs.map} +1 -1
  17. package/dist/{MessagingScreen-swUDyQ52.cjs → MessagingScreen-CQNNI4RN.cjs} +5 -5
  18. package/dist/{MessagingScreen-B6A7ty2W.mjs → MessagingScreen-y3AG96Gi.mjs} +5 -5
  19. package/dist/{OrdersScreen-D481tUw-.cjs → OrdersScreen-BgcQi5Re.cjs} +5 -5
  20. package/dist/{OrdersScreen-CtGV7N9D.cjs → OrdersScreen-CZIlrF_M.cjs} +2 -2
  21. package/dist/{OrdersScreen-CtGV7N9D.cjs.map → OrdersScreen-CZIlrF_M.cjs.map} +1 -1
  22. package/dist/{OrdersScreen-CCBd5QUO.mjs → OrdersScreen-DISwVljS.mjs} +5 -6
  23. package/dist/{OrdersScreen-DOOTETom.mjs → OrdersScreen-Do7YtBiu.mjs} +2 -2
  24. package/dist/{OrdersScreen-DOOTETom.mjs.map → OrdersScreen-Do7YtBiu.mjs.map} +1 -1
  25. package/dist/{ProfileScreen-C--2UZ7s.mjs → ProfileScreen-C7scpZZH.mjs} +3 -3
  26. package/dist/{ProfileScreen-C--2UZ7s.mjs.map → ProfileScreen-C7scpZZH.mjs.map} +1 -1
  27. package/dist/{ProfileScreen-Bu_yFgv0.cjs → ProfileScreen-C9aqx1sO.cjs} +6 -6
  28. package/dist/{ProfileScreen-ZfGyRNtC.cjs → ProfileScreen-DyLQihOW.cjs} +3 -3
  29. package/dist/{ProfileScreen-ZfGyRNtC.cjs.map → ProfileScreen-DyLQihOW.cjs.map} +1 -1
  30. package/dist/{ProfileScreen-OA_67XsY.mjs → ProfileScreen-imlOJIjC.mjs} +6 -6
  31. package/dist/{SearchSort-DwJt03by.mjs → SearchSort-BeYMXXIi.mjs} +90 -85
  32. package/dist/SearchSort-BeYMXXIi.mjs.map +1 -0
  33. package/dist/{SearchSort-CJawuuXz.cjs → SearchSort-Bi9QWJQQ.cjs} +90 -85
  34. package/dist/SearchSort-Bi9QWJQQ.cjs.map +1 -0
  35. package/dist/{ShareablesScreen-DOc_ZAI-.mjs → ShareablesScreen-BFQDn8Kt.mjs} +2 -2
  36. package/dist/{ShareablesScreen-DOc_ZAI-.mjs.map → ShareablesScreen-BFQDn8Kt.mjs.map} +1 -1
  37. package/dist/{ShareablesScreen-BTWfEL6_.mjs → ShareablesScreen-Bex7UIm5.mjs} +2 -3
  38. package/dist/{ShareablesScreen-CAkzv2_g.cjs → ShareablesScreen-D91gLWOB.cjs} +2 -2
  39. package/dist/{ShareablesScreen-BasjkQFL.cjs → ShareablesScreen-HHPFsN7t.cjs} +2 -2
  40. package/dist/{ShareablesScreen-BasjkQFL.cjs.map → ShareablesScreen-HHPFsN7t.cjs.map} +1 -1
  41. package/dist/{ShopScreen-BtR7eLiA.mjs → ShopScreen-C4vXayCp.mjs} +5 -6
  42. package/dist/{ShopScreen-X6vXRU0S.cjs → ShopScreen-CjrEStJc.cjs} +14 -14
  43. package/dist/ShopScreen-CjrEStJc.cjs.map +1 -0
  44. package/dist/{ShopScreen-CIHI2pDv.cjs → ShopScreen-DM9jxl3w.cjs} +5 -5
  45. package/dist/{ShopScreen-CNs3L1-h.mjs → ShopScreen-uOMi-jFD.mjs} +14 -14
  46. package/dist/ShopScreen-uOMi-jFD.mjs.map +1 -0
  47. package/dist/{ShopWidget-BUdYOcxc.cjs → ShopWidget-B56mIngl.cjs} +2 -2
  48. package/dist/{ShopWidget-CAmy3cDU.mjs → ShopWidget-BKTYcwx_.mjs} +5 -5
  49. package/dist/ShopWidget-BKTYcwx_.mjs.map +1 -0
  50. package/dist/{ShopWidget-mx04X_Wx.cjs → ShopWidget-BRx2rblg.cjs} +5 -5
  51. package/dist/{ShopWidget-CAmy3cDU.mjs.map → ShopWidget-BRx2rblg.cjs.map} +1 -1
  52. package/dist/{SubscriptionsScreen-C4bbVgDF.cjs → SubscriptionsScreen-B3kKkAuA.cjs} +6 -6
  53. package/dist/{SubscriptionsScreen-BmR904m_.mjs → SubscriptionsScreen-BP-sSa__.mjs} +6 -7
  54. package/dist/{SubscriptionsScreen-D5xpwRXs.mjs → SubscriptionsScreen-CQ3L8wDE.mjs} +3 -3
  55. package/dist/{SubscriptionsScreen-D5xpwRXs.mjs.map → SubscriptionsScreen-CQ3L8wDE.mjs.map} +1 -1
  56. package/dist/{SubscriptionsScreen-D0_MX34N.cjs → SubscriptionsScreen-D0BtuCfM.cjs} +3 -3
  57. package/dist/{SubscriptionsScreen-D0_MX34N.cjs.map → SubscriptionsScreen-D0BtuCfM.cjs.map} +1 -1
  58. package/dist/index.cjs +23 -23
  59. package/dist/index.d.cts.map +1 -1
  60. package/dist/index.d.mts.map +1 -1
  61. package/dist/index.mjs +23 -23
  62. package/package.json +11 -11
  63. package/dist/CalendarWidget-DSEvJxob.mjs.map +0 -1
  64. package/dist/CalendarWidget-DiwCPlG4.cjs.map +0 -1
  65. package/dist/SearchSort-CJawuuXz.cjs.map +0 -1
  66. package/dist/SearchSort-DwJt03by.mjs.map +0 -1
  67. package/dist/ShopScreen-CNs3L1-h.mjs.map +0 -1
  68. package/dist/ShopScreen-X6vXRU0S.cjs.map +0 -1
  69. package/dist/ShopWidget-mx04X_Wx.cjs.map +0 -1
@@ -5,8 +5,8 @@ import { l as getColorField, m as getPaddingField, o as getBorderRadiusField, u
5
5
  import { t as useWidgetPreviewContext } from "./preview-context-CDnhakni.mjs";
6
6
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
7
7
  import { useQuery } from "@tanstack/react-query";
8
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
- import { CalendarCheck, ChevronLeft, ChevronRight, ChevronsDown, ChevronsUp, MapPin } from "lucide-react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { Calendar, CalendarCheck, ChevronLeft, ChevronRight, ChevronsDown, ChevronsUp, Link2, MapPin } from "lucide-react";
10
10
  //#region ../widgets/src/hooks/use-calendar-events.preview.ts
11
11
  const today = /* @__PURE__ */ new Date();
12
12
  const inTwoDays = new Date(today);
@@ -128,10 +128,6 @@ const generateWeekGrid = () => {
128
128
  };
129
129
  });
130
130
  };
131
- const formatTime = (iso) => new Date(iso).toLocaleTimeString("en-US", {
132
- hour: "numeric",
133
- minute: "2-digit"
134
- });
135
131
  const formatContextualDate = (date) => {
136
132
  const d = diffDays(date, /* @__PURE__ */ new Date());
137
133
  const weekday = date.toLocaleDateString("en-US", { weekday: "short" });
@@ -181,46 +177,170 @@ function DayCellButton({ date, isToday, isSelected, eventCount, accentColor, tex
181
177
  })]
182
178
  });
183
179
  }
180
+ const safeTimeZone = (tz) => {
181
+ if (!tz) return void 0;
182
+ try {
183
+ new Intl.DateTimeFormat(void 0, { timeZone: tz });
184
+ return tz;
185
+ } catch {
186
+ return;
187
+ }
188
+ };
189
+ const formatLongDateTime = (iso, timeZone) => {
190
+ const d = new Date(iso);
191
+ const tz = safeTimeZone(timeZone);
192
+ return `${d.toLocaleDateString("en-US", {
193
+ month: "short",
194
+ day: "numeric",
195
+ year: "numeric",
196
+ timeZone: tz
197
+ })} at ${d.toLocaleTimeString("en-US", {
198
+ hour: "numeric",
199
+ minute: "2-digit",
200
+ timeZoneName: "short",
201
+ timeZone: tz
202
+ })}`;
203
+ };
204
+ const formatLongDate = (iso, timeZone) => {
205
+ return new Date(iso).toLocaleDateString("en-US", {
206
+ month: "short",
207
+ day: "numeric",
208
+ year: "numeric",
209
+ timeZone: safeTimeZone(timeZone)
210
+ });
211
+ };
212
+ const isSafeHttpUrl = (url) => {
213
+ try {
214
+ const parsed = new URL(url);
215
+ return parsed.protocol === "http:" || parsed.protocol === "https:";
216
+ } catch {
217
+ return false;
218
+ }
219
+ };
220
+ const deriveEventStatus = (event) => {
221
+ const rawStatus = event.status?.trim();
222
+ const normalized = rawStatus?.toLowerCase();
223
+ if (rawStatus && normalized !== "active" && normalized !== "confirmed") return {
224
+ label: rawStatus.charAt(0).toUpperCase() + rawStatus.slice(1).toLowerCase(),
225
+ tone: "past"
226
+ };
227
+ const startMs = new Date(event.start).getTime();
228
+ const endMs = new Date(event.end).getTime();
229
+ const now = Date.now();
230
+ if (now < startMs) return {
231
+ label: "Upcoming",
232
+ tone: "upcoming"
233
+ };
234
+ if (now <= endMs) return {
235
+ label: "Live",
236
+ tone: "live"
237
+ };
238
+ return {
239
+ label: "Past",
240
+ tone: "past"
241
+ };
242
+ };
184
243
  function EventCard({ event, accentColor, textColor }) {
185
244
  const accentVar = `var(--color-${accentColor})`;
186
245
  const barColor = event.color || accentVar;
187
- const timeText = event.isAllDay ? "All day" : `${formatTime(event.start)} – ${formatTime(event.end)}`;
188
- const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
189
- "aria-hidden": "true",
190
- className: "w-[2px] shrink-0 self-stretch rounded-full",
191
- style: { backgroundColor: barColor }
192
- }), /* @__PURE__ */ jsxs("div", {
193
- className: "min-w-0 flex-1",
246
+ const startDate = new Date(event.start);
247
+ const eventTz = safeTimeZone(event.timeZone);
248
+ const weekday = startDate.toLocaleDateString("en-US", {
249
+ weekday: "short",
250
+ timeZone: eventTz
251
+ });
252
+ const monthDay = startDate.toLocaleDateString("en-US", {
253
+ month: "short",
254
+ day: "numeric",
255
+ timeZone: eventTz
256
+ });
257
+ const status = deriveEventStatus(event);
258
+ const description = event.description?.body;
259
+ const startDisplay = event.isAllDay ? formatLongDate(event.start, event.timeZone ?? null) : formatLongDateTime(event.start, event.timeZone ?? null);
260
+ const endDisplay = event.isAllDay ? formatLongDate(event.end, event.timeZone ?? null) : formatLongDateTime(event.end, event.timeZone ?? null);
261
+ const statusToneClasses = status.tone === "live" ? `bg-${accentColor}/15 text-${accentColor}` : status.tone === "upcoming" ? `bg-${accentColor}/10 text-${accentColor}` : `bg-${textColor}/10 text-${textColor}/60`;
262
+ return /* @__PURE__ */ jsxs("article", {
263
+ className: `relative overflow-hidden rounded-lg border border-${textColor}/10`,
194
264
  children: [
195
- /* @__PURE__ */ jsx("div", {
196
- className: `truncate text-sm font-semibold text-${textColor} leading-tight`,
197
- children: event.title
265
+ /* @__PURE__ */ jsx("span", {
266
+ "aria-hidden": "true",
267
+ className: "absolute inset-y-0 left-0 w-[3px]",
268
+ style: { backgroundColor: barColor }
198
269
  }),
199
- /* @__PURE__ */ jsx("div", {
200
- className: `mt-1 text-[11px] tabular-nums text-${textColor}/60 font-medium`,
201
- children: timeText
270
+ event.imageUrl && /* @__PURE__ */ jsx("img", {
271
+ src: event.imageUrl,
272
+ alt: "",
273
+ className: "aspect-[16/7] w-full object-cover"
202
274
  }),
203
- event.venue && /* @__PURE__ */ jsxs("div", {
204
- className: `mt-1.5 flex items-center gap-1 text-[11px] text-${textColor}/55`,
205
- children: [/* @__PURE__ */ jsx(MapPin, { className: "size-2.5 shrink-0" }), /* @__PURE__ */ jsx("span", {
206
- className: "truncate",
207
- children: event.venue
275
+ /* @__PURE__ */ jsxs("div", {
276
+ className: "flex flex-col gap-4 p-4 pl-5",
277
+ children: [/* @__PURE__ */ jsxs("div", {
278
+ className: "flex items-start gap-4",
279
+ children: [/* @__PURE__ */ jsxs("div", {
280
+ className: `shrink-0 text-${textColor} leading-tight tabular-nums`,
281
+ children: [/* @__PURE__ */ jsx("div", {
282
+ className: `text-xs font-semibold text-${textColor}/55`,
283
+ children: weekday
284
+ }), /* @__PURE__ */ jsx("div", {
285
+ className: "text-2xl font-bold tracking-[-0.015em]",
286
+ children: monthDay
287
+ })]
288
+ }), /* @__PURE__ */ jsxs("div", {
289
+ className: "min-w-0 flex-1",
290
+ children: [/* @__PURE__ */ jsx("h4", {
291
+ className: `text-base font-bold text-${textColor} leading-tight tracking-[-0.01em]`,
292
+ children: event.title
293
+ }), description && /* @__PURE__ */ jsx("p", {
294
+ className: `mt-1 text-sm leading-snug whitespace-pre-wrap text-${textColor}/65`,
295
+ children: description
296
+ })]
297
+ })]
298
+ }), /* @__PURE__ */ jsxs("div", {
299
+ className: "flex flex-col gap-2.5",
300
+ children: [
301
+ /* @__PURE__ */ jsxs("div", {
302
+ className: "flex items-start gap-2",
303
+ children: [/* @__PURE__ */ jsx(Calendar, { className: `mt-0.5 size-4 shrink-0 text-${textColor}/55` }), /* @__PURE__ */ jsxs("div", {
304
+ className: `text-sm leading-snug text-${textColor}/80 tabular-nums`,
305
+ children: [/* @__PURE__ */ jsxs("div", { children: [
306
+ /* @__PURE__ */ jsx("span", {
307
+ className: "font-semibold",
308
+ children: "Start"
309
+ }),
310
+ " ",
311
+ startDisplay
312
+ ] }), /* @__PURE__ */ jsxs("div", { children: [
313
+ /* @__PURE__ */ jsx("span", {
314
+ className: "font-semibold",
315
+ children: "End"
316
+ }),
317
+ " ",
318
+ endDisplay
319
+ ] })]
320
+ })]
321
+ }),
322
+ /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("span", {
323
+ className: `inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold ${statusToneClasses}`,
324
+ children: status.label
325
+ }) }),
326
+ event.url && isSafeHttpUrl(event.url) && /* @__PURE__ */ jsxs("a", {
327
+ href: event.url,
328
+ target: "_blank",
329
+ rel: "noopener noreferrer",
330
+ className: `flex items-center gap-2 text-sm text-${accentColor} break-all hover:underline`,
331
+ children: [/* @__PURE__ */ jsx(Link2, { className: `size-4 shrink-0 text-${textColor}/55` }), /* @__PURE__ */ jsx("span", { children: event.url })]
332
+ }),
333
+ event.venue && /* @__PURE__ */ jsxs("a", {
334
+ href: `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(event.venue)}`,
335
+ target: "_blank",
336
+ rel: "noopener noreferrer",
337
+ className: `flex items-start gap-2 text-sm text-${accentColor} hover:underline`,
338
+ children: [/* @__PURE__ */ jsx(MapPin, { className: `mt-0.5 size-4 shrink-0 text-${textColor}/55` }), /* @__PURE__ */ jsx("span", { children: event.venue })]
339
+ })
340
+ ]
208
341
  })]
209
342
  })
210
343
  ]
211
- })] });
212
- const wrapperClasses = `group flex gap-x-2 rounded-md px-2 py-2 transition-colors -mx-2`;
213
- const interactiveClasses = `hover:bg-${accentColor}/5`;
214
- if (event.url) return /* @__PURE__ */ jsx("a", {
215
- href: event.url,
216
- target: "_blank",
217
- rel: "noopener noreferrer",
218
- className: `${wrapperClasses} ${interactiveClasses}`,
219
- children: content
220
- });
221
- return /* @__PURE__ */ jsx("div", {
222
- className: wrapperClasses,
223
- children: content
224
344
  });
225
345
  }
226
346
  function NavButton({ icon: Icon, label, variant, accentColor, textColor, onClick }) {
@@ -458,37 +578,40 @@ function CalendarWidget({ titleEnabled = true, titleText = "Calendar", titleFont
458
578
  ]
459
579
  })
460
580
  ]
461
- }), /* @__PURE__ */ jsxs("div", {
462
- className: `mt-4 border-${textColor}/10 @md:mt-0 @md:w-56 @md:border-l @md:pl-6`,
463
- children: [contextualDate && /* @__PURE__ */ jsxs("div", {
464
- className: "mb-3",
465
- children: [contextualDate.lead && /* @__PURE__ */ jsx("div", {
466
- className: `text-[10px] font-bold tracking-[0.16em] uppercase text-${accentColor}`,
467
- children: contextualDate.lead
581
+ }), /* @__PURE__ */ jsx("div", {
582
+ className: `mt-4 min-w-0 border-${textColor}/10 @md:relative @md:mt-0 @md:flex-1 @md:border-l`,
583
+ children: /* @__PURE__ */ jsxs("div", {
584
+ className: "@md:absolute @md:inset-0 @md:overflow-y-auto @md:pr-1 @md:pl-6",
585
+ children: [contextualDate && /* @__PURE__ */ jsxs("div", {
586
+ className: "mb-3",
587
+ children: [contextualDate.lead && /* @__PURE__ */ jsx("div", {
588
+ className: `text-[10px] font-bold tracking-[0.16em] uppercase text-${accentColor}`,
589
+ children: contextualDate.lead
590
+ }), /* @__PURE__ */ jsx("div", {
591
+ className: `text-sm font-semibold text-${textColor} tabular-nums`,
592
+ children: contextualDate.detail
593
+ })]
468
594
  }), /* @__PURE__ */ jsx("div", {
469
- className: `text-sm font-semibold text-${textColor} tabular-nums`,
470
- children: contextualDate.detail
471
- })]
472
- }), /* @__PURE__ */ jsx("div", {
473
- className: "animate-in fade-in slide-in-from-bottom-2 flex flex-col duration-200 ease-out",
474
- children: selectedDateEvents.length > 0 ? selectedDateEvents.map((event, idx) => /* @__PURE__ */ jsx(EventCard, {
475
- event,
476
- accentColor,
477
- textColor
478
- }, `${event.id}-${idx}`)) : /* @__PURE__ */ jsxs("div", {
479
- className: `flex flex-col items-start gap-1 rounded-md border border-dashed border-${textColor}/15 px-3 py-3`,
480
- children: [/* @__PURE__ */ jsxs("div", {
481
- className: "flex items-center gap-1.5",
482
- children: [/* @__PURE__ */ jsx(CalendarCheck, { className: `size-3 text-${textColor}/40` }), /* @__PURE__ */ jsx("span", {
483
- className: `text-[11px] font-semibold text-${textColor}/60`,
484
- children: "Nothing scheduled"
595
+ className: "animate-in fade-in slide-in-from-bottom-2 flex flex-col gap-3 duration-200 ease-out",
596
+ children: selectedDateEvents.length > 0 ? selectedDateEvents.map((event, idx) => /* @__PURE__ */ jsx(EventCard, {
597
+ event,
598
+ accentColor,
599
+ textColor
600
+ }, `${event.id}-${idx}`)) : /* @__PURE__ */ jsxs("div", {
601
+ className: `flex flex-col items-start gap-1 rounded-md border border-dashed border-${textColor}/15 px-3 py-3`,
602
+ children: [/* @__PURE__ */ jsxs("div", {
603
+ className: "flex items-center gap-1.5",
604
+ children: [/* @__PURE__ */ jsx(CalendarCheck, { className: `size-3 text-${textColor}/40` }), /* @__PURE__ */ jsx("span", {
605
+ className: `text-[11px] font-semibold text-${textColor}/60`,
606
+ children: "Nothing scheduled"
607
+ })]
608
+ }), /* @__PURE__ */ jsx("span", {
609
+ className: `text-[11px] text-${textColor}/45`,
610
+ children: "Enjoy the breather."
485
611
  })]
486
- }), /* @__PURE__ */ jsx("span", {
487
- className: `text-[11px] text-${textColor}/45`,
488
- children: "Enjoy the breather."
489
- })]
490
- })
491
- }, selectedDate?.toISOString() ?? "none")]
612
+ })
613
+ }, selectedDate?.toISOString() ?? "none")]
614
+ })
492
615
  })]
493
616
  })
494
617
  })]
@@ -628,4 +751,4 @@ const calendarWidgetPropertySchema = {
628
751
  //#endregion
629
752
  export { CalendarWidget_exports as n, calendarWidgetPropertySchema as r, CalendarWidget as t };
630
753
 
631
- //# sourceMappingURL=CalendarWidget-DSEvJxob.mjs.map
754
+ //# sourceMappingURL=CalendarWidget-BntrqUnu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarWidget-BntrqUnu.mjs","names":[],"sources":["../../widgets/src/hooks/use-calendar-events.preview.ts","../../widgets/src/hooks/use-calendar-events.ts","../../widgets/src/widgets/CalendarWidget.tsx"],"sourcesContent":["import type { CalendarEvent } from \"@fluid-app/portal-core/widgets-api-types\";\n\nconst today = new Date();\nconst inTwoDays = new Date(today);\ninTwoDays.setDate(inTwoDays.getDate() + 2);\n\nfunction toISO(date: Date, hours: number, minutes = 0): string {\n const d = new Date(date);\n d.setHours(hours, minutes, 0, 0);\n return d.toISOString();\n}\n\nfunction toDateString(date: Date): string {\n return date.toISOString().split(\"T\")[0]!;\n}\n\nexport const PREVIEW_DATA: CalendarEvent[] = [\n {\n id: 1,\n title: \"Team Strategy Call\",\n start: toISO(today, 9, 0),\n end: toISO(today, 10, 0),\n status: \"active\",\n color: \"#4f46e5\",\n },\n {\n id: 2,\n title: \"Product Launch Webinar\",\n start: toISO(today, 14, 0),\n end: toISO(today, 15, 30),\n status: \"active\",\n color: \"#0891b2\",\n venue: \"Zoom\",\n },\n {\n id: 3,\n title: \"Annual Leadership Summit\",\n start: `${toDateString(inTwoDays)}T00:00:00.000Z`,\n end: `${toDateString(inTwoDays)}T23:59:59.000Z`,\n status: \"active\",\n color: \"#059669\",\n isAllDay: true,\n venue: \"Convention Center\",\n },\n];\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useWidgetsApi } from \"@fluid-app/portal-core/widgets-api-context\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { useDataSourceRegistryConfig } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport { PREVIEW_DATA } from \"./use-calendar-events.preview\";\nimport type { CalendarEvent } from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport type { CalendarEvent } from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport function useCalendarEvents(): UseQueryResult<CalendarEvent[], Error> {\n const widgetsApi = useWidgetsApi();\n const { isPreview } = useWidgetPreviewContext();\n const { baseUrl } = useDataSourceRegistryConfig();\n\n return useQuery({\n queryKey: [\n \"portal-widget-use\",\n \"calendar-events\",\n isPreview ? \"preview\" : baseUrl,\n ] as const,\n queryFn: ({ signal }) => widgetsApi.fetchCalendarEvents(signal),\n enabled: !isPreview,\n ...(isPreview && { placeholderData: PREVIEW_DATA }),\n });\n}\n","import {\n useState,\n useMemo,\n useCallback,\n useRef,\n useEffect,\n type ComponentProps,\n} from \"react\";\nimport type React from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getColorField,\n getFontSizeField,\n getPaddingField,\n} from \"../core/fields\";\nimport {\n useCalendarEvents,\n type CalendarEvent,\n} from \"../hooks/use-calendar-events\";\nimport { ErrorState } from \"../components/error-state\";\nimport {\n Calendar,\n CalendarCheck,\n ChevronLeft,\n ChevronRight,\n ChevronsDown,\n ChevronsUp,\n Link2,\n MapPin,\n type LucideIcon,\n} from \"lucide-react\";\n\nconst DAY_NAMES = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"] as const;\n\nconst getDaysInMonth = (year: number, month: number): number =>\n new Date(year, month + 1, 0).getDate();\n\nconst getFirstDayOfMonth = (year: number, month: number): number =>\n new Date(year, month, 1).getDay();\n\nconst isSameDay = (a: Date, b: Date): boolean =>\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n\nconst startOfDay = (d: Date): Date => {\n const x = new Date(d);\n x.setHours(0, 0, 0, 0);\n return x;\n};\n\nconst addDays = (d: Date, n: number): Date => {\n const x = new Date(d);\n x.setDate(x.getDate() + n);\n return x;\n};\n\nconst diffDays = (a: Date, b: Date): number => {\n const ms = startOfDay(a).getTime() - startOfDay(b).getTime();\n return Math.round(ms / 86400000);\n};\n\ntype DayCell = {\n date: Date | null;\n isToday: boolean;\n isCurrentMonth: boolean;\n};\n\nconst generateMonthGrid = (year: number, month: number): DayCell[] => {\n const daysInMonth = getDaysInMonth(year, month);\n const firstDay = getFirstDayOfMonth(year, month);\n const today = new Date();\n const cells: DayCell[] = [];\n\n for (let i = 0; i < firstDay; i++) {\n cells.push({ date: null, isToday: false, isCurrentMonth: false });\n }\n\n for (let day = 1; day <= daysInMonth; day++) {\n const date = new Date(year, month, day);\n cells.push({\n date,\n isToday: isSameDay(date, today),\n isCurrentMonth: true,\n });\n }\n\n return cells;\n};\n\nconst generateWeekGrid = (): Array<{ date: Date; isToday: boolean }> => {\n const today = new Date();\n const weekday = today.getDay();\n return Array.from({ length: 7 }, (_, i) => {\n const date = addDays(today, -weekday + i);\n return { date, isToday: isSameDay(date, today) };\n });\n};\n\nconst formatContextualDate = (\n date: Date,\n): { lead: string | null; detail: string } => {\n const today = new Date();\n const d = diffDays(date, today);\n const weekday = date.toLocaleDateString(\"en-US\", { weekday: \"short\" });\n const monthDay = date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n if (d === 0) return { lead: \"Today\", detail: `${weekday}, ${monthDay}` };\n if (d === 1) return { lead: \"Tomorrow\", detail: `${weekday}, ${monthDay}` };\n if (d === -1) return { lead: \"Yesterday\", detail: `${weekday}, ${monthDay}` };\n return { lead: null, detail: `${weekday}, ${monthDay}` };\n};\n\ntype DayCellButtonProps = {\n date: Date;\n isToday: boolean;\n isSelected: boolean;\n eventCount: number;\n accentColor: ColorOptions;\n textColor: ColorOptions;\n showEventDensity: boolean;\n onClick: () => void;\n};\n\nfunction DayCellButton({\n date,\n isToday,\n isSelected,\n eventCount,\n accentColor,\n textColor,\n showEventDensity,\n onClick,\n}: DayCellButtonProps) {\n const dotCount = showEventDensity\n ? Math.min(eventCount, 3)\n : eventCount > 0\n ? 1\n : 0;\n\n const baseClasses =\n \"group relative flex aspect-square w-full flex-col items-center justify-center rounded-lg text-sm tabular-nums transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-0\";\n\n const stateClasses = isSelected\n ? `bg-${accentColor} text-${accentColor}-foreground focus-visible:ring-${accentColor}/40`\n : isToday\n ? `bg-${accentColor}/10 text-${accentColor} font-semibold hover:bg-${accentColor}/20 focus-visible:ring-${accentColor}/40`\n : `text-${textColor} hover:bg-${accentColor}/10 focus-visible:ring-${accentColor}/40`;\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={date.toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n })}\n aria-current={isToday ? \"date\" : undefined}\n aria-pressed={isSelected}\n className={`${baseClasses} ${stateClasses}`}\n >\n <span className=\"leading-none\">{date.getDate()}</span>\n {dotCount > 0 && (\n <span\n aria-hidden=\"true\"\n className=\"absolute bottom-1.5 flex items-center gap-[2px]\"\n >\n {Array.from({ length: dotCount }).map((_, i) => (\n <span\n key={i}\n className={`size-1 rounded-full ${\n isSelected\n ? `bg-${accentColor}-foreground/70`\n : `bg-${accentColor}`\n }`}\n />\n ))}\n </span>\n )}\n </button>\n );\n}\n\ntype EventCardProps = {\n event: CalendarEvent;\n accentColor: ColorOptions;\n textColor: ColorOptions;\n};\n\nconst safeTimeZone = (tz: string | null | undefined): string | undefined => {\n if (!tz) return undefined;\n try {\n new Intl.DateTimeFormat(undefined, { timeZone: tz });\n return tz;\n } catch {\n return undefined;\n }\n};\n\nconst formatLongDateTime = (iso: string, timeZone: string | null): string => {\n const d = new Date(iso);\n const tz = safeTimeZone(timeZone);\n const datePart = d.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n timeZone: tz,\n });\n const timePart = d.toLocaleTimeString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZoneName: \"short\",\n timeZone: tz,\n });\n return `${datePart} at ${timePart}`;\n};\n\nconst formatLongDate = (iso: string, timeZone: string | null): string => {\n return new Date(iso).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n timeZone: safeTimeZone(timeZone),\n });\n};\n\nconst isSafeHttpUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst deriveEventStatus = (\n event: CalendarEvent,\n): { label: string; tone: \"upcoming\" | \"live\" | \"past\" } => {\n const rawStatus = event.status?.trim();\n const normalized = rawStatus?.toLowerCase();\n if (rawStatus && normalized !== \"active\" && normalized !== \"confirmed\") {\n const label =\n rawStatus.charAt(0).toUpperCase() + rawStatus.slice(1).toLowerCase();\n return { label, tone: \"past\" };\n }\n const startMs = new Date(event.start).getTime();\n const endMs = new Date(event.end).getTime();\n const now = Date.now();\n if (now < startMs) return { label: \"Upcoming\", tone: \"upcoming\" };\n if (now <= endMs) return { label: \"Live\", tone: \"live\" };\n return { label: \"Past\", tone: \"past\" };\n};\n\nfunction EventCard({ event, accentColor, textColor }: EventCardProps) {\n const accentVar = `var(--color-${accentColor})`;\n const barColor = event.color || accentVar;\n const startDate = new Date(event.start);\n const eventTz = safeTimeZone(event.timeZone);\n const weekday = startDate.toLocaleDateString(\"en-US\", {\n weekday: \"short\",\n timeZone: eventTz,\n });\n const monthDay = startDate.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n timeZone: eventTz,\n });\n const status = deriveEventStatus(event);\n const description = event.description?.body;\n\n const startDisplay = event.isAllDay\n ? formatLongDate(event.start, event.timeZone ?? null)\n : formatLongDateTime(event.start, event.timeZone ?? null);\n const endDisplay = event.isAllDay\n ? formatLongDate(event.end, event.timeZone ?? null)\n : formatLongDateTime(event.end, event.timeZone ?? null);\n\n const statusToneClasses =\n status.tone === \"live\"\n ? `bg-${accentColor}/15 text-${accentColor}`\n : status.tone === \"upcoming\"\n ? `bg-${accentColor}/10 text-${accentColor}`\n : `bg-${textColor}/10 text-${textColor}/60`;\n\n return (\n <article\n className={`relative overflow-hidden rounded-lg border border-${textColor}/10`}\n >\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-y-0 left-0 w-[3px]\"\n style={{ backgroundColor: barColor }}\n />\n\n {event.imageUrl && (\n <img\n src={event.imageUrl}\n alt=\"\"\n className=\"aspect-[16/7] w-full object-cover\"\n />\n )}\n\n <div className=\"flex flex-col gap-4 p-4 pl-5\">\n <div className=\"flex items-start gap-4\">\n <div\n className={`shrink-0 text-${textColor} leading-tight tabular-nums`}\n >\n <div className={`text-xs font-semibold text-${textColor}/55`}>\n {weekday}\n </div>\n <div className=\"text-2xl font-bold tracking-[-0.015em]\">\n {monthDay}\n </div>\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <h4\n className={`text-base font-bold text-${textColor} leading-tight tracking-[-0.01em]`}\n >\n {event.title}\n </h4>\n {description && (\n <p\n className={`mt-1 text-sm leading-snug whitespace-pre-wrap text-${textColor}/65`}\n >\n {description}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"flex flex-col gap-2.5\">\n <div className=\"flex items-start gap-2\">\n <Calendar\n className={`mt-0.5 size-4 shrink-0 text-${textColor}/55`}\n />\n <div\n className={`text-sm leading-snug text-${textColor}/80 tabular-nums`}\n >\n <div>\n <span className=\"font-semibold\">Start</span> {startDisplay}\n </div>\n <div>\n <span className=\"font-semibold\">End</span> {endDisplay}\n </div>\n </div>\n </div>\n\n <div>\n <span\n className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold ${statusToneClasses}`}\n >\n {status.label}\n </span>\n </div>\n\n {event.url && isSafeHttpUrl(event.url) && (\n <a\n href={event.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`flex items-center gap-2 text-sm text-${accentColor} break-all hover:underline`}\n >\n <Link2 className={`size-4 shrink-0 text-${textColor}/55`} />\n <span>{event.url}</span>\n </a>\n )}\n\n {event.venue && (\n <a\n href={`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(event.venue)}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`flex items-start gap-2 text-sm text-${accentColor} hover:underline`}\n >\n <MapPin\n className={`mt-0.5 size-4 shrink-0 text-${textColor}/55`}\n />\n <span>{event.venue}</span>\n </a>\n )}\n </div>\n </div>\n </article>\n );\n}\n\ntype NavButtonProps = {\n icon: LucideIcon;\n label: string;\n variant: \"ghost\" | \"accent\";\n accentColor: ColorOptions;\n textColor: ColorOptions;\n onClick: () => void;\n};\n\nfunction NavButton({\n icon: Icon,\n label,\n variant,\n accentColor,\n textColor,\n onClick,\n}: NavButtonProps) {\n const classes =\n variant === \"accent\"\n ? `bg-${accentColor} text-${accentColor}-foreground hover:bg-${accentColor}/90 focus-visible:ring-${accentColor}/40`\n : `bg-${textColor}/5 text-${textColor} hover:bg-${textColor}/10 focus-visible:ring-${textColor}/20`;\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n className={`flex size-8 items-center justify-center rounded-full text-[12px] transition-colors focus:outline-none focus-visible:ring-2 ${classes}`}\n >\n <Icon className=\"size-4\" />\n </button>\n );\n}\n\ntype CalendarView = {\n month: number;\n year: number;\n};\n\nconst getInitialCalendarView = (): CalendarView => {\n const now = new Date();\n return { month: now.getMonth(), year: now.getFullYear() };\n};\n\nfunction useCalendarNavigation(\n setSelectedDate: React.Dispatch<React.SetStateAction<Date | null>>,\n) {\n const [view, setView] = useState(getInitialCalendarView);\n const [gridTransitioning, setGridTransitioning] = useState(false);\n const transitionTimeoutRef = useRef<number | null>(null);\n\n useEffect(\n () => () => {\n if (transitionTimeoutRef.current !== null) {\n window.clearTimeout(transitionTimeoutRef.current);\n }\n },\n [],\n );\n\n const clearPendingTransition = useCallback(() => {\n if (transitionTimeoutRef.current !== null) {\n window.clearTimeout(transitionTimeoutRef.current);\n transitionTimeoutRef.current = null;\n }\n }, []);\n\n const navigate = useCallback(\n (direction: -1 | 1) => {\n clearPendingTransition();\n setGridTransitioning(true);\n transitionTimeoutRef.current = window.setTimeout(() => {\n setView((prev) => {\n const next = prev.month + direction;\n if (next < 0) return { month: 11, year: prev.year - 1 };\n if (next > 11) return { month: 0, year: prev.year + 1 };\n return { month: next, year: prev.year };\n });\n setGridTransitioning(false);\n transitionTimeoutRef.current = null;\n }, 120);\n },\n [clearPendingTransition],\n );\n\n const goToToday = useCallback(() => {\n clearPendingTransition();\n const now = new Date();\n setGridTransitioning(true);\n transitionTimeoutRef.current = window.setTimeout(() => {\n setView({ month: now.getMonth(), year: now.getFullYear() });\n setSelectedDate(now);\n setGridTransitioning(false);\n transitionTimeoutRef.current = null;\n }, 80);\n }, [clearPendingTransition, setSelectedDate]);\n\n return { view, gridTransitioning, navigate, goToToday };\n}\n\nfunction useCalendarEventIndex(\n events: CalendarEvent[],\n selectedDate: Date | null,\n) {\n const eventsByDate = useMemo(() => {\n const map = new Map<string, CalendarEvent[]>();\n for (const event of events) {\n const start = startOfDay(new Date(event.start));\n const end = startOfDay(new Date(event.end));\n for (let cur = start; cur <= end; cur = addDays(cur, 1)) {\n const key = `${cur.getFullYear()}-${cur.getMonth()}-${cur.getDate()}`;\n const list = map.get(key);\n if (list) {\n list.push(event);\n } else {\n map.set(key, [event]);\n }\n }\n }\n return map;\n }, [events]);\n\n const lookupEventsForDate = useCallback(\n (date: Date): CalendarEvent[] => {\n const key = `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`;\n return eventsByDate.get(key) ?? [];\n },\n [eventsByDate],\n );\n\n const selectedDateEvents = useMemo(() => {\n if (!selectedDate) return [];\n return lookupEventsForDate(selectedDate);\n }, [selectedDate, lookupEventsForDate]);\n\n return { lookupEventsForDate, selectedDateEvents };\n}\n\ntype CalendarWidgetProps = ComponentProps<\"div\"> & {\n // Title\n titleEnabled?: boolean;\n titleText?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Styling\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n\n // Premium polish (new, additive)\n showEventDensity?: boolean;\n showTodayButton?: boolean;\n weekendDim?: boolean;\n showYearEyebrow?: boolean;\n};\n\nexport function CalendarWidget({\n titleEnabled = true,\n titleText = \"Calendar\",\n titleFontSize = \"xl\",\n titleColor = \"foreground\",\n\n background = { type: \"solid\", color: \"background\" },\n textColor = \"foreground\",\n accentColor = \"primary\",\n padding = 4,\n borderRadius = \"md\",\n\n showEventDensity = true,\n showTodayButton = true,\n weekendDim = true,\n showYearEyebrow = true,\n\n className,\n ...props\n}: CalendarWidgetProps): React.JSX.Element {\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n const [isCollapsed, setIsCollapsed] = useState(false);\n const [selectedDate, setSelectedDate] = useState<Date | null>(\n () => new Date(),\n );\n const { view, gridTransitioning, navigate, goToToday } =\n useCalendarNavigation(setSelectedDate);\n const currentMonth = view.month;\n const currentYear = view.year;\n\n const { data: events = [], isLoading, isError } = useCalendarEvents();\n\n const monthGrid = useMemo(\n () => generateMonthGrid(currentYear, currentMonth),\n [currentYear, currentMonth],\n );\n const weekGrid = generateWeekGrid();\n const { lookupEventsForDate, selectedDateEvents } = useCalendarEventIndex(\n events,\n selectedDate,\n );\n\n const now = new Date();\n const viewingCurrentMonth =\n currentMonth === now.getMonth() && currentYear === now.getFullYear();\n\n const monthLabel = new Date(currentYear, currentMonth).toLocaleString(\n \"en-US\",\n { month: \"long\" },\n );\n const yearLabel = String(currentYear);\n\n const contextualDate = selectedDate\n ? formatContextualDate(selectedDate)\n : null;\n\n return (\n <div\n className={`@container overflow-hidden rounded-${borderRadius} bg-${backgroundColor} text-${textColor} ${className ?? \"\"}`}\n style={{ backgroundImage }}\n {...props}\n >\n {titleEnabled && titleText && (\n <div className={`p-${padding} pb-0`}>\n <h2\n className={`text-${titleFontSize} text-${titleColor} font-bold tracking-[-0.012em]`}\n >\n {titleText}\n </h2>\n </div>\n )}\n\n {isLoading ? (\n <div\n className={`flex min-h-[300px] items-center justify-center p-${padding}`}\n >\n <div className={`text-${accentColor}`}>\n <div className=\"size-8 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n </div>\n </div>\n ) : isError ? (\n <ErrorState />\n ) : (\n <div className={`p-${padding}`}>\n <div className=\"@md:flex @md:gap-6\">\n <div className=\"@md:flex-none\">\n {/* Header row: year eyebrow + month + asymmetric nav + Today pill */}\n <div className=\"mb-4 flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 flex-col\">\n {showYearEyebrow && (\n <span\n className={`text-[10px] font-bold tracking-[0.16em] uppercase text-${textColor}/55`}\n >\n {yearLabel}\n </span>\n )}\n <span\n className={`text-xl leading-tight font-bold tracking-[-0.015em] text-${textColor}`}\n >\n {monthLabel}\n </span>\n </div>\n\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {showTodayButton && !viewingCurrentMonth && (\n <button\n type=\"button\"\n onClick={goToToday}\n className={`flex items-center gap-1 rounded-full bg-${accentColor}/10 px-2.5 py-1 text-[11px] font-semibold text-${accentColor} transition-colors hover:bg-${accentColor}/20 focus:outline-none focus-visible:ring-2 focus-visible:ring-${accentColor}/40`}\n >\n <CalendarCheck className=\"size-3\" />\n Today\n </button>\n )}\n <NavButton\n icon={ChevronLeft}\n label=\"Previous month\"\n variant=\"ghost\"\n accentColor={accentColor}\n textColor={textColor}\n onClick={() => navigate(-1)}\n />\n <NavButton\n icon={ChevronRight}\n label=\"Next month\"\n variant=\"accent\"\n accentColor={accentColor}\n textColor={textColor}\n onClick={() => navigate(1)}\n />\n </div>\n </div>\n\n {/* Day-of-week headers */}\n <div className=\"mb-2 grid grid-cols-7 gap-1 text-center\">\n {DAY_NAMES.map((day, idx) => {\n const isWeekend = idx === 0 || idx === 6;\n const dimmed = weekendDim && isWeekend;\n return (\n <div\n key={day}\n className={`text-[10px] font-semibold tracking-[0.12em] uppercase text-${textColor}/${dimmed ? \"40\" : \"55\"}`}\n >\n {day}\n </div>\n );\n })}\n </div>\n\n {/* Grid wrapper (opacity transitions on month navigate) */}\n <div\n className=\"transition-opacity duration-150 ease-out\"\n style={{ opacity: gridTransitioning ? 0.3 : 1 }}\n >\n {/* Collapsed week view on mobile */}\n {isCollapsed && (\n <div className=\"grid grid-cols-7 gap-1 @md:hidden\">\n {weekGrid.map(({ date, isToday }) => (\n <DayCellButton\n key={date.toISOString()}\n date={date}\n isToday={isToday}\n isSelected={\n !!selectedDate && isSameDay(selectedDate, date)\n }\n eventCount={lookupEventsForDate(date).length}\n accentColor={accentColor}\n textColor={textColor}\n showEventDensity={showEventDensity}\n onClick={() => setSelectedDate(date)}\n />\n ))}\n </div>\n )}\n\n {/* Month grid */}\n <div\n className={`grid grid-cols-7 gap-1 ${isCollapsed ? \"hidden @md:grid\" : \"grid\"}`}\n >\n {monthGrid.map((cell, idx) => {\n if (!cell.date) {\n return (\n <div key={`empty-${idx}`} className=\"aspect-square\" />\n );\n }\n const eventCount = lookupEventsForDate(cell.date).length;\n return (\n <DayCellButton\n key={cell.date.toISOString()}\n date={cell.date}\n isToday={cell.isToday}\n isSelected={\n !!selectedDate && isSameDay(selectedDate, cell.date)\n }\n eventCount={eventCount}\n accentColor={accentColor}\n textColor={textColor}\n showEventDensity={showEventDensity}\n onClick={() => setSelectedDate(cell.date)}\n />\n );\n })}\n </div>\n </div>\n\n {/* Mobile collapse toggle */}\n <button\n type=\"button\"\n onClick={() => setIsCollapsed(!isCollapsed)}\n className={`mt-2 flex w-full items-center justify-center gap-3 rounded-full p-1 text-${textColor}/40 transition-colors hover:text-${textColor}/60 @md:hidden`}\n aria-label={\n isCollapsed ? \"Expand calendar\" : \"Collapse calendar\"\n }\n >\n <div className={`h-px w-1/2 bg-${textColor}/20`} />\n {isCollapsed ? (\n <ChevronsDown className=\"size-3\" />\n ) : (\n <ChevronsUp className=\"size-3\" />\n )}\n <div className={`h-px w-1/2 bg-${textColor}/20`} />\n </button>\n </div>\n\n {/* Events rail */}\n <div\n className={`mt-4 min-w-0 border-${textColor}/10 @md:relative @md:mt-0 @md:flex-1 @md:border-l`}\n >\n <div className=\"@md:absolute @md:inset-0 @md:overflow-y-auto @md:pr-1 @md:pl-6\">\n {/* Context header */}\n {contextualDate && (\n <div className=\"mb-3\">\n {contextualDate.lead && (\n <div\n className={`text-[10px] font-bold tracking-[0.16em] uppercase text-${accentColor}`}\n >\n {contextualDate.lead}\n </div>\n )}\n <div\n className={`text-sm font-semibold text-${textColor} tabular-nums`}\n >\n {contextualDate.detail}\n </div>\n </div>\n )}\n\n {/* Events list with soft fade-in keyed by selected date */}\n <div\n key={selectedDate?.toISOString() ?? \"none\"}\n className=\"animate-in fade-in slide-in-from-bottom-2 flex flex-col gap-3 duration-200 ease-out\"\n >\n {selectedDateEvents.length > 0 ? (\n selectedDateEvents.map((event, idx) => (\n <EventCard\n key={`${event.id}-${idx}`}\n event={event}\n accentColor={accentColor}\n textColor={textColor}\n />\n ))\n ) : (\n <div\n className={`flex flex-col items-start gap-1 rounded-md border border-dashed border-${textColor}/15 px-3 py-3`}\n >\n <div className=\"flex items-center gap-1.5\">\n <CalendarCheck\n className={`size-3 text-${textColor}/40`}\n />\n <span\n className={`text-[11px] font-semibold text-${textColor}/60`}\n >\n Nothing scheduled\n </span>\n </div>\n <span className={`text-[11px] text-${textColor}/45`}>\n Enjoy the breather.\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport const calendarWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"CalendarWidget\",\n displayName: \"Calendar Widget\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [\n // Title group\n {\n key: \"titleEnabled\",\n label: \"Widget Title\",\n type: \"boolean\",\n description: \"Enable the title displayed above the calendar\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Title\",\n },\n {\n key: \"titleText\",\n label: \"Title\",\n type: \"text\",\n description: \"Title text displayed above the calendar\",\n defaultValue: \"Calendar\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the widget title\",\n defaultValue: \"xl\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the widget title\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Design group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the calendar container\",\n defaultValue: \"background\",\n tab: \"styling\",\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description: \"Default text color for calendar content\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getColorField({\n key: \"accentColor\",\n label: \"Accent Color\",\n description:\n \"Drives today highlight, event dots, Today pill, and selected day\",\n defaultValue: \"primary\",\n tab: \"styling\",\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding around the calendar container\",\n defaultValue: 4,\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Border radius for the calendar container\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Design\",\n }),\n\n // Polish group (new)\n {\n key: \"showYearEyebrow\",\n label: \"Year Eyebrow\",\n type: \"boolean\",\n description:\n \"Small uppercase year label above the month (e.g. '2026 / November').\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Polish\",\n },\n {\n key: \"showTodayButton\",\n label: \"Today Button\",\n type: \"boolean\",\n description: \"Show a 'Today' pill when viewing a different month.\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Polish\",\n },\n {\n key: \"showEventDensity\",\n label: \"Event Density Dots\",\n type: \"boolean\",\n description:\n \"Show 1–3 dots per day based on event count (off = single dot).\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Polish\",\n },\n {\n key: \"weekendDim\",\n label: \"Dim Weekends\",\n type: \"boolean\",\n description:\n \"Subtly dim the Sun/Sat day-of-week headers for visual rhythm.\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Polish\",\n },\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
@@ -13,7 +13,7 @@ const require_LayoutWidget = require("./LayoutWidget-BPzEtpHX.cjs");
13
13
  const require_TextWidget = require("./TextWidget--r6oQ94b.cjs");
14
14
  const require_AlertWidget = require("./AlertWidget-hK0MjMAm.cjs");
15
15
  const require_BulletListWidget = require("./BulletListWidget-msyZSQST.cjs");
16
- const require_CalendarWidget = require("./CalendarWidget-DiwCPlG4.cjs");
16
+ const require_CalendarWidget = require("./CalendarWidget-BMAo4qi6.cjs");
17
17
  const require_CardWidget = require("./CardWidget-H9myJUzx.cjs");
18
18
  const require_CarouselWidget = require("./CarouselWidget-Acr_f77b.cjs");
19
19
  const require_CatchUpWidget = require("./CatchUpWidget-CAUqALXy.cjs");
@@ -33,7 +33,7 @@ const require_SpacerWidget = require("./SpacerWidget-CYHjTF38.cjs");
33
33
  const require_TableWidget = require("./TableWidget-DfKZhS1Y.cjs");
34
34
  const require_ToDoWidget = require("./ToDoWidget-CImAWF3O.cjs");
35
35
  const require_VideoWidget = require("./VideoWidget-Ddt85ZZg.cjs");
36
- const require_ShopWidget = require("./ShopWidget-mx04X_Wx.cjs");
36
+ const require_ShopWidget = require("./ShopWidget-BRx2rblg.cjs");
37
37
  let react = require("react");
38
38
  let _tanstack_react_query = require("@tanstack/react-query");
39
39
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -17279,24 +17279,25 @@ function useThemeContext() {
17279
17279
  //#endregion
17280
17280
  //#region src/adapters/widgets-api-adapter.ts
17281
17281
  function mapBffCalendarEvent(event) {
17282
+ const description = event.description ?? null;
17282
17283
  return {
17283
17284
  id: event.id,
17284
17285
  title: event.title,
17285
17286
  color: event.color ?? null,
17286
17287
  start: event.start,
17287
17288
  end: event.end,
17288
- description: null,
17289
- url: null,
17289
+ description: description !== null ? { body: description } : null,
17290
+ url: event.url ?? null,
17290
17291
  active: null,
17291
- timeZone: null,
17292
- status: null,
17293
- imageUrl: null,
17292
+ timeZone: event.time_zone ?? null,
17293
+ status: event.status ?? null,
17294
+ imageUrl: event.image_url ?? null,
17294
17295
  images: null,
17295
- venue: null,
17296
+ venue: event.venue ?? null,
17296
17297
  countries: null,
17297
17298
  hasTomorrow: null,
17298
17299
  hasYesterday: null,
17299
- isAllDay: null
17300
+ isAllDay: event.is_all_day
17300
17301
  };
17301
17302
  }
17302
17303
  function mapBffTodo(raw) {
@@ -18198,7 +18199,7 @@ function createWidgetFromShareable(item) {
18198
18199
  const widgetPropertySchemas = {
18199
18200
  AlertWidget: () => Promise.resolve().then(() => require("./AlertWidget-hK0MjMAm.cjs")).then((n) => n.AlertWidget_exports).then((m) => m.alertWidgetPropertySchema),
18200
18201
  BulletListWidget: () => Promise.resolve().then(() => require("./BulletListWidget-msyZSQST.cjs")).then((n) => n.BulletListWidget_exports).then((m) => m.bulletListWidgetPropertySchema),
18201
- CalendarWidget: () => Promise.resolve().then(() => require("./CalendarWidget-DiwCPlG4.cjs")).then((n) => n.CalendarWidget_exports).then((m) => m.calendarWidgetPropertySchema),
18202
+ CalendarWidget: () => Promise.resolve().then(() => require("./CalendarWidget-BMAo4qi6.cjs")).then((n) => n.CalendarWidget_exports).then((m) => m.calendarWidgetPropertySchema),
18202
18203
  CardWidget: () => Promise.resolve().then(() => require("./CardWidget-DER6ZQ5t.cjs")).then((m) => m.cardWidgetPropertySchema),
18203
18204
  CarouselWidget: () => Promise.resolve().then(() => require("./CarouselWidget-Acr_f77b.cjs")).then((n) => n.CarouselWidget_exports).then((m) => m.carouselWidgetPropertySchema),
18204
18205
  CatchUpWidget: () => Promise.resolve().then(() => require("./CatchUpWidget-CAUqALXy.cjs")).then((n) => n.CatchUpWidget_exports).then((m) => m.catchUpWidgetPropertySchema),
@@ -18216,7 +18217,7 @@ const widgetPropertySchemas = {
18216
18217
  QuickShareWidget: () => Promise.resolve().then(() => require("./QuickShareWidget-Eb-zkAD6.cjs")).then((n) => n.QuickShareWidget_exports).then((m) => m.quickShareWidgetPropertySchema),
18217
18218
  RecentActivityWidget: () => Promise.resolve().then(() => require("./RecentActivityWidget-Cy9957Sq.cjs")).then((n) => n.RecentActivityWidget_exports).then((m) => m.recentActivityWidgetPropertySchema),
18218
18219
  SeparatorWidget: () => Promise.resolve().then(() => require("./SeparatorWidget-LQ97EZd5.cjs")).then((n) => n.SeparatorWidget_exports).then((m) => m.separatorWidgetPropertySchema),
18219
- ShopWidget: () => Promise.resolve().then(() => require("./ShopWidget-BUdYOcxc.cjs")).then((m) => m.shopWidgetPropertySchema),
18220
+ ShopWidget: () => Promise.resolve().then(() => require("./ShopWidget-B56mIngl.cjs")).then((m) => m.shopWidgetPropertySchema),
18220
18221
  SpacerWidget: () => Promise.resolve().then(() => require("./SpacerWidget-CYHjTF38.cjs")).then((n) => n.SpacerWidget_exports).then((m) => m.spacerWidgetPropertySchema),
18221
18222
  TableWidget: () => Promise.resolve().then(() => require("./TableWidget-DJWvrS1q.cjs")).then((m) => m.tableWidgetPropertySchema),
18222
18223
  TextWidget: () => Promise.resolve().then(() => require("./TextWidget--r6oQ94b.cjs")).then((n) => n.TextWidget_exports).then((m) => m.textWidgetPropertySchema),
@@ -18816,4 +18817,4 @@ Object.defineProperty(exports, "widgetPropertySchemas", {
18816
18817
  }
18817
18818
  });
18818
18819
 
18819
- //# sourceMappingURL=FluidProvider-DpVglTUh.cjs.map
18820
+ //# sourceMappingURL=FluidProvider-BIeO1i4r.cjs.map