@k2b/ui 0.24.0 → 0.26.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 (166) hide show
  1. package/README.md +2 -2
  2. package/dist/browser/actions/Dropdown.js +67 -52
  3. package/dist/browser/actions/Dropdown.js.map +1 -1
  4. package/dist/browser/actions/GestureMenu.js +5 -5
  5. package/dist/browser/actions/GestureMenu.js.map +1 -1
  6. package/dist/browser/actions/SpotlightSearch.js +13 -6
  7. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  8. package/dist/browser/actions/Toolbar.js +75 -1
  9. package/dist/browser/actions/Toolbar.js.map +1 -1
  10. package/dist/browser/content/Calendar.js +1539 -911
  11. package/dist/browser/content/Calendar.js.map +1 -1
  12. package/dist/browser/content/CalendarDayView.js +5 -4
  13. package/dist/browser/content/CalendarDayView.js.map +1 -1
  14. package/dist/browser/content/CalendarWeekView.js +5 -4
  15. package/dist/browser/content/CalendarWeekView.js.map +1 -1
  16. package/dist/browser/content/Kbd.js +51 -0
  17. package/dist/browser/content/Kbd.js.map +1 -0
  18. package/dist/browser/content/LabelChip.js +38 -0
  19. package/dist/browser/content/LabelChip.js.map +1 -0
  20. package/dist/browser/content/MarkdownView.js +2 -1
  21. package/dist/browser/content/MarkdownView.js.map +1 -1
  22. package/dist/browser/content/Steps.js +34 -0
  23. package/dist/browser/content/Steps.js.map +1 -0
  24. package/dist/browser/content/Timeline.js +3 -3
  25. package/dist/browser/content/Timeline.js.map +1 -1
  26. package/dist/browser/content/VirtualFeed.js +33 -1
  27. package/dist/browser/content/VirtualFeed.js.map +1 -1
  28. package/dist/browser/content/calendar-dialogs.js +32 -60
  29. package/dist/browser/content/calendar-dialogs.js.map +1 -1
  30. package/dist/browser/content/calendar-month-scroll.js +80 -0
  31. package/dist/browser/content/calendar-month-scroll.js.map +1 -0
  32. package/dist/browser/content/calendar-time-view.js +0 -1
  33. package/dist/browser/content/calendar-time-view.js.map +1 -1
  34. package/dist/browser/content/index.js +4 -1
  35. package/dist/browser/content/index.js.map +1 -1
  36. package/dist/browser/content/markdown-info-blocks.js +33 -5
  37. package/dist/browser/content/markdown-info-blocks.js.map +1 -1
  38. package/dist/browser/feedback/prompts.js +17 -3
  39. package/dist/browser/feedback/prompts.js.map +1 -1
  40. package/dist/browser/index.js +1 -0
  41. package/dist/browser/index.js.map +1 -1
  42. package/dist/browser/inputs/Combobox.js +22 -3
  43. package/dist/browser/inputs/Combobox.js.map +1 -1
  44. package/dist/browser/inputs/QrScanner.js +2 -1
  45. package/dist/browser/inputs/QrScanner.js.map +1 -1
  46. package/dist/browser/intl/index.js +1 -0
  47. package/dist/browser/intl/index.js.map +1 -1
  48. package/dist/browser/intl/shortcut-messages.js +77 -0
  49. package/dist/browser/intl/shortcut-messages.js.map +1 -0
  50. package/dist/browser/intl/shortcut.js +123 -0
  51. package/dist/browser/intl/shortcut.js.map +1 -0
  52. package/dist/browser/layout/AppWorkspace.js +355 -338
  53. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  54. package/dist/browser/layout/TableOfContents.js +115 -0
  55. package/dist/browser/layout/TableOfContents.js.map +1 -0
  56. package/dist/browser/layout/app-workspace-controller.js +7 -50
  57. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  58. package/dist/browser/layout/index.js +1 -0
  59. package/dist/browser/layout/index.js.map +1 -1
  60. package/dist/browser/layout/scroll-fade.js +14 -9
  61. package/dist/browser/layout/scroll-fade.js.map +1 -1
  62. package/dist/browser/layout/sidebar-scroll-memory.js +38 -0
  63. package/dist/browser/layout/sidebar-scroll-memory.js.map +1 -0
  64. package/dist/browser/layout/table-of-contents-messages.js +19 -0
  65. package/dist/browser/layout/table-of-contents-messages.js.map +1 -0
  66. package/dist/browser/motion.js +7 -0
  67. package/dist/browser/motion.js.map +1 -0
  68. package/dist/browser/surfaces/LinkCard.js +40 -24
  69. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  70. package/dist/ssr/actions/Dropdown.js +11 -5
  71. package/dist/ssr/actions/Dropdown.js.map +1 -1
  72. package/dist/ssr/actions/GestureMenu.js +5 -5
  73. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  74. package/dist/ssr/actions/SpotlightSearch.js +9 -3
  75. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  76. package/dist/ssr/actions/Toolbar.js +67 -1
  77. package/dist/ssr/actions/Toolbar.js.map +1 -1
  78. package/dist/ssr/content/Calendar.js +864 -312
  79. package/dist/ssr/content/Calendar.js.map +1 -1
  80. package/dist/ssr/content/CalendarDayView.js +5 -4
  81. package/dist/ssr/content/CalendarDayView.js.map +1 -1
  82. package/dist/ssr/content/CalendarWeekView.js +5 -4
  83. package/dist/ssr/content/CalendarWeekView.js.map +1 -1
  84. package/dist/ssr/content/Kbd.js +38 -0
  85. package/dist/ssr/content/Kbd.js.map +1 -0
  86. package/dist/ssr/content/LabelChip.js +21 -0
  87. package/dist/ssr/content/LabelChip.js.map +1 -0
  88. package/dist/ssr/content/MarkdownView.js +2 -1
  89. package/dist/ssr/content/MarkdownView.js.map +1 -1
  90. package/dist/ssr/content/Steps.js +14 -0
  91. package/dist/ssr/content/Steps.js.map +1 -0
  92. package/dist/ssr/content/Timeline.js +3 -3
  93. package/dist/ssr/content/Timeline.js.map +1 -1
  94. package/dist/ssr/content/VirtualFeed.js +33 -1
  95. package/dist/ssr/content/VirtualFeed.js.map +1 -1
  96. package/dist/ssr/content/calendar-dialogs.js +12 -32
  97. package/dist/ssr/content/calendar-dialogs.js.map +1 -1
  98. package/dist/ssr/content/calendar-month-scroll.js +80 -0
  99. package/dist/ssr/content/calendar-month-scroll.js.map +1 -0
  100. package/dist/ssr/content/calendar-time-view.js +0 -1
  101. package/dist/ssr/content/calendar-time-view.js.map +1 -1
  102. package/dist/ssr/content/index.js +4 -1
  103. package/dist/ssr/content/index.js.map +1 -1
  104. package/dist/ssr/content/markdown-info-blocks.js +33 -5
  105. package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
  106. package/dist/ssr/feedback/prompts.js +17 -3
  107. package/dist/ssr/feedback/prompts.js.map +1 -1
  108. package/dist/ssr/index.js +1 -0
  109. package/dist/ssr/index.js.map +1 -1
  110. package/dist/ssr/inputs/Combobox.js +18 -3
  111. package/dist/ssr/inputs/Combobox.js.map +1 -1
  112. package/dist/ssr/inputs/QrScanner.js +2 -1
  113. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  114. package/dist/ssr/intl/index.js +1 -0
  115. package/dist/ssr/intl/index.js.map +1 -1
  116. package/dist/ssr/intl/shortcut-messages.js +77 -0
  117. package/dist/ssr/intl/shortcut-messages.js.map +1 -0
  118. package/dist/ssr/intl/shortcut.js +123 -0
  119. package/dist/ssr/intl/shortcut.js.map +1 -0
  120. package/dist/ssr/layout/AppWorkspace.js +77 -72
  121. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  122. package/dist/ssr/layout/TableOfContents.js +79 -0
  123. package/dist/ssr/layout/TableOfContents.js.map +1 -0
  124. package/dist/ssr/layout/app-workspace-controller.js +7 -50
  125. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  126. package/dist/ssr/layout/index.js +1 -0
  127. package/dist/ssr/layout/index.js.map +1 -1
  128. package/dist/ssr/layout/scroll-fade.js +14 -9
  129. package/dist/ssr/layout/scroll-fade.js.map +1 -1
  130. package/dist/ssr/layout/sidebar-scroll-memory.js +38 -0
  131. package/dist/ssr/layout/sidebar-scroll-memory.js.map +1 -0
  132. package/dist/ssr/layout/table-of-contents-messages.js +19 -0
  133. package/dist/ssr/layout/table-of-contents-messages.js.map +1 -0
  134. package/dist/ssr/motion.js +7 -0
  135. package/dist/ssr/motion.js.map +1 -0
  136. package/dist/ssr/surfaces/LinkCard.js +26 -10
  137. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  138. package/dist/styles.css +1 -1
  139. package/dist/types/actions/Dropdown.d.ts +12 -0
  140. package/dist/types/actions/SpotlightSearch.d.ts +2 -0
  141. package/dist/types/content/Calendar.d.ts +16 -6
  142. package/dist/types/content/Kbd.d.ts +16 -0
  143. package/dist/types/content/LabelChip.d.ts +12 -0
  144. package/dist/types/content/MarkdownView.d.ts +2 -1
  145. package/dist/types/content/Steps.d.ts +12 -0
  146. package/dist/types/content/VirtualFeed.d.ts +8 -0
  147. package/dist/types/content/calendar-dialogs.d.ts +0 -2
  148. package/dist/types/content/calendar-month-scroll.d.ts +25 -0
  149. package/dist/types/content/calendar-time-view.d.ts +0 -1
  150. package/dist/types/content/index.d.ts +7 -1
  151. package/dist/types/content/markdown-info-blocks.d.ts +21 -4
  152. package/dist/types/feedback/prompts.d.ts +8 -2
  153. package/dist/types/index.d.ts +1 -0
  154. package/dist/types/inputs/Combobox.d.ts +1 -0
  155. package/dist/types/intl/index.d.ts +2 -0
  156. package/dist/types/intl/shortcut-messages.d.ts +35 -0
  157. package/dist/types/intl/shortcut.d.ts +29 -0
  158. package/dist/types/layout/AppWorkspace.d.ts +3 -1
  159. package/dist/types/layout/TableOfContents.d.ts +24 -0
  160. package/dist/types/layout/index.d.ts +2 -0
  161. package/dist/types/layout/scroll-fade.d.ts +2 -0
  162. package/dist/types/layout/sidebar-scroll-memory.d.ts +6 -0
  163. package/dist/types/layout/table-of-contents-messages.d.ts +4 -0
  164. package/dist/types/motion.d.ts +6 -0
  165. package/dist/types/surfaces/LinkCard.d.ts +3 -0
  166. package/package.json +3 -3
@@ -1 +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":[]}
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\";\nimport { Kbd } from \"./Kbd\";\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 <Kbd keys={command.shortcut!} />\n <Show when={alternatives[command.id]}>\n {(other) => (\n <>\n <span class=\"k2b-calendar-shortcuts__or\">/</span>\n <Kbd keys={other()} />\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":[]}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Scroll rules of the continuous month view, free of the DOM so they can be tested.
3
+ *
4
+ * Uniform week rows run below a sticky weekday header without stops. The center row names the month, and rows
5
+ * visible by more than half supply the host's dates. Calendar day keys keep week arithmetic independent of DST.
6
+ */
7
+ import { addDayKeys, dayKeyNumber } from "./calendar-days";
8
+ export const MONTH_ROWS_IN_VIEW = 5;
9
+ export const MONTH_ROW_BLOCK = 8;
10
+
11
+ /** Whole weeks covering the loaded days, with an exclusive end and the date context's first weekday. */
12
+ export const monthWeekKeys = (first, to, firstDayOfWeek) => {
13
+ if (first >= to) return [];
14
+ const weekday = ((dayKeyNumber(first) + 4) % 7 + 7) % 7;
15
+ const start = addDayKeys(first, -((weekday - firstDayOfWeek + 7) % 7));
16
+ const count = Math.ceil((dayKeyNumber(to) - dayKeyNumber(start)) / 7);
17
+ return Array.from({
18
+ length: count
19
+ }, (_, index) => addDayKeys(start, index * 7));
20
+ };
21
+
22
+ /** The row at the center of the area below the weekday header, clamped to the loaded weeks. */
23
+ export const monthFocusRow = (top, viewHeight, rowHeight, total) => Math.max(0, Math.min(total - 1, rowHeight > 0 ? Math.floor((top + viewHeight / 2) / rowHeight) : 0));
24
+
25
+ /** The middle day of a week names its month: Thursday for Monday weeks, Wednesday for Sunday weeks. */
26
+ export const monthOfWeek = week => `${addDayKeys(week, 3).slice(0, 7)}-01`;
27
+
28
+ /** The loaded row containing a day, including the first of a month; absent outside the loaded weeks. */
29
+ export const monthRowOf = (weeks, key) => {
30
+ if (!weeks.length) return undefined;
31
+ const row = Math.floor((dayKeyNumber(key) - dayKeyNumber(weeks[0])) / 7);
32
+ return row >= 0 && row < weeks.length ? row : undefined;
33
+ };
34
+
35
+ /** The half-open interval of rows whose visible height exceeds half a row. */
36
+ export const monthVisibleRows = (top, viewHeight, rowHeight, total) => {
37
+ if (rowHeight <= 0 || total === 0) return {
38
+ first: 0,
39
+ end: 0
40
+ };
41
+ const first = Math.max(0, Math.min(total, Math.floor(top / rowHeight + 0.5)));
42
+ const end = Math.max(first, Math.min(total, Math.ceil((top + viewHeight) / rowHeight - 0.5)));
43
+ return {
44
+ first,
45
+ end
46
+ };
47
+ };
48
+
49
+ /** One block above and below the visible rows' blocks; the window changes only at their block boundaries. */
50
+ export const monthRenderWindow = (top, viewHeight, rowHeight, total) => {
51
+ if (rowHeight <= 0 || total === 0) return {
52
+ first: 0,
53
+ end: 0
54
+ };
55
+ const {
56
+ first,
57
+ end
58
+ } = monthVisibleRows(top, viewHeight, rowHeight, total);
59
+ const last = Math.max(first, end - 1);
60
+ return {
61
+ first: Math.max(0, (Math.floor(first / MONTH_ROW_BLOCK) - 1) * MONTH_ROW_BLOCK),
62
+ end: Math.min(total, (Math.floor(last / MONTH_ROW_BLOCK) + 2) * MONTH_ROW_BLOCK)
63
+ };
64
+ };
65
+
66
+ /** The least movement that shows a row whole, or nothing when it is already fully in view. */
67
+ export const monthRevealTop = (row, top, viewHeight, rowHeight) => {
68
+ const start = row * rowHeight;
69
+ if (start < top) return start;
70
+ if (start + rowHeight > top + viewHeight) return Math.max(0, start + rowHeight - viewHeight);
71
+ return undefined;
72
+ };
73
+
74
+ /** Today points up or down until more than half its row is visible. */
75
+ export const monthTodayDirection = (row, top, viewHeight, rowHeight) => {
76
+ const start = row * rowHeight;
77
+ const visible = Math.min(start + rowHeight, top + viewHeight) - Math.max(start, top);
78
+ return visible > rowHeight / 2 ? "" : start < top ? "up" : "down";
79
+ };
80
+ //# sourceMappingURL=calendar-month-scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/calendar-month-scroll.ts"],"sourcesContent":["/**\n * Scroll rules of the continuous month view, free of the DOM so they can be tested.\n *\n * Uniform week rows run below a sticky weekday header without stops. The center row names the month, and rows\n * visible by more than half supply the host's dates. Calendar day keys keep week arithmetic independent of DST.\n */\nimport { addDayKeys, dayKeyNumber } from \"./calendar-days\";\nimport type { TodayDirection } from \"./calendar-time-view\";\n\nexport const MONTH_ROWS_IN_VIEW = 5;\nexport const MONTH_ROW_BLOCK = 8;\n\n/** Whole weeks covering the loaded days, with an exclusive end and the date context's first weekday. */\nexport const monthWeekKeys = (first: string, to: string, firstDayOfWeek: 0 | 1): string[] => {\n if (first >= to) return [];\n const weekday = (((dayKeyNumber(first) + 4) % 7) + 7) % 7;\n const start = addDayKeys(first, -((weekday - firstDayOfWeek + 7) % 7));\n const count = Math.ceil((dayKeyNumber(to) - dayKeyNumber(start)) / 7);\n return Array.from({ length: count }, (_, index) => addDayKeys(start, index * 7));\n};\n\n/** The row at the center of the area below the weekday header, clamped to the loaded weeks. */\nexport const monthFocusRow = (top: number, viewHeight: number, rowHeight: number, total: number): number =>\n Math.max(0, Math.min(total - 1, rowHeight > 0 ? Math.floor((top + viewHeight / 2) / rowHeight) : 0));\n\n/** The middle day of a week names its month: Thursday for Monday weeks, Wednesday for Sunday weeks. */\nexport const monthOfWeek = (week: string): string => `${addDayKeys(week, 3).slice(0, 7)}-01`;\n\n/** The loaded row containing a day, including the first of a month; absent outside the loaded weeks. */\nexport const monthRowOf = (weeks: readonly string[], key: string): number | undefined => {\n if (!weeks.length) return undefined;\n const row = Math.floor((dayKeyNumber(key) - dayKeyNumber(weeks[0]!)) / 7);\n return row >= 0 && row < weeks.length ? row : undefined;\n};\n\n/** The half-open interval of rows whose visible height exceeds half a row. */\nexport const monthVisibleRows = (top: number, viewHeight: number, rowHeight: number, total: number): { first: number; end: number } => {\n if (rowHeight <= 0 || total === 0) return { first: 0, end: 0 };\n const first = Math.max(0, Math.min(total, Math.floor(top / rowHeight + 0.5)));\n const end = Math.max(first, Math.min(total, Math.ceil((top + viewHeight) / rowHeight - 0.5)));\n return { first, end };\n};\n\n/** One block above and below the visible rows' blocks; the window changes only at their block boundaries. */\nexport const monthRenderWindow = (top: number, viewHeight: number, rowHeight: number, total: number): { first: number; end: number } => {\n if (rowHeight <= 0 || total === 0) return { first: 0, end: 0 };\n const { first, end } = monthVisibleRows(top, viewHeight, rowHeight, total);\n const last = Math.max(first, end - 1);\n return {\n first: Math.max(0, (Math.floor(first / MONTH_ROW_BLOCK) - 1) * MONTH_ROW_BLOCK),\n end: Math.min(total, (Math.floor(last / MONTH_ROW_BLOCK) + 2) * MONTH_ROW_BLOCK),\n };\n};\n\n/** The least movement that shows a row whole, or nothing when it is already fully in view. */\nexport const monthRevealTop = (row: number, top: number, viewHeight: number, rowHeight: number): number | undefined => {\n const start = row * rowHeight;\n if (start < top) return start;\n if (start + rowHeight > top + viewHeight) return Math.max(0, start + rowHeight - viewHeight);\n return undefined;\n};\n\n/** Today points up or down until more than half its row is visible. */\nexport const monthTodayDirection = (row: number, top: number, viewHeight: number, rowHeight: number): TodayDirection => {\n const start = row * rowHeight;\n const visible = Math.min(start + rowHeight, top + viewHeight) - Math.max(start, top);\n return visible > rowHeight / 2 ? \"\" : start < top ? \"up\" : \"down\";\n};\n"],"mappings":"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","ignoreList":[]}
@@ -56,7 +56,6 @@ export const eventAccent = event => event.colorHex ?? COLOR_TOKENS[event.color ?
56
56
 
57
57
  /** Minimum minutes an overlap counts for a band, about the height of its title. */
58
58
  const LANE_MINUTES = 20;
59
- export const reducedMotion = () => typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
60
59
 
61
60
  /** Swallows the click a browser sends right after a gesture ends, never the next one. */
62
61
  export const swallowNextClick = () => {