@fayz-ai/plugin-agenda 0.1.3

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 (114) hide show
  1. package/README.md +51 -0
  2. package/dist/AgendaContext.d.ts +13 -0
  3. package/dist/AgendaContext.d.ts.map +1 -0
  4. package/dist/AgendaPage.d.ts +11 -0
  5. package/dist/AgendaPage.d.ts.map +1 -0
  6. package/dist/bridges/create-financial-bridge.d.ts +19 -0
  7. package/dist/bridges/create-financial-bridge.d.ts.map +1 -0
  8. package/dist/calendar-styles.d.ts +8 -0
  9. package/dist/calendar-styles.d.ts.map +1 -0
  10. package/dist/chunk-3LJKZQK4.js +12 -0
  11. package/dist/chunk-3LJKZQK4.js.map +1 -0
  12. package/dist/chunk-SYDBDI3Q.cjs +15 -0
  13. package/dist/chunk-SYDBDI3Q.cjs.map +1 -0
  14. package/dist/components/AgendaGeneralSettings.d.ts +3 -0
  15. package/dist/components/AgendaGeneralSettings.d.ts.map +1 -0
  16. package/dist/components/AppointmentModal.d.ts +16 -0
  17. package/dist/components/AppointmentModal.d.ts.map +1 -0
  18. package/dist/components/AppointmentPopover.d.ts +14 -0
  19. package/dist/components/AppointmentPopover.d.ts.map +1 -0
  20. package/dist/components/BookingPaymentPanel.d.ts +18 -0
  21. package/dist/components/BookingPaymentPanel.d.ts.map +1 -0
  22. package/dist/components/CalendarSidebar.d.ts +3 -0
  23. package/dist/components/CalendarSidebar.d.ts.map +1 -0
  24. package/dist/components/CalendarToolbar.d.ts +13 -0
  25. package/dist/components/CalendarToolbar.d.ts.map +1 -0
  26. package/dist/components/EventContextMenu.d.ts +14 -0
  27. package/dist/components/EventContextMenu.d.ts.map +1 -0
  28. package/dist/components/FloatingPanel.d.ts +27 -0
  29. package/dist/components/FloatingPanel.d.ts.map +1 -0
  30. package/dist/components/MiniCalendar.d.ts +9 -0
  31. package/dist/components/MiniCalendar.d.ts.map +1 -0
  32. package/dist/components/PaymentStatusBadge.d.ts +13 -0
  33. package/dist/components/PaymentStatusBadge.d.ts.map +1 -0
  34. package/dist/components/SearchCombobox.d.ts +38 -0
  35. package/dist/components/SearchCombobox.d.ts.map +1 -0
  36. package/dist/components/StatusBadge.d.ts +5 -0
  37. package/dist/components/StatusBadge.d.ts.map +1 -0
  38. package/dist/config.d.ts +151 -0
  39. package/dist/config.d.ts.map +1 -0
  40. package/dist/data/index.d.ts +4 -0
  41. package/dist/data/index.d.ts.map +1 -0
  42. package/dist/data/mock.d.ts +3 -0
  43. package/dist/data/mock.d.ts.map +1 -0
  44. package/dist/data/supabase.d.ts +3 -0
  45. package/dist/data/supabase.d.ts.map +1 -0
  46. package/dist/data/types.d.ts +26 -0
  47. package/dist/data/types.d.ts.map +1 -0
  48. package/dist/financial-bridge.d.ts +92 -0
  49. package/dist/financial-bridge.d.ts.map +1 -0
  50. package/dist/hooks/useAgendaSettings.d.ts +7 -0
  51. package/dist/hooks/useAgendaSettings.d.ts.map +1 -0
  52. package/dist/index.cjs +5135 -0
  53. package/dist/index.cjs.map +1 -0
  54. package/dist/index.d.ts +9 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +5120 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/lib/tenant.d.ts +3 -0
  59. package/dist/lib/tenant.d.ts.map +1 -0
  60. package/dist/locales/en.d.ts +2 -0
  61. package/dist/locales/en.d.ts.map +1 -0
  62. package/dist/locales/index.d.ts +2 -0
  63. package/dist/locales/index.d.ts.map +1 -0
  64. package/dist/locales/pt-BR.d.ts +2 -0
  65. package/dist/locales/pt-BR.d.ts.map +1 -0
  66. package/dist/registries.d.ts +3 -0
  67. package/dist/registries.d.ts.map +1 -0
  68. package/dist/store.d.ts +66 -0
  69. package/dist/store.d.ts.map +1 -0
  70. package/dist/tenant-222EHYUC.cjs +16 -0
  71. package/dist/tenant-222EHYUC.cjs.map +1 -0
  72. package/dist/tenant-LAUWVUYB.js +3 -0
  73. package/dist/tenant-LAUWVUYB.js.map +1 -0
  74. package/dist/types.d.ts +202 -0
  75. package/dist/types.d.ts.map +1 -0
  76. package/dist/views/CalendarView.d.ts +3 -0
  77. package/dist/views/CalendarView.d.ts.map +1 -0
  78. package/dist/views/ConfirmationsView.d.ts +3 -0
  79. package/dist/views/ConfirmationsView.d.ts.map +1 -0
  80. package/package.json +63 -0
  81. package/src/AgendaContext.tsx +11 -0
  82. package/src/AgendaPage.tsx +33 -0
  83. package/src/bridges/create-financial-bridge.ts +298 -0
  84. package/src/calendar-styles.css +245 -0
  85. package/src/calendar-styles.ts +285 -0
  86. package/src/components/AgendaGeneralSettings.tsx +64 -0
  87. package/src/components/AppointmentModal.tsx +1031 -0
  88. package/src/components/AppointmentPopover.tsx +221 -0
  89. package/src/components/BookingPaymentPanel.tsx +394 -0
  90. package/src/components/CalendarSidebar.tsx +119 -0
  91. package/src/components/CalendarToolbar.tsx +83 -0
  92. package/src/components/EventContextMenu.tsx +122 -0
  93. package/src/components/FloatingPanel.tsx +123 -0
  94. package/src/components/MiniCalendar.tsx +120 -0
  95. package/src/components/PaymentStatusBadge.tsx +62 -0
  96. package/src/components/SearchCombobox.tsx +216 -0
  97. package/src/components/StatusBadge.tsx +23 -0
  98. package/src/config.ts +269 -0
  99. package/src/data/index.ts +3 -0
  100. package/src/data/mock.ts +324 -0
  101. package/src/data/supabase.ts +570 -0
  102. package/src/data/types.ts +37 -0
  103. package/src/financial-bridge.ts +96 -0
  104. package/src/hooks/useAgendaSettings.ts +17 -0
  105. package/src/index.ts +180 -0
  106. package/src/lib/tenant.ts +3 -0
  107. package/src/locales/en.ts +207 -0
  108. package/src/locales/index.ts +7 -0
  109. package/src/locales/pt-BR.ts +207 -0
  110. package/src/registries.ts +36 -0
  111. package/src/store.ts +304 -0
  112. package/src/types.ts +265 -0
  113. package/src/views/CalendarView.tsx +904 -0
  114. package/src/views/ConfirmationsView.tsx +155 -0
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Injects agenda calendar CSS at runtime.
3
+ * This ensures styles work both in symlinked dev mode and when consumed
4
+ * as a built package (where CSS side-effect imports are extracted by tsup
5
+ * and not automatically loaded).
6
+ */
7
+
8
+ const STYLE_ID = 'saas-agenda-calendar-styles'
9
+
10
+ const css = /* css */ `
11
+ /* Dark mode content background — uses the content token */
12
+ .dark .agenda-calendar,
13
+ .dark .agenda-calendar .fc,
14
+ .dark .agenda-calendar .fc-view-harness,
15
+ .dark .agenda-calendar .fc-timegrid,
16
+ .dark .agenda-calendar .fc-scrollgrid,
17
+ .dark .agenda-calendar .fc-timegrid-col,
18
+ .dark .agenda-calendar .fc-daygrid-body,
19
+ .dark .agenda-calendar .fc-timegrid-slot-lane {
20
+ background-color: hsl(var(--content));
21
+ }
22
+
23
+ /* FullCalendar — Google Calendar inspired theme */
24
+
25
+ .agenda-calendar {
26
+ --fc-border-color: hsl(var(--border));
27
+ --fc-today-bg-color: transparent;
28
+ --fc-now-indicator-color: hsl(var(--destructive));
29
+ --fc-highlight-color: hsl(var(--primary) / 0.06);
30
+ --fc-non-business-color: hsl(var(--muted) / 0.15);
31
+ --fc-neutral-bg-color: transparent;
32
+ --fc-page-bg-color: transparent;
33
+ --fc-event-border-color: transparent;
34
+ }
35
+
36
+ .agenda-calendar .fc {
37
+ font-family: inherit;
38
+ background: transparent;
39
+ }
40
+
41
+ .agenda-calendar .fc .fc-view-harness {
42
+ background: transparent;
43
+ }
44
+
45
+ /* ── Column headers ── */
46
+ .agenda-calendar .fc-col-header-cell {
47
+ background: transparent;
48
+ border-bottom: 1px solid var(--fc-border-color);
49
+ border-left: none;
50
+ border-right: none;
51
+ border-top: none;
52
+ }
53
+
54
+ .agenda-calendar .fc-col-header-cell-cushion {
55
+ padding: 8px 4px;
56
+ font-weight: 400;
57
+ font-size: 0.7rem;
58
+ color: hsl(var(--muted-foreground));
59
+ text-decoration: none;
60
+ text-transform: uppercase;
61
+ letter-spacing: 0.03em;
62
+ }
63
+
64
+ /* Today's column header */
65
+ .agenda-calendar .fc-day-today .fc-col-header-cell-cushion {
66
+ color: hsl(var(--primary));
67
+ font-weight: 600;
68
+ }
69
+
70
+ /* Resource header (professional columns) */
71
+ .agenda-calendar .fc .fc-resource-header {
72
+ background: transparent;
73
+ border-bottom: 1px solid var(--fc-border-color);
74
+ }
75
+
76
+ /* ── Time slots — compact ── */
77
+ .agenda-calendar .fc-timegrid-slot {
78
+ height: 1.5rem;
79
+ border-bottom: 1px solid hsl(var(--border) / 0.4);
80
+ }
81
+
82
+ .agenda-calendar .fc-timegrid-slot-label {
83
+ vertical-align: top;
84
+ border: none;
85
+ }
86
+
87
+ .agenda-calendar .fc-timegrid-slot-label-cushion {
88
+ font-size: 0.65rem;
89
+ color: hsl(var(--muted-foreground) / 0.7);
90
+ padding: 1px 8px 0 0;
91
+ }
92
+
93
+ /* Half-hour lines lighter */
94
+ .agenda-calendar .fc-timegrid-slot-minor {
95
+ border-bottom-style: none;
96
+ }
97
+
98
+ /* Column dividers */
99
+ .agenda-calendar .fc-timegrid-col {
100
+ border-right: 1px solid hsl(var(--border) / 0.5);
101
+ }
102
+
103
+ /* ── Events ── */
104
+ .agenda-calendar .fc-event {
105
+ border-radius: 6px;
106
+ border-width: 0;
107
+ border-left: 4px solid;
108
+ cursor: pointer;
109
+ transition: opacity 0.15s, box-shadow 0.15s, backdrop-filter 0.15s;
110
+ font-size: 0.7rem;
111
+ line-height: 1.3;
112
+ margin: 0 2px;
113
+ overflow: hidden;
114
+ backdrop-filter: blur(8px) saturate(140%);
115
+ -webkit-backdrop-filter: blur(8px) saturate(140%);
116
+ }
117
+
118
+ .agenda-calendar .fc-event .fc-event-main {
119
+ background: inherit;
120
+ border-radius: inherit;
121
+ overflow: hidden;
122
+ }
123
+
124
+ .agenda-calendar .fc-event:not(.fc-bg-event):hover {
125
+ opacity: 0.92;
126
+ box-shadow: 0 2px 8px rgba(0,0,0,0.12);
127
+ backdrop-filter: blur(12px) saturate(160%);
128
+ -webkit-backdrop-filter: blur(12px) saturate(160%);
129
+ }
130
+
131
+ .agenda-calendar .fc-bg-event {
132
+ pointer-events: none;
133
+ }
134
+
135
+ /* ── Now indicator ── */
136
+ .agenda-calendar .fc-timegrid-now-indicator-line {
137
+ border-color: hsl(var(--destructive));
138
+ border-width: 2px;
139
+ }
140
+
141
+ .agenda-calendar .fc-timegrid-now-indicator-arrow {
142
+ border-top-color: hsl(var(--destructive));
143
+ }
144
+
145
+ /* ── Month view ── */
146
+ .agenda-calendar .fc-daygrid-day-number {
147
+ font-size: 0.8rem;
148
+ padding: 4px 8px;
149
+ text-decoration: none;
150
+ color: hsl(var(--foreground));
151
+ }
152
+
153
+ .agenda-calendar .fc-daygrid-day.fc-day-today .fc-daygrid-day-number {
154
+ background-color: hsl(var(--primary));
155
+ color: hsl(var(--primary-foreground));
156
+ border-radius: 50%;
157
+ width: 1.5rem;
158
+ height: 1.5rem;
159
+ display: flex;
160
+ align-items: center;
161
+ justify-content: center;
162
+ font-size: 0.75rem;
163
+ }
164
+
165
+ /* ── Selection ── */
166
+ .agenda-calendar .fc-highlight {
167
+ background: hsl(var(--primary) / 0.08);
168
+ }
169
+
170
+ /* ── Links ── */
171
+ .agenda-calendar .fc a {
172
+ text-decoration: none;
173
+ color: inherit;
174
+ }
175
+
176
+ /* ── Scrollbar ── */
177
+ .agenda-calendar .fc-scroller {
178
+ scrollbar-width: thin;
179
+ scrollbar-color: hsl(var(--muted-foreground) / 0.12) transparent;
180
+ }
181
+
182
+ .agenda-calendar .fc-scroller::-webkit-scrollbar {
183
+ width: 6px;
184
+ }
185
+
186
+ .agenda-calendar .fc-scroller::-webkit-scrollbar-track {
187
+ background: transparent;
188
+ }
189
+
190
+ .agenda-calendar .fc-scroller::-webkit-scrollbar-thumb {
191
+ background: hsl(var(--muted-foreground) / 0.12);
192
+ border-radius: 3px;
193
+ }
194
+
195
+ /* ── Clean up borders ── */
196
+ .agenda-calendar .fc .fc-timegrid {
197
+ border: none;
198
+ }
199
+
200
+ .agenda-calendar .fc-scrollgrid {
201
+ border: none !important;
202
+ }
203
+
204
+ .agenda-calendar .fc-scrollgrid td:last-child {
205
+ border-right: none;
206
+ }
207
+
208
+ /* ── Unavailable time background — opaque/disabled feel ── */
209
+ .agenda-calendar .fc-unavailable-bg {
210
+ background: hsl(var(--muted-foreground) / 0.08) !important;
211
+ background-image: repeating-linear-gradient(
212
+ 45deg,
213
+ transparent,
214
+ transparent 4px,
215
+ hsl(var(--muted-foreground) / 0.04) 4px,
216
+ hsl(var(--muted-foreground) / 0.04) 8px
217
+ ) !important;
218
+ border-radius: 0;
219
+ border-left: none !important;
220
+ }
221
+
222
+ /* ── Location label on schedule blocks ── */
223
+ .agenda-calendar .fc-location-label {
224
+ background: transparent !important;
225
+ border: none !important;
226
+ border-left-width: 0 !important;
227
+ cursor: default !important;
228
+ pointer-events: none;
229
+ box-shadow: none !important;
230
+ z-index: 1 !important;
231
+ margin: 0 4px !important;
232
+ font-weight: 500 !important;
233
+ }
234
+
235
+ .agenda-calendar .fc-location-label .fc-event-main {
236
+ padding: 0 !important;
237
+ }
238
+
239
+ /* Week view day header with date */
240
+ .agenda-calendar .fc-timegrid .fc-col-header-cell {
241
+ padding: 4px 0;
242
+ }
243
+
244
+ /* ── Alternating resource column backgrounds ── */
245
+ .agenda-calendar .fc-resource-alt {
246
+ background-color: hsl(var(--muted) / 0.4) !important;
247
+ }
248
+
249
+ .dark .agenda-calendar .fc-resource-alt {
250
+ background-color: hsl(var(--muted-foreground) / 0.08) !important;
251
+ }
252
+
253
+ /* Resource group header separator — stronger border between professionals */
254
+ .agenda-calendar .fc-resource-group {
255
+ border-left: 2px solid hsl(var(--border));
256
+ }
257
+
258
+ /* Also stripe the resource header label for the alt group */
259
+ .agenda-calendar th.fc-resource-alt {
260
+ background-color: hsl(var(--muted) / 0.4) !important;
261
+ }
262
+
263
+ .dark .agenda-calendar th.fc-resource-alt {
264
+ background-color: hsl(var(--muted-foreground) / 0.06) !important;
265
+ }
266
+ `
267
+
268
+ let injected = false
269
+
270
+ export function injectCalendarStyles(): void {
271
+ if (injected) return
272
+ if (typeof document === 'undefined') return
273
+
274
+ // Check if already present (e.g. from CSS import in dev mode)
275
+ if (document.getElementById(STYLE_ID)) {
276
+ injected = true
277
+ return
278
+ }
279
+
280
+ const style = document.createElement('style')
281
+ style.id = STYLE_ID
282
+ style.textContent = css
283
+ document.head.appendChild(style)
284
+ injected = true
285
+ }
@@ -0,0 +1,64 @@
1
+ import React from 'react'
2
+ import { SettingsGroup, ToggleRow, SelectRow } from '@fayz-ai/saas'
3
+ import { useTranslation } from '@fayz-ai/core'
4
+ import { useAgendaSettings } from '../hooks/useAgendaSettings'
5
+
6
+ const HOUR_OPTIONS = Array.from({ length: 18 }, (_, i) => {
7
+ const h = (5 + i).toString().padStart(2, '0')
8
+ return { value: `${h}:00`, label: `${h}:00` }
9
+ })
10
+
11
+ export function AgendaGeneralSettings() {
12
+ const t = useTranslation()
13
+ const { startTime, endTime, setStartTime, setEndTime } = useAgendaSettings()
14
+ return (
15
+ <div className="space-y-4">
16
+ <SettingsGroup title={t('agenda.settings.scheduling')} description={t('agenda.settings.schedulingDesc')}>
17
+ <ToggleRow label={t('agenda.settings.conflictDetection')} description={t('agenda.settings.conflictDetectionDesc')} checked={true} onChange={() => {}} />
18
+ <ToggleRow label={t('agenda.settings.dragDrop')} description={t('agenda.settings.dragDropDesc')} checked={true} onChange={() => {}} />
19
+ <ToggleRow label={t('agenda.settings.autoCreateOrder')} description={t('agenda.settings.autoCreateOrderDesc')} checked={true} onChange={() => {}} />
20
+ </SettingsGroup>
21
+
22
+ <SettingsGroup title={t('agenda.settings.locations')} description={t('agenda.settings.locationsDesc')}>
23
+ <ToggleRow label={t('agenda.settings.enableLocation')} description={t('agenda.settings.enableLocationDesc')} checked={false} onChange={() => {}} />
24
+ </SettingsGroup>
25
+
26
+ <SettingsGroup title={t('agenda.settings.workingHours')} description={t('agenda.settings.workingHoursDesc')}>
27
+ <ToggleRow label={t('agenda.settings.enableWorkingHours')} description={t('agenda.settings.enableWorkingHoursDesc')} checked={true} onChange={() => {}} />
28
+ <ToggleRow label={t('agenda.settings.blockOutside')} description={t('agenda.settings.blockOutsideDesc')} checked={false} onChange={() => {}} />
29
+ </SettingsGroup>
30
+
31
+ <SettingsGroup title={t('agenda.settings.confirmations')} description={t('agenda.settings.confirmationsDesc')}>
32
+ <ToggleRow label={t('agenda.settings.enableConfirmations')} description={t('agenda.settings.enableConfirmationsDesc')} checked={true} onChange={() => {}} />
33
+ <ToggleRow label={t('agenda.settings.autoConfirm')} description={t('agenda.settings.autoConfirmDesc')} checked={false} onChange={() => {}} />
34
+ <ToggleRow label={t('agenda.settings.reminder')} description={t('agenda.settings.reminderDesc')} checked={true} onChange={() => {}} />
35
+ </SettingsGroup>
36
+
37
+ <SettingsGroup title={t('agenda.settings.calendarDisplay')} description={t('agenda.settings.calendarDisplayDesc')}>
38
+ <SelectRow
39
+ label={t('agenda.settings.dayStartTime')}
40
+ description={t('agenda.settings.dayStartTimeDesc')}
41
+ value={startTime}
42
+ options={HOUR_OPTIONS}
43
+ onChange={setStartTime}
44
+ />
45
+ <SelectRow
46
+ label={t('agenda.settings.dayEndTime')}
47
+ description={t('agenda.settings.dayEndTimeDesc')}
48
+ value={endTime}
49
+ options={HOUR_OPTIONS}
50
+ onChange={setEndTime}
51
+ />
52
+ <ToggleRow label={t('agenda.settings.showCancelled')} description={t('agenda.settings.showCancelledDesc')} checked={false} onChange={() => {}} />
53
+ <ToggleRow label={t('agenda.settings.showNoShow')} description={t('agenda.settings.showNoShowDesc')} checked={true} onChange={() => {}} />
54
+ <ToggleRow label={t('agenda.settings.compact')} description={t('agenda.settings.compactDesc')} checked={false} onChange={() => {}} />
55
+ </SettingsGroup>
56
+
57
+ <SettingsGroup title={t('agenda.settings.notifications')} description={t('agenda.settings.notificationsDesc')}>
58
+ <ToggleRow label={t('agenda.settings.newBookingNotif')} description={t('agenda.settings.newBookingNotifDesc')} checked={true} onChange={() => {}} />
59
+ <ToggleRow label={t('agenda.settings.cancelAlerts')} description={t('agenda.settings.cancelAlertsDesc')} checked={true} onChange={() => {}} />
60
+ <ToggleRow label={t('agenda.settings.noShowTracking')} description={t('agenda.settings.noShowTrackingDesc')} checked={false} onChange={() => {}} />
61
+ </SettingsGroup>
62
+ </div>
63
+ )
64
+ }