@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.
- package/README.md +193 -406
- package/dist/adapters/recurring.d.ts +45 -8
- package/dist/adapters/recurring.js +227 -49
- package/dist/adapters/rest.js +6 -1
- package/dist/calendar/Calendar.svelte +137 -29
- package/dist/calendar/Calendar.svelte.d.ts +10 -8
- package/dist/calendar/index.d.ts +0 -1
- package/dist/calendar/index.js +0 -1
- package/dist/core/index.d.ts +5 -4
- package/dist/core/index.js +2 -3
- package/dist/core/locale.d.ts +74 -0
- package/dist/core/locale.js +96 -4
- package/dist/core/time.d.ts +30 -0
- package/dist/core/time.js +42 -0
- package/dist/core/types.d.ts +1 -72
- package/dist/core/types.js +1 -8
- package/dist/engine/event-store.svelte.js +2 -2
- package/dist/engine/index.d.ts +1 -1
- package/dist/engine/view-state.svelte.d.ts +12 -6
- package/dist/engine/view-state.svelte.js +8 -4
- package/dist/index.d.ts +6 -7
- package/dist/index.js +4 -4
- package/dist/primitives/EmptySlot.svelte +6 -16
- package/dist/primitives/EventBlock.svelte +6 -19
- package/dist/primitives/NowIndicator.svelte +7 -4
- package/dist/primitives/TimeGutter.svelte +1 -1
- package/dist/theme/index.d.ts +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/theme/presets.d.ts +11 -19
- package/dist/theme/presets.js +25 -111
- package/dist/views/agenda/Agenda.svelte +17 -1514
- package/dist/views/agenda/Agenda.svelte.d.ts +0 -13
- package/dist/views/agenda/AgendaDay.svelte +976 -0
- package/dist/views/agenda/AgendaDay.svelte.d.ts +14 -0
- package/dist/views/agenda/AgendaWeek.svelte +775 -0
- package/dist/views/agenda/AgendaWeek.svelte.d.ts +15 -0
- package/dist/views/agenda/index.d.ts +2 -0
- package/dist/views/agenda/index.js +2 -0
- package/dist/views/index.d.ts +2 -6
- package/dist/views/index.js +2 -6
- package/dist/views/planner/Planner.svelte +17 -0
- package/dist/views/planner/Planner.svelte.d.ts +7 -0
- package/dist/views/planner/PlannerDay.svelte +957 -0
- package/dist/views/{day/DayGrid.svelte.d.ts → planner/PlannerDay.svelte.d.ts} +8 -16
- package/dist/views/planner/PlannerWeek.svelte +826 -0
- package/dist/views/{week/WeekGrid.svelte.d.ts → planner/PlannerWeek.svelte.d.ts} +5 -9
- package/dist/views/planner/index.d.ts +1 -0
- package/dist/views/planner/index.js +1 -0
- package/dist/widget/CalendarWidget.svelte +54 -35
- package/dist/widget/CalendarWidget.svelte.d.ts +1 -1
- package/dist/widget/widget.d.ts +1 -7
- package/dist/widget/widget.js +44 -3
- package/package.json +5 -2
- package/widget/svelte-calendar.css +1 -0
- package/widget/widget.js +6 -144
- package/dist/calendar/Toolbar.svelte +0 -241
- package/dist/calendar/Toolbar.svelte.d.ts +0 -19
- package/dist/views/day/DayGrid.svelte +0 -1101
- package/dist/views/day/DayTimeline.svelte +0 -532
- package/dist/views/day/DayTimeline.svelte.d.ts +0 -4
- package/dist/views/day/index.d.ts +0 -2
- package/dist/views/day/index.js +0 -2
- package/dist/views/schedule/WeekSchedule.svelte +0 -133
- package/dist/views/schedule/WeekSchedule.svelte.d.ts +0 -38
- package/dist/views/schedule/index.d.ts +0 -1
- package/dist/views/schedule/index.js +0 -2
- package/dist/views/settings/Settings.svelte +0 -307
- package/dist/views/settings/Settings.svelte.d.ts +0 -23
- package/dist/views/settings/index.d.ts +0 -2
- package/dist/views/settings/index.js +0 -1
- package/dist/views/week/WeekGrid.svelte +0 -631
- package/dist/views/week/WeekHeatmap.svelte +0 -460
- package/dist/views/week/WeekHeatmap.svelte.d.ts +0 -8
- package/dist/views/week/index.d.ts +0 -2
- package/dist/views/week/index.js +0 -2
package/dist/core/types.d.ts
CHANGED
|
@@ -11,14 +11,10 @@ export interface TimelineEvent {
|
|
|
11
11
|
start: Date;
|
|
12
12
|
end: Date;
|
|
13
13
|
color?: string;
|
|
14
|
-
/**
|
|
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;
|
package/dist/core/types.js
CHANGED
|
@@ -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() +
|
|
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) {
|
package/dist/engine/index.d.ts
CHANGED
|
@@ -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,
|
|
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-
|
|
7
|
+
export type BuiltInViewId = 'day-planner' | 'day-agenda' | 'week-planner' | 'week-agenda';
|
|
6
8
|
/**
|
|
7
|
-
* Any view identifier. Use built-in strings like 'day-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
|
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-
|
|
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
|
|
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 {
|
|
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
|
|
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,
|
|
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,
|
|
11
|
-
export type { Clock, TimelineEvent,
|
|
12
|
-
export { midnight,
|
|
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 {
|
|
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
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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="
|
|
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 ?
|
|
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="
|
|
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="
|
|
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="
|
|
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
|
|
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">
|
package/dist/theme/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { midnight,
|
|
1
|
+
export { midnight, neutral, presets, } from './presets.js';
|
|
2
2
|
export type { PresetName } from './presets.js';
|
package/dist/theme/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// ─── Theme barrel export ────────────────────────────────
|
|
2
|
-
export { midnight,
|
|
2
|
+
export { midnight, neutral, presets, } from './presets.js';
|
package/dist/theme/presets.d.ts
CHANGED
|
@@ -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 `
|
|
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
|
|
18
|
-
/**
|
|
19
|
-
|
|
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
|
|
27
|
-
readonly
|
|
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;
|
package/dist/theme/presets.js
CHANGED
|
@@ -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 `
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
--dt-
|
|
118
|
-
--dt-
|
|
119
|
-
--dt-
|
|
120
|
-
--dt-
|
|
121
|
-
--dt-
|
|
122
|
-
--dt-
|
|
123
|
-
--dt-
|
|
124
|
-
--dt-
|
|
125
|
-
--dt-
|
|
126
|
-
--dt-
|
|
127
|
-
--dt-
|
|
128
|
-
--dt-
|
|
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,
|
|
56
|
+
export const presets = { midnight, neutral };
|