@anymux/ui-kit 0.1.0 → 0.2.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 (94) hide show
  1. package/dist/{calendar-DSlrbHoj.js → calendar-DQKfYSQS.js} +48 -45
  2. package/dist/calendar-DQKfYSQS.js.map +1 -0
  3. package/dist/calendar.d.ts +1 -1
  4. package/dist/calendar.js +1 -1
  5. package/dist/{contacts-DQXTZzHc.js → contacts-By9Wg3kn.js} +35 -33
  6. package/dist/contacts-By9Wg3kn.js.map +1 -0
  7. package/dist/contacts.d.ts +1 -1
  8. package/dist/contacts.js +1 -1
  9. package/dist/{file-browser-m5atC3kF.js → file-browser-CkhNwADU.js} +61 -133
  10. package/dist/file-browser-CkhNwADU.js.map +1 -0
  11. package/dist/file-browser.d.ts +6 -6
  12. package/dist/file-browser.js +4 -4
  13. package/dist/{git-B55e6LL-.js → git-m4lboTfx.js} +29 -29
  14. package/dist/git-m4lboTfx.js.map +1 -0
  15. package/dist/git.js +1 -1
  16. package/dist/{iconMap-V4B8P-Uh.js → iconMap-DDpe35ek.js} +5 -5
  17. package/dist/iconMap-DDpe35ek.js.map +1 -0
  18. package/dist/icons.js +1 -1
  19. package/dist/{index-Bryv_GCG.d.ts → index-BP4IYXiF.d.ts} +46 -53
  20. package/dist/index-BP4IYXiF.d.ts.map +1 -0
  21. package/dist/{index-kHr9udZD.d.ts → index-BkIh8oov.d.ts} +17 -17
  22. package/dist/{index-kHr9udZD.d.ts.map → index-BkIh8oov.d.ts.map} +1 -1
  23. package/dist/{index-DSu19mq0.d.ts → index-D3Ob3aXg.d.ts} +9 -9
  24. package/dist/{index-DSu19mq0.d.ts.map → index-D3Ob3aXg.d.ts.map} +1 -1
  25. package/dist/{index-Ml_SgiKa.d.ts → index-DGoLQBX6.d.ts} +18 -42
  26. package/dist/index-DGoLQBX6.d.ts.map +1 -0
  27. package/dist/index-DnJaZr08.d.ts +67 -0
  28. package/dist/index-DnJaZr08.d.ts.map +1 -0
  29. package/dist/{index-DmsyeHFr.d.ts → index-Pty-N7-g.d.ts} +5 -5
  30. package/dist/{index-DmsyeHFr.d.ts.map → index-Pty-N7-g.d.ts.map} +1 -1
  31. package/dist/index.d.ts +7 -7
  32. package/dist/index.js +10 -10
  33. package/dist/layout-BYsc16hD.js +183 -0
  34. package/dist/layout-BYsc16hD.js.map +1 -0
  35. package/dist/layout.d.ts +2 -2
  36. package/dist/layout.js +2 -2
  37. package/dist/{list-CxfT6hix.js → list-DAq-b6RR.js} +49 -63
  38. package/dist/list-DAq-b6RR.js.map +1 -0
  39. package/dist/list.d.ts +2 -2
  40. package/dist/list.js +4 -3
  41. package/dist/{media-DZ292aKK.js → media-DuczOGsk.js} +32 -31
  42. package/dist/media-DuczOGsk.js.map +1 -0
  43. package/dist/media.js +1 -1
  44. package/dist/{tree-Dd9Z0Aso.js → tree-B9VQcKBp.js} +2 -2
  45. package/dist/{tree-Dd9Z0Aso.js.map → tree-B9VQcKBp.js.map} +1 -1
  46. package/dist/tree.d.ts +1 -1
  47. package/dist/tree.js +2 -2
  48. package/package.json +2 -2
  49. package/src/calendar/AgendaView.tsx +2 -2
  50. package/src/calendar/CalendarBrowser.tsx +11 -11
  51. package/src/calendar/CalendarSidebar.tsx +10 -10
  52. package/src/calendar/DayView.tsx +5 -5
  53. package/src/calendar/EventCard.tsx +3 -3
  54. package/src/calendar/MonthView.tsx +6 -6
  55. package/src/calendar/WeekView.tsx +10 -10
  56. package/src/contacts/ContactBrowser.tsx +8 -8
  57. package/src/contacts/ContactCard.tsx +4 -4
  58. package/src/contacts/ContactDetail.tsx +10 -10
  59. package/src/contacts/ContactGroupSidebar.tsx +6 -6
  60. package/src/contacts/ContactList.tsx +3 -3
  61. package/src/file-browser/components/FileBrowser.tsx +3 -2
  62. package/src/file-browser/components/FileBrowserContent.tsx +1 -1
  63. package/src/file-browser/examples/BasicUsage.tsx +2 -2
  64. package/src/file-browser/index.ts +1 -1
  65. package/src/file-browser/providers/FileSystemProvider.ts +1 -1
  66. package/src/git/BranchList.tsx +12 -12
  67. package/src/git/CommitList.tsx +11 -11
  68. package/src/git/DiffViewer.tsx +11 -11
  69. package/src/icons/iconMap.ts +4 -4
  70. package/src/layout/index.ts +6 -2
  71. package/src/layout/models/ResponsiveLayoutModel.ts +116 -0
  72. package/src/list/components/ListItem.tsx +1 -1
  73. package/src/list/index.ts +1 -1
  74. package/src/media/AlbumSidebar.tsx +4 -4
  75. package/src/media/MediaBrowser.tsx +11 -11
  76. package/src/media/MediaGrid.tsx +3 -3
  77. package/src/media/MediaList.tsx +6 -6
  78. package/src/media/MediaPreview.tsx +2 -2
  79. package/src/media/MediaTimeline.tsx +3 -3
  80. package/src/{file-browser/components/shared → shared}/ErrorBoundary.tsx +3 -3
  81. package/dist/calendar-DSlrbHoj.js.map +0 -1
  82. package/dist/contacts-DQXTZzHc.js.map +0 -1
  83. package/dist/file-browser-m5atC3kF.js.map +0 -1
  84. package/dist/git-B55e6LL-.js.map +0 -1
  85. package/dist/iconMap-V4B8P-Uh.js.map +0 -1
  86. package/dist/index-Bryv_GCG.d.ts.map +0 -1
  87. package/dist/index-DzfY1Tok.d.ts +0 -32
  88. package/dist/index-DzfY1Tok.d.ts.map +0 -1
  89. package/dist/index-Ml_SgiKa.d.ts.map +0 -1
  90. package/dist/layout-Ca_4r8ka.js +0 -89
  91. package/dist/layout-Ca_4r8ka.js.map +0 -1
  92. package/dist/list-CxfT6hix.js.map +0 -1
  93. package/dist/media-DZ292aKK.js.map +0 -1
  94. package/src/list/components/shared/ErrorBoundary.tsx +0 -123
@@ -176,17 +176,17 @@ const EventCard = ({ event, compact = false, onClick, className = "" }) => {
176
176
  });
177
177
  return /* @__PURE__ */ jsxs("button", {
178
178
  onClick,
179
- className: `text-left w-full p-3 rounded-lg border border-gray-200 hover:shadow-sm transition-shadow ${className}`,
179
+ className: `text-left w-full p-3 rounded-lg border border-border hover:shadow-sm transition-shadow ${className}`,
180
180
  style: {
181
181
  borderLeftWidth: "3px",
182
182
  borderLeftColor: color
183
183
  },
184
184
  children: [/* @__PURE__ */ jsx("p", {
185
- className: "text-sm font-medium text-gray-900 truncate",
185
+ className: "text-sm font-medium text-foreground truncate",
186
186
  title: event.title,
187
187
  children: event.title
188
188
  }), /* @__PURE__ */ jsxs("div", {
189
- className: "mt-1 flex items-center gap-3 text-xs text-gray-500",
189
+ className: "mt-1 flex items-center gap-3 text-xs text-muted-foreground",
190
190
  children: [/* @__PURE__ */ jsxs("span", {
191
191
  className: "flex items-center gap-1",
192
192
  children: [/* @__PURE__ */ jsx(Clock, { size: 12 }), event.allDay ? "All day" : `${formatTime(event.startDate)} - ${formatTime(event.endDate)}`]
@@ -234,22 +234,22 @@ const MonthView = observer(({ model, className = "" }) => {
234
234
  return /* @__PURE__ */ jsxs("div", {
235
235
  className: `flex flex-col h-full ${className}`,
236
236
  children: [/* @__PURE__ */ jsx("div", {
237
- className: "grid grid-cols-7 border-b border-gray-200",
237
+ className: "grid grid-cols-7 border-b border-border",
238
238
  children: DAYS$1.map((day) => /* @__PURE__ */ jsx("div", {
239
- className: "px-2 py-2 text-xs font-medium text-gray-500 text-center",
239
+ className: "px-2 py-2 text-xs font-medium text-muted-foreground text-center",
240
240
  children: day.slice(0, 3)
241
241
  }, day))
242
242
  }), /* @__PURE__ */ jsx("div", {
243
243
  className: "flex-1 grid grid-rows-[repeat(auto-fill,1fr)]",
244
244
  children: weeks.map((week$1, wi) => /* @__PURE__ */ jsx("div", {
245
- className: "grid grid-cols-7 border-b border-gray-100 min-h-[80px]",
245
+ className: "grid grid-cols-7 border-b border-border min-h-[80px]",
246
246
  children: week$1.map((day, di) => {
247
247
  const dateKey = day ? `${year}-${String(month + 1).padStart(2, "0")}-${String(day).padStart(2, "0")}` : null;
248
248
  const events = dateKey ? model.eventsByDay.get(dateKey) ?? [] : [];
249
249
  return /* @__PURE__ */ jsx("div", {
250
- className: `border-r border-gray-100 p-1 ${day === null ? "bg-gray-50" : ""}`,
250
+ className: `border-r border-border p-1 ${day === null ? "bg-muted/50" : ""}`,
251
251
  children: day !== null && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
252
- className: `text-xs mb-0.5 w-6 h-6 flex items-center justify-center rounded-full ${isToday(day) ? "bg-blue-500 text-white font-bold" : "text-gray-700"}`,
252
+ className: `text-xs mb-0.5 w-6 h-6 flex items-center justify-center rounded-full ${isToday(day) ? "bg-primary text-white font-bold" : "text-foreground"}`,
253
253
  children: day
254
254
  }), /* @__PURE__ */ jsxs("div", {
255
255
  className: "space-y-0.5",
@@ -258,7 +258,7 @@ const MonthView = observer(({ model, className = "" }) => {
258
258
  compact: true,
259
259
  onClick: () => model.selectEvent(ev)
260
260
  }, ev.id)), events.length > 3 && /* @__PURE__ */ jsxs("p", {
261
- className: "text-[10px] text-gray-400 pl-1",
261
+ className: "text-[10px] text-muted-foreground pl-1",
262
262
  children: [
263
263
  "+",
264
264
  events.length - 3,
@@ -295,28 +295,28 @@ const WeekView = observer(({ model, className = "" }) => {
295
295
  return /* @__PURE__ */ jsxs("div", {
296
296
  className: `flex flex-col h-full overflow-auto ${className}`,
297
297
  children: [/* @__PURE__ */ jsxs("div", {
298
- className: "sticky top-0 bg-white z-10 border-b border-gray-200",
298
+ className: "sticky top-0 bg-background z-10 border-b border-border",
299
299
  children: [/* @__PURE__ */ jsxs("div", {
300
300
  className: "grid",
301
301
  style: { gridTemplateColumns: "60px repeat(7, 1fr)" },
302
302
  children: [/* @__PURE__ */ jsx("div", {}), days.map((d, i) => /* @__PURE__ */ jsxs("div", {
303
- className: `text-center py-2 border-l border-gray-100 ${isToday(d) ? "bg-blue-50" : ""}`,
303
+ className: `text-center py-2 border-l border-border ${isToday(d) ? "bg-primary/10" : ""}`,
304
304
  children: [/* @__PURE__ */ jsx("div", {
305
- className: "text-xs text-gray-500",
305
+ className: "text-xs text-muted-foreground",
306
306
  children: d.toLocaleDateString(void 0, { weekday: "short" })
307
307
  }), /* @__PURE__ */ jsx("div", {
308
- className: `text-lg font-medium ${isToday(d) ? "text-blue-600" : "text-gray-900"}`,
308
+ className: `text-lg font-medium ${isToday(d) ? "text-primary" : "text-foreground"}`,
309
309
  children: d.getDate()
310
310
  })]
311
311
  }, i))]
312
312
  }), hasAllDay && /* @__PURE__ */ jsxs("div", {
313
- className: "grid border-t border-gray-100",
313
+ className: "grid border-t border-border",
314
314
  style: { gridTemplateColumns: "60px repeat(7, 1fr)" },
315
315
  children: [/* @__PURE__ */ jsx("div", {
316
- className: "text-[10px] text-gray-400 text-right pr-2 py-1",
316
+ className: "text-[10px] text-muted-foreground text-right pr-2 py-1",
317
317
  children: "all-day"
318
318
  }), allDayEventsByDay.map((events, i) => /* @__PURE__ */ jsx("div", {
319
- className: "border-l border-gray-100 px-0.5 py-0.5 space-y-0.5",
319
+ className: "border-l border-border px-0.5 py-0.5 space-y-0.5",
320
320
  children: events.map((ev) => /* @__PURE__ */ jsx("button", {
321
321
  onClick: () => model.selectEvent(ev),
322
322
  className: "w-full text-left text-[10px] px-1 py-0.5 rounded truncate",
@@ -333,20 +333,20 @@ const WeekView = observer(({ model, className = "" }) => {
333
333
  }), /* @__PURE__ */ jsx("div", {
334
334
  className: "flex-1 relative",
335
335
  children: HOURS$1.map((hour) => /* @__PURE__ */ jsxs("div", {
336
- className: "grid border-b border-gray-50",
336
+ className: "grid border-b border-border/50",
337
337
  style: {
338
338
  gridTemplateColumns: "60px repeat(7, 1fr)",
339
339
  height: "48px"
340
340
  },
341
341
  children: [/* @__PURE__ */ jsx("div", {
342
- className: "text-[10px] text-gray-400 text-right pr-2 -mt-2",
342
+ className: "text-[10px] text-muted-foreground text-right pr-2 -mt-2",
343
343
  children: hour === 0 ? "" : `${hour % 12 || 12} ${hour < 12 ? "AM" : "PM"}`
344
344
  }), days.map((d, i) => {
345
345
  const dateKey = d.toISOString().slice(0, 10);
346
346
  const events = (model.eventsByDay.get(dateKey) ?? []).filter((e) => !e.allDay && e.startDate.getHours() === hour);
347
347
  const showTimeLine = isToday(d) && hour === currentHour;
348
348
  return /* @__PURE__ */ jsxs("div", {
349
- className: "border-l border-gray-100 relative",
349
+ className: "border-l border-border relative",
350
350
  children: [showTimeLine && /* @__PURE__ */ jsxs("div", {
351
351
  className: "absolute left-0 right-0 z-10 pointer-events-none",
352
352
  style: { top: `${currentMinute / 60 * 48}px` },
@@ -389,9 +389,9 @@ const DayView = observer(({ model, className = "" }) => {
389
389
  return /* @__PURE__ */ jsxs("div", {
390
390
  className: `flex flex-col h-full overflow-auto ${className}`,
391
391
  children: [/* @__PURE__ */ jsxs("div", {
392
- className: "border-b border-gray-200 px-4 py-2 sticky top-0 bg-white z-10",
392
+ className: "border-b border-border px-4 py-2 sticky top-0 bg-background z-10",
393
393
  children: [/* @__PURE__ */ jsx("h2", {
394
- className: "text-lg font-medium text-gray-900",
394
+ className: "text-lg font-medium text-foreground",
395
395
  children: d.toLocaleDateString(void 0, {
396
396
  weekday: "long",
397
397
  month: "long",
@@ -414,12 +414,12 @@ const DayView = observer(({ model, className = "" }) => {
414
414
  children: HOURS.map((hour) => {
415
415
  const hourEvents = timedEvents.filter((e) => e.startDate.getHours() === hour);
416
416
  return /* @__PURE__ */ jsxs("div", {
417
- className: "grid grid-cols-[60px_1fr] border-b border-gray-50 min-h-[48px]",
417
+ className: "grid grid-cols-[60px_1fr] border-b border-border/50 min-h-[48px]",
418
418
  children: [/* @__PURE__ */ jsx("div", {
419
- className: "text-[10px] text-gray-400 text-right pr-2 -mt-2",
419
+ className: "text-[10px] text-muted-foreground text-right pr-2 -mt-2",
420
420
  children: hour === 0 ? "" : `${hour % 12 || 12} ${hour < 12 ? "AM" : "PM"}`
421
421
  }), /* @__PURE__ */ jsx("div", {
422
- className: "border-l border-gray-100 relative pl-1",
422
+ className: "border-l border-border relative pl-1",
423
423
  children: hourEvents.map((ev) => /* @__PURE__ */ jsxs("button", {
424
424
  onClick: () => model.selectEvent(ev),
425
425
  className: "w-full text-left text-xs p-1.5 rounded mb-0.5",
@@ -453,12 +453,12 @@ const AgendaView = observer(({ model, className = "" }) => {
453
453
  return /* @__PURE__ */ jsxs("div", {
454
454
  className: `overflow-y-auto p-4 space-y-4 ${className}`,
455
455
  children: [sortedEntries.length === 0 && /* @__PURE__ */ jsx("div", {
456
- className: "flex items-center justify-center h-32 text-gray-400 text-sm",
456
+ className: "flex items-center justify-center h-32 text-muted-foreground text-sm",
457
457
  children: "No upcoming events"
458
458
  }), sortedEntries.map(([dateKey, events]) => {
459
459
  const date = new Date(dateKey + "T00:00:00");
460
460
  return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
461
- className: "text-sm font-semibold text-gray-700 mb-2 sticky top-0 bg-white/90 backdrop-blur-sm py-1",
461
+ className: "text-sm font-semibold text-foreground mb-2 sticky top-0 bg-background/90 backdrop-blur-sm py-1",
462
462
  children: date.toLocaleDateString(void 0, {
463
463
  weekday: "long",
464
464
  month: "long",
@@ -499,7 +499,7 @@ const CalendarSidebar = observer(({ model, className = "" }) => {
499
499
  const isToday = (day) => day === today.getDate() && month === today.getMonth() && year === today.getFullYear();
500
500
  const isSelected = (day) => day === d.getDate();
501
501
  return /* @__PURE__ */ jsxs("div", {
502
- className: `w-56 border-r border-gray-200 bg-gray-50 p-3 ${className}`,
502
+ className: `w-56 border-r border-border bg-muted/30 p-3 ${className}`,
503
503
  children: [/* @__PURE__ */ jsxs("div", {
504
504
  className: "mb-4",
505
505
  children: [/* @__PURE__ */ jsxs("div", {
@@ -507,11 +507,11 @@ const CalendarSidebar = observer(({ model, className = "" }) => {
507
507
  children: [
508
508
  /* @__PURE__ */ jsx("button", {
509
509
  onClick: () => model.navigateBack(),
510
- className: "p-1 hover:bg-gray-200 rounded",
510
+ className: "p-1 hover:bg-muted rounded",
511
511
  children: /* @__PURE__ */ jsx(ChevronLeft, { size: 14 })
512
512
  }),
513
513
  /* @__PURE__ */ jsx("span", {
514
- className: "text-sm font-medium",
514
+ className: "text-sm font-medium text-foreground",
515
515
  children: d.toLocaleDateString(void 0, {
516
516
  month: "long",
517
517
  year: "numeric"
@@ -519,27 +519,27 @@ const CalendarSidebar = observer(({ model, className = "" }) => {
519
519
  }),
520
520
  /* @__PURE__ */ jsx("button", {
521
521
  onClick: () => model.navigateForward(),
522
- className: "p-1 hover:bg-gray-200 rounded",
522
+ className: "p-1 hover:bg-muted rounded",
523
523
  children: /* @__PURE__ */ jsx(ChevronRight, { size: 14 })
524
524
  })
525
525
  ]
526
526
  }), /* @__PURE__ */ jsxs("div", {
527
527
  className: "grid grid-cols-7 gap-0.5 text-center",
528
528
  children: [DAYS.map((day) => /* @__PURE__ */ jsx("div", {
529
- className: "text-[10px] text-gray-400 font-medium py-0.5",
529
+ className: "text-[10px] text-muted-foreground font-medium py-0.5",
530
530
  children: day
531
531
  }, day)), cells.map((day, i) => /* @__PURE__ */ jsx("button", {
532
532
  disabled: day === null,
533
533
  onClick: () => day && model.setDate(new Date(year, month, day)),
534
- className: `text-xs py-0.5 rounded ${day === null ? "" : isSelected(day) ? "bg-blue-500 text-white" : isToday(day) ? "bg-blue-100 text-blue-700 font-bold" : "text-gray-700 hover:bg-gray-200"}`,
534
+ className: `text-xs py-0.5 rounded ${day === null ? "" : isSelected(day) ? "bg-primary text-primary-foreground" : isToday(day) ? "bg-primary/10 text-primary font-bold" : "text-foreground hover:bg-muted"}`,
535
535
  children: day
536
536
  }, i))]
537
537
  })]
538
538
  }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
539
- className: "text-xs font-semibold text-gray-500 uppercase tracking-wider mb-2",
539
+ className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2",
540
540
  children: "Calendars"
541
541
  }), model.calendars.map((cal) => /* @__PURE__ */ jsxs("div", {
542
- className: "flex items-center gap-2 px-2 py-1.5 text-sm text-gray-700",
542
+ className: "flex items-center gap-2 px-2 py-1.5 text-sm text-foreground",
543
543
  children: [/* @__PURE__ */ jsx("div", {
544
544
  className: "w-3 h-3 rounded-full",
545
545
  style: { backgroundColor: cal.color }
@@ -565,29 +565,32 @@ const CalendarBrowser = observer(({ model, className = "", showSidebar = true })
565
565
  model.loadEvents();
566
566
  }, [model]);
567
567
  return /* @__PURE__ */ jsxs("div", {
568
- className: `flex h-full bg-white rounded-xl border border-gray-200 overflow-hidden ${className}`,
569
- children: [showSidebar && /* @__PURE__ */ jsx(CalendarSidebar, { model }), /* @__PURE__ */ jsxs("div", {
568
+ className: `flex h-full bg-background rounded-xl border border-border overflow-hidden ${className}`,
569
+ children: [showSidebar && /* @__PURE__ */ jsx(CalendarSidebar, {
570
+ model,
571
+ className: "hidden md:block"
572
+ }), /* @__PURE__ */ jsxs("div", {
570
573
  className: "flex-1 flex flex-col min-w-0",
571
574
  children: [/* @__PURE__ */ jsxs("div", {
572
- className: "flex items-center gap-2 px-4 py-2 border-b border-gray-200",
575
+ className: "flex items-center gap-1.5 sm:gap-2 px-3 py-2 border-b border-border flex-wrap sm:flex-nowrap",
573
576
  children: [
574
577
  /* @__PURE__ */ jsx("button", {
575
578
  onClick: () => model.today(),
576
- className: "text-sm px-3 py-1.5 border border-gray-200 rounded-lg hover:bg-gray-50",
579
+ className: "text-sm px-3 py-1.5 border border-border rounded-lg hover:bg-muted",
577
580
  children: "Today"
578
581
  }),
579
582
  /* @__PURE__ */ jsx("button", {
580
583
  onClick: () => model.navigateBack(),
581
- className: "p-1.5 hover:bg-gray-100 rounded-lg",
584
+ className: "p-1.5 hover:bg-muted rounded-lg",
582
585
  children: /* @__PURE__ */ jsx(ChevronLeft, { size: 16 })
583
586
  }),
584
587
  /* @__PURE__ */ jsx("button", {
585
588
  onClick: () => model.navigateForward(),
586
- className: "p-1.5 hover:bg-gray-100 rounded-lg",
589
+ className: "p-1.5 hover:bg-muted rounded-lg",
587
590
  children: /* @__PURE__ */ jsx(ChevronRight, { size: 16 })
588
591
  }),
589
592
  /* @__PURE__ */ jsx("h2", {
590
- className: "text-sm font-medium text-gray-900 ml-2",
593
+ className: "text-sm font-medium text-foreground ml-2 truncate",
591
594
  children: model.currentDate.toLocaleDateString(void 0, {
592
595
  month: "long",
593
596
  year: "numeric",
@@ -598,10 +601,10 @@ const CalendarBrowser = observer(({ model, className = "", showSidebar = true })
598
601
  })
599
602
  }),
600
603
  /* @__PURE__ */ jsx("div", {
601
- className: "ml-auto flex items-center border border-gray-200 rounded-lg overflow-hidden",
604
+ className: "ml-auto flex items-center border border-border rounded-lg overflow-hidden",
602
605
  children: Object.keys(VIEW_LABELS).map((mode) => /* @__PURE__ */ jsx("button", {
603
606
  onClick: () => model.setViewMode(mode),
604
- className: `px-3 py-1.5 text-xs font-medium ${model.viewMode === mode ? "bg-blue-50 text-blue-600" : "text-gray-500 hover:bg-gray-50"}`,
607
+ className: `px-2 sm:px-3 py-1.5 text-xs font-medium ${model.viewMode === mode ? "bg-primary/10 text-primary" : "text-muted-foreground hover:bg-muted"}`,
605
608
  children: VIEW_LABELS[mode]
606
609
  }, mode))
607
610
  })
@@ -612,7 +615,7 @@ const CalendarBrowser = observer(({ model, className = "", showSidebar = true })
612
615
  className: "flex items-center justify-center h-64",
613
616
  children: /* @__PURE__ */ jsx(Loader2, {
614
617
  size: 24,
615
- className: "animate-spin text-gray-400"
618
+ className: "animate-spin text-muted-foreground"
616
619
  })
617
620
  }) : model.error ? /* @__PURE__ */ jsx(BrowserError, {
618
621
  error: model.error,
@@ -758,4 +761,4 @@ var MockCalendarProvider = class {
758
761
 
759
762
  //#endregion
760
763
  export { AgendaView, CalendarBrowser, CalendarModel, CalendarSidebar, DayView, EventCard, MockCalendarProvider, MonthView, WeekView };
761
- //# sourceMappingURL=calendar-DSlrbHoj.js.map
764
+ //# sourceMappingURL=calendar-DQKfYSQS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-DQKfYSQS.js","names":["provider: ICalendarProvider","err: any","event: Omit<CalendarEvent, 'id' | 'createdAt' | 'updatedAt'>","id: string","event: CalendarEvent | null","date: Date","mode: CalendarViewMode","d: Date","weeks: (number | null)[][]","week: (number | null)[]","day: number","d: Date","cells: (number | null)[]","day: number","VIEW_LABELS: Record<CalendarViewMode, string>","CALENDARS: CalendarInfo[]","events: CalendarEvent[]","id: string","item: Omit<CalendarEvent, 'id' | 'createdAt' | 'updatedAt'>","created: CalendarEvent","updates: Partial<CalendarEvent>","query: string","start: Date","end: Date","calendarId: string"],"sources":["../src/calendar/CalendarModel.ts","../src/calendar/EventCard.tsx","../src/calendar/MonthView.tsx","../src/calendar/WeekView.tsx","../src/calendar/DayView.tsx","../src/calendar/AgendaView.tsx","../src/calendar/CalendarSidebar.tsx","../src/calendar/CalendarBrowser.tsx","../src/calendar/MockCalendarProvider.ts"],"sourcesContent":["import { makeAutoObservable, flow } from 'mobx';\nimport type { ICalendarProvider, CalendarEvent, CalendarInfo } from './types';\n\nexport type CalendarViewMode = 'month' | 'week' | 'day' | 'agenda';\n\nexport class CalendarModel {\n events: CalendarEvent[] = [];\n calendars: CalendarInfo[] = [];\n currentDate: Date = new Date();\n viewMode: CalendarViewMode = 'month';\n selectedEvent: CalendarEvent | null = null;\n loading = false;\n error: string | null = null;\n\n constructor(private provider: ICalendarProvider) {\n makeAutoObservable(this);\n }\n\n get visibleDateRange(): { start: Date; end: Date } {\n const d = this.currentDate;\n switch (this.viewMode) {\n case 'month': {\n const start = new Date(d.getFullYear(), d.getMonth(), 1);\n start.setDate(start.getDate() - start.getDay());\n const end = new Date(d.getFullYear(), d.getMonth() + 1, 0);\n end.setDate(end.getDate() + (6 - end.getDay()));\n return { start, end };\n }\n case 'week': {\n const start = new Date(d);\n start.setDate(d.getDate() - d.getDay());\n start.setHours(0, 0, 0, 0);\n const end = new Date(start);\n end.setDate(start.getDate() + 6);\n end.setHours(23, 59, 59, 999);\n return { start, end };\n }\n case 'day': {\n const start = new Date(d);\n start.setHours(0, 0, 0, 0);\n const end = new Date(d);\n end.setHours(23, 59, 59, 999);\n return { start, end };\n }\n case 'agenda': {\n const start = new Date(d);\n start.setHours(0, 0, 0, 0);\n const end = new Date(d);\n end.setDate(end.getDate() + 30);\n return { start, end };\n }\n }\n }\n\n get eventsForCurrentView(): CalendarEvent[] {\n const { start, end } = this.visibleDateRange;\n return this.events.filter(e =>\n e.endDate >= start && e.startDate <= end\n );\n }\n\n get eventsByDay(): Map<string, CalendarEvent[]> {\n const map = new Map<string, CalendarEvent[]>();\n for (const event of this.eventsForCurrentView) {\n const key = event.startDate.toISOString().slice(0, 10);\n const list = map.get(key) ?? [];\n list.push(event);\n map.set(key, list);\n }\n return map;\n }\n\n loadEvents = flow(function* (this: CalendarModel) {\n this.loading = true;\n this.error = null;\n try {\n const { start, end } = this.visibleDateRange;\n const [events, calendars] = yield Promise.all([\n this.provider.getEventsByRange(start, end),\n this.provider.getCalendars()\n ]);\n this.events = events;\n this.calendars = calendars;\n } catch (err: any) {\n this.error = err?.message || 'Failed to load calendar events';\n } finally {\n this.loading = false;\n }\n });\n\n selectEvent(event: CalendarEvent | null) {\n this.selectedEvent = event;\n }\n\n setDate(date: Date) {\n this.currentDate = date;\n this.loadEvents();\n }\n\n setViewMode(mode: CalendarViewMode) {\n this.viewMode = mode;\n this.loadEvents();\n }\n\n navigateForward() {\n const d = new Date(this.currentDate);\n switch (this.viewMode) {\n case 'month': d.setMonth(d.getMonth() + 1); break;\n case 'week': d.setDate(d.getDate() + 7); break;\n case 'day': d.setDate(d.getDate() + 1); break;\n case 'agenda': d.setDate(d.getDate() + 30); break;\n }\n this.setDate(d);\n }\n\n navigateBack() {\n const d = new Date(this.currentDate);\n switch (this.viewMode) {\n case 'month': d.setMonth(d.getMonth() - 1); break;\n case 'week': d.setDate(d.getDate() - 7); break;\n case 'day': d.setDate(d.getDate() - 1); break;\n case 'agenda': d.setDate(d.getDate() - 30); break;\n }\n this.setDate(d);\n }\n\n today() {\n this.setDate(new Date());\n }\n\n createEvent = flow(function* (this: CalendarModel, event: Omit<CalendarEvent, 'id' | 'createdAt' | 'updatedAt'>) {\n const created = yield this.provider.createItem(event);\n this.events.push(created);\n return created;\n });\n\n deleteEvent = flow(function* (this: CalendarModel, id: string) {\n yield this.provider.deleteItem(id);\n this.events = this.events.filter(e => e.id !== id);\n if (this.selectedEvent?.id === id) this.selectedEvent = null;\n });\n}\n","import React from 'react';\nimport { Clock, MapPin } from 'lucide-react';\nimport type { CalendarEvent } from './types';\n\nexport interface EventCardProps {\n event: CalendarEvent;\n compact?: boolean;\n onClick?: () => void;\n className?: string;\n}\n\nconst formatTime = (d: Date) => d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n\nexport const EventCard = ({ event, compact = false, onClick, className = '' }: EventCardProps) => {\n const color = event.color ?? '#3b82f6';\n\n if (compact) {\n return (\n <button\n onClick={onClick}\n className={`text-left text-xs px-1.5 py-0.5 rounded truncate w-full hover:opacity-80 transition-opacity ${className}`}\n style={{ backgroundColor: `${color}20`, color, borderLeft: `2px solid ${color}` }}\n title={event.title}\n >\n {event.title}\n </button>\n );\n }\n\n return (\n <button\n onClick={onClick}\n className={`text-left w-full p-3 rounded-lg border border-border hover:shadow-sm transition-shadow ${className}`}\n style={{ borderLeftWidth: '3px', borderLeftColor: color }}\n >\n <p className=\"text-sm font-medium text-foreground truncate\" title={event.title}>{event.title}</p>\n <div className=\"mt-1 flex items-center gap-3 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <Clock size={12} />\n {event.allDay ? 'All day' : `${formatTime(event.startDate)} - ${formatTime(event.endDate)}`}\n </span>\n {event.location && (\n <span className=\"flex items-center gap-1\">\n <MapPin size={12} />\n {event.location}\n </span>\n )}\n </div>\n </button>\n );\n};\n","import React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { CalendarModel } from './CalendarModel';\nimport { EventCard } from './EventCard';\n\nexport interface MonthViewProps {\n model: CalendarModel;\n className?: string;\n}\n\nconst DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const MonthView = observer<MonthViewProps>(({ model, className = '' }) => {\n const d = model.currentDate;\n const year = d.getFullYear();\n const month = d.getMonth();\n const today = new Date();\n\n const firstDay = new Date(year, month, 1).getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n\n const weeks: (number | null)[][] = [];\n let week: (number | null)[] = [];\n for (let i = 0; i < firstDay; i++) week.push(null);\n for (let day = 1; day <= daysInMonth; day++) {\n week.push(day);\n if (week.length === 7) { weeks.push(week); week = []; }\n }\n if (week.length > 0) {\n while (week.length < 7) week.push(null);\n weeks.push(week);\n }\n\n const isToday = (day: number) =>\n day === today.getDate() && month === today.getMonth() && year === today.getFullYear();\n\n return (\n <div className={`flex flex-col h-full ${className}`}>\n <div className=\"grid grid-cols-7 border-b border-border\">\n {DAYS.map(day => (\n <div key={day} className=\"px-2 py-2 text-xs font-medium text-muted-foreground text-center\">{day.slice(0, 3)}</div>\n ))}\n </div>\n <div className=\"flex-1 grid grid-rows-[repeat(auto-fill,1fr)]\">\n {weeks.map((week, wi) => (\n <div key={wi} className=\"grid grid-cols-7 border-b border-border min-h-[80px]\">\n {week.map((day, di) => {\n const dateKey = day ? `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}` : null;\n const events = dateKey ? (model.eventsByDay.get(dateKey) ?? []) : [];\n return (\n <div key={di} className={`border-r border-border p-1 ${day === null ? 'bg-muted/50' : ''}`}>\n {day !== null && (\n <>\n <div className={`text-xs mb-0.5 w-6 h-6 flex items-center justify-center rounded-full ${\n isToday(day) ? 'bg-primary text-white font-bold' : 'text-foreground'\n }`}>\n {day}\n </div>\n <div className=\"space-y-0.5\">\n {events.slice(0, 3).map(ev => (\n <EventCard key={ev.id} event={ev} compact onClick={() => model.selectEvent(ev)} />\n ))}\n {events.length > 3 && (\n <p className=\"text-[10px] text-muted-foreground pl-1\">+{events.length - 3} more</p>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n});\n","import React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { CalendarModel } from './CalendarModel';\n\nexport interface WeekViewProps {\n model: CalendarModel;\n className?: string;\n}\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i);\n\nexport const WeekView = observer<WeekViewProps>(({ model, className = '' }) => {\n const { start } = model.visibleDateRange;\n const days = Array.from({ length: 7 }, (_, i) => {\n const d = new Date(start);\n d.setDate(start.getDate() + i);\n return d;\n });\n\n const now = new Date();\n const isToday = (d: Date) => d.toDateString() === now.toDateString();\n const currentHour = now.getHours();\n const currentMinute = now.getMinutes();\n\n // Collect all-day events for the visible week\n const allDayEventsByDay = days.map(d => {\n const dateKey = d.toISOString().slice(0, 10);\n return (model.eventsByDay.get(dateKey) ?? []).filter(e => e.allDay);\n });\n const hasAllDay = allDayEventsByDay.some(events => events.length > 0);\n\n return (\n <div className={`flex flex-col h-full overflow-auto ${className}`}>\n {/* Day headers */}\n <div className=\"sticky top-0 bg-background z-10 border-b border-border\">\n <div className=\"grid\" style={{ gridTemplateColumns: '60px repeat(7, 1fr)' }}>\n <div />\n {days.map((d, i) => (\n <div key={i} className={`text-center py-2 border-l border-border ${isToday(d) ? 'bg-primary/10' : ''}`}>\n <div className=\"text-xs text-muted-foreground\">{d.toLocaleDateString(undefined, { weekday: 'short' })}</div>\n <div className={`text-lg font-medium ${isToday(d) ? 'text-primary' : 'text-foreground'}`}>{d.getDate()}</div>\n </div>\n ))}\n </div>\n\n {/* All-day events row */}\n {hasAllDay && (\n <div className=\"grid border-t border-border\" style={{ gridTemplateColumns: '60px repeat(7, 1fr)' }}>\n <div className=\"text-[10px] text-muted-foreground text-right pr-2 py-1\">all-day</div>\n {allDayEventsByDay.map((events, i) => (\n <div key={i} className=\"border-l border-border px-0.5 py-0.5 space-y-0.5\">\n {events.map(ev => (\n <button\n key={ev.id}\n onClick={() => model.selectEvent(ev)}\n className=\"w-full text-left text-[10px] px-1 py-0.5 rounded truncate\"\n style={{\n backgroundColor: `${ev.color ?? '#3b82f6'}20`,\n color: ev.color ?? '#3b82f6',\n borderLeft: `2px solid ${ev.color ?? '#3b82f6'}`,\n }}\n title={ev.title}\n >\n {ev.title}\n </button>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Time grid */}\n <div className=\"flex-1 relative\">\n {HOURS.map(hour => (\n <div key={hour} className=\"grid border-b border-border/50\" style={{ gridTemplateColumns: '60px repeat(7, 1fr)', height: '48px' }}>\n <div className=\"text-[10px] text-muted-foreground text-right pr-2 -mt-2\">\n {hour === 0 ? '' : `${hour % 12 || 12} ${hour < 12 ? 'AM' : 'PM'}`}\n </div>\n {days.map((d, i) => {\n const dateKey = d.toISOString().slice(0, 10);\n const events = (model.eventsByDay.get(dateKey) ?? []).filter(e =>\n !e.allDay && e.startDate.getHours() === hour\n );\n const showTimeLine = isToday(d) && hour === currentHour;\n return (\n <div key={i} className=\"border-l border-border relative\">\n {/* Current time indicator */}\n {showTimeLine && (\n <div\n className=\"absolute left-0 right-0 z-10 pointer-events-none\"\n style={{ top: `${(currentMinute / 60) * 48}px` }}\n >\n <div className=\"w-2 h-2 bg-red-500 rounded-full absolute -left-1 -top-1\" />\n <div className=\"h-px bg-red-500 w-full\" />\n </div>\n )}\n {events.map((ev, ei) => {\n const durationHours = Math.max(0.5, (ev.endDate.getTime() - ev.startDate.getTime()) / 3600000);\n const topOffset = (ev.startDate.getMinutes() / 60) * 48;\n return (\n <button\n key={ev.id}\n onClick={() => model.selectEvent(ev)}\n className=\"absolute text-xs px-1 py-0.5 rounded truncate z-[1]\"\n title={ev.title}\n style={{\n backgroundColor: `${ev.color ?? '#3b82f6'}20`,\n color: ev.color ?? '#3b82f6',\n borderLeft: `2px solid ${ev.color ?? '#3b82f6'}`,\n height: `${durationHours * 48}px`,\n top: `${topOffset}px`,\n left: `${ei * 4 + 2}px`,\n right: '2px',\n }}\n >\n {ev.title}\n </button>\n );\n })}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n});\n","import React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { CalendarModel } from './CalendarModel';\n\nexport interface DayViewProps {\n model: CalendarModel;\n className?: string;\n}\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i);\n\nexport const DayView = observer<DayViewProps>(({ model, className = '' }) => {\n const d = model.currentDate;\n const dateKey = d.toISOString().slice(0, 10);\n const dayEvents = model.eventsByDay.get(dateKey) ?? [];\n const allDayEvents = dayEvents.filter(e => e.allDay);\n const timedEvents = dayEvents.filter(e => !e.allDay);\n\n return (\n <div className={`flex flex-col h-full overflow-auto ${className}`}>\n {/* Header */}\n <div className=\"border-b border-border px-4 py-2 sticky top-0 bg-background z-10\">\n <h2 className=\"text-lg font-medium text-foreground\">\n {d.toLocaleDateString(undefined, { weekday: 'long', month: 'long', day: 'numeric' })}\n </h2>\n {allDayEvents.length > 0 && (\n <div className=\"flex gap-1 mt-1\">\n {allDayEvents.map(ev => (\n <button\n key={ev.id}\n onClick={() => model.selectEvent(ev)}\n className=\"text-xs px-2 py-0.5 rounded\"\n style={{ backgroundColor: `${ev.color ?? '#3b82f6'}20`, color: ev.color ?? '#3b82f6' }}\n >\n {ev.title}\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Time slots */}\n <div className=\"flex-1\">\n {HOURS.map(hour => {\n const hourEvents = timedEvents.filter(e => e.startDate.getHours() === hour);\n return (\n <div key={hour} className=\"grid grid-cols-[60px_1fr] border-b border-border/50 min-h-[48px]\">\n <div className=\"text-[10px] text-muted-foreground text-right pr-2 -mt-2\">\n {hour === 0 ? '' : `${hour % 12 || 12} ${hour < 12 ? 'AM' : 'PM'}`}\n </div>\n <div className=\"border-l border-border relative pl-1\">\n {hourEvents.map(ev => (\n <button\n key={ev.id}\n onClick={() => model.selectEvent(ev)}\n className=\"w-full text-left text-xs p-1.5 rounded mb-0.5\"\n style={{\n backgroundColor: `${ev.color ?? '#3b82f6'}15`,\n color: ev.color ?? '#3b82f6',\n borderLeft: `2px solid ${ev.color ?? '#3b82f6'}`\n }}\n >\n <span className=\"font-medium\">{ev.title}</span>\n <span className=\"ml-2 opacity-70\">\n {ev.startDate.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}\n </span>\n </button>\n ))}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n});\n","import React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { CalendarModel } from './CalendarModel';\nimport { EventCard } from './EventCard';\n\nexport interface AgendaViewProps {\n model: CalendarModel;\n className?: string;\n}\n\nexport const AgendaView = observer<AgendaViewProps>(({ model, className = '' }) => {\n const sortedEntries = Array.from(model.eventsByDay.entries())\n .sort(([a], [b]) => a.localeCompare(b));\n\n return (\n <div className={`overflow-y-auto p-4 space-y-4 ${className}`}>\n {sortedEntries.length === 0 && (\n <div className=\"flex items-center justify-center h-32 text-muted-foreground text-sm\">No upcoming events</div>\n )}\n {sortedEntries.map(([dateKey, events]) => {\n const date = new Date(dateKey + 'T00:00:00');\n return (\n <div key={dateKey}>\n <h3 className=\"text-sm font-semibold text-foreground mb-2 sticky top-0 bg-background/90 backdrop-blur-sm py-1\">\n {date.toLocaleDateString(undefined, { weekday: 'long', month: 'long', day: 'numeric' })}\n </h3>\n <div className=\"space-y-1.5\">\n {events.map(ev => (\n <EventCard key={ev.id} event={ev} onClick={() => model.selectEvent(ev)} />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n );\n});\n","import React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport type { CalendarModel } from './CalendarModel';\n\nexport interface CalendarSidebarProps {\n model: CalendarModel;\n className?: string;\n}\n\nconst DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\n\nexport const CalendarSidebar = observer<CalendarSidebarProps>(({ model, className = '' }) => {\n const d = model.currentDate;\n const year = d.getFullYear();\n const month = d.getMonth();\n\n const firstDay = new Date(year, month, 1).getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const today = new Date();\n\n const cells: (number | null)[] = [];\n for (let i = 0; i < firstDay; i++) cells.push(null);\n for (let i = 1; i <= daysInMonth; i++) cells.push(i);\n\n const isToday = (day: number) =>\n day === today.getDate() && month === today.getMonth() && year === today.getFullYear();\n\n const isSelected = (day: number) =>\n day === d.getDate();\n\n return (\n <div className={`w-56 border-r border-border bg-muted/30 p-3 ${className}`}>\n {/* Mini month */}\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <button onClick={() => model.navigateBack()} className=\"p-1 hover:bg-muted rounded\">\n <ChevronLeft size={14} />\n </button>\n <span className=\"text-sm font-medium text-foreground\">\n {d.toLocaleDateString(undefined, { month: 'long', year: 'numeric' })}\n </span>\n <button onClick={() => model.navigateForward()} className=\"p-1 hover:bg-muted rounded\">\n <ChevronRight size={14} />\n </button>\n </div>\n <div className=\"grid grid-cols-7 gap-0.5 text-center\">\n {DAYS.map(day => (\n <div key={day} className=\"text-[10px] text-muted-foreground font-medium py-0.5\">{day}</div>\n ))}\n {cells.map((day, i) => (\n <button\n key={i}\n disabled={day === null}\n onClick={() => day && model.setDate(new Date(year, month, day))}\n className={`text-xs py-0.5 rounded ${\n day === null ? '' :\n isSelected(day) ? 'bg-primary text-primary-foreground' :\n isToday(day) ? 'bg-primary/10 text-primary font-bold' :\n 'text-foreground hover:bg-muted'\n }`}\n >\n {day}\n </button>\n ))}\n </div>\n </div>\n\n {/* Calendar list */}\n <div>\n <h3 className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2\">Calendars</h3>\n {model.calendars.map(cal => (\n <div key={cal.id} className=\"flex items-center gap-2 px-2 py-1.5 text-sm text-foreground\">\n <div className=\"w-3 h-3 rounded-full\" style={{ backgroundColor: cal.color }} />\n <span className=\"truncate\" title={cal.name}>{cal.name}</span>\n </div>\n ))}\n </div>\n </div>\n );\n});\n","import React, { useEffect } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { ChevronLeft, ChevronRight, Loader2 } from 'lucide-react';\nimport { BrowserError } from '@anymux/ui/components/browser-error';\nimport type { CalendarModel, CalendarViewMode } from './CalendarModel';\nimport { MonthView } from './MonthView';\nimport { WeekView } from './WeekView';\nimport { DayView } from './DayView';\nimport { AgendaView } from './AgendaView';\nimport { CalendarSidebar } from './CalendarSidebar';\n\nexport interface CalendarBrowserProps {\n model: CalendarModel;\n className?: string;\n showSidebar?: boolean;\n}\n\nconst VIEW_LABELS: Record<CalendarViewMode, string> = {\n month: 'Month',\n week: 'Week',\n day: 'Day',\n agenda: 'Agenda',\n};\n\nexport const CalendarBrowser = observer<CalendarBrowserProps>(({ model, className = '', showSidebar = true }) => {\n useEffect(() => { model.loadEvents(); }, [model]);\n\n return (\n <div className={`flex h-full bg-background rounded-xl border border-border overflow-hidden ${className}`}>\n {showSidebar && <CalendarSidebar model={model} className=\"hidden md:block\" />}\n\n <div className=\"flex-1 flex flex-col min-w-0\">\n {/* Toolbar */}\n <div className=\"flex items-center gap-1.5 sm:gap-2 px-3 py-2 border-b border-border flex-wrap sm:flex-nowrap\">\n <button onClick={() => model.today()} className=\"text-sm px-3 py-1.5 border border-border rounded-lg hover:bg-muted\">\n Today\n </button>\n <button onClick={() => model.navigateBack()} className=\"p-1.5 hover:bg-muted rounded-lg\">\n <ChevronLeft size={16} />\n </button>\n <button onClick={() => model.navigateForward()} className=\"p-1.5 hover:bg-muted rounded-lg\">\n <ChevronRight size={16} />\n </button>\n <h2 className=\"text-sm font-medium text-foreground ml-2 truncate\">\n {model.currentDate.toLocaleDateString(undefined, {\n month: 'long',\n year: 'numeric',\n ...(model.viewMode === 'day' ? { day: 'numeric', weekday: 'long' } : {})\n })}\n </h2>\n <div className=\"ml-auto flex items-center border border-border rounded-lg overflow-hidden\">\n {(Object.keys(VIEW_LABELS) as CalendarViewMode[]).map(mode => (\n <button\n key={mode}\n onClick={() => model.setViewMode(mode)}\n className={`px-2 sm:px-3 py-1.5 text-xs font-medium ${\n model.viewMode === mode ? 'bg-primary/10 text-primary' : 'text-muted-foreground hover:bg-muted'\n }`}\n >\n {VIEW_LABELS[mode]}\n </button>\n ))}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-hidden\">\n {model.loading ? (\n <div className=\"flex items-center justify-center h-64\">\n <Loader2 size={24} className=\"animate-spin text-muted-foreground\" />\n </div>\n ) : model.error ? (\n <BrowserError\n error={model.error}\n context=\"Calendar\"\n onRetry={() => model.loadEvents()}\n />\n ) : (\n <>\n {model.viewMode === 'month' && <MonthView model={model} />}\n {model.viewMode === 'week' && <WeekView model={model} />}\n {model.viewMode === 'day' && <DayView model={model} />}\n {model.viewMode === 'agenda' && <AgendaView model={model} />}\n </>\n )}\n </div>\n </div>\n </div>\n );\n});\n","import type { ICalendarProvider, CalendarEvent, CalendarInfo } from './types';\n\nconst CALENDARS: CalendarInfo[] = [\n { id: 'personal', name: 'Personal', color: '#3b82f6' },\n { id: 'work', name: 'Work', color: '#10b981' },\n { id: 'family', name: 'Family', color: '#f59e0b' },\n];\n\nconst EVENT_TITLES = [\n 'Team standup', 'Lunch with Sarah', 'Design review', 'Gym session',\n 'Doctor appointment', 'Code review', 'Sprint planning', 'Movie night',\n 'Grocery shopping', 'Piano lesson', 'Board meeting', 'Yoga class',\n 'Project deadline', 'Coffee with Alex', 'Dentist', 'Book club',\n];\n\nconst LOCATIONS = ['Office', 'Zoom', 'Conference Room A', 'Downtown Cafe', 'Home', undefined];\n\nfunction generateEvents(): CalendarEvent[] {\n const events: CalendarEvent[] = [];\n const now = new Date();\n const baseDate = new Date(now.getFullYear(), now.getMonth(), 1);\n\n for (let i = 0; i < 40; i++) {\n const day = Math.floor(Math.random() * 35) - 5;\n const hour = 8 + Math.floor(Math.random() * 10);\n const duration = 1 + Math.floor(Math.random() * 3);\n const allDay = i % 8 === 0;\n const calendar = CALENDARS[i % CALENDARS.length];\n\n const startDate = new Date(baseDate);\n startDate.setDate(startDate.getDate() + day);\n startDate.setHours(hour, 0, 0, 0);\n\n const endDate = new Date(startDate);\n if (allDay) {\n endDate.setHours(23, 59, 59, 999);\n } else {\n endDate.setHours(hour + duration);\n }\n\n events.push({\n id: `event-${i}`,\n type: 'calendar-event',\n title: EVENT_TITLES[i % EVENT_TITLES.length],\n startDate,\n endDate,\n allDay,\n location: LOCATIONS[i % LOCATIONS.length],\n attendees: i % 3 === 0 ? ['alice@example.com', 'bob@example.com'] : undefined,\n color: calendar.color,\n calendarId: calendar.id,\n createdAt: now,\n updatedAt: now,\n });\n }\n return events;\n}\n\nexport class MockCalendarProvider implements ICalendarProvider {\n private events = generateEvents();\n\n async listItems() { return this.events; }\n\n async getItem(id: string) { return this.events.find(e => e.id === id) ?? null; }\n\n async createItem(item: Omit<CalendarEvent, 'id' | 'createdAt' | 'updatedAt'>) {\n const now = new Date();\n const created: CalendarEvent = { ...item, id: `event-${Date.now()}`, createdAt: now, updatedAt: now } as CalendarEvent;\n this.events.push(created);\n return created;\n }\n\n async updateItem(id: string, updates: Partial<CalendarEvent>) {\n const idx = this.events.findIndex(e => e.id === id);\n if (idx === -1) throw new Error('Not found');\n this.events[idx] = { ...this.events[idx], ...updates, updatedAt: new Date() };\n return this.events[idx];\n }\n\n async deleteItem(id: string) {\n this.events = this.events.filter(e => e.id !== id);\n }\n\n async search(query: string) {\n const q = query.toLowerCase();\n return this.events.filter(e => e.title.toLowerCase().includes(q));\n }\n\n async getCalendars() { return CALENDARS; }\n\n async getEventsByRange(start: Date, end: Date) {\n return this.events.filter(e => e.endDate >= start && e.startDate <= end);\n }\n\n async getEventsByCalendar(calendarId: string) {\n return this.events.filter(e => e.calendarId === calendarId);\n }\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import "./types-common-CB3kRek8.js";
2
- import { AgendaView$1 as AgendaView, AgendaViewProps, CalendarBrowser$1 as CalendarBrowser, CalendarBrowserProps, CalendarEvent, CalendarInfo, CalendarModel$1 as CalendarModel, CalendarSidebar$1 as CalendarSidebar, CalendarSidebarProps, CalendarViewMode, DayView$1 as DayView, DayViewProps, EventCard$1 as EventCard, EventCardProps, ICalendarProvider, MockCalendarProvider$1 as MockCalendarProvider, MonthView$1 as MonthView, MonthViewProps, WeekView$1 as WeekView, WeekViewProps } from "./index-DSu19mq0.js";
2
+ import { AgendaView$1 as AgendaView, AgendaViewProps, CalendarBrowser$1 as CalendarBrowser, CalendarBrowserProps, CalendarEvent, CalendarInfo, CalendarModel$1 as CalendarModel, CalendarSidebar$1 as CalendarSidebar, CalendarSidebarProps, CalendarViewMode, DayView$1 as DayView, DayViewProps, EventCard$1 as EventCard, EventCardProps, ICalendarProvider, MockCalendarProvider$1 as MockCalendarProvider, MonthView$1 as MonthView, MonthViewProps, WeekView$1 as WeekView, WeekViewProps } from "./index-D3Ob3aXg.js";
3
3
  export { AgendaView, AgendaViewProps, CalendarBrowser, CalendarBrowserProps, CalendarEvent, CalendarInfo, CalendarModel, CalendarSidebar, CalendarSidebarProps, CalendarViewMode, DayView, DayViewProps, EventCard, EventCardProps, ICalendarProvider, MockCalendarProvider, MonthView, MonthViewProps, WeekView, WeekViewProps };
package/dist/calendar.js CHANGED
@@ -1,3 +1,3 @@
1
- import { AgendaView, CalendarBrowser, CalendarModel, CalendarSidebar, DayView, EventCard, MockCalendarProvider, MonthView, WeekView } from "./calendar-DSlrbHoj.js";
1
+ import { AgendaView, CalendarBrowser, CalendarModel, CalendarSidebar, DayView, EventCard, MockCalendarProvider, MonthView, WeekView } from "./calendar-DQKfYSQS.js";
2
2
 
3
3
  export { AgendaView, CalendarBrowser, CalendarModel, CalendarSidebar, DayView, EventCard, MockCalendarProvider, MonthView, WeekView };