Holiday Hours Manage temporary schedules for holidays, closures, and special events.
{#if exceptionGroupsLoading}
{#each Array(2) as _, i (i)} {/each}
{:else}
{#if exceptionGroups.length === 0}

No exception groups found.

{/if} {#each exceptionGroups as g (g.weekStarts)}

{g.name}

{g.weekStarts?.length || 0} weeks

{g.description}

Applies to weeks:
{g.weekStarts ?.slice(0, 3) .map((w) => new SvelteDate(w).toLocaleDateString('en-GB', { day: 'numeric', month: 'short' }) ) .join(', ')} {#if (g.weekStarts?.length ?? 0) > 3} (+{(g.weekStarts?.length ?? 0) - 3} more) {/if}
{/each}
{/if}
Create Exception Schedule Define custom working hours for holidays, closures, or special events.

Apply to Weeks *

Select a date range to add all Mondays within that range

{#if exceptionDraft.weekStarts.length > 0}
Selected weeks ({exceptionDraft.weekStarts.length}):
{#each exceptionDraft.weekStarts as week, index (week)}
Week starting: {week}
{/each}
{/if}

Working Hours for these Weeks *

{#each exceptionDraft.hours as row (row.weekday)} {/each}
Day Open Start End
{weekdayLabel(row.weekday)}
Delete exception group? This action cannot be undone. This will permanently delete this exception group and all its associated schedule rows. { exceptionToDelete = undefined; }} > Cancel Delete {#if viewingException} {viewingException.name} {viewingException.description || 'Holiday schedule details'}

Applied to Weeks

{#if viewingException.weekStarts && viewingException.weekStarts.length > 0}
{#each viewingException.weekStarts as week (week)}
Week of {new SvelteDate(week).toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' })}
{/each}
{:else}

No weeks specified

{/if}

Working Hours

{#each viewingException.hours as row (row.weekday)} {/each}
Day Status Start End
{weekdayLabel(row.weekday)} {row.is_open ? 'Open' : 'Closed'} {row.is_open ? row.start_time : '—'} {row.is_open ? row.end_time : '—'}
{/if}