@acms-subir/core 0.3.47 → 0.3.49

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 (48) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/cli/migrations.generated.mjs +42 -23
  3. package/docs/calendar.md +80 -0
  4. package/docs/server.md +28 -3
  5. package/docs/theme-authoring.md +1 -1
  6. package/integration.mjs +37 -0
  7. package/package.json +1 -1
  8. package/src/actions/index.ts +76 -11
  9. package/src/components/EventPage.astro +18 -12
  10. package/src/components/calendar/CalendarBoard.tsx +43 -19
  11. package/src/components/editor/event/EventSheet.tsx +2 -0
  12. package/src/components/editor/event/SingleDates.tsx +123 -0
  13. package/src/lib/booking/holds.ts +7 -7
  14. package/src/lib/calendar/api.ts +11 -1
  15. package/src/lib/calendar/board.ts +7 -3
  16. package/src/lib/calendar/cards.ts +5 -5
  17. package/src/lib/calendar/change-migration.ts +40 -15
  18. package/src/lib/calendar/data.ts +9 -3
  19. package/src/lib/calendar/event-words.ts +9 -0
  20. package/src/lib/calendar/events.ts +94 -9
  21. package/src/lib/calendar/ics-write.ts +25 -2
  22. package/src/lib/calendar/moves.ts +291 -0
  23. package/src/lib/calendar/render.ts +10 -6
  24. package/src/lib/calendar/schedule.ts +73 -61
  25. package/src/lib/email/booking-words.ts +7 -1
  26. package/src/lib/email/service.ts +6 -1
  27. package/src/lib/email/templates.ts +6 -2
  28. package/src/lib/mobile/calendar.ts +5 -2
  29. package/src/lib/mobile/schemas.ts +7 -3
  30. package/src/lib/origin-check.ts +54 -0
  31. package/src/lib/push/service.ts +44 -10
  32. package/src/lib/push/types.ts +2 -0
  33. package/src/lib/repo/migrations.ts +5 -2
  34. package/src/lib/repo/sql.ts +28 -10
  35. package/src/lib/repo/types.ts +6 -3
  36. package/src/lib/schema.ts +21 -0
  37. package/src/lib/sections.ts +5 -2
  38. package/src/lib/sync/catalog.ts +1 -0
  39. package/src/middleware.ts +5 -0
  40. package/src/pages/api/calendar/events/index.ts +6 -0
  41. package/src/pages/members/_Layout.astro +1 -0
  42. package/src/pages/members/events/index.astro +1 -1
  43. package/src/server/index.ts +33 -0
  44. package/src/styles/editor.css +19 -0
  45. package/src/styles/schedule.css +2 -0
  46. package/src/styles/site.css +6 -0
  47. package/src/theme-sdk/calendar.ts +3 -2
  48. package/src/virtual.d.ts +2 -0
@@ -1328,3 +1328,22 @@ html.pe-evr-lock { overflow: hidden; }
1328
1328
  .pe-evs-wrap { --evs-pad: 14px; padding-top: 18px; }
1329
1329
  .pe-evsec input:where(:not([type='checkbox'], [type='radio'])), .pe-evsec select, .pe-evsec textarea, .pe-loc-search input, .pe-evsec input.mono { font-size: 16px; }
1330
1330
  }
1331
+
1332
+ /* Event settings → Single dates (SingleDates.tsx): move or cancel one date */
1333
+ .pe-evd { list-style: none; margin: 0; padding: 0; }
1334
+ .pe-evd-row { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 6px 12px; padding: 8px 0; border-top: 1px solid var(--line); }
1335
+ .pe-evd-row:first-child { border-top: 0; }
1336
+ .pe-evd-main { display: flex; flex-direction: column; min-width: 0; font-size: 13.5px; font-variant-numeric: tabular-nums; }
1337
+ .pe-evd-state { font-size: 12px; color: var(--text-2); }
1338
+ .pe-evd-row.is-cancelled .pe-evd-when { color: var(--muted); }
1339
+ .pe-evd-row.is-cancelled .pe-evd-state { color: var(--red); }
1340
+ .pe-evd-row.is-moved .pe-evd-state { color: var(--accent); }
1341
+ .pe-evd-acts { display: flex; flex-wrap: wrap; gap: 6px; }
1342
+ .pe-evd-form { flex-basis: 100%; display: flex; flex-direction: column; gap: 10px; margin: 4px 0 6px; padding: 12px; border-radius: 10px; background: var(--panel-2, var(--soft)); }
1343
+ .pe-evd-fields { display: flex; flex-wrap: wrap; gap: 10px; }
1344
+ .pe-evd-fields .pe-field { flex: 1 1 130px; margin: 0; }
1345
+ .pe-evd-rooms { border: 0; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 4px 14px; font-size: 13px; }
1346
+ .pe-evd-rooms legend { font-size: 12px; color: var(--text-2); margin-bottom: 4px; padding: 0; }
1347
+ .pe-evd-room { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; }
1348
+ .pe-evd-formacts { display: flex; gap: 8px; }
1349
+ .pe-ev-note.is-error { color: var(--red); }
@@ -205,6 +205,8 @@ kbd { font: 10.5px ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--
205
205
  .sch-toast button { border: 0; background: none; color: var(--accent); font: inherit; font-weight: 650; cursor: pointer; padding: 0; }
206
206
  :root[data-theme='dark'] .sch-toast { background: #2e2b27; color: var(--text); border: 1px solid var(--line-strong); }
207
207
  .sch-toast.err { background: var(--red); color: #fff; }
208
+ /* a room clash after a move: both events keep the room */
209
+ .sch-toast-warn { display: block; max-width: 340px; font-size: 12px; color: var(--amber, #c98a16); }
208
210
 
209
211
  /* ---- quick add ---- */
210
212
  .qa-layer { position: fixed; inset: 0; z-index: 75; }
@@ -806,6 +806,10 @@ li::marker { color: var(--muted); }
806
806
  @layer base {
807
807
  .pc-cal-event.is-cancelled b, .pc-cal-row.is-cancelled .ti { text-decoration: line-through; color: var(--cal-muted); }
808
808
  .pc-cal-pop-flag { display: inline-block; font-size: 11px; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; color: var(--danger); margin-bottom: 3px; }
809
+ /* a moved date: flagged, never struck through */
810
+ .pc-cal-pop-flag.is-moved, .pc-ev-flag.is-moved { color: var(--accent); }
811
+ .pc-cal-pop-moved { font-size: 12.5px; color: var(--cal-muted); margin-top: 2px; }
812
+ .pc-cal-event.is-moved b::before { content: '↷ '; }
809
813
  .pc-cal-pop-link { display: inline-block; margin-top: 9px; font-weight: 600; font-size: 12.5px; color: var(--cal-accent); text-decoration: none; }
810
814
  .pc-cal-pop-link:hover { text-decoration: underline; }
811
815
 
@@ -867,6 +871,8 @@ li::marker { color: var(--muted); }
867
871
  .pc-ev-page.is-cancelled .pc-ev-title { text-decoration: line-through; text-decoration-thickness: 2px; color: var(--muted); }
868
872
  .pc-ev-cancelled { background: color-mix(in srgb, var(--danger) 10%, var(--panel)); border-radius: var(--r-sm); padding: 10px 14px; font-size: 14.5px; margin: 0 0 16px; }
869
873
  .pc-ev-cancelled b { color: var(--danger); }
874
+ .pc-ev-moved { background: color-mix(in srgb, var(--accent) 10%, var(--panel)); border-radius: var(--r-sm); padding: 10px 14px; font-size: 14.5px; margin: 0 0 16px; }
875
+ .pc-ev-moved b { color: var(--accent); }
870
876
  .pc-ev-lede { font-size: 19px; line-height: 1.55; color: var(--muted); margin: 0 0 22px; }
871
877
  .pc-ev-side {
872
878
  position: sticky; top: 96px; background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg);
@@ -29,9 +29,10 @@ export interface UpcomingEventsOptions {
29
29
  /**
30
30
  * Occurrence start/end are Unix milliseconds; event retains its authored
31
31
  * fields except private custom fields. `cancelled` is true when the whole
32
- * event or just this date is cancelled.
32
+ * event or just this date is cancelled. `moved` is set when this date of a
33
+ * series was moved here: `from` (its old start and end) and staff's `note`.
33
34
  */
34
- export type UpcomingEvent = Pick<Occurrence, 'event' | 'start' | 'end' | 'allDay' | 'days' | 'cancelled'>;
35
+ export type UpcomingEvent = Pick<Occurrence, 'event' | 'start' | 'end' | 'allDay' | 'days' | 'cancelled'> & Pick<Partial<Occurrence>, 'moved'>;
35
36
 
36
37
  /** Server-side helper for Astro templates and endpoints. No repository access needed. */
37
38
  export async function upcomingEvents(
package/src/virtual.d.ts CHANGED
@@ -24,6 +24,8 @@ declare module 'virtual:acms-config' {
24
24
  permissions?: { key: string; label: string; description: string; defaults: string[]; sensitive: boolean }[];
25
25
  members?: { enabled: boolean; base: string; notify: string[] };
26
26
  announcements?: { enabled: boolean; base: string; pages: boolean; topics: Partial<Record<'event' | 'registration' | 'help' | 'info', string>> };
27
+ // set in astro:config:setup (lib/origin-check.ts): off only when the site turned security.checkOrigin off
28
+ originCheck?: { enabled: boolean; signedRoutes: string[] };
27
29
  // resolved by integration.mjs (lib/calendar/config.ts documents the shape)
28
30
  calendar?: {
29
31
  enabled: boolean;