@nomideusz/svelte-calendar 0.3.1 → 0.5.1

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 (75) hide show
  1. package/README.md +193 -406
  2. package/dist/adapters/recurring.d.ts +45 -8
  3. package/dist/adapters/recurring.js +227 -49
  4. package/dist/adapters/rest.js +6 -1
  5. package/dist/calendar/Calendar.svelte +137 -29
  6. package/dist/calendar/Calendar.svelte.d.ts +10 -8
  7. package/dist/calendar/index.d.ts +0 -1
  8. package/dist/calendar/index.js +0 -1
  9. package/dist/core/index.d.ts +5 -4
  10. package/dist/core/index.js +2 -3
  11. package/dist/core/locale.d.ts +74 -0
  12. package/dist/core/locale.js +96 -4
  13. package/dist/core/time.d.ts +30 -0
  14. package/dist/core/time.js +42 -0
  15. package/dist/core/types.d.ts +1 -72
  16. package/dist/core/types.js +1 -8
  17. package/dist/engine/event-store.svelte.js +2 -2
  18. package/dist/engine/index.d.ts +1 -1
  19. package/dist/engine/view-state.svelte.d.ts +12 -6
  20. package/dist/engine/view-state.svelte.js +8 -4
  21. package/dist/index.d.ts +6 -7
  22. package/dist/index.js +4 -4
  23. package/dist/primitives/EmptySlot.svelte +6 -16
  24. package/dist/primitives/EventBlock.svelte +6 -19
  25. package/dist/primitives/NowIndicator.svelte +7 -4
  26. package/dist/primitives/TimeGutter.svelte +1 -1
  27. package/dist/theme/index.d.ts +1 -1
  28. package/dist/theme/index.js +1 -1
  29. package/dist/theme/presets.d.ts +11 -19
  30. package/dist/theme/presets.js +25 -111
  31. package/dist/views/agenda/Agenda.svelte +17 -1514
  32. package/dist/views/agenda/Agenda.svelte.d.ts +0 -13
  33. package/dist/views/agenda/AgendaDay.svelte +976 -0
  34. package/dist/views/agenda/AgendaDay.svelte.d.ts +14 -0
  35. package/dist/views/agenda/AgendaWeek.svelte +775 -0
  36. package/dist/views/agenda/AgendaWeek.svelte.d.ts +15 -0
  37. package/dist/views/agenda/index.d.ts +2 -0
  38. package/dist/views/agenda/index.js +2 -0
  39. package/dist/views/index.d.ts +2 -6
  40. package/dist/views/index.js +2 -6
  41. package/dist/views/planner/Planner.svelte +17 -0
  42. package/dist/views/planner/Planner.svelte.d.ts +7 -0
  43. package/dist/views/planner/PlannerDay.svelte +957 -0
  44. package/dist/views/{day/DayGrid.svelte.d.ts → planner/PlannerDay.svelte.d.ts} +8 -16
  45. package/dist/views/planner/PlannerWeek.svelte +826 -0
  46. package/dist/views/{week/WeekGrid.svelte.d.ts → planner/PlannerWeek.svelte.d.ts} +5 -9
  47. package/dist/views/planner/index.d.ts +1 -0
  48. package/dist/views/planner/index.js +1 -0
  49. package/dist/widget/CalendarWidget.svelte +54 -35
  50. package/dist/widget/CalendarWidget.svelte.d.ts +1 -1
  51. package/dist/widget/widget.d.ts +1 -7
  52. package/dist/widget/widget.js +44 -3
  53. package/package.json +5 -2
  54. package/widget/svelte-calendar.css +1 -0
  55. package/widget/widget.js +6 -144
  56. package/dist/calendar/Toolbar.svelte +0 -241
  57. package/dist/calendar/Toolbar.svelte.d.ts +0 -19
  58. package/dist/views/day/DayGrid.svelte +0 -1101
  59. package/dist/views/day/DayTimeline.svelte +0 -532
  60. package/dist/views/day/DayTimeline.svelte.d.ts +0 -4
  61. package/dist/views/day/index.d.ts +0 -2
  62. package/dist/views/day/index.js +0 -2
  63. package/dist/views/schedule/WeekSchedule.svelte +0 -133
  64. package/dist/views/schedule/WeekSchedule.svelte.d.ts +0 -38
  65. package/dist/views/schedule/index.d.ts +0 -1
  66. package/dist/views/schedule/index.js +0 -2
  67. package/dist/views/settings/Settings.svelte +0 -307
  68. package/dist/views/settings/Settings.svelte.d.ts +0 -23
  69. package/dist/views/settings/index.d.ts +0 -2
  70. package/dist/views/settings/index.js +0 -1
  71. package/dist/views/week/WeekGrid.svelte +0 -631
  72. package/dist/views/week/WeekHeatmap.svelte +0 -460
  73. package/dist/views/week/WeekHeatmap.svelte.d.ts +0 -8
  74. package/dist/views/week/index.d.ts +0 -2
  75. package/dist/views/week/index.js +0 -2
@@ -11,14 +11,10 @@ export interface TimelineEvent {
11
11
  start: Date;
12
12
  end: Date;
13
13
  color?: string;
14
- /** All-day event (renders as a banner, not a timed block) */
14
+ /** True for all-day events (no specific start/end time) */
15
15
  allDay?: boolean;
16
16
  /** Category for grouping (e.g. "wellness", "work", "life") */
17
17
  category?: string;
18
- /** Recurrence rule — iCalendar RRULE string (e.g. "FREQ=WEEKLY;BYDAY=MO") */
19
- recurrence?: string;
20
- /** Whether this event can be moved / resized by the user */
21
- editable?: boolean;
22
18
  /** Subtitle displayed below the title (e.g. instructor name, level) */
23
19
  subtitle?: string;
24
20
  /** Tags displayed as small pills (e.g. ["Beginner", "Yoga"]) */
@@ -26,70 +22,3 @@ export interface TimelineEvent {
26
22
  /** Arbitrary payload from the source app (bookings, attendees, etc.) */
27
23
  data?: Record<string, unknown>;
28
24
  }
29
- /**
30
- * Shared props contract for all WeekTimeline variants.
31
- * Every variant MUST accept this exact interface so they can be
32
- * hot-swapped without changing bindings.
33
- */
34
- export interface WeekTimelineProps {
35
- /** Week offset: 0 = this week, -1 = last, +1 = next (ignored when focusDate is set) */
36
- weekOffset?: number;
37
- /** Start on Monday (true) or Sunday (false) */
38
- mondayStart?: boolean;
39
- /** Pixel height of one hour row */
40
- hourHeight?: number;
41
- /** Pixel width of each day column (0 = equal flex) */
42
- dayWidth?: number;
43
- /** Where "now" sits vertically (0 = top edge, 1 = bottom edge) */
44
- nowPosition?: number;
45
- /** Total visible height of the component */
46
- height?: number;
47
- /** Events to render */
48
- events?: TimelineEvent[];
49
- /** Inline style for CSS variable overrides (theme) */
50
- style?: string;
51
- /** The date to centre this view on. Overrides weekOffset when set. */
52
- focusDate?: Date;
53
- /** Called when the user clicks an event */
54
- oneventclick?: (event: TimelineEvent) => void;
55
- /** Called when the user clicks an empty time slot */
56
- oneventcreate?: (range: {
57
- start: Date;
58
- end: Date;
59
- }) => void;
60
- /** Currently selected event ID (for highlight) */
61
- selectedEventId?: string | null;
62
- }
63
- /**
64
- * Shared props contract for the DayTimeline component.
65
- */
66
- export interface DayTimelineProps {
67
- /** Number of past days visible */
68
- pastDays?: number;
69
- /** Number of future days visible */
70
- futureDays?: number;
71
- /** Pixel width of one hour */
72
- hourWidth?: number;
73
- /** Where "now" sits in the viewport (0 = left edge, 1 = right edge) */
74
- nowPosition?: number;
75
- /** Events to render */
76
- events?: TimelineEvent[];
77
- /** Inline style for CSS custom property overrides */
78
- style?: string;
79
- /** The date to centre this view on */
80
- focusDate?: Date;
81
- /** Called when the user clicks an event */
82
- oneventclick?: (event: TimelineEvent) => void;
83
- /** Called when the user clicks an empty time slot */
84
- oneventcreate?: (range: {
85
- start: Date;
86
- end: Date;
87
- }) => void;
88
- /** Currently selected event ID (for highlight) */
89
- selectedEventId?: string | null;
90
- }
91
- /**
92
- * Convert a Date (or timestamp) to a pixel offset on the timeline.
93
- * Useful for external apps that need to position overlays.
94
- */
95
- export declare function timeToX(time: Date | number, rangeStartMs: number, hourWidth: number): number;
@@ -1,11 +1,4 @@
1
1
  /**
2
2
  * Shared TypeScript types for the timeline design system.
3
3
  */
4
- /**
5
- * Convert a Date (or timestamp) to a pixel offset on the timeline.
6
- * Useful for external apps that need to position overlays.
7
- */
8
- export function timeToX(time, rangeStartMs, hourWidth) {
9
- const ms = typeof time === 'number' ? time : time.getTime();
10
- return ((ms - rangeStartMs) / 3_600_000) * hourWidth;
11
- }
4
+ export {};
@@ -1,4 +1,4 @@
1
- import { sod } from '../core/time.js';
1
+ import { sod, DAY_MS } from '../core/time.js';
2
2
  /**
3
3
  * Create a reactive event store backed by a CalendarAdapter.
4
4
  */
@@ -61,7 +61,7 @@ export function createEventStore(adapter) {
61
61
  },
62
62
  forDay(date) {
63
63
  const dayStart = new Date(sod(date.getTime()));
64
- const dayEnd = new Date(dayStart.getTime() + 86_400_000);
64
+ const dayEnd = new Date(dayStart.getTime() + DAY_MS);
65
65
  return events.filter((ev) => overlaps(ev, dayStart, dayEnd));
66
66
  },
67
67
  byId(id) {
@@ -1,7 +1,7 @@
1
1
  export { createEventStore } from './event-store.svelte.js';
2
2
  export type { EventStore } from './event-store.svelte.js';
3
3
  export { createViewState } from './view-state.svelte.js';
4
- export type { ViewState, ViewStateOptions, CalendarViewId, BuiltInViewId, ViewGranularity, DateRange as ViewDateRange, } from './view-state.svelte.js';
4
+ export type { ViewState, ViewStateOptions, CalendarViewId, BuiltInViewId, ViewGranularity, } from './view-state.svelte.js';
5
5
  export { createSelection } from './selection.svelte.js';
6
6
  export type { Selection } from './selection.svelte.js';
7
7
  export { createDragState } from './drag.svelte.js';
@@ -1,10 +1,12 @@
1
+ import type { DateRange } from '../adapters/types.js';
2
+ export type { DateRange };
1
3
  /**
2
4
  * Built-in view IDs. Custom view IDs are also supported — CalendarViewId
3
5
  * is typed as `string` so consumers can register any ID.
4
6
  */
5
- export type BuiltInViewId = 'day-grid' | 'day-agenda' | 'week-grid' | 'week-agenda' | 'week-heatmap';
7
+ export type BuiltInViewId = 'day-planner' | 'day-agenda' | 'week-planner' | 'week-agenda';
6
8
  /**
7
- * Any view identifier. Use built-in strings like 'day-grid' or your own
9
+ * Any view identifier. Use built-in strings like 'day-planner' or your own
8
10
  * custom IDs like 'day-kanban', 'week-resource', etc.
9
11
  */
10
12
  export type CalendarViewId = string;
@@ -14,10 +16,13 @@ export interface ViewStateOptions {
14
16
  mondayStart?: boolean;
15
17
  /** IANA timezone string (e.g. 'America/New_York'). Defaults to local timezone. */
16
18
  timezone?: string;
17
- }
18
- export interface DateRange {
19
- start: Date;
20
- end: Date;
19
+ /** Initial date to focus on (defaults to today). */
20
+ initialDate?: Date;
21
+ /**
22
+ * Optional resolver for view granularity.
23
+ * Useful for custom IDs that don't follow "day-*" / "week-*" naming.
24
+ */
25
+ granularityForView?: (viewId: CalendarViewId) => ViewGranularity | undefined;
21
26
  }
22
27
  export interface ViewState {
23
28
  readonly view: CalendarViewId;
@@ -28,6 +33,7 @@ export interface ViewState {
28
33
  /** IANA timezone, or undefined for local */
29
34
  readonly timezone: string | undefined;
30
35
  setView(id: CalendarViewId): void;
36
+ setMondayStart(value: boolean): void;
31
37
  setFocusDate(date: Date): void;
32
38
  next(): void;
33
39
  prev(): void;
@@ -12,7 +12,7 @@
12
12
  * vs.goToday() — jump to today
13
13
  */
14
14
  import { startOfWeek as calcStartOfWeek, addDaysMs, DAY_MS } from '../core/time.js';
15
- function granularityFor(view) {
15
+ function inferGranularity(view) {
16
16
  if (view.startsWith('day'))
17
17
  return 'day';
18
18
  return 'week';
@@ -32,11 +32,12 @@ function computeRange(focus, granularity, mondayStart) {
32
32
  };
33
33
  }
34
34
  export function createViewState(options = {}) {
35
- let view = $state(options.defaultView ?? 'week-grid');
36
- let focusDate = $state(new Date());
35
+ let view = $state(options.defaultView ?? 'week-planner');
36
+ let focusDate = $state(options.initialDate ?? new Date());
37
37
  let mondayStart = $state(options.mondayStart ?? true);
38
38
  const timezone = options.timezone;
39
- const granularity = $derived(granularityFor(view));
39
+ const granularityResolver = options.granularityForView;
40
+ const granularity = $derived(granularityResolver?.(view) ?? inferGranularity(view));
40
41
  const range = $derived(computeRange(focusDate, granularity, mondayStart));
41
42
  return {
42
43
  get view() {
@@ -60,6 +61,9 @@ export function createViewState(options = {}) {
60
61
  setView(id) {
61
62
  view = id;
62
63
  },
64
+ setMondayStart(value) {
65
+ mondayStart = value;
66
+ },
63
67
  setFocusDate(date) {
64
68
  focusDate = date;
65
69
  },
package/dist/index.d.ts CHANGED
@@ -1,13 +1,12 @@
1
- export { DayGrid, DayTimeline, WeekGrid, WeekHeatmap, Agenda, Settings, WeekSchedule, } from './views/index.js';
2
- export type { SettingsField } from './views/index.js';
1
+ export { Planner, Agenda, AgendaDay, AgendaWeek, } from './views/index.js';
3
2
  export { NowIndicator, EventBlock, TimeGutter, DayHeader, EmptySlot, } from './primitives/index.js';
4
- export { Calendar, Toolbar } from './calendar/index.js';
3
+ export { Calendar } from './calendar/index.js';
5
4
  export type { CalendarView } from './calendar/index.js';
6
5
  export { createEventStore, createViewState, createSelection, createDragState, } from './engine/index.js';
7
- export type { EventStore, ViewState, ViewStateOptions, CalendarViewId, BuiltInViewId, ViewGranularity, ViewDateRange, Selection, DragState, DragMode, DragPayload, } from './engine/index.js';
6
+ export type { EventStore, ViewState, ViewStateOptions, CalendarViewId, BuiltInViewId, ViewGranularity, Selection, DragState, DragMode, DragPayload, } from './engine/index.js';
8
7
  export { createMemoryAdapter, createRestAdapter, createRecurringAdapter } from './adapters/index.js';
9
8
  export type { CalendarAdapter, DateRange, RestAdapterOptions, RecurringEvent, RecurringAdapterOptions, MemoryAdapterOptions, } from './adapters/index.js';
10
- export { createClock, DAY_MS, HOUR_MS, HOURS, sod, startOfWeek, addDaysMs, diffDays, pad, fractionalHour, fmtHM, fmtS, dayNum, dayOfWeek, fmtH, weekdayShort, weekdayLong, monthShort, monthLong, dateShort, dateWithWeekday, fmtDay, fmtWeekRange, setDefaultLocale, getDefaultLocale, is24HourLocale, timeToX, toZonedTime, fromZonedTime, nowInZone, formatInTimeZone, generatePalette, VIVID_PALETTE, } from './core/index.js';
11
- export type { Clock, TimelineEvent, WeekTimelineProps, DayTimelineProps, } from './core/index.js';
12
- export { midnight, parchment, indigo, neutral, bare, presets } from './theme/index.js';
9
+ export { createClock, startOfWeek, fmtH, fmtTime, fmtDuration, weekdayShort, weekdayLong, monthShort, monthLong, dateShort, dateWithWeekday, fmtDay, fmtWeekRange, setDefaultLocale, getDefaultLocale, is24HourLocale, defaultLabels, setLabels, resetLabels, getLabels, toZonedTime, fromZonedTime, nowInZone, formatInTimeZone, generatePalette, VIVID_PALETTE, isMultiDay, isAllDay, segmentForDay, } from './core/index.js';
10
+ export type { Clock, TimelineEvent, DaySegment, CalendarLabels, } from './core/index.js';
11
+ export { midnight, neutral, presets } from './theme/index.js';
13
12
  export type { PresetName } from './theme/index.js';
package/dist/index.js CHANGED
@@ -1,14 +1,14 @@
1
1
  // ─── Views ──────────────────────────────────────────────
2
- export { DayGrid, DayTimeline, WeekGrid, WeekHeatmap, Agenda, Settings, WeekSchedule, } from './views/index.js';
2
+ export { Planner, Agenda, AgendaDay, AgendaWeek, } from './views/index.js';
3
3
  // ─── Primitives ─────────────────────────────────────────
4
4
  export { NowIndicator, EventBlock, TimeGutter, DayHeader, EmptySlot, } from './primitives/index.js';
5
5
  // ─── Calendar shell ─────────────────────────────────────
6
- export { Calendar, Toolbar } from './calendar/index.js';
6
+ export { Calendar } from './calendar/index.js';
7
7
  // ─── Engine (reactive state) ────────────────────────────
8
8
  export { createEventStore, createViewState, createSelection, createDragState, } from './engine/index.js';
9
9
  // ─── Adapters ───────────────────────────────────────────
10
10
  export { createMemoryAdapter, createRestAdapter, createRecurringAdapter } from './adapters/index.js';
11
11
  // ─── Core: clock, time, locale, types ───────────────────
12
- export { createClock, DAY_MS, HOUR_MS, HOURS, sod, startOfWeek, addDaysMs, diffDays, pad, fractionalHour, fmtHM, fmtS, dayNum, dayOfWeek, fmtH, weekdayShort, weekdayLong, monthShort, monthLong, dateShort, dateWithWeekday, fmtDay, fmtWeekRange, setDefaultLocale, getDefaultLocale, is24HourLocale, timeToX, toZonedTime, fromZonedTime, nowInZone, formatInTimeZone, generatePalette, VIVID_PALETTE, } from './core/index.js';
12
+ export { createClock, startOfWeek, fmtH, fmtTime, fmtDuration, weekdayShort, weekdayLong, monthShort, monthLong, dateShort, dateWithWeekday, fmtDay, fmtWeekRange, setDefaultLocale, getDefaultLocale, is24HourLocale, defaultLabels, setLabels, resetLabels, getLabels, toZonedTime, fromZonedTime, nowInZone, formatInTimeZone, generatePalette, VIVID_PALETTE, isMultiDay, isAllDay, segmentForDay, } from './core/index.js';
13
13
  // ─── Themes ─────────────────────────────────────────────
14
- export { midnight, parchment, indigo, neutral, bare, presets } from './theme/index.js';
14
+ export { midnight, neutral, presets } from './theme/index.js';
@@ -6,6 +6,10 @@
6
6
  between events.
7
7
  -->
8
8
  <script lang="ts">
9
+ import { fmtTime, fmtDuration, getLabels } from '../core/locale.js';
10
+
11
+ const L = $derived(getLabels());
12
+
9
13
  interface Props {
10
14
  /** Start time of the empty slot */
11
15
  start: Date;
@@ -24,21 +28,7 @@
24
28
  orientation = 'vertical',
25
29
  }: Props = $props();
26
30
 
27
- function fmtTime(d: Date): string {
28
- const h = d.getHours();
29
- const m = d.getMinutes();
30
- const suffix = h >= 12 ? 'p' : 'a';
31
- const h12 = h === 0 ? 12 : h > 12 ? h - 12 : h;
32
- return m === 0 ? `${h12}${suffix}` : `${h12}:${String(m).padStart(2, '0')}${suffix}`;
33
- }
34
-
35
- const dur = $derived.by(() => {
36
- const mins = Math.round((end.getTime() - start.getTime()) / 60_000);
37
- if (mins < 60) return `${mins}m free`;
38
- const h = Math.floor(mins / 60);
39
- const m = mins % 60;
40
- return m > 0 ? `${h}h ${m}m free` : `${h}h free`;
41
- });
31
+ const dur = $derived(`${fmtDuration(start, end)} ${L.free}`);
42
32
 
43
33
  function handleKeydown(e: KeyboardEvent) {
44
34
  if (e.key === 'Enter' || e.key === ' ') {
@@ -54,7 +44,7 @@
54
44
  class:es-h={orientation === 'horizontal'}
55
45
  role="button"
56
46
  tabindex="0"
57
- aria-label="Create event, {fmtTime(start)} to {fmtTime(end)}, {dur}"
47
+ aria-label="{L.createEvent}, {fmtTime(start)} to {fmtTime(end)}, {dur}"
58
48
  onclick={() => onclick?.({ start, end })}
59
49
  onkeydown={handleKeydown}
60
50
  >
@@ -10,8 +10,11 @@
10
10
  -->
11
11
  <script lang="ts">
12
12
  import type { TimelineEvent } from '../core/types.js';
13
+ import { fmtTime, fmtDuration, getLabels } from '../core/locale.js';
13
14
  import type { Snippet } from 'svelte';
14
15
 
16
+ const L = $derived(getLabels());
17
+
15
18
  interface Props {
16
19
  event: TimelineEvent;
17
20
  /** Display variant */
@@ -44,29 +47,13 @@
44
47
  children,
45
48
  }: Props = $props();
46
49
 
47
- function fmtTime(d: Date): string {
48
- const h = d.getHours();
49
- const m = d.getMinutes();
50
- const suffix = h >= 12 ? 'p' : 'a';
51
- const h12 = h === 0 ? 12 : h > 12 ? h - 12 : h;
52
- return m === 0 ? `${h12}${suffix}` : `${h12}:${String(m).padStart(2, '0')}${suffix}`;
53
- }
54
-
55
- function fmtDuration(start: Date, end: Date): string {
56
- const mins = Math.round((end.getTime() - start.getTime()) / 60_000);
57
- if (mins < 60) return `${mins}m`;
58
- const h = Math.floor(mins / 60);
59
- const m = mins % 60;
60
- return m > 0 ? `${h}h ${m}m` : `${h}h`;
61
- }
62
-
63
50
  const accentColor = $derived(event.color || 'var(--dt-accent, #ef4444)');
64
51
 
65
52
  const ariaLabel = $derived.by(() => {
66
53
  const t = event.title;
67
54
  const time = `${fmtTime(event.start)} to ${fmtTime(event.end)}`;
68
55
  const dur = fmtDuration(event.start, event.end);
69
- const status = active ? ', happening now' : past ? ', past' : '';
56
+ const status = active ? `, ${L.happeningNow}` : past ? `, ${L.past}` : '';
70
57
  return `${t}, ${time}, ${dur}${status}`;
71
58
  });
72
59
 
@@ -105,7 +92,7 @@
105
92
  {/each}
106
93
  </div>
107
94
  {/if}
108
- {#if active}<span class="eb-live-badge">now</span>{/if}
95
+ {#if active}<span class="eb-live-badge">{L.now}</span>{/if}
109
96
  </div>
110
97
  {:else}
111
98
  <!-- row -->
@@ -125,7 +112,7 @@
125
112
  {/each}
126
113
  </span>
127
114
  {/if}
128
- {#if active}<span class="eb-live-badge">now</span>{/if}
115
+ {#if active}<span class="eb-live-badge">{L.now}</span>{/if}
129
116
  {/if}
130
117
  {/snippet}
131
118
 
@@ -13,6 +13,9 @@
13
13
  -->
14
14
  <script lang="ts">
15
15
  import type { Snippet } from 'svelte';
16
+ import { getLabels } from '../core/locale.js';
17
+
18
+ const L = $derived(getLabels());
16
19
 
17
20
  interface Props {
18
21
  /** Visual mode */
@@ -53,15 +56,15 @@
53
56
  </script>
54
57
 
55
58
  {#if mode === 'badge'}
56
- <span class="ni-badge" style={colorVar} role="status" aria-live="polite" aria-label="Current time: {time}">
59
+ <span class="ni-badge" style={colorVar} role="status" aria-live="polite" aria-label="{L.currentTime}: {time}">
57
60
  {#if children}
58
61
  {@render children()}
59
62
  {:else}
60
- now
63
+ {L.now}
61
64
  {/if}
62
65
  </span>
63
66
  {:else if mode === 'dot'}
64
- <div class="ni ni-dot {orientation}" style="{posStyle}; {colorVar}" role="status" aria-label="Current time: {time}">
67
+ <div class="ni ni-dot {orientation}" style="{posStyle}; {colorVar}" role="status" aria-label="{L.currentTime}: {time}">
65
68
  <div class="ni-dot-circle"></div>
66
69
  {#if showLabel && time}
67
70
  <div class="ni-label">
@@ -71,7 +74,7 @@
71
74
  {/if}
72
75
  </div>
73
76
  {:else}
74
- <div class="ni ni-line {orientation}" style="{posStyle}; {colorVar}" role="status" aria-label="Current time: {time}">
77
+ <div class="ni ni-line {orientation}" style="{posStyle}; {colorVar}" role="status" aria-label="{L.currentTime}: {time}">
75
78
  <div class="ni-line-bar"></div>
76
79
  {#if showLabel && time}
77
80
  <div class="ni-label">
@@ -2,7 +2,7 @@
2
2
  TimeGutter — shared hour labels / tick marks.
3
3
 
4
4
  Two orientations:
5
- "horizontal" — ticks along a horizontal track (for DayTimeline style)
5
+ "horizontal" — ticks along a horizontal track (for day timeline-style layouts)
6
6
  "vertical" — label column along a vertical grid (for WeekTimeline style)
7
7
  -->
8
8
  <script lang="ts">
@@ -1,2 +1,2 @@
1
- export { midnight, parchment, indigo, neutral, bare, presets, } from './presets.js';
1
+ export { midnight, neutral, presets, } from './presets.js';
2
2
  export type { PresetName } from './presets.js';
@@ -1,2 +1,2 @@
1
1
  // ─── Theme barrel export ────────────────────────────────
2
- export { midnight, parchment, indigo, neutral, bare, presets, } from './presets.js';
2
+ export { midnight, neutral, presets, } from './presets.js';
@@ -2,31 +2,23 @@
2
2
  * Theme presets for timeline components.
3
3
  *
4
4
  * Each preset is a CSS inline-style string of --dt-* custom properties.
5
- * Pass to the `style` prop of any timeline component.
5
+ * Pass to the `theme` prop of any timeline component.
6
+ *
7
+ * Presets:
8
+ * midnight — Dark mode with red accent
9
+ * neutral — Light mode, inherits host fonts
6
10
  */
7
- /** Midnight Industrial — dark charcoal + red accent, tech monitoring */
8
- export declare const midnight = "\n\t--dt-stage-bg: #080a0f;\n\t--dt-bg: #0b0e14;\n\t--dt-surface: #10141c;\n\t--dt-border: rgba(148, 163, 184, 0.07);\n\t--dt-border-day: rgba(148, 163, 184, 0.14);\n\t--dt-text: rgba(226, 232, 240, 0.85);\n\t--dt-text-2: rgba(148, 163, 184, 0.55);\n\t--dt-text-3: rgba(100, 116, 139, 0.55);\n\t--dt-accent: #ef4444;\n\t--dt-accent-dim: rgba(239, 68, 68, 0.18);\n\t--dt-glow: rgba(239, 68, 68, 0.35);\n\t--dt-today-bg: rgba(239, 68, 68, 0.02);\n\t--dt-btn-text: #fff;\n\t--dt-scrollbar: rgba(148, 163, 184, 0.12);\n\t--dt-success: rgba(74, 222, 128, 0.7);\n\t--dt-serif: Georgia, 'Times New Roman', serif;\n\t--dt-hm-empty: rgba(80, 80, 120, 0.06);\n\t--dt-hm-low: rgba(239, 68, 68, 0.15);\n\t--dt-hm-mid: rgba(239, 68, 68, 0.3);\n\t--dt-hm-high: rgba(239, 68, 68, 0.5);\n\t--dt-hm-max: rgba(239, 68, 68, 0.72);\n";
9
- /** Desert Parchment — warm analog planner, burnt sienna on aged paper */
10
- export declare const parchment = "\n\t--dt-stage-bg: #e4dace;\n\t--dt-bg: #f0e9dd;\n\t--dt-surface: #e8dfd0;\n\t--dt-border: rgba(139, 110, 70, 0.12);\n\t--dt-border-day: rgba(139, 110, 70, 0.22);\n\t--dt-text: rgba(55, 40, 22, 0.88);\n\t--dt-text-2: rgba(110, 85, 52, 0.62);\n\t--dt-text-3: rgba(139, 110, 70, 0.42);\n\t--dt-accent: #b85c2f;\n\t--dt-accent-dim: rgba(184, 92, 47, 0.14);\n\t--dt-glow: rgba(184, 92, 47, 0.25);\n\t--dt-today-bg: rgba(184, 92, 47, 0.04);\n\t--dt-btn-text: #fdf6ee;\n\t--dt-scrollbar: rgba(139, 110, 70, 0.15);\n\t--dt-success: rgba(76, 153, 76, 0.7);\n\t--dt-serif: Georgia, 'Times New Roman', serif;\n\t--dt-mono: 'Courier New', 'Courier', monospace;\n\t--dt-sans: 'Outfit', Georgia, serif;\n\t--dt-hm-empty: rgba(139, 110, 70, 0.06);\n\t--dt-hm-low: rgba(184, 92, 47, 0.15);\n\t--dt-hm-mid: rgba(184, 92, 47, 0.3);\n\t--dt-hm-high: rgba(184, 92, 47, 0.5);\n\t--dt-hm-max: rgba(184, 92, 47, 0.72);\n";
11
- /** Soft Indigo — calm productivity, muted lavender with indigo markers */
12
- export declare const indigo = "\n\t--dt-stage-bg: #efedf8;\n\t--dt-bg: #f7f6fc;\n\t--dt-surface: #eeedf8;\n\t--dt-border: rgba(99, 102, 241, 0.08);\n\t--dt-border-day: rgba(99, 102, 241, 0.14);\n\t--dt-text: rgba(30, 27, 55, 0.82);\n\t--dt-text-2: rgba(75, 70, 120, 0.55);\n\t--dt-text-3: rgba(99, 102, 241, 0.3);\n\t--dt-accent: #6366f1;\n\t--dt-accent-dim: rgba(99, 102, 241, 0.12);\n\t--dt-glow: rgba(99, 102, 241, 0.25);\n\t--dt-today-bg: rgba(99, 102, 241, 0.03);\n\t--dt-btn-text: #fff;\n\t--dt-scrollbar: rgba(99, 102, 241, 0.1);\n\t--dt-success: rgba(34, 197, 94, 0.7);\n\t--dt-serif: Georgia, 'Times New Roman', serif;\n\t--dt-sans: 'Outfit', system-ui, sans-serif;\n\t--dt-hm-empty: rgba(99, 102, 241, 0.04);\n\t--dt-hm-low: rgba(99, 102, 241, 0.12);\n\t--dt-hm-mid: rgba(99, 102, 241, 0.28);\n\t--dt-hm-high: rgba(99, 102, 241, 0.48);\n\t--dt-hm-max: rgba(99, 102, 241, 0.7);\n";
13
11
  /**
14
12
  * Neutral — inherits fonts from host page, uses standard grays + safe blue accent.
15
13
  * Drop-in preset that blends into any website without fighting its design.
14
+ * This is the recommended default.
16
15
  */
17
- export declare const neutral = "\n\t--dt-stage-bg: #ffffff;\n\t--dt-bg: #ffffff;\n\t--dt-surface: #f9fafb;\n\t--dt-border: rgba(0, 0, 0, 0.08);\n\t--dt-border-day: rgba(0, 0, 0, 0.14);\n\t--dt-text: rgba(0, 0, 0, 0.87);\n\t--dt-text-2: rgba(0, 0, 0, 0.54);\n\t--dt-text-3: rgba(0, 0, 0, 0.38);\n\t--dt-accent: #2563eb;\n\t--dt-accent-dim: rgba(37, 99, 235, 0.12);\n\t--dt-glow: rgba(37, 99, 235, 0.25);\n\t--dt-today-bg: rgba(37, 99, 235, 0.04);\n\t--dt-btn-text: #fff;\n\t--dt-scrollbar: rgba(0, 0, 0, 0.1);\n\t--dt-success: rgba(22, 163, 74, 0.7);\n\t--dt-serif: inherit;\n\t--dt-sans: inherit;\n\t--dt-mono: ui-monospace, 'SFMono-Regular', monospace;\n\t--dt-hm-empty: rgba(0, 0, 0, 0.03);\n\t--dt-hm-low: rgba(37, 99, 235, 0.12);\n\t--dt-hm-mid: rgba(37, 99, 235, 0.28);\n\t--dt-hm-high: rgba(37, 99, 235, 0.48);\n\t--dt-hm-max: rgba(37, 99, 235, 0.7);\n";
18
- /**
19
- * Bare — transparent skeleton that inherits everything from the host page.
20
- * All colors use currentColor/transparent/inherit so the calendar fully absorbs
21
- * the parent site's design. Override individual --dt-* tokens as needed.
22
- */
23
- export declare const bare = "\n\t--dt-stage-bg: transparent;\n\t--dt-bg: transparent;\n\t--dt-surface: transparent;\n\t--dt-border: currentColor;\n\t--dt-border-day: currentColor;\n\t--dt-text: inherit;\n\t--dt-text-2: inherit;\n\t--dt-text-3: inherit;\n\t--dt-accent: currentColor;\n\t--dt-accent-dim: transparent;\n\t--dt-glow: transparent;\n\t--dt-today-bg: transparent;\n\t--dt-btn-text: inherit;\n\t--dt-scrollbar: currentColor;\n\t--dt-success: currentColor;\n\t--dt-serif: inherit;\n\t--dt-sans: inherit;\n\t--dt-mono: inherit;\n\t--dt-hm-empty: transparent;\n\t--dt-hm-low: currentColor;\n\t--dt-hm-mid: currentColor;\n\t--dt-hm-high: currentColor;\n\t--dt-hm-max: currentColor;\n";
16
+ export declare const neutral = "\n\t--dt-stage-bg: #ffffff;\n\t--dt-bg: #ffffff;\n\t--dt-surface: #f9fafb;\n\t--dt-border: rgba(0, 0, 0, 0.08);\n\t--dt-border-day: rgba(0, 0, 0, 0.14);\n\t--dt-text: rgba(0, 0, 0, 0.87);\n\t--dt-text-2: rgba(0, 0, 0, 0.54);\n\t--dt-text-3: rgba(0, 0, 0, 0.38);\n\t--dt-accent: #2563eb;\n\t--dt-accent-dim: rgba(37, 99, 235, 0.12);\n\t--dt-glow: rgba(37, 99, 235, 0.25);\n\t--dt-today-bg: rgba(37, 99, 235, 0.04);\n\t--dt-btn-text: #fff;\n\t--dt-scrollbar: rgba(0, 0, 0, 0.1);\n\t--dt-success: rgba(22, 163, 74, 0.7);\n\t--dt-serif: inherit;\n\t--dt-sans: inherit;\n\t--dt-mono: ui-monospace, 'SFMono-Regular', monospace;\n";
17
+ /** Midnight Industrial — dark charcoal + red accent, tech monitoring */
18
+ export declare const midnight = "\n\t--dt-stage-bg: #080a0f;\n\t--dt-bg: #0b0e14;\n\t--dt-surface: #10141c;\n\t--dt-border: rgba(148, 163, 184, 0.07);\n\t--dt-border-day: rgba(148, 163, 184, 0.14);\n\t--dt-text: rgba(226, 232, 240, 0.85);\n\t--dt-text-2: rgba(148, 163, 184, 0.55);\n\t--dt-text-3: rgba(100, 116, 139, 0.55);\n\t--dt-accent: #ef4444;\n\t--dt-accent-dim: rgba(239, 68, 68, 0.18);\n\t--dt-glow: rgba(239, 68, 68, 0.35);\n\t--dt-today-bg: rgba(239, 68, 68, 0.02);\n\t--dt-btn-text: #fff;\n\t--dt-scrollbar: rgba(148, 163, 184, 0.12);\n\t--dt-success: rgba(74, 222, 128, 0.7);\n\t--dt-serif: Georgia, 'Times New Roman', serif;\n";
24
19
  /** All available presets keyed by name */
25
20
  export declare const presets: {
26
- readonly midnight: "\n\t--dt-stage-bg: #080a0f;\n\t--dt-bg: #0b0e14;\n\t--dt-surface: #10141c;\n\t--dt-border: rgba(148, 163, 184, 0.07);\n\t--dt-border-day: rgba(148, 163, 184, 0.14);\n\t--dt-text: rgba(226, 232, 240, 0.85);\n\t--dt-text-2: rgba(148, 163, 184, 0.55);\n\t--dt-text-3: rgba(100, 116, 139, 0.55);\n\t--dt-accent: #ef4444;\n\t--dt-accent-dim: rgba(239, 68, 68, 0.18);\n\t--dt-glow: rgba(239, 68, 68, 0.35);\n\t--dt-today-bg: rgba(239, 68, 68, 0.02);\n\t--dt-btn-text: #fff;\n\t--dt-scrollbar: rgba(148, 163, 184, 0.12);\n\t--dt-success: rgba(74, 222, 128, 0.7);\n\t--dt-serif: Georgia, 'Times New Roman', serif;\n\t--dt-hm-empty: rgba(80, 80, 120, 0.06);\n\t--dt-hm-low: rgba(239, 68, 68, 0.15);\n\t--dt-hm-mid: rgba(239, 68, 68, 0.3);\n\t--dt-hm-high: rgba(239, 68, 68, 0.5);\n\t--dt-hm-max: rgba(239, 68, 68, 0.72);\n";
27
- readonly parchment: "\n\t--dt-stage-bg: #e4dace;\n\t--dt-bg: #f0e9dd;\n\t--dt-surface: #e8dfd0;\n\t--dt-border: rgba(139, 110, 70, 0.12);\n\t--dt-border-day: rgba(139, 110, 70, 0.22);\n\t--dt-text: rgba(55, 40, 22, 0.88);\n\t--dt-text-2: rgba(110, 85, 52, 0.62);\n\t--dt-text-3: rgba(139, 110, 70, 0.42);\n\t--dt-accent: #b85c2f;\n\t--dt-accent-dim: rgba(184, 92, 47, 0.14);\n\t--dt-glow: rgba(184, 92, 47, 0.25);\n\t--dt-today-bg: rgba(184, 92, 47, 0.04);\n\t--dt-btn-text: #fdf6ee;\n\t--dt-scrollbar: rgba(139, 110, 70, 0.15);\n\t--dt-success: rgba(76, 153, 76, 0.7);\n\t--dt-serif: Georgia, 'Times New Roman', serif;\n\t--dt-mono: 'Courier New', 'Courier', monospace;\n\t--dt-sans: 'Outfit', Georgia, serif;\n\t--dt-hm-empty: rgba(139, 110, 70, 0.06);\n\t--dt-hm-low: rgba(184, 92, 47, 0.15);\n\t--dt-hm-mid: rgba(184, 92, 47, 0.3);\n\t--dt-hm-high: rgba(184, 92, 47, 0.5);\n\t--dt-hm-max: rgba(184, 92, 47, 0.72);\n";
28
- readonly indigo: "\n\t--dt-stage-bg: #efedf8;\n\t--dt-bg: #f7f6fc;\n\t--dt-surface: #eeedf8;\n\t--dt-border: rgba(99, 102, 241, 0.08);\n\t--dt-border-day: rgba(99, 102, 241, 0.14);\n\t--dt-text: rgba(30, 27, 55, 0.82);\n\t--dt-text-2: rgba(75, 70, 120, 0.55);\n\t--dt-text-3: rgba(99, 102, 241, 0.3);\n\t--dt-accent: #6366f1;\n\t--dt-accent-dim: rgba(99, 102, 241, 0.12);\n\t--dt-glow: rgba(99, 102, 241, 0.25);\n\t--dt-today-bg: rgba(99, 102, 241, 0.03);\n\t--dt-btn-text: #fff;\n\t--dt-scrollbar: rgba(99, 102, 241, 0.1);\n\t--dt-success: rgba(34, 197, 94, 0.7);\n\t--dt-serif: Georgia, 'Times New Roman', serif;\n\t--dt-sans: 'Outfit', system-ui, sans-serif;\n\t--dt-hm-empty: rgba(99, 102, 241, 0.04);\n\t--dt-hm-low: rgba(99, 102, 241, 0.12);\n\t--dt-hm-mid: rgba(99, 102, 241, 0.28);\n\t--dt-hm-high: rgba(99, 102, 241, 0.48);\n\t--dt-hm-max: rgba(99, 102, 241, 0.7);\n";
29
- readonly neutral: "\n\t--dt-stage-bg: #ffffff;\n\t--dt-bg: #ffffff;\n\t--dt-surface: #f9fafb;\n\t--dt-border: rgba(0, 0, 0, 0.08);\n\t--dt-border-day: rgba(0, 0, 0, 0.14);\n\t--dt-text: rgba(0, 0, 0, 0.87);\n\t--dt-text-2: rgba(0, 0, 0, 0.54);\n\t--dt-text-3: rgba(0, 0, 0, 0.38);\n\t--dt-accent: #2563eb;\n\t--dt-accent-dim: rgba(37, 99, 235, 0.12);\n\t--dt-glow: rgba(37, 99, 235, 0.25);\n\t--dt-today-bg: rgba(37, 99, 235, 0.04);\n\t--dt-btn-text: #fff;\n\t--dt-scrollbar: rgba(0, 0, 0, 0.1);\n\t--dt-success: rgba(22, 163, 74, 0.7);\n\t--dt-serif: inherit;\n\t--dt-sans: inherit;\n\t--dt-mono: ui-monospace, 'SFMono-Regular', monospace;\n\t--dt-hm-empty: rgba(0, 0, 0, 0.03);\n\t--dt-hm-low: rgba(37, 99, 235, 0.12);\n\t--dt-hm-mid: rgba(37, 99, 235, 0.28);\n\t--dt-hm-high: rgba(37, 99, 235, 0.48);\n\t--dt-hm-max: rgba(37, 99, 235, 0.7);\n";
30
- readonly bare: "\n\t--dt-stage-bg: transparent;\n\t--dt-bg: transparent;\n\t--dt-surface: transparent;\n\t--dt-border: currentColor;\n\t--dt-border-day: currentColor;\n\t--dt-text: inherit;\n\t--dt-text-2: inherit;\n\t--dt-text-3: inherit;\n\t--dt-accent: currentColor;\n\t--dt-accent-dim: transparent;\n\t--dt-glow: transparent;\n\t--dt-today-bg: transparent;\n\t--dt-btn-text: inherit;\n\t--dt-scrollbar: currentColor;\n\t--dt-success: currentColor;\n\t--dt-serif: inherit;\n\t--dt-sans: inherit;\n\t--dt-mono: inherit;\n\t--dt-hm-empty: transparent;\n\t--dt-hm-low: currentColor;\n\t--dt-hm-mid: currentColor;\n\t--dt-hm-high: currentColor;\n\t--dt-hm-max: currentColor;\n";
21
+ readonly midnight: "\n\t--dt-stage-bg: #080a0f;\n\t--dt-bg: #0b0e14;\n\t--dt-surface: #10141c;\n\t--dt-border: rgba(148, 163, 184, 0.07);\n\t--dt-border-day: rgba(148, 163, 184, 0.14);\n\t--dt-text: rgba(226, 232, 240, 0.85);\n\t--dt-text-2: rgba(148, 163, 184, 0.55);\n\t--dt-text-3: rgba(100, 116, 139, 0.55);\n\t--dt-accent: #ef4444;\n\t--dt-accent-dim: rgba(239, 68, 68, 0.18);\n\t--dt-glow: rgba(239, 68, 68, 0.35);\n\t--dt-today-bg: rgba(239, 68, 68, 0.02);\n\t--dt-btn-text: #fff;\n\t--dt-scrollbar: rgba(148, 163, 184, 0.12);\n\t--dt-success: rgba(74, 222, 128, 0.7);\n\t--dt-serif: Georgia, 'Times New Roman', serif;\n";
22
+ readonly neutral: "\n\t--dt-stage-bg: #ffffff;\n\t--dt-bg: #ffffff;\n\t--dt-surface: #f9fafb;\n\t--dt-border: rgba(0, 0, 0, 0.08);\n\t--dt-border-day: rgba(0, 0, 0, 0.14);\n\t--dt-text: rgba(0, 0, 0, 0.87);\n\t--dt-text-2: rgba(0, 0, 0, 0.54);\n\t--dt-text-3: rgba(0, 0, 0, 0.38);\n\t--dt-accent: #2563eb;\n\t--dt-accent-dim: rgba(37, 99, 235, 0.12);\n\t--dt-glow: rgba(37, 99, 235, 0.25);\n\t--dt-today-bg: rgba(37, 99, 235, 0.04);\n\t--dt-btn-text: #fff;\n\t--dt-scrollbar: rgba(0, 0, 0, 0.1);\n\t--dt-success: rgba(22, 163, 74, 0.7);\n\t--dt-serif: inherit;\n\t--dt-sans: inherit;\n\t--dt-mono: ui-monospace, 'SFMono-Regular', monospace;\n";
31
23
  };
32
24
  export type PresetName = keyof typeof presets;
@@ -2,86 +2,16 @@
2
2
  * Theme presets for timeline components.
3
3
  *
4
4
  * Each preset is a CSS inline-style string of --dt-* custom properties.
5
- * Pass to the `style` prop of any timeline component.
5
+ * Pass to the `theme` prop of any timeline component.
6
+ *
7
+ * Presets:
8
+ * midnight — Dark mode with red accent
9
+ * neutral — Light mode, inherits host fonts
6
10
  */
7
- /** Midnight Industrial — dark charcoal + red accent, tech monitoring */
8
- export const midnight = `
9
- --dt-stage-bg: #080a0f;
10
- --dt-bg: #0b0e14;
11
- --dt-surface: #10141c;
12
- --dt-border: rgba(148, 163, 184, 0.07);
13
- --dt-border-day: rgba(148, 163, 184, 0.14);
14
- --dt-text: rgba(226, 232, 240, 0.85);
15
- --dt-text-2: rgba(148, 163, 184, 0.55);
16
- --dt-text-3: rgba(100, 116, 139, 0.55);
17
- --dt-accent: #ef4444;
18
- --dt-accent-dim: rgba(239, 68, 68, 0.18);
19
- --dt-glow: rgba(239, 68, 68, 0.35);
20
- --dt-today-bg: rgba(239, 68, 68, 0.02);
21
- --dt-btn-text: #fff;
22
- --dt-scrollbar: rgba(148, 163, 184, 0.12);
23
- --dt-success: rgba(74, 222, 128, 0.7);
24
- --dt-serif: Georgia, 'Times New Roman', serif;
25
- --dt-hm-empty: rgba(80, 80, 120, 0.06);
26
- --dt-hm-low: rgba(239, 68, 68, 0.15);
27
- --dt-hm-mid: rgba(239, 68, 68, 0.3);
28
- --dt-hm-high: rgba(239, 68, 68, 0.5);
29
- --dt-hm-max: rgba(239, 68, 68, 0.72);
30
- `;
31
- /** Desert Parchment — warm analog planner, burnt sienna on aged paper */
32
- export const parchment = `
33
- --dt-stage-bg: #e4dace;
34
- --dt-bg: #f0e9dd;
35
- --dt-surface: #e8dfd0;
36
- --dt-border: rgba(139, 110, 70, 0.12);
37
- --dt-border-day: rgba(139, 110, 70, 0.22);
38
- --dt-text: rgba(55, 40, 22, 0.88);
39
- --dt-text-2: rgba(110, 85, 52, 0.62);
40
- --dt-text-3: rgba(139, 110, 70, 0.42);
41
- --dt-accent: #b85c2f;
42
- --dt-accent-dim: rgba(184, 92, 47, 0.14);
43
- --dt-glow: rgba(184, 92, 47, 0.25);
44
- --dt-today-bg: rgba(184, 92, 47, 0.04);
45
- --dt-btn-text: #fdf6ee;
46
- --dt-scrollbar: rgba(139, 110, 70, 0.15);
47
- --dt-success: rgba(76, 153, 76, 0.7);
48
- --dt-serif: Georgia, 'Times New Roman', serif;
49
- --dt-mono: 'Courier New', 'Courier', monospace;
50
- --dt-sans: 'Outfit', Georgia, serif;
51
- --dt-hm-empty: rgba(139, 110, 70, 0.06);
52
- --dt-hm-low: rgba(184, 92, 47, 0.15);
53
- --dt-hm-mid: rgba(184, 92, 47, 0.3);
54
- --dt-hm-high: rgba(184, 92, 47, 0.5);
55
- --dt-hm-max: rgba(184, 92, 47, 0.72);
56
- `;
57
- /** Soft Indigo — calm productivity, muted lavender with indigo markers */
58
- export const indigo = `
59
- --dt-stage-bg: #efedf8;
60
- --dt-bg: #f7f6fc;
61
- --dt-surface: #eeedf8;
62
- --dt-border: rgba(99, 102, 241, 0.08);
63
- --dt-border-day: rgba(99, 102, 241, 0.14);
64
- --dt-text: rgba(30, 27, 55, 0.82);
65
- --dt-text-2: rgba(75, 70, 120, 0.55);
66
- --dt-text-3: rgba(99, 102, 241, 0.3);
67
- --dt-accent: #6366f1;
68
- --dt-accent-dim: rgba(99, 102, 241, 0.12);
69
- --dt-glow: rgba(99, 102, 241, 0.25);
70
- --dt-today-bg: rgba(99, 102, 241, 0.03);
71
- --dt-btn-text: #fff;
72
- --dt-scrollbar: rgba(99, 102, 241, 0.1);
73
- --dt-success: rgba(34, 197, 94, 0.7);
74
- --dt-serif: Georgia, 'Times New Roman', serif;
75
- --dt-sans: 'Outfit', system-ui, sans-serif;
76
- --dt-hm-empty: rgba(99, 102, 241, 0.04);
77
- --dt-hm-low: rgba(99, 102, 241, 0.12);
78
- --dt-hm-mid: rgba(99, 102, 241, 0.28);
79
- --dt-hm-high: rgba(99, 102, 241, 0.48);
80
- --dt-hm-max: rgba(99, 102, 241, 0.7);
81
- `;
82
11
  /**
83
12
  * Neutral — inherits fonts from host page, uses standard grays + safe blue accent.
84
13
  * Drop-in preset that blends into any website without fighting its design.
14
+ * This is the recommended default.
85
15
  */
86
16
  export const neutral = `
87
17
  --dt-stage-bg: #ffffff;
@@ -102,41 +32,25 @@ export const neutral = `
102
32
  --dt-serif: inherit;
103
33
  --dt-sans: inherit;
104
34
  --dt-mono: ui-monospace, 'SFMono-Regular', monospace;
105
- --dt-hm-empty: rgba(0, 0, 0, 0.03);
106
- --dt-hm-low: rgba(37, 99, 235, 0.12);
107
- --dt-hm-mid: rgba(37, 99, 235, 0.28);
108
- --dt-hm-high: rgba(37, 99, 235, 0.48);
109
- --dt-hm-max: rgba(37, 99, 235, 0.7);
110
35
  `;
111
- /**
112
- * Bare — transparent skeleton that inherits everything from the host page.
113
- * All colors use currentColor/transparent/inherit so the calendar fully absorbs
114
- * the parent site's design. Override individual --dt-* tokens as needed.
115
- */
116
- export const bare = `
117
- --dt-stage-bg: transparent;
118
- --dt-bg: transparent;
119
- --dt-surface: transparent;
120
- --dt-border: currentColor;
121
- --dt-border-day: currentColor;
122
- --dt-text: inherit;
123
- --dt-text-2: inherit;
124
- --dt-text-3: inherit;
125
- --dt-accent: currentColor;
126
- --dt-accent-dim: transparent;
127
- --dt-glow: transparent;
128
- --dt-today-bg: transparent;
129
- --dt-btn-text: inherit;
130
- --dt-scrollbar: currentColor;
131
- --dt-success: currentColor;
132
- --dt-serif: inherit;
133
- --dt-sans: inherit;
134
- --dt-mono: inherit;
135
- --dt-hm-empty: transparent;
136
- --dt-hm-low: currentColor;
137
- --dt-hm-mid: currentColor;
138
- --dt-hm-high: currentColor;
139
- --dt-hm-max: currentColor;
36
+ /** Midnight Industrial — dark charcoal + red accent, tech monitoring */
37
+ export const midnight = `
38
+ --dt-stage-bg: #080a0f;
39
+ --dt-bg: #0b0e14;
40
+ --dt-surface: #10141c;
41
+ --dt-border: rgba(148, 163, 184, 0.07);
42
+ --dt-border-day: rgba(148, 163, 184, 0.14);
43
+ --dt-text: rgba(226, 232, 240, 0.85);
44
+ --dt-text-2: rgba(148, 163, 184, 0.55);
45
+ --dt-text-3: rgba(100, 116, 139, 0.55);
46
+ --dt-accent: #ef4444;
47
+ --dt-accent-dim: rgba(239, 68, 68, 0.18);
48
+ --dt-glow: rgba(239, 68, 68, 0.35);
49
+ --dt-today-bg: rgba(239, 68, 68, 0.02);
50
+ --dt-btn-text: #fff;
51
+ --dt-scrollbar: rgba(148, 163, 184, 0.12);
52
+ --dt-success: rgba(74, 222, 128, 0.7);
53
+ --dt-serif: Georgia, 'Times New Roman', serif;
140
54
  `;
141
55
  /** All available presets keyed by name */
142
- export const presets = { midnight, parchment, indigo, neutral, bare };
56
+ export const presets = { midnight, neutral };