@k2b/ui 0.22.0 → 0.24.0

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 (117) hide show
  1. package/dist/browser/content/Calendar.js +1122 -1065
  2. package/dist/browser/content/Calendar.js.map +1 -1
  3. package/dist/browser/content/CalendarDayView.js +1187 -0
  4. package/dist/browser/content/CalendarDayView.js.map +1 -0
  5. package/dist/browser/content/CalendarWeekView.js +1593 -0
  6. package/dist/browser/content/CalendarWeekView.js.map +1 -0
  7. package/dist/browser/content/ChartExplorer.js +174 -82
  8. package/dist/browser/content/ChartExplorer.js.map +1 -1
  9. package/dist/browser/content/ChartFilterControls.js +90 -33
  10. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  11. package/dist/browser/content/DataTable.js +235 -197
  12. package/dist/browser/content/DataTable.js.map +1 -1
  13. package/dist/browser/content/calendar-day-scroll.js +111 -0
  14. package/dist/browser/content/calendar-day-scroll.js.map +1 -0
  15. package/dist/browser/content/calendar-days.js +408 -0
  16. package/dist/browser/content/calendar-days.js.map +1 -0
  17. package/dist/browser/content/calendar-dialogs.js +236 -0
  18. package/dist/browser/content/calendar-dialogs.js.map +1 -0
  19. package/dist/browser/content/calendar-messages.js +210 -2
  20. package/dist/browser/content/calendar-messages.js.map +1 -1
  21. package/dist/browser/content/calendar-pointer.js +15 -3
  22. package/dist/browser/content/calendar-pointer.js.map +1 -1
  23. package/dist/browser/content/calendar-shared.js +328 -0
  24. package/dist/browser/content/calendar-shared.js.map +1 -0
  25. package/dist/browser/content/calendar-time-view.js +1654 -0
  26. package/dist/browser/content/calendar-time-view.js.map +1 -0
  27. package/dist/browser/content/chart-messages.js +10 -0
  28. package/dist/browser/content/chart-messages.js.map +1 -1
  29. package/dist/browser/content/index.js.map +1 -1
  30. package/dist/browser/inputs/Combobox.js +0 -1
  31. package/dist/browser/inputs/Combobox.js.map +1 -1
  32. package/dist/browser/layout/AppWorkspace.js +125 -97
  33. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  34. package/dist/browser/layout/Navigation.js +18 -3
  35. package/dist/browser/layout/Navigation.js.map +1 -1
  36. package/dist/browser/layout/PageTitle.js +18 -1
  37. package/dist/browser/layout/PageTitle.js.map +1 -1
  38. package/dist/browser/layout/SidebarSwitcher.js +505 -0
  39. package/dist/browser/layout/SidebarSwitcher.js.map +1 -0
  40. package/dist/browser/layout/app-workspace-controller.js +174 -86
  41. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  42. package/dist/browser/layout/index.js +1 -0
  43. package/dist/browser/layout/index.js.map +1 -1
  44. package/dist/browser/layout/navigation-model.js +1 -0
  45. package/dist/browser/layout/navigation-model.js.map +1 -1
  46. package/dist/browser/surfaces/StatCell.js +18 -6
  47. package/dist/browser/surfaces/StatCell.js.map +1 -1
  48. package/dist/ssr/content/Calendar.js +553 -341
  49. package/dist/ssr/content/Calendar.js.map +1 -1
  50. package/dist/ssr/content/CalendarDayView.js +800 -0
  51. package/dist/ssr/content/CalendarDayView.js.map +1 -0
  52. package/dist/ssr/content/CalendarWeekView.js +1090 -0
  53. package/dist/ssr/content/CalendarWeekView.js.map +1 -0
  54. package/dist/ssr/content/ChartExplorer.js +93 -34
  55. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  56. package/dist/ssr/content/ChartFilterControls.js +49 -7
  57. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  58. package/dist/ssr/content/DataTable.js +88 -66
  59. package/dist/ssr/content/DataTable.js.map +1 -1
  60. package/dist/ssr/content/calendar-day-scroll.js +111 -0
  61. package/dist/ssr/content/calendar-day-scroll.js.map +1 -0
  62. package/dist/ssr/content/calendar-days.js +408 -0
  63. package/dist/ssr/content/calendar-days.js.map +1 -0
  64. package/dist/ssr/content/calendar-dialogs.js +159 -0
  65. package/dist/ssr/content/calendar-dialogs.js.map +1 -0
  66. package/dist/ssr/content/calendar-messages.js +210 -2
  67. package/dist/ssr/content/calendar-messages.js.map +1 -1
  68. package/dist/ssr/content/calendar-pointer.js +15 -3
  69. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  70. package/dist/ssr/content/calendar-shared.js +261 -0
  71. package/dist/ssr/content/calendar-shared.js.map +1 -0
  72. package/dist/ssr/content/calendar-time-view.js +1311 -0
  73. package/dist/ssr/content/calendar-time-view.js.map +1 -0
  74. package/dist/ssr/content/chart-messages.js +10 -0
  75. package/dist/ssr/content/chart-messages.js.map +1 -1
  76. package/dist/ssr/content/index.js.map +1 -1
  77. package/dist/ssr/inputs/Combobox.js.map +1 -1
  78. package/dist/ssr/layout/AppWorkspace.js +40 -29
  79. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  80. package/dist/ssr/layout/Navigation.js +12 -2
  81. package/dist/ssr/layout/Navigation.js.map +1 -1
  82. package/dist/ssr/layout/PageTitle.js +18 -1
  83. package/dist/ssr/layout/PageTitle.js.map +1 -1
  84. package/dist/ssr/layout/SidebarSwitcher.js +271 -0
  85. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -0
  86. package/dist/ssr/layout/app-workspace-controller.js +174 -86
  87. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  88. package/dist/ssr/layout/index.js +1 -0
  89. package/dist/ssr/layout/index.js.map +1 -1
  90. package/dist/ssr/layout/navigation-model.js +1 -0
  91. package/dist/ssr/layout/navigation-model.js.map +1 -1
  92. package/dist/ssr/surfaces/StatCell.js +2 -2
  93. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  94. package/dist/styles.css +1 -1
  95. package/dist/types/content/Calendar.d.ts +95 -1
  96. package/dist/types/content/CalendarDayView.d.ts +7 -0
  97. package/dist/types/content/CalendarWeekView.d.ts +7 -0
  98. package/dist/types/content/ChartExplorer.d.ts +36 -1
  99. package/dist/types/content/ChartFilterControls.d.ts +6 -1
  100. package/dist/types/content/DataTable.d.ts +14 -0
  101. package/dist/types/content/calendar-day-scroll.d.ts +47 -0
  102. package/dist/types/content/calendar-days.d.ts +192 -0
  103. package/dist/types/content/calendar-dialogs.d.ts +22 -0
  104. package/dist/types/content/calendar-messages.d.ts +99 -0
  105. package/dist/types/content/calendar-pointer.d.ts +9 -0
  106. package/dist/types/content/calendar-shared.d.ts +69 -0
  107. package/dist/types/content/calendar-time-view.d.ts +252 -0
  108. package/dist/types/content/chart-messages.d.ts +5 -0
  109. package/dist/types/content/index.d.ts +2 -2
  110. package/dist/types/layout/AppWorkspace.d.ts +27 -3
  111. package/dist/types/layout/PageTitle.d.ts +2 -1
  112. package/dist/types/layout/SidebarSwitcher.d.ts +65 -0
  113. package/dist/types/layout/app-workspace-controller.d.ts +9 -1
  114. package/dist/types/layout/index.d.ts +1 -0
  115. package/dist/types/layout/navigation-model.d.ts +4 -0
  116. package/dist/types/surfaces/StatCell.d.ts +5 -0
  117. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/calendar-dialogs.tsx"],"sourcesContent":["import { createSignal, For, Show } from \"solid-js\";\nimport { dialogCore } from \"../feedback/dialog-core\";\nimport { DialogHeader } from \"../feedback/prompts\";\nimport type { CalendarCommand } from \"./Calendar\";\nimport { addDayKeys } from \"./calendar-days\";\nimport type { CalendarMessages } from \"./calendar-messages\";\n\nconst isMac = () => typeof navigator !== \"undefined\" && /Mac|iPhone|iPad/.test(navigator.platform);\n\n/** The keys of a shortcut as the reader presses them, such as [\"⇧\", \"N\"] or [\"Shift\", \"N\"]. */\nexport const shortcutKeys = (shortcut: string): string[] => {\n const mac = isMac();\n const names: Record<string, string> = {\n shift: mac ? \"⇧\" : \"Shift\",\n alt: mac ? \"⌥\" : \"Alt\",\n ctrl: mac ? \"⌃\" : \"Ctrl\",\n meta: mac ? \"⌘\" : \"Meta\",\n mod: mac ? \"⌘\" : \"Ctrl\",\n arrowup: \"↑\",\n arrowdown: \"↓\",\n arrowleft: \"←\",\n arrowright: \"→\",\n };\n return shortcut.split(\"+\").map((part) => names[part.toLowerCase()] ?? (part.length === 1 ? part.toUpperCase() : part));\n};\n\n/**\n * The calendar's shortcuts: the same list the host registers for its dispatcher and its help. `alternatives` names\n * other keys the calendar itself handles for a command, such as the arrow keys that page like J and K.\n */\nexport const openCalendarShortcuts = (\n commands: readonly CalendarCommand[],\n messages: CalendarMessages,\n alternatives: Readonly<Record<string, string>> = {},\n) =>\n dialogCore.open<void>(\n (close) => (\n <div class=\"k2b-dialog__panel\">\n <DialogHeader title={messages.calendarShortcuts} icon=\"ti ti-keyboard\" close={() => close()} />\n <div class=\"k2b-dialog__body\">\n <dl class=\"k2b-calendar-shortcuts\">\n <For each={commands.filter((command) => command.shortcut)}>\n {(command) => (\n <>\n <dt>\n <For each={shortcutKeys(command.shortcut!)}>{(key) => <kbd class=\"k2b-calendar-shortcuts__key\">{key}</kbd>}</For>\n <Show when={alternatives[command.id]}>\n {(other) => (\n <>\n <span class=\"k2b-calendar-shortcuts__or\">/</span>\n <For each={shortcutKeys(other())}>{(key) => <kbd class=\"k2b-calendar-shortcuts__key\">{key}</kbd>}</For>\n </>\n )}\n </Show>\n </dt>\n <dd>{command.label}</dd>\n </>\n )}\n </For>\n </dl>\n <p class=\"k2b-calendar-shortcuts__note\">{messages.calendarShortcutsNote}</p>\n </div>\n </div>\n ),\n { panelClassName: \"k2b-dialog k2b-dialog--small\", ariaLabel: messages.calendarShortcuts },\n );\n\nconst pad = (value: number) => String(value).padStart(2, \"0\");\nconst validKey = (year: number, month: number, day: number) => {\n const date = new Date(Date.UTC(year, month - 1, day));\n return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day\n ? `${year}-${pad(month)}-${pad(day)}`\n : null;\n};\n/** The Monday of an ISO week of a year. */\nconst isoWeekStart = (year: number, week: number) => {\n const january4 = new Date(Date.UTC(year, 0, 4));\n const monday = new Date(january4.getTime() - ((january4.getUTCDay() || 7) - 1) * 86_400_000);\n return addDayKeys(monday.toISOString().slice(0, 10), (week - 1) * 7);\n};\n\n/**\n * Reads German and English dates, weekdays, months, week numbers, today, and tomorrow for Go to. Weekdays include\n * today unless preceded by next; a month alone uses the next year if it has passed. A date without a year is this\n * year's. Names ignore case and accents and allow a trailing dot. Returns a `YYYY-MM-DD` key or `null`.\n */\nexport const parseGoTo = (text: string, today: string): string | null => {\n const value = text.trim().toLowerCase();\n if (!value) return null;\n const year = Number(today.slice(0, 4));\n if (/^(heute|today)$/.test(value)) return today;\n if (/^(morgen|tomorrow)$/.test(value)) return addDayKeys(today, 1);\n const fullYear = (raw: string | undefined) => (raw ? (raw.length === 2 ? 2000 + Number(raw) : Number(raw)) : year);\n let match = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/.exec(value);\n if (match) return validKey(Number(match[1]), Number(match[2]), Number(match[3]));\n match = /^(\\d{1,2})\\.(\\d{1,2})\\.?(\\d{2}|\\d{4})?$/.exec(value);\n if (match) return validKey(fullYear(match[3]), Number(match[2]), Number(match[1]));\n match = /^(\\d{1,2})\\/(\\d{1,2})(?:\\/(\\d{2}|\\d{4}))?$/.exec(value);\n if (match) return validKey(fullYear(match[3]), Number(match[1]), Number(match[2]));\n match = /^(?:kw|w|week|woche)\\s*(\\d{1,2})(?:\\s*\\/?\\s*(\\d{4}))?$/.exec(value);\n if (match) {\n const week = Number(match[1]);\n return week >= 1 && week <= 53 ? isoWeekStart(match[2] ? Number(match[2]) : year, week) : null;\n }\n const named = value\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/\\.$/, \"\")\n .trim();\n const weekdays = [\n \"montag mo monday mon\",\n \"dienstag di tuesday tue tues\",\n \"mittwoch mi wednesday wed\",\n \"donnerstag do thursday thu thur thurs\",\n \"freitag fr friday fri\",\n \"samstag sa saturday sat\",\n \"sonntag so sunday sun\",\n ];\n match = /^(?:(am|on|nachste|nachsten|nachster|naechsten|kommende|kommenden|next)\\s+)?([a-z]+)$/.exec(named);\n if (match) {\n const name = match[2];\n const weekday = weekdays.findIndex((names) => names.split(\" \").includes(name ?? \"\"));\n if (weekday >= 0) {\n const date = new Date(Date.UTC(year, Number(today.slice(5, 7)) - 1, Number(today.slice(8, 10))));\n const todayWeekday = (date.getUTCDay() + 6) % 7;\n let diff = (weekday - todayWeekday + 7) % 7;\n if (match[1] && match[1] !== \"am\" && match[1] !== \"on\" && diff === 0) diff = 7;\n return addDayKeys(today, diff);\n }\n }\n const months = [\n \"januar jan january\",\n \"februar feb february\",\n \"marz maerz mar mrz march\",\n \"april apr\",\n \"mai may\",\n \"juni jun june\",\n \"juli jul july\",\n \"august aug\",\n \"september sep sept\",\n \"oktober okt october oct\",\n \"november nov\",\n \"dezember dez december dec\",\n ];\n const monthOf = (name: string | undefined) => months.findIndex((names) => names.split(\" \").includes(name ?? \"\")) + 1;\n match = /^(\\d{1,2})\\.?\\s+([a-z]+)\\.?(?:\\s+(\\d{4}))?$/.exec(named);\n if (match) return validKey(fullYear(match[3]), monthOf(match[2]), Number(match[1]));\n match = /^([a-z]+)\\.?\\s+(\\d{1,2})(?:,?\\s+(\\d{4}))?$/.exec(named);\n if (match) return validKey(fullYear(match[3]), monthOf(match[1]), Number(match[2]));\n match = /^([a-z]+)\\.?(?:\\s+(\\d{4}))?$/.exec(named);\n if (match) {\n const month = monthOf(match[1]);\n const monthYear = match[2] ? Number(match[2]) : year + (month < Number(today.slice(5, 7)) ? 1 : 0);\n return validKey(monthYear, month, 1);\n }\n return null;\n};\n\n/** Go to: a field that reads a date or a week number and names the day it found before the reader goes there. */\nexport const openCalendarGoTo = (props: {\n messages: CalendarMessages;\n today: string;\n describe: (key: string) => string;\n onGo: (key: string) => void;\n}) =>\n dialogCore\n .open<string>(\n (close) => {\n const [text, setText] = createSignal(\"\");\n const result = () => parseGoTo(text(), props.today);\n return (\n <form\n class=\"k2b-dialog__panel\"\n onSubmit={(event) => {\n event.preventDefault();\n const key = result();\n if (key) close(key);\n }}\n >\n <DialogHeader title={props.messages.calendarCommandGoTo} icon=\"ti ti-calendar-search\" close={() => close()} />\n <div class=\"k2b-dialog__body k2b-calendar-goto\">\n <input\n class=\"k2b-calendar-goto__input\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck={false}\n aria-label={props.messages.calendarCommandGoTo}\n aria-describedby=\"k2b-calendar-goto-hint\"\n placeholder={props.messages.calendarGoToPlaceholder}\n value={text()}\n onInput={(event) => setText(event.currentTarget.value)}\n />\n <p class=\"k2b-calendar-goto__preview\" id=\"k2b-calendar-goto-hint\" aria-live=\"polite\" data-ok={result() ? \"true\" : undefined}>\n <Show when={result()} fallback={text().trim() ? props.messages.calendarGoToUnknown : props.messages.calendarGoToHint}>\n {(key) => `→ ${props.describe(key())}`}\n </Show>\n </p>\n </div>\n <footer class=\"k2b-dialog__actions\">\n <button type=\"submit\" class=\"k2b-button\" data-variant=\"primary\" data-size=\"sm\" disabled={!result()}>\n {props.messages.calendarGoToGo}\n </button>\n </footer>\n </form>\n );\n },\n { panelClassName: \"k2b-dialog k2b-dialog--small\", ariaLabel: props.messages.calendarCommandGoTo, initialFocus: \"first-input\" },\n )\n .then((key) => {\n if (key) props.onGo(key);\n });\n"],"mappings":"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","ignoreList":[]}
@@ -57,7 +57,111 @@ const calendarMessages = i18n.define({
57
57
  calendarContinuesUntil: ({
58
58
  day,
59
59
  month
60
- }) => `until ${month ? `${month} ` : ""}${day}`
60
+ }) => `until ${month ? `${month} ` : ""}${day}`,
61
+ calendarDuration: ({
62
+ minutes
63
+ }) => {
64
+ if (minutes < 60) return `${minutes} min`;
65
+ const hours = Math.floor(minutes / 60);
66
+ const rest = minutes % 60;
67
+ return `${hours} hr${rest ? ` ${rest} min` : hours === 1 ? "" : "s"}`;
68
+ },
69
+ calendarFree: ({
70
+ duration
71
+ }) => `${duration} free`,
72
+ calendarCreateAt: ({
73
+ start,
74
+ end
75
+ }) => `Create event ${start}–${end}`,
76
+ calendarFreeAction: ({
77
+ duration,
78
+ from,
79
+ to,
80
+ start,
81
+ end
82
+ }) => `${duration} free, ${from} to ${to}. Create event ${start}–${end}`,
83
+ calendarRemaining: ({
84
+ duration
85
+ }) => `${duration} left`,
86
+ calendarSoon: ({
87
+ title,
88
+ duration
89
+ }) => `${title} in ${duration}`,
90
+ calendarNight: ({
91
+ from,
92
+ to
93
+ }) => `Night · ${from} → ${to}`,
94
+ calendarNightHours: ({
95
+ from,
96
+ to
97
+ }) => `Night · ${from}–${to}`,
98
+ calendarFoldNight: "Fold",
99
+ calendarOpenNight: "Open the night",
100
+ calendarFoldNights: "Fold the nights",
101
+ calendarOpenNights: ({
102
+ from,
103
+ to
104
+ }) => `Open the nights, ${from} to ${to}`,
105
+ calendarUntil: ({
106
+ time
107
+ }) => `until ${time}`,
108
+ calendarNothingPlannedShort: "Nothing planned",
109
+ calendarUnfoldDays: ({
110
+ count
111
+ }) => count === 1 ? "Show day" : "Show days",
112
+ calendarDayCount: ({
113
+ count
114
+ }) => `${count} days`,
115
+ calendarDaySummary: ({
116
+ events,
117
+ tasks
118
+ }) => [events ? `${events} ${events === 1 ? "event" : "events"}` : "", tasks ? `${tasks} ${tasks === 1 ? "to-do" : "to-dos"}` : ""].filter(Boolean).join(" · "),
119
+ calendarMoreDays: "More days load as you scroll …",
120
+ calendarAllDayRow: "all day",
121
+ calendarAllDayRowShort: "all day",
122
+ calendarAllDayAndDue: "All day and due",
123
+ calendarDone: ({
124
+ title
125
+ }) => `Done: ${title}`,
126
+ calendarAllDone: "All done for today",
127
+ calendarAllDoneShort: "All done",
128
+ calendarDue: ({
129
+ time
130
+ }) => `due ${time}`,
131
+ calendarFits: "fits",
132
+ calendarTooShort: ({
133
+ duration
134
+ }) => `${duration} too short`,
135
+ calendarOverlaps: ({
136
+ title
137
+ }) => `overlaps “${title}”`,
138
+ calendarWeekNumber: ({
139
+ week
140
+ }) => `W ${week}`,
141
+ calendarWeek: "Week",
142
+ calendarDays: "Days",
143
+ calendarKeyboardHelp: "Arrow keys move between days, events, and free time. Enter opens or creates, Space checks off.",
144
+ calendarDayKeyboardHelp: "Tab moves through the events and free time of each day. Enter opens or creates, Space checks off.",
145
+ calendarShortcuts: "Keyboard shortcuts",
146
+ calendarShortcutsNote: "Shortcuts work anywhere on this page, except while you type in a text field or a dialog is open.",
147
+ calendarCommandToday: "Today",
148
+ calendarCommandTodayDescription: "Show today in the calendar",
149
+ calendarCommandNext: "Next",
150
+ calendarCommandNextDescription: "Show the next day, week, month, or year",
151
+ calendarCommandPrevious: "Previous",
152
+ calendarCommandPreviousDescription: "Show the previous day, week, month, or year",
153
+ calendarCommandView: ({
154
+ view
155
+ }) => `${view} view`,
156
+ calendarCommandViewDescription: ({
157
+ view
158
+ }) => `Switch the calendar to the ${view.toLowerCase()} view`,
159
+ calendarCommandGoTo: "Go to",
160
+ calendarCommandGoToDescription: "Jump to a date or a week number",
161
+ calendarGoToPlaceholder: "Date, such as 3/15, Friday, March, or W 12",
162
+ calendarGoToHint: "Enter a date, a weekday, a month, or a week number.",
163
+ calendarGoToUnknown: "Not recognized.",
164
+ calendarGoToGo: "Go"
61
165
  },
62
166
  de: {
63
167
  calendarView: "Kalenderansicht",
@@ -108,7 +212,111 @@ const calendarMessages = i18n.define({
108
212
  calendarContinuesUntil: ({
109
213
  day,
110
214
  month
111
- }) => `bis ${day}.${month ? ` ${month}` : ""}`
215
+ }) => `bis ${day}.${month ? ` ${month}` : ""}`,
216
+ calendarDuration: ({
217
+ minutes
218
+ }) => {
219
+ if (minutes < 60) return `${minutes} Min`;
220
+ const hours = Math.floor(minutes / 60);
221
+ const rest = minutes % 60;
222
+ return rest ? `${hours} Std. ${rest}` : `${hours} Std.`;
223
+ },
224
+ calendarFree: ({
225
+ duration
226
+ }) => `${duration} frei`,
227
+ calendarCreateAt: ({
228
+ start,
229
+ end
230
+ }) => `Termin ${start}–${end} anlegen`,
231
+ calendarFreeAction: ({
232
+ duration,
233
+ from,
234
+ to,
235
+ start,
236
+ end
237
+ }) => `${duration} frei, ${from} bis ${to}. Termin ${start}–${end} anlegen`,
238
+ calendarRemaining: ({
239
+ duration
240
+ }) => `noch ${duration}`,
241
+ calendarSoon: ({
242
+ title,
243
+ duration
244
+ }) => `${title} in ${duration}`,
245
+ calendarNight: ({
246
+ from,
247
+ to
248
+ }) => `Nacht · ${from} → ${to}`,
249
+ calendarNightHours: ({
250
+ from,
251
+ to
252
+ }) => `Nacht · ${from}–${to}`,
253
+ calendarFoldNight: "einklappen",
254
+ calendarOpenNight: "Nacht ausklappen",
255
+ calendarFoldNights: "Nächte einklappen",
256
+ calendarOpenNights: ({
257
+ from,
258
+ to
259
+ }) => `Nächte ausklappen, ${from}–${to} Uhr`,
260
+ calendarUntil: ({
261
+ time
262
+ }) => `bis ${time}`,
263
+ calendarNothingPlannedShort: "Nichts geplant",
264
+ calendarUnfoldDays: ({
265
+ count
266
+ }) => count === 1 ? "Tag aufklappen" : "Tage aufklappen",
267
+ calendarDayCount: ({
268
+ count
269
+ }) => `${count} Tage`,
270
+ calendarDaySummary: ({
271
+ events,
272
+ tasks
273
+ }) => [events ? `${events} ${events === 1 ? "Termin" : "Termine"}` : "", tasks ? `${tasks} ${tasks === 1 ? "To-do" : "To-dos"}` : ""].filter(Boolean).join(" · "),
274
+ calendarMoreDays: "Weitere Tage laden beim Scrollen …",
275
+ calendarAllDayRow: "ganztägig",
276
+ calendarAllDayRowShort: "ganzt.",
277
+ calendarAllDayAndDue: "Ganztägig und fällig",
278
+ calendarDone: ({
279
+ title
280
+ }) => `Erledigt: ${title}`,
281
+ calendarAllDone: "Alles für heute erledigt",
282
+ calendarAllDoneShort: "Alles erledigt",
283
+ calendarDue: ({
284
+ time
285
+ }) => `fällig ${time}`,
286
+ calendarFits: "passt",
287
+ calendarTooShort: ({
288
+ duration
289
+ }) => `${duration} zu kurz`,
290
+ calendarOverlaps: ({
291
+ title
292
+ }) => `überschneidet „${title}“`,
293
+ calendarWeekNumber: ({
294
+ week
295
+ }) => `KW ${week}`,
296
+ calendarWeek: "Woche",
297
+ calendarDays: "Tage",
298
+ calendarKeyboardHelp: "Pfeiltasten wechseln zwischen Tagen, Terminen und freier Zeit. Enter öffnet oder legt an, Leertaste hakt ab.",
299
+ calendarDayKeyboardHelp: "Tab wechselt zwischen den Terminen und der freien Zeit jedes Tages. Enter öffnet oder legt an, Leertaste hakt ab.",
300
+ calendarShortcuts: "Tastenkürzel",
301
+ calendarShortcutsNote: "Kürzel wirken überall auf dieser Seite, nur nicht beim Tippen in einem Eingabefeld oder bei offenem Dialog.",
302
+ calendarCommandToday: "Heute",
303
+ calendarCommandTodayDescription: "Im Kalender heute zeigen",
304
+ calendarCommandNext: "Weiter",
305
+ calendarCommandNextDescription: "Nächsten Tag, nächste Woche, nächsten Monat oder nächstes Jahr zeigen",
306
+ calendarCommandPrevious: "Zurück",
307
+ calendarCommandPreviousDescription: "Vorigen Tag, vorige Woche, vorigen Monat oder voriges Jahr zeigen",
308
+ calendarCommandView: ({
309
+ view
310
+ }) => `Ansicht ${view}`,
311
+ calendarCommandViewDescription: ({
312
+ view
313
+ }) => `Den Kalender als ${view} zeigen`,
314
+ calendarCommandGoTo: "Gehe zu",
315
+ calendarCommandGoToDescription: "Zu einem Datum oder einer Kalenderwoche springen",
316
+ calendarGoToPlaceholder: "Datum, z. B. 15.3., Freitag, März oder KW 12",
317
+ calendarGoToHint: "Datum, Wochentag, Monat oder Kalenderwoche eingeben.",
318
+ calendarGoToUnknown: "Nicht erkannt.",
319
+ calendarGoToGo: "Springen"
112
320
  }
113
321
  }
114
322
  });
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/calendar-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\n/**\n * The calendar's own strings. They live beside the calendar instead of in the shared catalog, so applications that\n * never render a calendar do not ship them.\n */\nconst calendarMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n calendarView: \"Calendar view\",\n openDate: ({ label }: { label: string }) => `Open ${label}`,\n createEventOn: ({ label }: { label: string }) => `Create event on ${label}`,\n hiddenOverlappingEvents: ({ count }: { count: number }) => `${count} hidden overlapping events`,\n calendarEventTime: ({ title, start, end }: { title: string; start: string; end: string }) => `${title}, ${start} to ${end}`,\n weekShort: \"Wk\",\n noEvents: \"No events\",\n moveEvent: \"Move event\",\n resizeEvent: \"Resize event\",\n calendarMoreEvents: ({ count }: { count: number }) => `+${count} more`,\n calendarMoreEventsOn: ({ count, label }: { count: number; label: string }) => `${count} more on ${label}`,\n calendarSelectionActions: \"Actions for the selected days\",\n calendarQuickCreate: \"New entry\",\n calendarSelectedDays: ({ start, end, count }: { start: string; end: string; count: number }) => `${start} – ${end} · ${count} days`,\n calendarOpenDay: \"Open day\",\n calendarOpenWeek: \"Open week\",\n calendarOpenWeekNumber: ({ week }: { week: number }) => `Week ${week}, open week`,\n calendarClearSelection: \"Clear selection\",\n calendarNewEvent: \"New event\",\n calendarNothingPlanned: \"Nothing planned.\",\n calendarContinuesFrom: ({ day, month }: { day: number; month?: string }) => `from ${month ? `${month} ` : \"\"}${day}`,\n calendarContinuesUntil: ({ day, month }: { day: number; month?: string }) => `until ${month ? `${month} ` : \"\"}${day}`,\n },\n de: {\n calendarView: \"Kalenderansicht\",\n openDate: ({ label }) => `${label} öffnen`,\n createEventOn: ({ label }) => `Termin am ${label} erstellen`,\n hiddenOverlappingEvents: ({ count }) => `${count} ausgeblendete überlappende Termine`,\n calendarEventTime: ({ title, start, end }) => `${title}, ${start} bis ${end}`,\n weekShort: \"KW\",\n noEvents: \"Keine Termine\",\n moveEvent: \"Termin verschieben\",\n resizeEvent: \"Termindauer ändern\",\n calendarMoreEvents: ({ count }) => `+${count} weitere`,\n calendarMoreEventsOn: ({ count, label }) => `${count} weitere am ${label}`,\n calendarSelectionActions: \"Aktionen für die ausgewählten Tage\",\n calendarQuickCreate: \"Neuer Eintrag\",\n calendarSelectedDays: ({ start, end, count }) => `${start} – ${end} · ${count} Tage`,\n calendarOpenDay: \"Tag öffnen\",\n calendarOpenWeek: \"Woche öffnen\",\n calendarOpenWeekNumber: ({ week }) => `KW ${week}, Woche öffnen`,\n calendarClearSelection: \"Auswahl aufheben\",\n calendarNewEvent: \"Neuer Termin\",\n calendarNothingPlanned: \"Nichts geplant.\",\n calendarContinuesFrom: ({ day, month }) => `seit ${day}.${month ? ` ${month}` : \"\"}`,\n calendarContinuesUntil: ({ day, month }) => `bis ${day}.${month ? ` ${month}` : \"\"}`,\n },\n },\n});\n\nexport type CalendarMessages = ReturnType<(typeof calendarMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale, like the rest of @k2b/ui. */\nexport const useCalendarMessages = (): (() => CalendarMessages) => {\n const locale = useLocale();\n return () => calendarMessages.resolve([locale()]).t;\n};\n\nexport const checkCalendarMessages = () => calendarMessages.check();\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/calendar-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\n/**\n * The calendar's own strings. They live beside the calendar instead of in the shared catalog, so applications that\n * never render a calendar do not ship them.\n */\nconst calendarMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n calendarView: \"Calendar view\",\n openDate: ({ label }: { label: string }) => `Open ${label}`,\n createEventOn: ({ label }: { label: string }) => `Create event on ${label}`,\n hiddenOverlappingEvents: ({ count }: { count: number }) => `${count} hidden overlapping events`,\n calendarEventTime: ({ title, start, end }: { title: string; start: string; end: string }) => `${title}, ${start} to ${end}`,\n weekShort: \"Wk\",\n noEvents: \"No events\",\n moveEvent: \"Move event\",\n resizeEvent: \"Resize event\",\n calendarMoreEvents: ({ count }: { count: number }) => `+${count} more`,\n calendarMoreEventsOn: ({ count, label }: { count: number; label: string }) => `${count} more on ${label}`,\n calendarSelectionActions: \"Actions for the selected days\",\n calendarQuickCreate: \"New entry\",\n calendarSelectedDays: ({ start, end, count }: { start: string; end: string; count: number }) => `${start} – ${end} · ${count} days`,\n calendarOpenDay: \"Open day\",\n calendarOpenWeek: \"Open week\",\n calendarOpenWeekNumber: ({ week }: { week: number }) => `Week ${week}, open week`,\n calendarClearSelection: \"Clear selection\",\n calendarNewEvent: \"New event\",\n calendarNothingPlanned: \"Nothing planned.\",\n calendarContinuesFrom: ({ day, month }: { day: number; month?: string }) => `from ${month ? `${month} ` : \"\"}${day}`,\n calendarContinuesUntil: ({ day, month }: { day: number; month?: string }) => `until ${month ? `${month} ` : \"\"}${day}`,\n calendarDuration: ({ minutes }: { minutes: number }) => {\n if (minutes < 60) return `${minutes} min`;\n const hours = Math.floor(minutes / 60);\n const rest = minutes % 60;\n return `${hours} hr${rest ? ` ${rest} min` : hours === 1 ? \"\" : \"s\"}`;\n },\n calendarFree: ({ duration }: { duration: string }) => `${duration} free`,\n calendarCreateAt: ({ start, end }: { start: string; end: string }) => `Create event ${start}–${end}`,\n calendarFreeAction: ({\n duration,\n from,\n to,\n start,\n end,\n }: {\n duration: string;\n from: string;\n to: string;\n start: string;\n end: string;\n }) => `${duration} free, ${from} to ${to}. Create event ${start}–${end}`,\n calendarRemaining: ({ duration }: { duration: string }) => `${duration} left`,\n calendarSoon: ({ title, duration }: { title: string; duration: string }) => `${title} in ${duration}`,\n calendarNight: ({ from, to }: { from: string; to: string }) => `Night · ${from} → ${to}`,\n calendarNightHours: ({ from, to }: { from: string; to: string }) => `Night · ${from}–${to}`,\n calendarFoldNight: \"Fold\",\n calendarOpenNight: \"Open the night\",\n calendarFoldNights: \"Fold the nights\",\n calendarOpenNights: ({ from, to }: { from: string; to: string }) => `Open the nights, ${from} to ${to}`,\n calendarUntil: ({ time }: { time: string }) => `until ${time}`,\n calendarNothingPlannedShort: \"Nothing planned\",\n calendarUnfoldDays: ({ count }: { count: number }): string => (count === 1 ? \"Show day\" : \"Show days\"),\n calendarDayCount: ({ count }: { count: number }) => `${count} days`,\n calendarDaySummary: ({ events, tasks }: { events: number; tasks: number }) =>\n [events ? `${events} ${events === 1 ? \"event\" : \"events\"}` : \"\", tasks ? `${tasks} ${tasks === 1 ? \"to-do\" : \"to-dos\"}` : \"\"]\n .filter(Boolean)\n .join(\" · \"),\n calendarMoreDays: \"More days load as you scroll …\",\n calendarAllDayRow: \"all day\",\n calendarAllDayRowShort: \"all day\",\n calendarAllDayAndDue: \"All day and due\",\n calendarDone: ({ title }: { title: string }) => `Done: ${title}`,\n calendarAllDone: \"All done for today\",\n calendarAllDoneShort: \"All done\",\n calendarDue: ({ time }: { time: string }) => `due ${time}`,\n calendarFits: \"fits\",\n calendarTooShort: ({ duration }: { duration: string }) => `${duration} too short`,\n calendarOverlaps: ({ title }: { title: string }) => `overlaps “${title}”`,\n calendarWeekNumber: ({ week }: { week: number }) => `W ${week}`,\n calendarWeek: \"Week\",\n calendarDays: \"Days\",\n calendarKeyboardHelp: \"Arrow keys move between days, events, and free time. Enter opens or creates, Space checks off.\",\n calendarDayKeyboardHelp: \"Tab moves through the events and free time of each day. Enter opens or creates, Space checks off.\",\n calendarShortcuts: \"Keyboard shortcuts\",\n calendarShortcutsNote: \"Shortcuts work anywhere on this page, except while you type in a text field or a dialog is open.\",\n calendarCommandToday: \"Today\",\n calendarCommandTodayDescription: \"Show today in the calendar\",\n calendarCommandNext: \"Next\",\n calendarCommandNextDescription: \"Show the next day, week, month, or year\",\n calendarCommandPrevious: \"Previous\",\n calendarCommandPreviousDescription: \"Show the previous day, week, month, or year\",\n calendarCommandView: ({ view }: { view: string }) => `${view} view`,\n calendarCommandViewDescription: ({ view }: { view: string }) => `Switch the calendar to the ${view.toLowerCase()} view`,\n calendarCommandGoTo: \"Go to\",\n calendarCommandGoToDescription: \"Jump to a date or a week number\",\n calendarGoToPlaceholder: \"Date, such as 3/15, Friday, March, or W 12\",\n calendarGoToHint: \"Enter a date, a weekday, a month, or a week number.\",\n calendarGoToUnknown: \"Not recognized.\",\n calendarGoToGo: \"Go\",\n },\n de: {\n calendarView: \"Kalenderansicht\",\n openDate: ({ label }) => `${label} öffnen`,\n createEventOn: ({ label }) => `Termin am ${label} erstellen`,\n hiddenOverlappingEvents: ({ count }) => `${count} ausgeblendete überlappende Termine`,\n calendarEventTime: ({ title, start, end }) => `${title}, ${start} bis ${end}`,\n weekShort: \"KW\",\n noEvents: \"Keine Termine\",\n moveEvent: \"Termin verschieben\",\n resizeEvent: \"Termindauer ändern\",\n calendarMoreEvents: ({ count }) => `+${count} weitere`,\n calendarMoreEventsOn: ({ count, label }) => `${count} weitere am ${label}`,\n calendarSelectionActions: \"Aktionen für die ausgewählten Tage\",\n calendarQuickCreate: \"Neuer Eintrag\",\n calendarSelectedDays: ({ start, end, count }) => `${start} – ${end} · ${count} Tage`,\n calendarOpenDay: \"Tag öffnen\",\n calendarOpenWeek: \"Woche öffnen\",\n calendarOpenWeekNumber: ({ week }) => `KW ${week}, Woche öffnen`,\n calendarClearSelection: \"Auswahl aufheben\",\n calendarNewEvent: \"Neuer Termin\",\n calendarNothingPlanned: \"Nichts geplant.\",\n calendarContinuesFrom: ({ day, month }) => `seit ${day}.${month ? ` ${month}` : \"\"}`,\n calendarContinuesUntil: ({ day, month }) => `bis ${day}.${month ? ` ${month}` : \"\"}`,\n calendarDuration: ({ minutes }) => {\n if (minutes < 60) return `${minutes} Min`;\n const hours = Math.floor(minutes / 60);\n const rest = minutes % 60;\n return rest ? `${hours} Std. ${rest}` : `${hours} Std.`;\n },\n calendarFree: ({ duration }) => `${duration} frei`,\n calendarCreateAt: ({ start, end }) => `Termin ${start}–${end} anlegen`,\n calendarFreeAction: ({ duration, from, to, start, end }) => `${duration} frei, ${from} bis ${to}. Termin ${start}–${end} anlegen`,\n calendarRemaining: ({ duration }) => `noch ${duration}`,\n calendarSoon: ({ title, duration }) => `${title} in ${duration}`,\n calendarNight: ({ from, to }) => `Nacht · ${from} → ${to}`,\n calendarNightHours: ({ from, to }) => `Nacht · ${from}–${to}`,\n calendarFoldNight: \"einklappen\",\n calendarOpenNight: \"Nacht ausklappen\",\n calendarFoldNights: \"Nächte einklappen\",\n calendarOpenNights: ({ from, to }) => `Nächte ausklappen, ${from}–${to} Uhr`,\n calendarUntil: ({ time }) => `bis ${time}`,\n calendarNothingPlannedShort: \"Nichts geplant\",\n calendarUnfoldDays: ({ count }) => (count === 1 ? \"Tag aufklappen\" : \"Tage aufklappen\"),\n calendarDayCount: ({ count }) => `${count} Tage`,\n calendarDaySummary: ({ events, tasks }) =>\n [events ? `${events} ${events === 1 ? \"Termin\" : \"Termine\"}` : \"\", tasks ? `${tasks} ${tasks === 1 ? \"To-do\" : \"To-dos\"}` : \"\"]\n .filter(Boolean)\n .join(\" · \"),\n calendarMoreDays: \"Weitere Tage laden beim Scrollen …\",\n calendarAllDayRow: \"ganztägig\",\n calendarAllDayRowShort: \"ganzt.\",\n calendarAllDayAndDue: \"Ganztägig und fällig\",\n calendarDone: ({ title }) => `Erledigt: ${title}`,\n calendarAllDone: \"Alles für heute erledigt\",\n calendarAllDoneShort: \"Alles erledigt\",\n calendarDue: ({ time }) => `fällig ${time}`,\n calendarFits: \"passt\",\n calendarTooShort: ({ duration }) => `${duration} zu kurz`,\n calendarOverlaps: ({ title }) => `überschneidet „${title}“`,\n calendarWeekNumber: ({ week }) => `KW ${week}`,\n calendarWeek: \"Woche\",\n calendarDays: \"Tage\",\n calendarKeyboardHelp: \"Pfeiltasten wechseln zwischen Tagen, Terminen und freier Zeit. Enter öffnet oder legt an, Leertaste hakt ab.\",\n calendarDayKeyboardHelp:\n \"Tab wechselt zwischen den Terminen und der freien Zeit jedes Tages. Enter öffnet oder legt an, Leertaste hakt ab.\",\n calendarShortcuts: \"Tastenkürzel\",\n calendarShortcutsNote: \"Kürzel wirken überall auf dieser Seite, nur nicht beim Tippen in einem Eingabefeld oder bei offenem Dialog.\",\n calendarCommandToday: \"Heute\",\n calendarCommandTodayDescription: \"Im Kalender heute zeigen\",\n calendarCommandNext: \"Weiter\",\n calendarCommandNextDescription: \"Nächsten Tag, nächste Woche, nächsten Monat oder nächstes Jahr zeigen\",\n calendarCommandPrevious: \"Zurück\",\n calendarCommandPreviousDescription: \"Vorigen Tag, vorige Woche, vorigen Monat oder voriges Jahr zeigen\",\n calendarCommandView: ({ view }) => `Ansicht ${view}`,\n calendarCommandViewDescription: ({ view }) => `Den Kalender als ${view} zeigen`,\n calendarCommandGoTo: \"Gehe zu\",\n calendarCommandGoToDescription: \"Zu einem Datum oder einer Kalenderwoche springen\",\n calendarGoToPlaceholder: \"Datum, z. B. 15.3., Freitag, März oder KW 12\",\n calendarGoToHint: \"Datum, Wochentag, Monat oder Kalenderwoche eingeben.\",\n calendarGoToUnknown: \"Nicht erkannt.\",\n calendarGoToGo: \"Springen\",\n },\n },\n});\n\nexport type CalendarMessages = ReturnType<(typeof calendarMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale, like the rest of @k2b/ui. */\nexport const useCalendarMessages = (): (() => CalendarMessages) => {\n const locale = useLocale();\n return () => calendarMessages.resolve([locale()]).t;\n};\n\nexport const checkCalendarMessages = () => calendarMessages.check();\n"],"mappings":"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","ignoreList":[]}
@@ -38,6 +38,7 @@ export const startCalendarPointerSession = options => {
38
38
  let latest = null;
39
39
  let scrollFrame = 0;
40
40
  let releaseTextSelection = null;
41
+ let armed = !options.armAutoScroll;
41
42
  const preview = () => {
42
43
  const value = options.resolve(clientX, clientY);
43
44
  if (value === null) return;
@@ -48,7 +49,9 @@ export const startCalendarPointerSession = options => {
48
49
  scrollFrame = 0;
49
50
  if (!active || !options.scrollContainer) return;
50
51
  const rect = options.scrollContainer.getBoundingClientRect();
51
- const speed = calendarAutoScrollSpeed(clientY, rect.top, rect.bottom);
52
+ const inside = clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom;
53
+ if (!armed && inside && clientY > rect.top + 56 && clientY < rect.bottom - 56) armed = true;
54
+ const speed = armed && (inside || !options.armAutoScroll) ? calendarAutoScrollSpeed(clientY, rect.top, rect.bottom) : 0;
52
55
  if (speed !== 0) {
53
56
  const before = options.scrollContainer.scrollTop;
54
57
  options.scrollContainer.scrollTop += speed;
@@ -80,7 +83,11 @@ export const startCalendarPointerSession = options => {
80
83
  if (finished) return;
81
84
  finished = true;
82
85
  cleanup();
83
- if (active) options.onCancel?.();
86
+ try {
87
+ if (active) options.onCancel?.();
88
+ } finally {
89
+ options.onEnd?.();
90
+ }
84
91
  }
85
92
  function onMove(event) {
86
93
  if (finished || event.pointerId !== pointerId) return;
@@ -89,13 +96,18 @@ export const startCalendarPointerSession = options => {
89
96
  if (!active && Math.hypot(clientX - startX, clientY - startY) >= threshold) activate();
90
97
  if (!active) return;
91
98
  event.preventDefault();
99
+ options.onMove?.(clientX, clientY);
92
100
  preview();
93
101
  }
94
102
  function onUp(event) {
95
103
  if (finished || event.pointerId !== pointerId) return;
96
104
  finished = true;
97
105
  cleanup();
98
- if (active && latest !== null) options.onCommit(latest);else if (active) options.onCancel?.();
106
+ try {
107
+ if (active && latest !== null) options.onCommit(latest);else if (active) options.onCancel?.();
108
+ } finally {
109
+ options.onEnd?.();
110
+ }
99
111
  }
100
112
  function onKeyDown(event) {
101
113
  if (event.key !== "Escape") return;
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/calendar-pointer.ts"],"sourcesContent":["import { suppressTextSelection } from \"../internal/text-selection\";\n\nexport const CALENDAR_SNAP_MINUTES = 15;\n\nexport const snapCalendarMinutes = (minutes: number, step = CALENDAR_SNAP_MINUTES): number => Math.round(minutes / step) * step;\n\nexport const calendarDayIndexAtPoint = (clientX: number, startX: number, width: number, days: number): number | null => {\n if (days <= 0 || width <= 0 || clientX < startX || clientX >= startX + width) return null;\n return Math.min(days - 1, Math.floor(((clientX - startX) / width) * days));\n};\n\nexport const calendarMinuteAtPoint = (clientY: number, top: number, height: number, startHour: number, endHour: number): number => {\n const totalMinutes = Math.max(60, (endHour - startHour + 1) * 60);\n const ratio = height > 0 ? Math.min(1, Math.max(0, (clientY - top) / height)) : 0;\n return snapCalendarMinutes(startHour * 60 + ratio * totalMinutes);\n};\n\nexport const calendarAutoScrollSpeed = (clientY: number, top: number, bottom: number, edge = 56, maximum = 18): number => {\n if (clientY < top + edge) return -Math.ceil(maximum * Math.min(1, (top + edge - clientY) / edge));\n if (clientY > bottom - edge) return Math.ceil(maximum * Math.min(1, (clientY - (bottom - edge)) / edge));\n return 0;\n};\n\ntype CalendarPointerSessionOptions<T> = {\n event: PointerEvent;\n resolve: (clientX: number, clientY: number) => T | null;\n onActivate?: () => void;\n onPreview: (value: T) => void;\n onCommit: (value: T) => void;\n onCancel?: () => void;\n scrollContainer?: HTMLElement;\n threshold?: number;\n};\n\nlet cancelActiveSession: (() => void) | null = null;\n\n/**\n * Owns one pointer gesture from threshold crossing through commit or cancel.\n * Views provide geometry through `resolve`; this helper owns global cleanup,\n * pointer cancellation, Escape handling, and edge auto-scroll.\n */\nexport const startCalendarPointerSession = <T>(options: CalendarPointerSessionOptions<T>): (() => void) => {\n if (options.event.button !== 0 || !options.event.isPrimary) return () => {};\n\n cancelActiveSession?.();\n\n const pointerId = options.event.pointerId;\n const target = options.event.currentTarget instanceof HTMLElement ? options.event.currentTarget : null;\n const startX = options.event.clientX;\n const startY = options.event.clientY;\n // Leave enough room for normal click jitter before an event becomes a drag.\n const threshold = options.threshold ?? 6;\n let clientX = startX;\n let clientY = startY;\n let active = false;\n let finished = false;\n let latest: T | null = null;\n let scrollFrame = 0;\n let releaseTextSelection: (() => void) | null = null;\n\n const preview = () => {\n const value = options.resolve(clientX, clientY);\n if (value === null) return;\n latest = value;\n options.onPreview(value);\n };\n\n const autoScroll = () => {\n scrollFrame = 0;\n if (!active || !options.scrollContainer) return;\n const rect = options.scrollContainer.getBoundingClientRect();\n const speed = calendarAutoScrollSpeed(clientY, rect.top, rect.bottom);\n if (speed !== 0) {\n const before = options.scrollContainer.scrollTop;\n options.scrollContainer.scrollTop += speed;\n if (options.scrollContainer.scrollTop !== before) preview();\n }\n scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n const cleanup = () => {\n if (scrollFrame) cancelAnimationFrame(scrollFrame);\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", cancel);\n window.removeEventListener(\"blur\", cancel);\n window.removeEventListener(\"keydown\", onKeyDown);\n if (target?.hasPointerCapture?.(pointerId)) target.releasePointerCapture(pointerId);\n releaseTextSelection?.();\n if (cancelActiveSession === cancel) cancelActiveSession = null;\n };\n\n const activate = () => {\n if (active) return;\n active = true;\n releaseTextSelection = suppressTextSelection(pointerId);\n target?.setPointerCapture?.(pointerId);\n options.onActivate?.();\n preview();\n if (options.scrollContainer) scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n function cancel() {\n if (finished) return;\n finished = true;\n cleanup();\n if (active) options.onCancel?.();\n }\n\n function onMove(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n clientX = event.clientX;\n clientY = event.clientY;\n if (!active && Math.hypot(clientX - startX, clientY - startY) >= threshold) activate();\n if (!active) return;\n event.preventDefault();\n preview();\n }\n\n function onUp(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n finished = true;\n cleanup();\n if (active && latest !== null) options.onCommit(latest);\n else if (active) options.onCancel?.();\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n cancel();\n }\n\n window.addEventListener(\"pointermove\", onMove, { passive: false });\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", cancel);\n window.addEventListener(\"blur\", cancel);\n window.addEventListener(\"keydown\", onKeyDown);\n cancelActiveSession = cancel;\n return cancel;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/calendar-pointer.ts"],"sourcesContent":["import { suppressTextSelection } from \"../internal/text-selection\";\n\nexport const CALENDAR_SNAP_MINUTES = 15;\n\nexport const snapCalendarMinutes = (minutes: number, step = CALENDAR_SNAP_MINUTES): number => Math.round(minutes / step) * step;\n\nexport const calendarDayIndexAtPoint = (clientX: number, startX: number, width: number, days: number): number | null => {\n if (days <= 0 || width <= 0 || clientX < startX || clientX >= startX + width) return null;\n return Math.min(days - 1, Math.floor(((clientX - startX) / width) * days));\n};\n\nexport const calendarMinuteAtPoint = (clientY: number, top: number, height: number, startHour: number, endHour: number): number => {\n const totalMinutes = Math.max(60, (endHour - startHour + 1) * 60);\n const ratio = height > 0 ? Math.min(1, Math.max(0, (clientY - top) / height)) : 0;\n return snapCalendarMinutes(startHour * 60 + ratio * totalMinutes);\n};\n\nexport const calendarAutoScrollSpeed = (clientY: number, top: number, bottom: number, edge = 56, maximum = 18): number => {\n if (clientY < top + edge) return -Math.ceil(maximum * Math.min(1, (top + edge - clientY) / edge));\n if (clientY > bottom - edge) return Math.ceil(maximum * Math.min(1, (clientY - (bottom - edge)) / edge));\n return 0;\n};\n\ntype CalendarPointerSessionOptions<T> = {\n event: PointerEvent;\n resolve: (clientX: number, clientY: number) => T | null;\n onActivate?: () => void;\n onPreview: (value: T) => void;\n onCommit: (value: T) => void;\n onCancel?: () => void;\n /** Called once whenever the session ends, even before activation, after onCommit or onCancel. */\n onEnd?: () => void;\n scrollContainer?: HTMLElement;\n threshold?: number;\n /**\n * The edges scroll only once the pointer has been well inside the container, and only while it is over it, so a drag\n * that comes in from outside, such as from a list below, does not scroll on its way in.\n */\n armAutoScroll?: boolean;\n /** Called on every move once the gesture is active, such as to move a token with the pointer. */\n onMove?: (clientX: number, clientY: number) => void;\n};\n\nlet cancelActiveSession: (() => void) | null = null;\n\n/**\n * Owns one pointer gesture from threshold crossing through commit or cancel.\n * Views provide geometry through `resolve`; this helper owns global cleanup,\n * pointer cancellation, Escape handling, and edge auto-scroll.\n */\nexport const startCalendarPointerSession = <T>(options: CalendarPointerSessionOptions<T>): (() => void) => {\n if (options.event.button !== 0 || !options.event.isPrimary) return () => {};\n\n cancelActiveSession?.();\n\n const pointerId = options.event.pointerId;\n const target = options.event.currentTarget instanceof HTMLElement ? options.event.currentTarget : null;\n const startX = options.event.clientX;\n const startY = options.event.clientY;\n // Leave enough room for normal click jitter before an event becomes a drag.\n const threshold = options.threshold ?? 6;\n let clientX = startX;\n let clientY = startY;\n let active = false;\n let finished = false;\n let latest: T | null = null;\n let scrollFrame = 0;\n let releaseTextSelection: (() => void) | null = null;\n let armed = !options.armAutoScroll;\n\n const preview = () => {\n const value = options.resolve(clientX, clientY);\n if (value === null) return;\n latest = value;\n options.onPreview(value);\n };\n\n const autoScroll = () => {\n scrollFrame = 0;\n if (!active || !options.scrollContainer) return;\n const rect = options.scrollContainer.getBoundingClientRect();\n const inside = clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom;\n if (!armed && inside && clientY > rect.top + 56 && clientY < rect.bottom - 56) armed = true;\n const speed = armed && (inside || !options.armAutoScroll) ? calendarAutoScrollSpeed(clientY, rect.top, rect.bottom) : 0;\n if (speed !== 0) {\n const before = options.scrollContainer.scrollTop;\n options.scrollContainer.scrollTop += speed;\n if (options.scrollContainer.scrollTop !== before) preview();\n }\n scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n const cleanup = () => {\n if (scrollFrame) cancelAnimationFrame(scrollFrame);\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", cancel);\n window.removeEventListener(\"blur\", cancel);\n window.removeEventListener(\"keydown\", onKeyDown);\n if (target?.hasPointerCapture?.(pointerId)) target.releasePointerCapture(pointerId);\n releaseTextSelection?.();\n if (cancelActiveSession === cancel) cancelActiveSession = null;\n };\n\n const activate = () => {\n if (active) return;\n active = true;\n releaseTextSelection = suppressTextSelection(pointerId);\n target?.setPointerCapture?.(pointerId);\n options.onActivate?.();\n preview();\n if (options.scrollContainer) scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n function cancel() {\n if (finished) return;\n finished = true;\n cleanup();\n try {\n if (active) options.onCancel?.();\n } finally {\n options.onEnd?.();\n }\n }\n\n function onMove(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n clientX = event.clientX;\n clientY = event.clientY;\n if (!active && Math.hypot(clientX - startX, clientY - startY) >= threshold) activate();\n if (!active) return;\n event.preventDefault();\n options.onMove?.(clientX, clientY);\n preview();\n }\n\n function onUp(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n finished = true;\n cleanup();\n try {\n if (active && latest !== null) options.onCommit(latest);\n else if (active) options.onCancel?.();\n } finally {\n options.onEnd?.();\n }\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n cancel();\n }\n\n window.addEventListener(\"pointermove\", onMove, { passive: false });\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", cancel);\n window.addEventListener(\"blur\", cancel);\n window.addEventListener(\"keydown\", onKeyDown);\n cancelActiveSession = cancel;\n return cancel;\n};\n"],"mappings":"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","ignoreList":[]}