@k2b/ui 0.46.0 → 0.48.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.
- package/dist/browser/chat/ChatComposer.js +244 -193
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatDecision.js +10 -6
- package/dist/browser/chat/ChatDecision.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +6 -0
- package/dist/browser/chat/chat-messages.js.map +1 -1
- package/dist/browser/chat/types.js.map +1 -1
- package/dist/browser/content/Calendar.js +40 -5
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/VirtualFeed.js +26 -21
- package/dist/browser/content/VirtualFeed.js.map +1 -1
- package/dist/browser/content/calendar-event-detail.js +328 -0
- package/dist/browser/content/calendar-event-detail.js.map +1 -0
- package/dist/browser/content/calendar-messages.js +34 -2
- package/dist/browser/content/calendar-messages.js.map +1 -1
- package/dist/browser/content/calendar-shared.js +189 -82
- package/dist/browser/content/calendar-shared.js.map +1 -1
- package/dist/browser/content/calendar-time-view.js +101 -96
- package/dist/browser/content/calendar-time-view.js.map +1 -1
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/inputs/Combobox.js +14 -6
- package/dist/browser/inputs/Combobox.js.map +1 -1
- package/dist/browser/inputs/dictation/Dictation.js +114 -108
- package/dist/browser/inputs/dictation/Dictation.js.map +1 -1
- package/dist/browser/inputs/dictation/dictation-messages.js +2 -0
- package/dist/browser/inputs/dictation/dictation-messages.js.map +1 -1
- package/dist/browser/layout/AnchoredPopover.js +2 -1
- package/dist/browser/layout/AnchoredPopover.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +340 -440
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/AppWorkspaceSidebarItemStatus.js +113 -0
- package/dist/browser/layout/AppWorkspaceSidebarItemStatus.js.map +1 -0
- package/dist/browser/layout/DetailPanel.js +1 -1
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/DetailSections.js +236 -132
- package/dist/browser/layout/DetailSections.js.map +1 -1
- package/dist/browser/layout/MobileShell.js +30 -13
- package/dist/browser/layout/MobileShell.js.map +1 -1
- package/dist/browser/layout/detail-sections-messages.js +4 -0
- package/dist/browser/layout/detail-sections-messages.js.map +1 -1
- package/dist/browser/layout/index.js +1 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +53 -30
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatDecision.js +10 -6
- package/dist/ssr/chat/ChatDecision.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +6 -0
- package/dist/ssr/chat/chat-messages.js.map +1 -1
- package/dist/ssr/chat/types.js.map +1 -1
- package/dist/ssr/content/Calendar.js +36 -4
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/VirtualFeed.js +26 -21
- package/dist/ssr/content/VirtualFeed.js.map +1 -1
- package/dist/ssr/content/calendar-event-detail.js +212 -0
- package/dist/ssr/content/calendar-event-detail.js.map +1 -0
- package/dist/ssr/content/calendar-messages.js +34 -2
- package/dist/ssr/content/calendar-messages.js.map +1 -1
- package/dist/ssr/content/calendar-shared.js +117 -36
- package/dist/ssr/content/calendar-shared.js.map +1 -1
- package/dist/ssr/content/calendar-time-view.js +6 -4
- package/dist/ssr/content/calendar-time-view.js.map +1 -1
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/inputs/Combobox.js +6 -3
- package/dist/ssr/inputs/Combobox.js.map +1 -1
- package/dist/ssr/inputs/dictation/Dictation.js +3 -1
- package/dist/ssr/inputs/dictation/Dictation.js.map +1 -1
- package/dist/ssr/inputs/dictation/dictation-messages.js +2 -0
- package/dist/ssr/inputs/dictation/dictation-messages.js.map +1 -1
- package/dist/ssr/layout/AnchoredPopover.js +2 -1
- package/dist/ssr/layout/AnchoredPopover.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +61 -127
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/AppWorkspaceSidebarItemStatus.js +76 -0
- package/dist/ssr/layout/AppWorkspaceSidebarItemStatus.js.map +1 -0
- package/dist/ssr/layout/DetailPanel.js +1 -1
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/DetailSections.js +126 -50
- package/dist/ssr/layout/DetailSections.js.map +1 -1
- package/dist/ssr/layout/MobileShell.js +16 -2
- package/dist/ssr/layout/MobileShell.js.map +1 -1
- package/dist/ssr/layout/detail-sections-messages.js +4 -0
- package/dist/ssr/layout/detail-sections-messages.js.map +1 -1
- package/dist/ssr/layout/index.js +1 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/chat/ChatDecision.d.ts +5 -0
- package/dist/types/chat/chat-messages.d.ts +3 -0
- package/dist/types/chat/types.d.ts +5 -0
- package/dist/types/content/Calendar.d.ts +29 -5
- package/dist/types/content/calendar-event-detail.d.ts +21 -0
- package/dist/types/content/calendar-messages.d.ts +16 -0
- package/dist/types/content/calendar-shared.d.ts +16 -1
- package/dist/types/content/calendar-time-view.d.ts +1 -1
- package/dist/types/content/index.d.ts +1 -1
- package/dist/types/inputs/Combobox.d.ts +2 -0
- package/dist/types/inputs/dictation/dictation-messages.d.ts +1 -0
- package/dist/types/layout/AppWorkspace.d.ts +2 -28
- package/dist/types/layout/AppWorkspaceSidebarItemStatus.d.ts +30 -0
- package/dist/types/layout/DetailSections.d.ts +32 -2
- package/dist/types/layout/MobileShell.d.ts +12 -0
- package/dist/types/layout/detail-sections-messages.d.ts +2 -0
- package/dist/types/layout/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -91,7 +91,8 @@ export function ChatDecision(props) {
|
|
|
91
91
|
};
|
|
92
92
|
|
|
93
93
|
// Read once: an object literal from the host builds its JSX again on every read.
|
|
94
|
-
const reason = createMemo(() => props.unavailable ?? props.reason);
|
|
94
|
+
const reason = createMemo(() => props.waiting ?? props.unavailable ?? props.reason);
|
|
95
|
+
const confirmOff = () => Boolean(props.waiting ?? props.unavailable);
|
|
95
96
|
const open = () => props.state === "open";
|
|
96
97
|
const answer = (choice, enabled) => {
|
|
97
98
|
if (!enabled || !open() || answeredHere()) return;
|
|
@@ -191,9 +192,9 @@ export function ChatDecision(props) {
|
|
|
191
192
|
return props.confirm.variant ?? "ai";
|
|
192
193
|
},
|
|
193
194
|
get disabled() {
|
|
194
|
-
return
|
|
195
|
+
return confirmOff();
|
|
195
196
|
},
|
|
196
|
-
onClick: () => answer(props.confirm, !
|
|
197
|
+
onClick: () => answer(props.confirm, !confirmOff()),
|
|
197
198
|
get children() {
|
|
198
199
|
return [_$createComponent(Show, {
|
|
199
200
|
get when() {
|
|
@@ -211,7 +212,10 @@ export function ChatDecision(props) {
|
|
|
211
212
|
"class": "k2b-chat-decision__answer",
|
|
212
213
|
wrap: true,
|
|
213
214
|
variant: "subtle",
|
|
214
|
-
|
|
215
|
+
get disabled() {
|
|
216
|
+
return Boolean(props.waiting);
|
|
217
|
+
},
|
|
218
|
+
onClick: () => answer(props.decline, !props.waiting),
|
|
215
219
|
get children() {
|
|
216
220
|
return [_$createComponent(Show, {
|
|
217
221
|
get when() {
|
|
@@ -234,9 +238,9 @@ export function ChatDecision(props) {
|
|
|
234
238
|
wrap: true,
|
|
235
239
|
variant: "text",
|
|
236
240
|
get disabled() {
|
|
237
|
-
return
|
|
241
|
+
return confirmOff();
|
|
238
242
|
},
|
|
239
|
-
onClick: () => answer(remember(), !
|
|
243
|
+
onClick: () => answer(remember(), !confirmOff()),
|
|
240
244
|
get children() {
|
|
241
245
|
return remember().label;
|
|
242
246
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["chat/ChatDecision.tsx"],"sourcesContent":["import {\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n useContext,\n} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { Avatar } from \"../surfaces/Avatar\";\nimport { useChatMessages } from \"./chat-messages\";\nimport type {\n ChatDecisionAnswer,\n ChatDecisionReason,\n ChatDecisionState,\n ChatOutcomeLine,\n ChatOutcomeTone,\n ChatPreviewHeaderRow,\n ChatPreviewPerson,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Decision\n// ---------------------------------------------------------------------------\n\nexport type ChatDecisionProps = {\n /** `open` shows the question; every other state shows `outcome` in its place. */\n state: ChatDecisionState;\n /** The question as one sentence, usually with `ReferenceChip`s. */\n sentence: JSX.Element;\n /** Why this question is asked, in the platform's words. */\n reason: ChatDecisionReason;\n /** The thing itself, usually `Chat.Preview`. */\n preview?: JSX.Element;\n /** The main answer, named by verb and target (\"Send to Lea\"). `danger` for deletions, `primary` for requests. */\n confirm: ChatDecisionAnswer & { variant?: \"ai\" | \"primary\" | \"danger\" };\n /** The other answer (\"Don't send\"). */\n decline: ChatDecisionAnswer;\n /** An optional quiet third answer after the buttons, such as \"Yes, and don't ask again in this chat\". */\n remember?: ChatDecisionAnswer;\n /** Turns `confirm` and `remember` off; this reason replaces `reason` in the same place. */\n unavailable?: ChatDecisionReason;\n /** The result line shown in every state but `open`, usually `Chat.Outcome`. */\n outcome?: JSX.Element;\n /** Receives a rejected promise from an answer's `onSelect`. */\n onAnswerError?: (error: unknown) => void;\n anchorId?: string | number;\n class?: string;\n};\n\n/** What an outcome inside a question needs from it: whether it was just answered here, and a link press inside it. */\nconst DecisionScope = createContext<{ answered: () => boolean; pressed: () => void; released: () => void }>();\n\nconst reasonIcon = (reason: ChatDecisionReason) => reason.icon ?? \"ti ti-info-circle\";\n\n/**\n * A question the person answers in the conversation: one sentence, why it is asked, the thing itself, and two answers.\n * An answer collapses it at once to its outcome line, which takes the focus and is announced.\n */\nexport function ChatDecision(props: ChatDecisionProps): JSX.Element {\n const id = createUniqueId();\n const sentenceId = `k2b-chat-decision-${id}-sentence`;\n const reasonId = `k2b-chat-decision-${id}-reason`;\n let root: HTMLDivElement | undefined;\n let sentence: HTMLParagraphElement | undefined;\n // An answer given here moves the focus to the outcome; a click in the outcome that reopens the question moves it\n // back to the sentence. A state change from elsewhere moves no focus.\n const [answeredHere, setAnsweredHere] = createSignal(false);\n const [arrive, setArrive] = createSignal(false);\n let reopenedHere = false;\n // A press on the sentence focuses it too; only a focus moved there from elsewhere, such as a jump, lights it up.\n // The browser also focuses the sentence again when its window comes back; that is no arrival either.\n let sentencePressed = false;\n let sentenceHeldAcrossWindow = false;\n const windowLeft = () => {\n if (sentence && document.activeElement === sentence) sentenceHeldAcrossWindow = true;\n };\n onMount(() => {\n window.addEventListener(\"blur\", windowLeft);\n onCleanup(() => window.removeEventListener(\"blur\", windowLeft));\n });\n // A press counts only while its action runs: a reopen from elsewhere later must not take the focus.\n const scope = {\n answered: answeredHere,\n pressed: () => {\n reopenedHere = true;\n },\n released: () => {\n reopenedHere = false;\n },\n };\n\n // Read once: an object literal from the host builds its JSX again on every read.\n const reason = createMemo(() => props.unavailable ?? props.reason);\n const open = () => props.state === \"open\";\n\n const answer = (choice: ChatDecisionAnswer, enabled: boolean) => {\n if (!enabled || !open() || answeredHere()) return;\n setAnsweredHere(true);\n try {\n const result = choice.onSelect();\n if (result instanceof Promise) result.catch((error: unknown) => props.onAnswerError?.(error));\n } catch (error) {\n props.onAnswerError?.(error);\n }\n // A host that keeps the question open (it could not take the answer) gets working buttons back.\n queueMicrotask(() => {\n if (open()) setAnsweredHere(false);\n });\n };\n\n createEffect(\n on(\n () => props.state,\n (state, previous) => {\n if (state !== \"open\" && previous === \"open\" && answeredHere()) {\n root?.querySelector<HTMLElement>(\".k2b-chat-outcome\")?.focus({ preventScroll: true });\n }\n if (state === \"open\" && previous !== undefined && previous !== \"open\") {\n // A host that could not take an answer given here returns the question from `sending`; the outcome that held\n // the focus is gone, so the focus goes back to the sentence instead of the page.\n const active = document.activeElement;\n const failedHere = answeredHere() && previous === \"sending\" && (!active || active === document.body);\n setAnsweredHere(false);\n if (reopenedHere || failedHere) {\n sentence?.focus({ preventScroll: true });\n setArrive(true);\n }\n // Handled. Until then the marker holds through states in between, such as `sending` while a reopen loads.\n reopenedHere = false;\n }\n },\n ),\n );\n\n return (\n <div\n ref={root}\n class={`k2b-chat-decision ${props.class ?? \"\"}`}\n data-state={props.state}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n >\n <Show when={open()} fallback={<DecisionScope.Provider value={scope}>{props.outcome}</DecisionScope.Provider>}>\n <section class=\"k2b-chat-decision__card\" aria-labelledby={sentenceId} aria-describedby={reasonId}>\n <p\n ref={sentence}\n id={sentenceId}\n class=\"k2b-chat-decision__sentence\"\n tabindex=\"-1\"\n data-arrive={arrive() ? \"true\" : undefined}\n onPointerDown={() => {\n sentencePressed = true;\n }}\n onPointerUp={() => {\n sentencePressed = false;\n }}\n onPointerCancel={() => {\n sentencePressed = false;\n }}\n onFocus={() => {\n if (!sentencePressed && !sentenceHeldAcrossWindow) setArrive(true);\n sentencePressed = false;\n sentenceHeldAcrossWindow = false;\n }}\n onAnimationEnd={() => setArrive(false)}\n >\n {props.sentence}\n </p>\n <p id={reasonId} class=\"k2b-chat-line k2b-chat-decision__reason\" data-tone={reason().tone ?? \"neutral\"}>\n <i class={`k2b-chat-line__icon ${reasonIcon(reason())}`} aria-hidden=\"true\" />\n <span class=\"k2b-chat-line__text\">{reason().text}</span>\n </p>\n {props.preview}\n <div class=\"k2b-chat-decision__answers\">\n <Button\n class=\"k2b-chat-decision__answer\"\n wrap\n variant={props.confirm.variant ?? \"ai\"}\n disabled={Boolean(props.unavailable)}\n onClick={() => answer(props.confirm, !props.unavailable)}\n >\n <Show when={props.confirm.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {props.confirm.label}\n </Button>\n <Button class=\"k2b-chat-decision__answer\" wrap variant=\"subtle\" onClick={() => answer(props.decline, true)}>\n <Show when={props.decline.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {props.decline.label}\n </Button>\n <Show when={props.remember}>\n {(remember) => (\n <Button\n class=\"k2b-chat-decision__remember\"\n wrap\n variant=\"text\"\n disabled={Boolean(props.unavailable)}\n onClick={() => answer(remember(), !props.unavailable)}\n >\n {remember().label}\n </Button>\n )}\n </Show>\n </div>\n </section>\n </Show>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Outcome\n// ---------------------------------------------------------------------------\n\nexport type ChatOutcomeProps = {\n /**\n * Every line one flow can show, such as running and done. All of them share one cell, so the line is as high as\n * the longest and switching between them moves nothing.\n */\n lines: Readonly<Record<string, ChatOutcomeLine>>;\n /** The key of the visible line. */\n current: string;\n /** Receives an error thrown or rejected by a line's `action`. */\n onActionError?: (error: unknown) => void;\n anchorId?: string | number;\n class?: string;\n};\n\nconst OUTCOME_ICONS: Record<ChatOutcomeTone, string> = {\n running: \"ti ti-loader-2 k2b-spin\",\n done: \"ti ti-check\",\n off: \"ti ti-circle-off\",\n waiting: \"ti ti-clock\",\n warning: \"ti ti-alert-triangle\",\n error: \"ti ti-alert-circle\",\n};\n\n/** The visible words of a line, without what screen readers do not hear. */\nconst spokenText = (element: Element): string => {\n const copy = element.cloneNode(true) as Element;\n // Buttons under the line are controls, not part of what happened.\n for (const hidden of copy.querySelectorAll('[aria-hidden=\"true\"], .k2b-chat-outcome__actions')) hidden.remove();\n // The time and the link stand apart by margin only; spoken, they need a space.\n for (const part of copy.querySelectorAll(\".k2b-chat-outcome__time, .k2b-chat-outcome__link\")) part.before(\" \");\n return (copy.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n};\n\n/**\n * One line that says what happened: running, done, off, waiting, warning, or error. Changes are announced through a\n * polite live region; the line itself can take the focus.\n */\nexport function ChatOutcome(props: ChatOutcomeProps): JSX.Element {\n const scope = useContext(DecisionScope);\n // Only a line that replaces a question just answered here fades in; history renders final.\n const entering = untrack(() => scope?.answered() ?? false);\n const [live, setLive] = createSignal(\"\");\n let root: HTMLDivElement | undefined;\n let cell: HTMLDivElement | undefined;\n let pending = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n // Read once: an object literal from the host builds its JSX again on every read.\n const lines = createMemo(() => props.lines);\n const line = () => lines()[props.current];\n const tone = () => line()?.tone ?? \"off\";\n const keys = () => {\n const all = Object.keys(lines());\n return all.includes(props.current) ? all : [props.current, ...all];\n };\n\n // Empty the region first, so the same words spoken again are a change too.\n const announce = () => {\n setLive(\"\");\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n const current = cell?.querySelector('[data-current=\"true\"]');\n setLive(current ? spokenText(current) : \"\");\n }, 40);\n };\n\n onMount(() => {\n if (untrack(() => scope?.answered())) announce();\n });\n createEffect(\n on(\n () => props.current,\n () => {\n // A link pressed in a line that is now hidden would leave the focus on an invisible button, which the browser\n // then drops to the page. The line itself keeps it instead.\n const active = document.activeElement;\n const hidden = active && cell?.contains(active) && !active.closest('[data-current=\"true\"]');\n if (hidden || (pending && active === document.body)) root?.focus({ preventScroll: true });\n announce();\n },\n { defer: true },\n ),\n );\n onCleanup(() => {\n if (timer) clearTimeout(timer);\n });\n\n return (\n <div\n ref={root}\n class={`k2b-chat-outcome ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n data-enter={entering ? \"true\" : undefined}\n tabindex=\"-1\"\n >\n <span class=\"k2b-chat-outcome__icon\" aria-hidden=\"true\">\n <i class={line()?.icon ?? OUTCOME_ICONS[tone()]} />\n </span>\n {/* Busy is set on the words only: a live region inside a busy subtree would be held back. */}\n <div ref={cell} class=\"k2b-chat-outcome__cell\" aria-busy={tone() === \"running\" ? \"true\" : undefined}>\n <For each={keys()}>\n {(key) => {\n const entry = () => lines()[key];\n const current = () => key === props.current;\n return (\n <Show when={entry()}>\n {(item) => (\n <div\n class=\"k2b-chat-outcome__text\"\n data-current={current() ? \"true\" : undefined}\n aria-hidden={current() ? undefined : \"true\"}\n >\n {item().text}\n <Show when={item().detail}>\n {(detail) => (\n <>\n {\" \"}\n <span class=\"k2b-chat-outcome__detail\">{detail()}</span>\n </>\n )}\n </Show>\n <Show when={item().time}>{(time) => <span class=\"k2b-chat-outcome__time\">{time()}</span>}</Show>\n <Show when={item().action}>\n {(action) => (\n <Button\n class=\"k2b-chat-outcome__link\"\n wrap\n variant=\"text\"\n tabIndex={current() ? undefined : -1}\n onClick={() => {\n // A second press while the first is still running would repeat its work.\n if (pending) return;\n scope?.pressed();\n try {\n const result = action().onSelect();\n if (result instanceof Promise) {\n pending = true;\n result\n .catch((error: unknown) => props.onActionError?.(error))\n .finally(() => {\n pending = false;\n scope?.released();\n });\n return;\n }\n } catch (error) {\n props.onActionError?.(error);\n }\n scope?.released();\n }}\n >\n {action().label}\n </Button>\n )}\n </Show>\n {/* Every line keeps its buttons, hidden with its text, so the cell also reserves their row. */}\n <Show when={item().actions}>{(actions) => <div class=\"k2b-chat-outcome__actions\">{actions()}</div>}</Show>\n </div>\n )}\n </Show>\n );\n }}\n </For>\n </div>\n <span class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\">\n {live()}\n </span>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Preview\n// ---------------------------------------------------------------------------\n\nexport type ChatPreviewProps = { children: JSX.Element; class?: string };\n\n/** The thing a question is about, as calm text on the sentence's edge: no surface, no column. */\nfunction ChatPreviewRoot(props: ChatPreviewProps): JSX.Element {\n return <div class={`k2b-chat-preview ${props.class ?? \"\"}`}>{props.children}</div>;\n}\n\nexport type ChatPreviewHeaderProps = {\n /** One row per field, such as From, To, Cc, and Bcc; the label stands right before its value. */\n rows: readonly ChatPreviewHeaderRow[];\n /** A last line, such as when the message goes out. */\n note?: JSX.Element;\n};\n\nconst PreviewPeople = (props: { people: readonly ChatPreviewPerson[] }) => (\n <For each={props.people}>\n {(person, index) => (\n <>\n {index() > 0 ? \", \" : \"\"}\n <span class=\"k2b-chat-preview__person\">\n <Show when={person.name}>{(name) => <b>{name()}</b>}</Show>\n <Show when={person.address}>\n {(address) => (\n <span class=\"k2b-chat-preview__address\" data-alone={person.name ? undefined : \"true\"}>\n {address()}\n </span>\n )}\n </Show>\n </span>\n </>\n )}\n </For>\n);\n\nfunction ChatPreviewHeader(props: ChatPreviewHeaderProps): JSX.Element {\n return (\n <div class=\"k2b-chat-preview__header\">\n <dl>\n <For each={props.rows}>\n {(row) => (\n <div data-emphasis={row.emphasis ? \"true\" : undefined}>\n <dt>{row.label}</dt>\n <dd>\n <Show when={row.people}>{(people) => <PreviewPeople people={people()} />}</Show>\n {row.value}\n </dd>\n </div>\n )}\n </For>\n </dl>\n <Show when={props.note}>{(note) => <p>{note()}</p>}</Show>\n </div>\n );\n}\n\nexport type ChatPreviewTitleProps = { children: JSX.Element; meta?: JSX.Element };\n\n/** The thing's name in the text's own face, with optional quiet facts after it. */\nfunction ChatPreviewTitle(props: ChatPreviewTitleProps): JSX.Element {\n return (\n <p class=\"k2b-chat-preview__title-line\">\n <span class=\"k2b-chat-preview__title\">{props.children}</span>\n <Show when={props.meta}>\n {(meta) => (\n <>\n {\" \"}\n <span class=\"k2b-chat-preview__meta\">{meta()}</span>\n </>\n )}\n </Show>\n </p>\n );\n}\n\n/** A rule or instruction as one sentence, such as what a routine does; chips and marks may stand inside. */\nfunction ChatPreviewSentence(props: { children: JSX.Element }): JSX.Element {\n return <p class=\"k2b-chat-preview__sentence\">{props.children}</p>;\n}\n\nexport type ChatPreviewExcerptProps = {\n children: JSX.Element;\n /** Shows the whole text in place instead of the first lines, such as after `Chat.Preview.ShowAll`. */\n expanded?: boolean;\n id?: string;\n};\n\n/** The first lines of a longer text. It keeps its line breaks, shows about three lines, and fades out. */\nfunction ChatPreviewExcerpt(props: ChatPreviewExcerptProps): JSX.Element {\n return (\n <p\n class=\"k2b-chat-preview__excerpt\"\n id={props.id}\n data-expanded={props.expanded ? \"true\" : undefined}\n tabindex={props.expanded ? -1 : undefined}\n >\n {props.children}\n </p>\n );\n}\n\nexport type ChatPreviewShowAllProps = {\n /** The id of the `Chat.Preview.Excerpt` this button opens. */\n controls: string;\n onShow: () => void;\n children: JSX.Element;\n};\n\n/**\n * Shows the rest of an excerpt in place, for a text with no page of its own to open. It looks like `ReadMore`; the\n * caller removes it once the text is shown, and the focus moves to the text, so reading goes on where it was.\n */\nfunction ChatPreviewShowAll(props: ChatPreviewShowAllProps): JSX.Element {\n const show = () => {\n props.onShow();\n queueMicrotask(() => document.getElementById(props.controls)?.focus({ preventScroll: true }));\n };\n return (\n <button type=\"button\" class=\"k2b-chat-preview__more\" aria-controls={props.controls} aria-expanded=\"false\" onClick={show}>\n {props.children}\n </button>\n );\n}\n\nexport type ChatPreviewReadMoreProps = {\n href: string;\n children: JSX.Element;\n /** Tooltip, such as \"Opens exactly this version of the draft\". */\n title?: string;\n};\n\n/** Opens the whole thing at exactly the version the question shows. */\nfunction ChatPreviewReadMore(props: ChatPreviewReadMoreProps): JSX.Element {\n return (\n <a class=\"k2b-chat-preview__more\" href={props.href} title={props.title}>\n {props.children}\n </a>\n );\n}\n\nconst InList = createContext(false);\n\n/** A list of lines with a name, such as \"What the routine may do\". */\nfunction ChatPreviewLines(props: { label?: string; children: JSX.Element }): JSX.Element {\n return (\n <ul class=\"k2b-chat-preview__lines\" aria-label={props.label}>\n <InList.Provider value={true}>{props.children}</InList.Provider>\n </ul>\n );\n}\n\nexport type ChatPreviewLineProps = {\n /** Icon class; the text after it starts 1.5rem from the edge. */\n icon: string;\n /** Icon colour, such as the PDF colour of an attachment. */\n accent?: string;\n /** `muted` for limits and notes, `warning` for an application's own warning. */\n tone?: \"default\" | \"muted\" | \"warning\";\n /** Marks the whole line as new or removed. */\n mark?: \"added\" | \"removed\";\n /** Quiet facts after the text, such as a file size. */\n meta?: JSX.Element;\n children: JSX.Element;\n};\n\n/** One line led by an icon: a consequence, a right, an attachment, or a warning. */\nfunction ChatPreviewLine(props: ChatPreviewLineProps): JSX.Element {\n const inList = useContext(InList);\n const messages = useChatMessages();\n const content = () => (\n <>\n <i class={`k2b-chat-line__icon ${props.icon}`} style={props.accent ? { color: props.accent } : undefined} aria-hidden=\"true\" />\n <span class=\"k2b-chat-line__text\">\n {/* One stable wrapper, so marking a line later never moves its mounted children. */}\n <span class=\"k2b-chat-mark\" data-change={props.mark}>\n <Show when={props.mark}>\n {(mark) => <span class=\"k2b-sr-only\">{mark() === \"added\" ? messages().markAdded : messages().markRemoved} </span>}\n </Show>\n {props.children}\n </span>\n <Show when={props.meta}>\n {(meta) => (\n <>\n {\" \"}\n <span class=\"k2b-chat-preview__meta\">{meta()}</span>\n </>\n )}\n </Show>\n </span>\n </>\n );\n const attributes = () => ({\n class: \"k2b-chat-line k2b-chat-preview__line\",\n \"data-tone\": props.tone && props.tone !== \"default\" ? props.tone : undefined,\n });\n return inList ? <li {...attributes()}>{content()}</li> : <p {...attributes()}>{content()}</p>;\n}\n\nexport type ChatPreviewPeopleProps = {\n /** The first few people; their avatars overlap at the start of the line. */\n people: readonly { name: string; src?: string | null }[];\n /** The names as text, such as \"Lea Berg, Tom Weber and 3 others\". */\n children: JSX.Element;\n};\n\nfunction ChatPreviewPeople(props: ChatPreviewPeopleProps): JSX.Element {\n return (\n <p class=\"k2b-chat-preview__people\">\n <span class=\"k2b-chat-preview__faces\" aria-hidden=\"true\">\n <For each={props.people}>{(person) => <Avatar name={person.name} src={person.src} size=\"xs\" />}</For>\n </span>\n <span>{props.children}</span>\n </p>\n );\n}\n\nexport const ChatPreview = Object.assign(ChatPreviewRoot, {\n Header: ChatPreviewHeader,\n Title: ChatPreviewTitle,\n Sentence: ChatPreviewSentence,\n Excerpt: ChatPreviewExcerpt,\n ReadMore: ChatPreviewReadMore,\n ShowAll: ChatPreviewShowAll,\n Lines: ChatPreviewLines,\n Line: ChatPreviewLine,\n People: ChatPreviewPeople,\n});\n\n// ---------------------------------------------------------------------------\n// Mark\n// ---------------------------------------------------------------------------\n\nexport type ChatMarkProps = { change: \"added\" | \"removed\"; children: JSX.Element };\n\n/** Marks new or removed words; screen readers hear \"new:\" or \"removed:\" first. */\nexport function ChatMark(props: ChatMarkProps): JSX.Element {\n const messages = useChatMessages();\n return (\n <Show\n when={props.change === \"removed\"}\n fallback={\n <mark class=\"k2b-chat-mark\" data-change=\"added\">\n <span class=\"k2b-sr-only\">{messages().markAdded} </span>\n {props.children}\n </mark>\n }\n >\n <del class=\"k2b-chat-mark\" data-change=\"removed\">\n <span class=\"k2b-sr-only\">{messages().markRemoved} </span>\n {props.children}\n </del>\n </Show>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["chat/ChatDecision.tsx"],"sourcesContent":["import {\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n useContext,\n} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { Avatar } from \"../surfaces/Avatar\";\nimport { useChatMessages } from \"./chat-messages\";\nimport type {\n ChatDecisionAnswer,\n ChatDecisionReason,\n ChatDecisionState,\n ChatOutcomeLine,\n ChatOutcomeTone,\n ChatPreviewHeaderRow,\n ChatPreviewPerson,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Decision\n// ---------------------------------------------------------------------------\n\nexport type ChatDecisionProps = {\n /** `open` shows the question; every other state shows `outcome` in its place. */\n state: ChatDecisionState;\n /** The question as one sentence, usually with `ReferenceChip`s. */\n sentence: JSX.Element;\n /** Why this question is asked, in the platform's words. */\n reason: ChatDecisionReason;\n /** The thing itself, usually `Chat.Preview`. */\n preview?: JSX.Element;\n /** The main answer, named by verb and target (\"Send to Lea\"). `danger` for deletions, `primary` for requests. */\n confirm: ChatDecisionAnswer & { variant?: \"ai\" | \"primary\" | \"danger\" };\n /** The other answer (\"Don't send\"). */\n decline: ChatDecisionAnswer;\n /** An optional quiet third answer after the buttons, such as \"Yes, and don't ask again in this chat\". */\n remember?: ChatDecisionAnswer;\n /** Turns `confirm` and `remember` off; this reason replaces `reason` in the same place. */\n unavailable?: ChatDecisionReason;\n /**\n * Turns every answer off until the reason clears, such as no connection, so no answer is lost on the way; this\n * reason replaces `reason` and `unavailable` in the same place.\n */\n waiting?: ChatDecisionReason;\n /** The result line shown in every state but `open`, usually `Chat.Outcome`. */\n outcome?: JSX.Element;\n /** Receives a rejected promise from an answer's `onSelect`. */\n onAnswerError?: (error: unknown) => void;\n anchorId?: string | number;\n class?: string;\n};\n\n/** What an outcome inside a question needs from it: whether it was just answered here, and a link press inside it. */\nconst DecisionScope = createContext<{ answered: () => boolean; pressed: () => void; released: () => void }>();\n\nconst reasonIcon = (reason: ChatDecisionReason) => reason.icon ?? \"ti ti-info-circle\";\n\n/**\n * A question the person answers in the conversation: one sentence, why it is asked, the thing itself, and two answers.\n * An answer collapses it at once to its outcome line, which takes the focus and is announced.\n */\nexport function ChatDecision(props: ChatDecisionProps): JSX.Element {\n const id = createUniqueId();\n const sentenceId = `k2b-chat-decision-${id}-sentence`;\n const reasonId = `k2b-chat-decision-${id}-reason`;\n let root: HTMLDivElement | undefined;\n let sentence: HTMLParagraphElement | undefined;\n // An answer given here moves the focus to the outcome; a click in the outcome that reopens the question moves it\n // back to the sentence. A state change from elsewhere moves no focus.\n const [answeredHere, setAnsweredHere] = createSignal(false);\n const [arrive, setArrive] = createSignal(false);\n let reopenedHere = false;\n // A press on the sentence focuses it too; only a focus moved there from elsewhere, such as a jump, lights it up.\n // The browser also focuses the sentence again when its window comes back; that is no arrival either.\n let sentencePressed = false;\n let sentenceHeldAcrossWindow = false;\n const windowLeft = () => {\n if (sentence && document.activeElement === sentence) sentenceHeldAcrossWindow = true;\n };\n onMount(() => {\n window.addEventListener(\"blur\", windowLeft);\n onCleanup(() => window.removeEventListener(\"blur\", windowLeft));\n });\n // A press counts only while its action runs: a reopen from elsewhere later must not take the focus.\n const scope = {\n answered: answeredHere,\n pressed: () => {\n reopenedHere = true;\n },\n released: () => {\n reopenedHere = false;\n },\n };\n\n // Read once: an object literal from the host builds its JSX again on every read.\n const reason = createMemo(() => props.waiting ?? props.unavailable ?? props.reason);\n const confirmOff = () => Boolean(props.waiting ?? props.unavailable);\n const open = () => props.state === \"open\";\n\n const answer = (choice: ChatDecisionAnswer, enabled: boolean) => {\n if (!enabled || !open() || answeredHere()) return;\n setAnsweredHere(true);\n try {\n const result = choice.onSelect();\n if (result instanceof Promise) result.catch((error: unknown) => props.onAnswerError?.(error));\n } catch (error) {\n props.onAnswerError?.(error);\n }\n // A host that keeps the question open (it could not take the answer) gets working buttons back.\n queueMicrotask(() => {\n if (open()) setAnsweredHere(false);\n });\n };\n\n createEffect(\n on(\n () => props.state,\n (state, previous) => {\n if (state !== \"open\" && previous === \"open\" && answeredHere()) {\n root?.querySelector<HTMLElement>(\".k2b-chat-outcome\")?.focus({ preventScroll: true });\n }\n if (state === \"open\" && previous !== undefined && previous !== \"open\") {\n // A host that could not take an answer given here returns the question from `sending`; the outcome that held\n // the focus is gone, so the focus goes back to the sentence instead of the page.\n const active = document.activeElement;\n const failedHere = answeredHere() && previous === \"sending\" && (!active || active === document.body);\n setAnsweredHere(false);\n if (reopenedHere || failedHere) {\n sentence?.focus({ preventScroll: true });\n setArrive(true);\n }\n // Handled. Until then the marker holds through states in between, such as `sending` while a reopen loads.\n reopenedHere = false;\n }\n },\n ),\n );\n\n return (\n <div\n ref={root}\n class={`k2b-chat-decision ${props.class ?? \"\"}`}\n data-state={props.state}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n >\n <Show when={open()} fallback={<DecisionScope.Provider value={scope}>{props.outcome}</DecisionScope.Provider>}>\n <section class=\"k2b-chat-decision__card\" aria-labelledby={sentenceId} aria-describedby={reasonId}>\n <p\n ref={sentence}\n id={sentenceId}\n class=\"k2b-chat-decision__sentence\"\n tabindex=\"-1\"\n data-arrive={arrive() ? \"true\" : undefined}\n onPointerDown={() => {\n sentencePressed = true;\n }}\n onPointerUp={() => {\n sentencePressed = false;\n }}\n onPointerCancel={() => {\n sentencePressed = false;\n }}\n onFocus={() => {\n if (!sentencePressed && !sentenceHeldAcrossWindow) setArrive(true);\n sentencePressed = false;\n sentenceHeldAcrossWindow = false;\n }}\n onAnimationEnd={() => setArrive(false)}\n >\n {props.sentence}\n </p>\n <p id={reasonId} class=\"k2b-chat-line k2b-chat-decision__reason\" data-tone={reason().tone ?? \"neutral\"}>\n <i class={`k2b-chat-line__icon ${reasonIcon(reason())}`} aria-hidden=\"true\" />\n <span class=\"k2b-chat-line__text\">{reason().text}</span>\n </p>\n {props.preview}\n <div class=\"k2b-chat-decision__answers\">\n <Button\n class=\"k2b-chat-decision__answer\"\n wrap\n variant={props.confirm.variant ?? \"ai\"}\n disabled={confirmOff()}\n onClick={() => answer(props.confirm, !confirmOff())}\n >\n <Show when={props.confirm.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {props.confirm.label}\n </Button>\n <Button\n class=\"k2b-chat-decision__answer\"\n wrap\n variant=\"subtle\"\n disabled={Boolean(props.waiting)}\n onClick={() => answer(props.decline, !props.waiting)}\n >\n <Show when={props.decline.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {props.decline.label}\n </Button>\n <Show when={props.remember}>\n {(remember) => (\n <Button\n class=\"k2b-chat-decision__remember\"\n wrap\n variant=\"text\"\n disabled={confirmOff()}\n onClick={() => answer(remember(), !confirmOff())}\n >\n {remember().label}\n </Button>\n )}\n </Show>\n </div>\n </section>\n </Show>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Outcome\n// ---------------------------------------------------------------------------\n\nexport type ChatOutcomeProps = {\n /**\n * Every line one flow can show, such as running and done. All of them share one cell, so the line is as high as\n * the longest and switching between them moves nothing.\n */\n lines: Readonly<Record<string, ChatOutcomeLine>>;\n /** The key of the visible line. */\n current: string;\n /** Receives an error thrown or rejected by a line's `action`. */\n onActionError?: (error: unknown) => void;\n anchorId?: string | number;\n class?: string;\n};\n\nconst OUTCOME_ICONS: Record<ChatOutcomeTone, string> = {\n running: \"ti ti-loader-2 k2b-spin\",\n done: \"ti ti-check\",\n off: \"ti ti-circle-off\",\n waiting: \"ti ti-clock\",\n warning: \"ti ti-alert-triangle\",\n error: \"ti ti-alert-circle\",\n};\n\n/** The visible words of a line, without what screen readers do not hear. */\nconst spokenText = (element: Element): string => {\n const copy = element.cloneNode(true) as Element;\n // Buttons under the line are controls, not part of what happened.\n for (const hidden of copy.querySelectorAll('[aria-hidden=\"true\"], .k2b-chat-outcome__actions')) hidden.remove();\n // The time and the link stand apart by margin only; spoken, they need a space.\n for (const part of copy.querySelectorAll(\".k2b-chat-outcome__time, .k2b-chat-outcome__link\")) part.before(\" \");\n return (copy.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n};\n\n/**\n * One line that says what happened: running, done, off, waiting, warning, or error. Changes are announced through a\n * polite live region; the line itself can take the focus.\n */\nexport function ChatOutcome(props: ChatOutcomeProps): JSX.Element {\n const scope = useContext(DecisionScope);\n // Only a line that replaces a question just answered here fades in; history renders final.\n const entering = untrack(() => scope?.answered() ?? false);\n const [live, setLive] = createSignal(\"\");\n let root: HTMLDivElement | undefined;\n let cell: HTMLDivElement | undefined;\n let pending = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n // Read once: an object literal from the host builds its JSX again on every read.\n const lines = createMemo(() => props.lines);\n const line = () => lines()[props.current];\n const tone = () => line()?.tone ?? \"off\";\n const keys = () => {\n const all = Object.keys(lines());\n return all.includes(props.current) ? all : [props.current, ...all];\n };\n\n // Empty the region first, so the same words spoken again are a change too.\n const announce = () => {\n setLive(\"\");\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n const current = cell?.querySelector('[data-current=\"true\"]');\n setLive(current ? spokenText(current) : \"\");\n }, 40);\n };\n\n onMount(() => {\n if (untrack(() => scope?.answered())) announce();\n });\n createEffect(\n on(\n () => props.current,\n () => {\n // A link pressed in a line that is now hidden would leave the focus on an invisible button, which the browser\n // then drops to the page. The line itself keeps it instead.\n const active = document.activeElement;\n const hidden = active && cell?.contains(active) && !active.closest('[data-current=\"true\"]');\n if (hidden || (pending && active === document.body)) root?.focus({ preventScroll: true });\n announce();\n },\n { defer: true },\n ),\n );\n onCleanup(() => {\n if (timer) clearTimeout(timer);\n });\n\n return (\n <div\n ref={root}\n class={`k2b-chat-outcome ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n data-enter={entering ? \"true\" : undefined}\n tabindex=\"-1\"\n >\n <span class=\"k2b-chat-outcome__icon\" aria-hidden=\"true\">\n <i class={line()?.icon ?? OUTCOME_ICONS[tone()]} />\n </span>\n {/* Busy is set on the words only: a live region inside a busy subtree would be held back. */}\n <div ref={cell} class=\"k2b-chat-outcome__cell\" aria-busy={tone() === \"running\" ? \"true\" : undefined}>\n <For each={keys()}>\n {(key) => {\n const entry = () => lines()[key];\n const current = () => key === props.current;\n return (\n <Show when={entry()}>\n {(item) => (\n <div\n class=\"k2b-chat-outcome__text\"\n data-current={current() ? \"true\" : undefined}\n aria-hidden={current() ? undefined : \"true\"}\n >\n {item().text}\n <Show when={item().detail}>\n {(detail) => (\n <>\n {\" \"}\n <span class=\"k2b-chat-outcome__detail\">{detail()}</span>\n </>\n )}\n </Show>\n <Show when={item().time}>{(time) => <span class=\"k2b-chat-outcome__time\">{time()}</span>}</Show>\n <Show when={item().action}>\n {(action) => (\n <Button\n class=\"k2b-chat-outcome__link\"\n wrap\n variant=\"text\"\n tabIndex={current() ? undefined : -1}\n onClick={() => {\n // A second press while the first is still running would repeat its work.\n if (pending) return;\n scope?.pressed();\n try {\n const result = action().onSelect();\n if (result instanceof Promise) {\n pending = true;\n result\n .catch((error: unknown) => props.onActionError?.(error))\n .finally(() => {\n pending = false;\n scope?.released();\n });\n return;\n }\n } catch (error) {\n props.onActionError?.(error);\n }\n scope?.released();\n }}\n >\n {action().label}\n </Button>\n )}\n </Show>\n {/* Every line keeps its buttons, hidden with its text, so the cell also reserves their row. */}\n <Show when={item().actions}>{(actions) => <div class=\"k2b-chat-outcome__actions\">{actions()}</div>}</Show>\n </div>\n )}\n </Show>\n );\n }}\n </For>\n </div>\n <span class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\">\n {live()}\n </span>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Preview\n// ---------------------------------------------------------------------------\n\nexport type ChatPreviewProps = { children: JSX.Element; class?: string };\n\n/** The thing a question is about, as calm text on the sentence's edge: no surface, no column. */\nfunction ChatPreviewRoot(props: ChatPreviewProps): JSX.Element {\n return <div class={`k2b-chat-preview ${props.class ?? \"\"}`}>{props.children}</div>;\n}\n\nexport type ChatPreviewHeaderProps = {\n /** One row per field, such as From, To, Cc, and Bcc; the label stands right before its value. */\n rows: readonly ChatPreviewHeaderRow[];\n /** A last line, such as when the message goes out. */\n note?: JSX.Element;\n};\n\nconst PreviewPeople = (props: { people: readonly ChatPreviewPerson[] }) => (\n <For each={props.people}>\n {(person, index) => (\n <>\n {index() > 0 ? \", \" : \"\"}\n <span class=\"k2b-chat-preview__person\">\n <Show when={person.name}>{(name) => <b>{name()}</b>}</Show>\n <Show when={person.address}>\n {(address) => (\n <span class=\"k2b-chat-preview__address\" data-alone={person.name ? undefined : \"true\"}>\n {address()}\n </span>\n )}\n </Show>\n </span>\n </>\n )}\n </For>\n);\n\nfunction ChatPreviewHeader(props: ChatPreviewHeaderProps): JSX.Element {\n return (\n <div class=\"k2b-chat-preview__header\">\n <dl>\n <For each={props.rows}>\n {(row) => (\n <div data-emphasis={row.emphasis ? \"true\" : undefined}>\n <dt>{row.label}</dt>\n <dd>\n <Show when={row.people}>{(people) => <PreviewPeople people={people()} />}</Show>\n {row.value}\n </dd>\n </div>\n )}\n </For>\n </dl>\n <Show when={props.note}>{(note) => <p>{note()}</p>}</Show>\n </div>\n );\n}\n\nexport type ChatPreviewTitleProps = { children: JSX.Element; meta?: JSX.Element };\n\n/** The thing's name in the text's own face, with optional quiet facts after it. */\nfunction ChatPreviewTitle(props: ChatPreviewTitleProps): JSX.Element {\n return (\n <p class=\"k2b-chat-preview__title-line\">\n <span class=\"k2b-chat-preview__title\">{props.children}</span>\n <Show when={props.meta}>\n {(meta) => (\n <>\n {\" \"}\n <span class=\"k2b-chat-preview__meta\">{meta()}</span>\n </>\n )}\n </Show>\n </p>\n );\n}\n\n/** A rule or instruction as one sentence, such as what a routine does; chips and marks may stand inside. */\nfunction ChatPreviewSentence(props: { children: JSX.Element }): JSX.Element {\n return <p class=\"k2b-chat-preview__sentence\">{props.children}</p>;\n}\n\nexport type ChatPreviewExcerptProps = {\n children: JSX.Element;\n /** Shows the whole text in place instead of the first lines, such as after `Chat.Preview.ShowAll`. */\n expanded?: boolean;\n id?: string;\n};\n\n/** The first lines of a longer text. It keeps its line breaks, shows about three lines, and fades out. */\nfunction ChatPreviewExcerpt(props: ChatPreviewExcerptProps): JSX.Element {\n return (\n <p\n class=\"k2b-chat-preview__excerpt\"\n id={props.id}\n data-expanded={props.expanded ? \"true\" : undefined}\n tabindex={props.expanded ? -1 : undefined}\n >\n {props.children}\n </p>\n );\n}\n\nexport type ChatPreviewShowAllProps = {\n /** The id of the `Chat.Preview.Excerpt` this button opens. */\n controls: string;\n onShow: () => void;\n children: JSX.Element;\n};\n\n/**\n * Shows the rest of an excerpt in place, for a text with no page of its own to open. It looks like `ReadMore`; the\n * caller removes it once the text is shown, and the focus moves to the text, so reading goes on where it was.\n */\nfunction ChatPreviewShowAll(props: ChatPreviewShowAllProps): JSX.Element {\n const show = () => {\n props.onShow();\n queueMicrotask(() => document.getElementById(props.controls)?.focus({ preventScroll: true }));\n };\n return (\n <button type=\"button\" class=\"k2b-chat-preview__more\" aria-controls={props.controls} aria-expanded=\"false\" onClick={show}>\n {props.children}\n </button>\n );\n}\n\nexport type ChatPreviewReadMoreProps = {\n href: string;\n children: JSX.Element;\n /** Tooltip, such as \"Opens exactly this version of the draft\". */\n title?: string;\n};\n\n/** Opens the whole thing at exactly the version the question shows. */\nfunction ChatPreviewReadMore(props: ChatPreviewReadMoreProps): JSX.Element {\n return (\n <a class=\"k2b-chat-preview__more\" href={props.href} title={props.title}>\n {props.children}\n </a>\n );\n}\n\nconst InList = createContext(false);\n\n/** A list of lines with a name, such as \"What the routine may do\". */\nfunction ChatPreviewLines(props: { label?: string; children: JSX.Element }): JSX.Element {\n return (\n <ul class=\"k2b-chat-preview__lines\" aria-label={props.label}>\n <InList.Provider value={true}>{props.children}</InList.Provider>\n </ul>\n );\n}\n\nexport type ChatPreviewLineProps = {\n /** Icon class; the text after it starts 1.5rem from the edge. */\n icon: string;\n /** Icon colour, such as the PDF colour of an attachment. */\n accent?: string;\n /** `muted` for limits and notes, `warning` for an application's own warning. */\n tone?: \"default\" | \"muted\" | \"warning\";\n /** Marks the whole line as new or removed. */\n mark?: \"added\" | \"removed\";\n /** Quiet facts after the text, such as a file size. */\n meta?: JSX.Element;\n children: JSX.Element;\n};\n\n/** One line led by an icon: a consequence, a right, an attachment, or a warning. */\nfunction ChatPreviewLine(props: ChatPreviewLineProps): JSX.Element {\n const inList = useContext(InList);\n const messages = useChatMessages();\n const content = () => (\n <>\n <i class={`k2b-chat-line__icon ${props.icon}`} style={props.accent ? { color: props.accent } : undefined} aria-hidden=\"true\" />\n <span class=\"k2b-chat-line__text\">\n {/* One stable wrapper, so marking a line later never moves its mounted children. */}\n <span class=\"k2b-chat-mark\" data-change={props.mark}>\n <Show when={props.mark}>\n {(mark) => <span class=\"k2b-sr-only\">{mark() === \"added\" ? messages().markAdded : messages().markRemoved} </span>}\n </Show>\n {props.children}\n </span>\n <Show when={props.meta}>\n {(meta) => (\n <>\n {\" \"}\n <span class=\"k2b-chat-preview__meta\">{meta()}</span>\n </>\n )}\n </Show>\n </span>\n </>\n );\n const attributes = () => ({\n class: \"k2b-chat-line k2b-chat-preview__line\",\n \"data-tone\": props.tone && props.tone !== \"default\" ? props.tone : undefined,\n });\n return inList ? <li {...attributes()}>{content()}</li> : <p {...attributes()}>{content()}</p>;\n}\n\nexport type ChatPreviewPeopleProps = {\n /** The first few people; their avatars overlap at the start of the line. */\n people: readonly { name: string; src?: string | null }[];\n /** The names as text, such as \"Lea Berg, Tom Weber and 3 others\". */\n children: JSX.Element;\n};\n\nfunction ChatPreviewPeople(props: ChatPreviewPeopleProps): JSX.Element {\n return (\n <p class=\"k2b-chat-preview__people\">\n <span class=\"k2b-chat-preview__faces\" aria-hidden=\"true\">\n <For each={props.people}>{(person) => <Avatar name={person.name} src={person.src} size=\"xs\" />}</For>\n </span>\n <span>{props.children}</span>\n </p>\n );\n}\n\nexport const ChatPreview = Object.assign(ChatPreviewRoot, {\n Header: ChatPreviewHeader,\n Title: ChatPreviewTitle,\n Sentence: ChatPreviewSentence,\n Excerpt: ChatPreviewExcerpt,\n ReadMore: ChatPreviewReadMore,\n ShowAll: ChatPreviewShowAll,\n Lines: ChatPreviewLines,\n Line: ChatPreviewLine,\n People: ChatPreviewPeople,\n});\n\n// ---------------------------------------------------------------------------\n// Mark\n// ---------------------------------------------------------------------------\n\nexport type ChatMarkProps = { change: \"added\" | \"removed\"; children: JSX.Element };\n\n/** Marks new or removed words; screen readers hear \"new:\" or \"removed:\" first. */\nexport function ChatMark(props: ChatMarkProps): JSX.Element {\n const messages = useChatMessages();\n return (\n <Show\n when={props.change === \"removed\"}\n fallback={\n <mark class=\"k2b-chat-mark\" data-change=\"added\">\n <span class=\"k2b-sr-only\">{messages().markAdded} </span>\n {props.children}\n </mark>\n }\n >\n <del class=\"k2b-chat-mark\" data-change=\"removed\">\n <span class=\"k2b-sr-only\">{messages().markRemoved} </span>\n {props.children}\n </del>\n </Show>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -139,6 +139,9 @@ export const chatMessages = i18n.define({
|
|
|
139
139
|
openInNewTab: ({
|
|
140
140
|
name
|
|
141
141
|
}) => `Open ${name} in a new tab`,
|
|
142
|
+
uploading: ({
|
|
143
|
+
name
|
|
144
|
+
}) => `Uploading ${name}`,
|
|
142
145
|
retryOlderMessages: "Retry loading older messages",
|
|
143
146
|
sendMessage: "Send message",
|
|
144
147
|
startConversation: "Start a conversation",
|
|
@@ -282,6 +285,9 @@ export const chatMessages = i18n.define({
|
|
|
282
285
|
openInNewTab: ({
|
|
283
286
|
name
|
|
284
287
|
}) => `${name} in neuem Tab öffnen`,
|
|
288
|
+
uploading: ({
|
|
289
|
+
name
|
|
290
|
+
}) => `${name} wird hochgeladen`,
|
|
285
291
|
retryOlderMessages: "Ältere Nachrichten erneut laden",
|
|
286
292
|
sendMessage: "Nachricht senden",
|
|
287
293
|
startConversation: "Unterhaltung beginnen",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["chat/chat-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nexport const chatMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n commandFailed: \"That did not work.\",\n commandDraftChanged: \"The text changed in the meantime, so nothing was inserted.\",\n markAdded: \"new:\",\n markRemoved: \"removed:\",\n commandOpening: \"Opening …\",\n commandSelected: \"selected\",\n attachments: \"Attachments\",\n assistant: \"Assistant\",\n addToChat: \"Add to chat\",\n addMenu: \"Add\",\n commandSearch: \"Search\",\n commandSearchLabel: \"Search entries\",\n attachFiles: \"Attach files\",\n addGuidance: \"Add guidance...\",\n chat: \"Chat\",\n chooseModel: \"Choose model\",\n commands: \"Commands\",\n commandsNothingFound: ({ query }: { query: string }) => `Nothing found for “${query}”`,\n commandSuggestions: ({ count }: { count: number }) =>\n count === 0 ? \"No suggestions\" : count === 1 ? \"1 suggestion\" : `${count} suggestions`,\n dropFilesToAttach: \"Drop to attach to the message\",\n conversation: \"Conversation\",\n jumpToLatest: \"Jump to latest\",\n messageSent: \"Sent\",\n messageNotSent: \"Not sent\",\n messageRetry: \"Retry\",\n messageDiscard: \"Discard\",\n messageShowMore: \"Show more\",\n messageShowLess: \"Show less\",\n messageReplyTo: \"In reply to\",\n messageForwarded: \"Forwarded\",\n messageEdited: \"edited\",\n messageDeleted: \"This message was deleted\",\n messageVideo: \"Video\",\n messageMoreAttachments: ({ count }: { count: number }) => `${count} more`,\n messageReactions: \"Reactions\",\n messageReaction: ({ emoji, count, names, own }: { emoji: string; count: number; names?: string; own?: boolean }) =>\n `${emoji} ${own && count === 1 ? \"your reaction\" : `${count} ${count === 1 ? \"reaction\" : \"reactions\"}${own ? \", including yours\" : \"\"}`}${names ? `: ${names}` : \"\"}`,\n messageAddReaction: \"Add reaction\",\n moreReactions: ({ count }: { count: number }) => (count === 1 ? \"1 more reaction\" : `${count} more reactions`),\n reactionYou: \"You\",\n reactionAnd: \"and\",\n reactionMorePeople: ({ count }: { count: number }) => `and ${count} more`,\n messageReplies: ({ count }: { count: number }) => (count === 1 ? \"1 reply\" : `${count} replies`),\n messageLastReply: ({ time }: { time: string }) => `Last reply ${time}`,\n messageStop: \"Stop\",\n conversationMessages: ({ label }: { label: string }) => `${label} messages`,\n loadEarlier: \"Load earlier\",\n loadingConversation: \"Loading conversation\",\n loadingMessages: \"Loading messages\",\n failed: \"Failed\",\n generating: \"Generating\",\n loadOlderMessages: \"Load older messages\",\n loadingOlderMessages: \"Loading older messages\",\n couldNotLoadOlderMessages: \"Could not load older messages\",\n couldNotLoadEarlierMessages: \"Could not load earlier messages\",\n couldNotPostMessage: \"Could not post message\",\n messageActions: \"Message actions\",\n cancelReply: \"Cancel reply\",\n replyingTo: \"Replying to\",\n messageMenu: ({ author, time }: { author: string; time: string }) => `Message from ${author}, ${time}`,\n messageComposer: \"Message composer\",\n messageInput: \"Message input\",\n model: \"Model\",\n input: \"Input\",\n output: \"Output\",\n loopTotal: \"Whole response\",\n remaining: \"Remaining\",\n notConfigured: \"Not configured\",\n system: \"System\",\n tool: \"Tool\",\n user: \"User\",\n waiting: \"Waiting\",\n lastRequestContext: \"Last request context\",\n contextWindowUsed: \"Context window used\",\n contextWindow: \"Context window\",\n contextUsageUnavailable: \"Context usage unavailable\",\n contextUsageUnavailableWithWindow: ({ window }: { window: string }) => `Context usage unavailable, ${window} token context window`,\n tokensUsed: ({ total }: { total: string }) => `${total} tokens used`,\n tokensUsedPercent: ({ total, percent }: { total: string; percent: number }) =>\n `${total} tokens used, ${percent}% of the context window`,\n postMessage: \"Post message\",\n queueMessage: \"Queue message\",\n queueing: \"Queueing\",\n sending: \"Sending\",\n steering: \"Steering\",\n writeMessage: \"Write a message or type / ...\",\n writeConversationMessage: \"Write a message\",\n composerFormatting: \"Formatting\",\n insertEmoji: \"Insert emoji\",\n emojiSuggestions: \"Emoji suggestions\",\n peopleSuggestions: \"People\",\n agentLabel: \"Agent\",\n dictate: \"Dictate\",\n dictateOrHold: \"Dictate. Hold to record a voice message.\",\n stopDictation: \"Stop dictation\",\n microphoneOptions: \"Microphone options\",\n recordVoiceMessage: \"Record voice message\",\n dictationListening: \"Dictating …\",\n dictationRefining: \"Refining the text …\",\n dictationRefined: \"Text refined\",\n dictationUnrefined: \"Text not refined\",\n dictationInterrupted: \"Dictation interrupted\",\n restoreOriginal: \"Restore original\",\n openInNewTab: ({ name }: { name: string }) => `Open ${name} in a new tab`,\n retryOlderMessages: \"Retry loading older messages\",\n sendMessage: \"Send message\",\n startConversation: \"Start a conversation\",\n steerResponse: \"Steer response\",\n stopResponse: \"Stop response\",\n stopping: \"Stopping\",\n },\n de: {\n commandFailed: \"Das hat nicht geklappt.\",\n commandDraftChanged: \"Der Text hat sich inzwischen geändert, darum wurde nichts eingefügt.\",\n markAdded: \"neu:\",\n markRemoved: \"weg:\",\n commandOpening: \"Wird geöffnet …\",\n commandSelected: \"gewählt\",\n attachments: \"Anhänge\",\n assistant: \"Assistent\",\n addToChat: \"Zum Chat hinzufügen\",\n addMenu: \"Hinzufügen\",\n commandSearch: \"Suchen\",\n commandSearchLabel: \"Einträge durchsuchen\",\n attachFiles: \"Dateien anhängen\",\n addGuidance: \"Hinweis hinzufügen...\",\n chat: \"Chat\",\n chooseModel: \"Modell auswählen\",\n commands: \"Befehle\",\n commandsNothingFound: ({ query }) => `Nichts gefunden für „${query}“`,\n commandSuggestions: ({ count }) => (count === 0 ? \"Keine Vorschläge\" : count === 1 ? \"1 Vorschlag\" : `${count} Vorschläge`),\n dropFilesToAttach: \"Ablegen, um an die Nachricht anzuhängen\",\n conversation: \"Unterhaltung\",\n jumpToLatest: \"Zur neuesten Nachricht\",\n messageSent: \"Gesendet\",\n messageNotSent: \"Nicht gesendet\",\n messageRetry: \"Erneut senden\",\n messageDiscard: \"Verwerfen\",\n messageShowMore: \"Mehr anzeigen\",\n messageShowLess: \"Weniger anzeigen\",\n messageReplyTo: \"Antwort auf\",\n messageForwarded: \"Weitergeleitet\",\n messageEdited: \"bearbeitet\",\n messageDeleted: \"Diese Nachricht wurde gelöscht\",\n messageVideo: \"Video\",\n messageMoreAttachments: ({ count }) => `${count} weitere`,\n messageReactions: \"Reaktionen\",\n messageReaction: ({ emoji, count, names, own }) =>\n `${emoji} ${own && count === 1 ? \"deine Reaktion\" : `${count} ${count === 1 ? \"Reaktion\" : \"Reaktionen\"}${own ? \", einschließlich deiner\" : \"\"}`}${names ? `: ${names}` : \"\"}`,\n messageAddReaction: \"Reaktion hinzufügen\",\n moreReactions: ({ count }) => (count === 1 ? \"1 weitere Reaktion\" : `${count} weitere Reaktionen`),\n reactionYou: \"Du\",\n reactionAnd: \"und\",\n reactionMorePeople: ({ count }) => `und ${count} weitere`,\n messageReplies: ({ count }) => (count === 1 ? \"1 Antwort\" : `${count} Antworten`),\n messageLastReply: ({ time }) => `Letzte Antwort ${time}`,\n messageStop: \"Stoppen\",\n conversationMessages: ({ label }) => `Nachrichten in ${label}`,\n loadEarlier: \"Ältere laden\",\n loadingConversation: \"Unterhaltung wird geladen\",\n loadingMessages: \"Nachrichten werden geladen\",\n failed: \"Fehlgeschlagen\",\n generating: \"Wird generiert\",\n loadOlderMessages: \"Ältere Nachrichten laden\",\n loadingOlderMessages: \"Ältere Nachrichten werden geladen\",\n couldNotLoadOlderMessages: \"Ältere Nachrichten konnten nicht geladen werden\",\n couldNotLoadEarlierMessages: \"Ältere Nachrichten konnten nicht geladen werden\",\n couldNotPostMessage: \"Nachricht konnte nicht gepostet werden\",\n messageActions: \"Nachrichtenaktionen\",\n cancelReply: \"Antwort abbrechen\",\n replyingTo: \"Antwort an\",\n messageMenu: ({ author, time }) => `Nachricht von ${author}, ${time}`,\n messageComposer: \"Nachricht verfassen\",\n messageInput: \"Nachrichteneingabe\",\n model: \"Modell\",\n input: \"Eingabe\",\n output: \"Ausgabe\",\n loopTotal: \"Ganze Antwort\",\n remaining: \"Verbleibend\",\n notConfigured: \"Nicht konfiguriert\",\n system: \"System\",\n tool: \"Werkzeug\",\n user: \"Benutzer\",\n waiting: \"Wartet\",\n lastRequestContext: \"Kontext der letzten Anfrage\",\n contextWindowUsed: \"Kontextfenster verwendet\",\n contextWindow: \"Kontextfenster\",\n contextUsageUnavailable: \"Kontextnutzung nicht verfügbar\",\n contextUsageUnavailableWithWindow: ({ window }) => `Kontextnutzung nicht verfügbar, Kontextfenster mit ${window} Token`,\n tokensUsed: ({ total }) => `${total} Token verwendet`,\n tokensUsedPercent: ({ total, percent }) => `${total} Token verwendet, ${percent}% des Kontextfensters`,\n postMessage: \"Nachricht posten\",\n queueMessage: \"Nachricht einreihen\",\n queueing: \"Wird eingereiht\",\n sending: \"Wird gesendet\",\n steering: \"Wird gesteuert\",\n writeMessage: \"Nachricht schreiben oder / eingeben ...\",\n writeConversationMessage: \"Nachricht schreiben\",\n composerFormatting: \"Formatierung\",\n insertEmoji: \"Emoji einfügen\",\n emojiSuggestions: \"Emoji-Vorschläge\",\n peopleSuggestions: \"Personen\",\n agentLabel: \"Agent\",\n dictate: \"Diktieren\",\n dictateOrHold: \"Diktieren. Halten nimmt eine Sprachnachricht auf.\",\n stopDictation: \"Diktat beenden\",\n microphoneOptions: \"Mikrofon-Optionen\",\n recordVoiceMessage: \"Sprachnachricht aufnehmen\",\n dictationListening: \"Diktat läuft …\",\n dictationRefining: \"Text wird verfeinert …\",\n dictationRefined: \"Text verfeinert\",\n dictationUnrefined: \"Text nicht verfeinert\",\n dictationInterrupted: \"Diktat unterbrochen\",\n restoreOriginal: \"Original wiederherstellen\",\n openInNewTab: ({ name }) => `${name} in neuem Tab öffnen`,\n retryOlderMessages: \"Ältere Nachrichten erneut laden\",\n sendMessage: \"Nachricht senden\",\n startConversation: \"Unterhaltung beginnen\",\n steerResponse: \"Antwort steuern\",\n stopResponse: \"Antwort stoppen\",\n stopping: \"Wird gestoppt\",\n },\n },\n});\n\nexport type ChatMessages = ReturnType<(typeof chatMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useChatMessages = (): (() => ChatMessages) => {\n const locale = useLocale();\n return () => chatMessages.resolve([locale()]).t;\n};\n\nexport const checkChatMessages = () => chatMessages.check();\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["chat/chat-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nexport const chatMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n commandFailed: \"That did not work.\",\n commandDraftChanged: \"The text changed in the meantime, so nothing was inserted.\",\n markAdded: \"new:\",\n markRemoved: \"removed:\",\n commandOpening: \"Opening …\",\n commandSelected: \"selected\",\n attachments: \"Attachments\",\n assistant: \"Assistant\",\n addToChat: \"Add to chat\",\n addMenu: \"Add\",\n commandSearch: \"Search\",\n commandSearchLabel: \"Search entries\",\n attachFiles: \"Attach files\",\n addGuidance: \"Add guidance...\",\n chat: \"Chat\",\n chooseModel: \"Choose model\",\n commands: \"Commands\",\n commandsNothingFound: ({ query }: { query: string }) => `Nothing found for “${query}”`,\n commandSuggestions: ({ count }: { count: number }) =>\n count === 0 ? \"No suggestions\" : count === 1 ? \"1 suggestion\" : `${count} suggestions`,\n dropFilesToAttach: \"Drop to attach to the message\",\n conversation: \"Conversation\",\n jumpToLatest: \"Jump to latest\",\n messageSent: \"Sent\",\n messageNotSent: \"Not sent\",\n messageRetry: \"Retry\",\n messageDiscard: \"Discard\",\n messageShowMore: \"Show more\",\n messageShowLess: \"Show less\",\n messageReplyTo: \"In reply to\",\n messageForwarded: \"Forwarded\",\n messageEdited: \"edited\",\n messageDeleted: \"This message was deleted\",\n messageVideo: \"Video\",\n messageMoreAttachments: ({ count }: { count: number }) => `${count} more`,\n messageReactions: \"Reactions\",\n messageReaction: ({ emoji, count, names, own }: { emoji: string; count: number; names?: string; own?: boolean }) =>\n `${emoji} ${own && count === 1 ? \"your reaction\" : `${count} ${count === 1 ? \"reaction\" : \"reactions\"}${own ? \", including yours\" : \"\"}`}${names ? `: ${names}` : \"\"}`,\n messageAddReaction: \"Add reaction\",\n moreReactions: ({ count }: { count: number }) => (count === 1 ? \"1 more reaction\" : `${count} more reactions`),\n reactionYou: \"You\",\n reactionAnd: \"and\",\n reactionMorePeople: ({ count }: { count: number }) => `and ${count} more`,\n messageReplies: ({ count }: { count: number }) => (count === 1 ? \"1 reply\" : `${count} replies`),\n messageLastReply: ({ time }: { time: string }) => `Last reply ${time}`,\n messageStop: \"Stop\",\n conversationMessages: ({ label }: { label: string }) => `${label} messages`,\n loadEarlier: \"Load earlier\",\n loadingConversation: \"Loading conversation\",\n loadingMessages: \"Loading messages\",\n failed: \"Failed\",\n generating: \"Generating\",\n loadOlderMessages: \"Load older messages\",\n loadingOlderMessages: \"Loading older messages\",\n couldNotLoadOlderMessages: \"Could not load older messages\",\n couldNotLoadEarlierMessages: \"Could not load earlier messages\",\n couldNotPostMessage: \"Could not post message\",\n messageActions: \"Message actions\",\n cancelReply: \"Cancel reply\",\n replyingTo: \"Replying to\",\n messageMenu: ({ author, time }: { author: string; time: string }) => `Message from ${author}, ${time}`,\n messageComposer: \"Message composer\",\n messageInput: \"Message input\",\n model: \"Model\",\n input: \"Input\",\n output: \"Output\",\n loopTotal: \"Whole response\",\n remaining: \"Remaining\",\n notConfigured: \"Not configured\",\n system: \"System\",\n tool: \"Tool\",\n user: \"User\",\n waiting: \"Waiting\",\n lastRequestContext: \"Last request context\",\n contextWindowUsed: \"Context window used\",\n contextWindow: \"Context window\",\n contextUsageUnavailable: \"Context usage unavailable\",\n contextUsageUnavailableWithWindow: ({ window }: { window: string }) => `Context usage unavailable, ${window} token context window`,\n tokensUsed: ({ total }: { total: string }) => `${total} tokens used`,\n tokensUsedPercent: ({ total, percent }: { total: string; percent: number }) =>\n `${total} tokens used, ${percent}% of the context window`,\n postMessage: \"Post message\",\n queueMessage: \"Queue message\",\n queueing: \"Queueing\",\n sending: \"Sending\",\n steering: \"Steering\",\n writeMessage: \"Write a message or type / ...\",\n writeConversationMessage: \"Write a message\",\n composerFormatting: \"Formatting\",\n insertEmoji: \"Insert emoji\",\n emojiSuggestions: \"Emoji suggestions\",\n peopleSuggestions: \"People\",\n agentLabel: \"Agent\",\n dictate: \"Dictate\",\n dictateOrHold: \"Dictate. Hold to record a voice message.\",\n stopDictation: \"Stop dictation\",\n microphoneOptions: \"Microphone options\",\n recordVoiceMessage: \"Record voice message\",\n dictationListening: \"Dictating …\",\n dictationRefining: \"Refining the text …\",\n dictationRefined: \"Text refined\",\n dictationUnrefined: \"Text not refined\",\n dictationInterrupted: \"Dictation interrupted\",\n restoreOriginal: \"Restore original\",\n openInNewTab: ({ name }: { name: string }) => `Open ${name} in a new tab`,\n uploading: ({ name }: { name: string }) => `Uploading ${name}`,\n retryOlderMessages: \"Retry loading older messages\",\n sendMessage: \"Send message\",\n startConversation: \"Start a conversation\",\n steerResponse: \"Steer response\",\n stopResponse: \"Stop response\",\n stopping: \"Stopping\",\n },\n de: {\n commandFailed: \"Das hat nicht geklappt.\",\n commandDraftChanged: \"Der Text hat sich inzwischen geändert, darum wurde nichts eingefügt.\",\n markAdded: \"neu:\",\n markRemoved: \"weg:\",\n commandOpening: \"Wird geöffnet …\",\n commandSelected: \"gewählt\",\n attachments: \"Anhänge\",\n assistant: \"Assistent\",\n addToChat: \"Zum Chat hinzufügen\",\n addMenu: \"Hinzufügen\",\n commandSearch: \"Suchen\",\n commandSearchLabel: \"Einträge durchsuchen\",\n attachFiles: \"Dateien anhängen\",\n addGuidance: \"Hinweis hinzufügen...\",\n chat: \"Chat\",\n chooseModel: \"Modell auswählen\",\n commands: \"Befehle\",\n commandsNothingFound: ({ query }) => `Nichts gefunden für „${query}“`,\n commandSuggestions: ({ count }) => (count === 0 ? \"Keine Vorschläge\" : count === 1 ? \"1 Vorschlag\" : `${count} Vorschläge`),\n dropFilesToAttach: \"Ablegen, um an die Nachricht anzuhängen\",\n conversation: \"Unterhaltung\",\n jumpToLatest: \"Zur neuesten Nachricht\",\n messageSent: \"Gesendet\",\n messageNotSent: \"Nicht gesendet\",\n messageRetry: \"Erneut senden\",\n messageDiscard: \"Verwerfen\",\n messageShowMore: \"Mehr anzeigen\",\n messageShowLess: \"Weniger anzeigen\",\n messageReplyTo: \"Antwort auf\",\n messageForwarded: \"Weitergeleitet\",\n messageEdited: \"bearbeitet\",\n messageDeleted: \"Diese Nachricht wurde gelöscht\",\n messageVideo: \"Video\",\n messageMoreAttachments: ({ count }) => `${count} weitere`,\n messageReactions: \"Reaktionen\",\n messageReaction: ({ emoji, count, names, own }) =>\n `${emoji} ${own && count === 1 ? \"deine Reaktion\" : `${count} ${count === 1 ? \"Reaktion\" : \"Reaktionen\"}${own ? \", einschließlich deiner\" : \"\"}`}${names ? `: ${names}` : \"\"}`,\n messageAddReaction: \"Reaktion hinzufügen\",\n moreReactions: ({ count }) => (count === 1 ? \"1 weitere Reaktion\" : `${count} weitere Reaktionen`),\n reactionYou: \"Du\",\n reactionAnd: \"und\",\n reactionMorePeople: ({ count }) => `und ${count} weitere`,\n messageReplies: ({ count }) => (count === 1 ? \"1 Antwort\" : `${count} Antworten`),\n messageLastReply: ({ time }) => `Letzte Antwort ${time}`,\n messageStop: \"Stoppen\",\n conversationMessages: ({ label }) => `Nachrichten in ${label}`,\n loadEarlier: \"Ältere laden\",\n loadingConversation: \"Unterhaltung wird geladen\",\n loadingMessages: \"Nachrichten werden geladen\",\n failed: \"Fehlgeschlagen\",\n generating: \"Wird generiert\",\n loadOlderMessages: \"Ältere Nachrichten laden\",\n loadingOlderMessages: \"Ältere Nachrichten werden geladen\",\n couldNotLoadOlderMessages: \"Ältere Nachrichten konnten nicht geladen werden\",\n couldNotLoadEarlierMessages: \"Ältere Nachrichten konnten nicht geladen werden\",\n couldNotPostMessage: \"Nachricht konnte nicht gepostet werden\",\n messageActions: \"Nachrichtenaktionen\",\n cancelReply: \"Antwort abbrechen\",\n replyingTo: \"Antwort an\",\n messageMenu: ({ author, time }) => `Nachricht von ${author}, ${time}`,\n messageComposer: \"Nachricht verfassen\",\n messageInput: \"Nachrichteneingabe\",\n model: \"Modell\",\n input: \"Eingabe\",\n output: \"Ausgabe\",\n loopTotal: \"Ganze Antwort\",\n remaining: \"Verbleibend\",\n notConfigured: \"Nicht konfiguriert\",\n system: \"System\",\n tool: \"Werkzeug\",\n user: \"Benutzer\",\n waiting: \"Wartet\",\n lastRequestContext: \"Kontext der letzten Anfrage\",\n contextWindowUsed: \"Kontextfenster verwendet\",\n contextWindow: \"Kontextfenster\",\n contextUsageUnavailable: \"Kontextnutzung nicht verfügbar\",\n contextUsageUnavailableWithWindow: ({ window }) => `Kontextnutzung nicht verfügbar, Kontextfenster mit ${window} Token`,\n tokensUsed: ({ total }) => `${total} Token verwendet`,\n tokensUsedPercent: ({ total, percent }) => `${total} Token verwendet, ${percent}% des Kontextfensters`,\n postMessage: \"Nachricht posten\",\n queueMessage: \"Nachricht einreihen\",\n queueing: \"Wird eingereiht\",\n sending: \"Wird gesendet\",\n steering: \"Wird gesteuert\",\n writeMessage: \"Nachricht schreiben oder / eingeben ...\",\n writeConversationMessage: \"Nachricht schreiben\",\n composerFormatting: \"Formatierung\",\n insertEmoji: \"Emoji einfügen\",\n emojiSuggestions: \"Emoji-Vorschläge\",\n peopleSuggestions: \"Personen\",\n agentLabel: \"Agent\",\n dictate: \"Diktieren\",\n dictateOrHold: \"Diktieren. Halten nimmt eine Sprachnachricht auf.\",\n stopDictation: \"Diktat beenden\",\n microphoneOptions: \"Mikrofon-Optionen\",\n recordVoiceMessage: \"Sprachnachricht aufnehmen\",\n dictationListening: \"Diktat läuft …\",\n dictationRefining: \"Text wird verfeinert …\",\n dictationRefined: \"Text verfeinert\",\n dictationUnrefined: \"Text nicht verfeinert\",\n dictationInterrupted: \"Diktat unterbrochen\",\n restoreOriginal: \"Original wiederherstellen\",\n openInNewTab: ({ name }) => `${name} in neuem Tab öffnen`,\n uploading: ({ name }) => `${name} wird hochgeladen`,\n retryOlderMessages: \"Ältere Nachrichten erneut laden\",\n sendMessage: \"Nachricht senden\",\n startConversation: \"Unterhaltung beginnen\",\n steerResponse: \"Antwort steuern\",\n stopResponse: \"Antwort stoppen\",\n stopping: \"Wird gestoppt\",\n },\n },\n});\n\nexport type ChatMessages = ReturnType<(typeof chatMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useChatMessages = (): (() => ChatMessages) => {\n const locale = useLocale();\n return () => chatMessages.resolve([locale()]).t;\n};\n\nexport const checkChatMessages = () => chatMessages.check();\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["chat/types.ts"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport type { EmojiSkinTone } from \"../inputs/emoji/emoji-index\";\n\nexport type ChatRole = \"user\" | \"assistant\" | \"system\" | \"tool\";\n\nexport type ChatMessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n\n/** `warning` marks a partial result or an outcome that is not yet known. */\nexport type ChatActivityTone = \"neutral\" | \"ai\" | \"success\" | \"warning\" | \"danger\";\n\n/** `open` asks; `sending` while the answer is on its way; `decided` once answered; `expired` when it ran out. */\nexport type ChatDecisionState = \"open\" | \"sending\" | \"decided\" | \"expired\";\n\n/** One answer of a question. Set the question's state in `onSelect` before awaiting anything, so it collapses at once. */\nexport type ChatDecisionAnswer = {\n label: string;\n /** Icon class, for example `ti ti-send`. */\n icon?: string;\n onSelect: () => void | Promise<void>;\n};\n\n/** Why a question is asked, or why its main answer is off. */\nexport type ChatDecisionReason = {\n text: JSX.Element;\n /** Icon class; the text after it starts 1.5rem from the edge. */\n icon?: string;\n /** `danger` for deletions, `warning` for outside content and limits. */\n tone?: \"neutral\" | \"danger\" | \"warning\";\n};\n\nexport type ChatOutcomeTone = \"running\" | \"done\" | \"off\" | \"waiting\" | \"warning\" | \"error\";\n\n/** One text of an outcome flow. */\nexport type ChatOutcomeLine = {\n tone: ChatOutcomeTone;\n /** What happened, as one sentence, usually with `ReferenceChip`s. */\n text: JSX.Element;\n /** A quiet second sentence, such as \"You declined.\" */\n detail?: JSX.Element;\n /** A formatted time after the text. */\n time?: string;\n /** Replaces the tone's icon, for example `ti ti-clock-x` for an expired question. */\n icon?: string;\n /** One text link after the line, such as \"Ask again\". */\n action?: { label: string; onSelect: () => void | Promise<void> };\n /** Small buttons under the line. Shown while this line is current; otherwise hidden but still reserving their row. */\n actions?: JSX.Element;\n};\n\n/** A person in a preview header: the name in the text colour, then the address the message really uses. */\nexport type ChatPreviewPerson = { name?: string; address?: string };\n\n/** One header row, such as \"To Lea Berg lea.berg@example.com\". */\nexport type ChatPreviewHeaderRow = {\n label: string;\n people?: readonly ChatPreviewPerson[];\n /** Further content after the people, such as \"and 2 more\". */\n value?: JSX.Element;\n /** Draws the label stronger, for recipients others cannot see. */\n emphasis?: boolean;\n};\n\ntype ChatActionBase = {\n id: string;\n label: string;\n icon?: string;\n variant?: \"danger\";\n disabled?: boolean;\n /** Toggle state for persistent message actions such as feedback. */\n pressed?: boolean;\n /** Semantic foreground for selected feedback actions, without a persistent background. */\n pressedTone?: \"success\" | \"danger\";\n};\n\n/** Exactly one executable behavior for every chat action. */\nexport type ChatAction = ChatActionBase &\n ({ onSelect: () => void | Promise<void>; copyText?: never } | { copyText: string; onSelect?: never });\n\nexport type ChatAttachment = {\n id: string;\n name: string;\n size?: number;\n kind?: \"file\" | \"image\" | \"resource\";\n icon?: string;\n previewUrl?: string;\n alt?: string;\n /** Optional destination represented by this attachment. */\n href?: string;\n /** Opaque application-owned payload returned unchanged with ChatSubmitInput. */\n data?: unknown;\n /** Optional application-owned action presented below the attachment label. */\n action?: ChatAction;\n};\n\nexport type ChatUsage = {\n input?: number;\n output?: number;\n total?: number;\n};\n\nexport type ChatContextUsageData = {\n usage?: ChatUsage | null;\n loopUsage?: ChatUsage | null;\n contextWindow?: number;\n modelLabel?: string;\n};\n\nexport type ChatModelOption = {\n id: string;\n label: string;\n description?: string;\n image?: string;\n icon?: string;\n capabilities?: readonly string[];\n};\n\nexport type ChatComposerState = \"idle\" | \"submitting\" | \"running\" | \"stopping\";\n\nexport type ChatSubmitIntent = \"send\" | \"steer\" | \"queue\";\n\nexport type ChatSubmitInput = {\n intent: ChatSubmitIntent;\n text: string;\n attachments: readonly ChatAttachment[];\n mentions?: readonly ChatMention[];\n};\n\n/** Ranges use UTF-16 offsets into the untrimmed composer text. Payloads stay application-owned. */\nexport type ChatMention = { start: number; end: number; attachment: ChatAttachment };\n\n/**\n * Live dictation as the caller runs it: `listening` while speech arrives, `refining` after the stop until the refined\n * text replaced it, `refined` afterwards, `unrefined` when the raw text stays, and `interrupted` when the connection\n * ended early and the text so far stays.\n */\nexport type ChatDictationState = \"listening\" | \"refining\" | \"refined\" | \"unrefined\" | \"interrupted\";\n\n/** The composer's microphone. Dictation comes first; a voice message is the deliberate second action. */\nexport type ChatComposerMicrophone = {\n /** A tap starts or stops live dictation. Without it, a tap opens the microphone menu. */\n onDictate?: () => void;\n /** Holding the microphone, or \"Record voice message\" in its menu. Omit it where recording is not available. */\n onVoiceMessage?: () => void;\n /** The dictation state, shown on the microphone and in the hint line. */\n dictation?: ChatDictationState | null;\n /** Offered as \"Restore original\" while `dictation` is `refined`. */\n onRestoreOriginal?: () => void;\n disabled?: boolean;\n};\n\n/**\n * The composer's emoji button and `:shortcode` completion. Typing a colon and two letters suggests emoji by their\n * English or German name or GitHub shortcode; a complete `:thumbsup:` becomes 👍 when its closing colon is typed.\n */\nexport type ChatComposerEmoji = {\n /** Opens the emoji choice next to `anchor`, usually `EmojiPicker.Popover`; `insert` puts the chosen text at the caret. */\n onOpen: (context: { anchor: HTMLElement; insert: (text: string) => void }) => void;\n /** The skin tone of completed emoji that have one, as in the picker. */\n skinTone?: EmojiSkinTone;\n /** Called with each emoji the completion inserted, for example to remember it with `rememberEmoji`. */\n onPick?: (emoji: string) => void;\n};\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["chat/types.ts"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport type { EmojiSkinTone } from \"../inputs/emoji/emoji-index\";\n\nexport type ChatRole = \"user\" | \"assistant\" | \"system\" | \"tool\";\n\nexport type ChatMessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n\n/** `warning` marks a partial result or an outcome that is not yet known. */\nexport type ChatActivityTone = \"neutral\" | \"ai\" | \"success\" | \"warning\" | \"danger\";\n\n/** `open` asks; `sending` while the answer is on its way; `decided` once answered; `expired` when it ran out. */\nexport type ChatDecisionState = \"open\" | \"sending\" | \"decided\" | \"expired\";\n\n/** One answer of a question. Set the question's state in `onSelect` before awaiting anything, so it collapses at once. */\nexport type ChatDecisionAnswer = {\n label: string;\n /** Icon class, for example `ti ti-send`. */\n icon?: string;\n onSelect: () => void | Promise<void>;\n};\n\n/** Why a question is asked, or why its main answer is off. */\nexport type ChatDecisionReason = {\n text: JSX.Element;\n /** Icon class; the text after it starts 1.5rem from the edge. */\n icon?: string;\n /** `danger` for deletions, `warning` for outside content and limits. */\n tone?: \"neutral\" | \"danger\" | \"warning\";\n};\n\nexport type ChatOutcomeTone = \"running\" | \"done\" | \"off\" | \"waiting\" | \"warning\" | \"error\";\n\n/** One text of an outcome flow. */\nexport type ChatOutcomeLine = {\n tone: ChatOutcomeTone;\n /** What happened, as one sentence, usually with `ReferenceChip`s. */\n text: JSX.Element;\n /** A quiet second sentence, such as \"You declined.\" */\n detail?: JSX.Element;\n /** A formatted time after the text. */\n time?: string;\n /** Replaces the tone's icon, for example `ti ti-clock-x` for an expired question. */\n icon?: string;\n /** One text link after the line, such as \"Ask again\". */\n action?: { label: string; onSelect: () => void | Promise<void> };\n /** Small buttons under the line. Shown while this line is current; otherwise hidden but still reserving their row. */\n actions?: JSX.Element;\n};\n\n/** A person in a preview header: the name in the text colour, then the address the message really uses. */\nexport type ChatPreviewPerson = { name?: string; address?: string };\n\n/** One header row, such as \"To Lea Berg lea.berg@example.com\". */\nexport type ChatPreviewHeaderRow = {\n label: string;\n people?: readonly ChatPreviewPerson[];\n /** Further content after the people, such as \"and 2 more\". */\n value?: JSX.Element;\n /** Draws the label stronger, for recipients others cannot see. */\n emphasis?: boolean;\n};\n\ntype ChatActionBase = {\n id: string;\n label: string;\n icon?: string;\n variant?: \"danger\";\n disabled?: boolean;\n /** Toggle state for persistent message actions such as feedback. */\n pressed?: boolean;\n /** Semantic foreground for selected feedback actions, without a persistent background. */\n pressedTone?: \"success\" | \"danger\";\n};\n\n/** Exactly one executable behavior for every chat action. */\nexport type ChatAction = ChatActionBase &\n ({ onSelect: () => void | Promise<void>; copyText?: never } | { copyText: string; onSelect?: never });\n\nexport type ChatAttachment = {\n id: string;\n name: string;\n size?: number;\n kind?: \"file\" | \"image\" | \"resource\";\n icon?: string;\n previewUrl?: string;\n alt?: string;\n /** Optional destination represented by this attachment. */\n href?: string;\n /** Opaque application-owned payload returned unchanged with ChatSubmitInput. */\n data?: unknown;\n /** Optional application-owned action presented below the attachment label. */\n action?: ChatAction;\n /**\n * Upload progress in percent while the attachment uploads, such as a draft that saves its files before sending. The\n * line below the label shows a ring and the percentage instead of `action`.\n */\n progress?: number;\n};\n\nexport type ChatUsage = {\n input?: number;\n output?: number;\n total?: number;\n};\n\nexport type ChatContextUsageData = {\n usage?: ChatUsage | null;\n loopUsage?: ChatUsage | null;\n contextWindow?: number;\n modelLabel?: string;\n};\n\nexport type ChatModelOption = {\n id: string;\n label: string;\n description?: string;\n image?: string;\n icon?: string;\n capabilities?: readonly string[];\n};\n\nexport type ChatComposerState = \"idle\" | \"submitting\" | \"running\" | \"stopping\";\n\nexport type ChatSubmitIntent = \"send\" | \"steer\" | \"queue\";\n\nexport type ChatSubmitInput = {\n intent: ChatSubmitIntent;\n text: string;\n attachments: readonly ChatAttachment[];\n mentions?: readonly ChatMention[];\n};\n\n/** Ranges use UTF-16 offsets into the untrimmed composer text. Payloads stay application-owned. */\nexport type ChatMention = { start: number; end: number; attachment: ChatAttachment };\n\n/**\n * Live dictation as the caller runs it: `listening` while speech arrives, `refining` after the stop until the refined\n * text replaced it, `refined` afterwards, `unrefined` when the raw text stays, and `interrupted` when the connection\n * ended early and the text so far stays.\n */\nexport type ChatDictationState = \"listening\" | \"refining\" | \"refined\" | \"unrefined\" | \"interrupted\";\n\n/** The composer's microphone. Dictation comes first; a voice message is the deliberate second action. */\nexport type ChatComposerMicrophone = {\n /** A tap starts or stops live dictation. Without it, a tap opens the microphone menu. */\n onDictate?: () => void;\n /** Holding the microphone, or \"Record voice message\" in its menu. Omit it where recording is not available. */\n onVoiceMessage?: () => void;\n /** The dictation state, shown on the microphone and in the hint line. */\n dictation?: ChatDictationState | null;\n /** Offered as \"Restore original\" while `dictation` is `refined`. */\n onRestoreOriginal?: () => void;\n disabled?: boolean;\n};\n\n/**\n * The composer's emoji button and `:shortcode` completion. Typing a colon and two letters suggests emoji by their\n * English or German name or GitHub shortcode; a complete `:thumbsup:` becomes 👍 when its closing colon is typed.\n */\nexport type ChatComposerEmoji = {\n /** Opens the emoji choice next to `anchor`, usually `EmojiPicker.Popover`; `insert` puts the chosen text at the caret. */\n onOpen: (context: { anchor: HTMLElement; insert: (text: string) => void }) => void;\n /** The skin tone of completed emoji that have one, as in the picker. */\n skinTone?: EmojiSkinTone;\n /** Called with each emoji the completion inserted, for example to remember it with `rememberEmoji`. */\n onPick?: (emoji: string) => void;\n};\n"],"mappings":"","ignoreList":[]}
|
|
@@ -76,7 +76,7 @@ var _tmpl$ = /*#__PURE__*/_$template(`<a>`),
|
|
|
76
76
|
_tmpl$58 = /*#__PURE__*/_$template(`<div class=k2b-calendar-mobile-month><!$><!/><div class=k2b-calendar-mobile-month__agenda><div class=k2b-calendar-mobile-month__title></div><!$><!/>`),
|
|
77
77
|
_tmpl$59 = /*#__PURE__*/_$template(`<div class=k2b-calendar-mobile-month__empty>`),
|
|
78
78
|
_tmpl$60 = /*#__PURE__*/_$template(`<div class=k2b-calendar-body>`),
|
|
79
|
-
_tmpl$61 = /*#__PURE__*/_$template(`<section
|
|
79
|
+
_tmpl$61 = /*#__PURE__*/_$template(`<section><!$><!/><!$><!/><!$><!/>`);
|
|
80
80
|
import { Link } from "@k2b/ssr/nav";
|
|
81
81
|
import { dates as calendar } from "@k2b/stdlib";
|
|
82
82
|
import { createComputed, createEffect, createMemo, createSignal, For, mergeProps, on, onCleanup, onMount, Show, untrack } from "solid-js";
|
|
@@ -91,6 +91,7 @@ import { CalendarDayView } from "./CalendarDayView";
|
|
|
91
91
|
import { CalendarWeekView } from "./CalendarWeekView";
|
|
92
92
|
import { addDayKeys } from "./calendar-days";
|
|
93
93
|
import { openCalendarGoTo, openCalendarShortcuts } from "./calendar-dialogs";
|
|
94
|
+
import { CalendarEventDetail } from "./calendar-event-detail";
|
|
94
95
|
import { layoutCalendarIntervals } from "./calendar-event-layout";
|
|
95
96
|
import { useCalendarMessages } from "./calendar-messages";
|
|
96
97
|
import { fitMonthWeek, layoutMonthWeek, monthLaneCapacity } from "./calendar-month-layout";
|
|
@@ -2863,7 +2864,9 @@ const MonthView = props => {
|
|
|
2863
2864
|
},
|
|
2864
2865
|
get leadingTime() {
|
|
2865
2866
|
return leadingTime(item);
|
|
2866
|
-
}
|
|
2867
|
+
},
|
|
2868
|
+
faces: 1,
|
|
2869
|
+
linkCount: true
|
|
2867
2870
|
}));
|
|
2868
2871
|
return _el$140;
|
|
2869
2872
|
})()
|
|
@@ -3582,6 +3585,8 @@ const TimeGridView = props => {
|
|
|
3582
3585
|
return eventHref(props.owner, event);
|
|
3583
3586
|
},
|
|
3584
3587
|
fill: true,
|
|
3588
|
+
faces: 3,
|
|
3589
|
+
linkCount: true,
|
|
3585
3590
|
get moving() {
|
|
3586
3591
|
return movingEventId() === event.id;
|
|
3587
3592
|
},
|
|
@@ -3898,7 +3903,9 @@ const MobileMonthView = props => {
|
|
|
3898
3903
|
},
|
|
3899
3904
|
get href() {
|
|
3900
3905
|
return eventHref(props.owner, event);
|
|
3901
|
-
}
|
|
3906
|
+
},
|
|
3907
|
+
faces: 1,
|
|
3908
|
+
linkCount: true
|
|
3902
3909
|
})
|
|
3903
3910
|
}));
|
|
3904
3911
|
return _el$231;
|
|
@@ -3918,9 +3925,22 @@ const CalendarRoot = props => {
|
|
|
3918
3925
|
// Subviews derive their date config from the owner props, so the inherited
|
|
3919
3926
|
// render locale is merged here once; an explicit dateConfig.locale wins.
|
|
3920
3927
|
const localizedConfig = useDateConfigLocale(() => props.dateConfig);
|
|
3928
|
+
const [now, setNow] = createSignal(new Date());
|
|
3929
|
+
const [detail, setDetail] = createSignal(null);
|
|
3921
3930
|
const owner = mergeProps(props, {
|
|
3922
3931
|
get dateConfig() {
|
|
3923
3932
|
return localizedConfig();
|
|
3933
|
+
},
|
|
3934
|
+
calendarNow: now,
|
|
3935
|
+
get selectedEventId() {
|
|
3936
|
+
return props.selectedEventId ?? detail()?.event.id;
|
|
3937
|
+
},
|
|
3938
|
+
// The calendar's own detail stands in only for a host that opens nothing itself.
|
|
3939
|
+
get openEventDetail() {
|
|
3940
|
+
return props.onEventActivate ? undefined : (event, anchor) => setDetail({
|
|
3941
|
+
event,
|
|
3942
|
+
anchor
|
|
3943
|
+
});
|
|
3924
3944
|
}
|
|
3925
3945
|
});
|
|
3926
3946
|
const view = () => props.view ?? "month";
|
|
@@ -3932,7 +3952,6 @@ const CalendarRoot = props => {
|
|
|
3932
3952
|
};
|
|
3933
3953
|
const date = createMemo(() => safeDate(props.date));
|
|
3934
3954
|
const selectedDate = createMemo(() => safeDate(props.selectedDate ?? props.date));
|
|
3935
|
-
const [now, setNow] = createSignal(new Date());
|
|
3936
3955
|
/** The first day selected in the month view, so the view switcher opens the other views at it. */
|
|
3937
3956
|
const [focusDay, setFocusDay] = createSignal(null);
|
|
3938
3957
|
const normalizedEvents = createMemo(() => normalizeEvents(props.events, dateConfig()));
|
|
@@ -4143,7 +4162,9 @@ const CalendarRoot = props => {
|
|
|
4143
4162
|
_el$239 = _el$238.firstChild,
|
|
4144
4163
|
[_el$240, _co$63] = _$getNextMarker(_el$239.nextSibling),
|
|
4145
4164
|
_el$241 = _el$240.nextSibling,
|
|
4146
|
-
[_el$242, _co$64] = _$getNextMarker(_el$241.nextSibling)
|
|
4165
|
+
[_el$242, _co$64] = _$getNextMarker(_el$241.nextSibling),
|
|
4166
|
+
_el$243 = _el$242.nextSibling,
|
|
4167
|
+
[_el$244, _co$65] = _$getNextMarker(_el$243.nextSibling);
|
|
4147
4168
|
var _ref$9 = root;
|
|
4148
4169
|
typeof _ref$9 === "function" ? _$use(_ref$9, _el$238) : root = _el$238;
|
|
4149
4170
|
_$insert(_el$238, _$createComponent(CalendarHeader, {
|
|
@@ -4301,6 +4322,20 @@ const CalendarRoot = props => {
|
|
|
4301
4322
|
});
|
|
4302
4323
|
}
|
|
4303
4324
|
}), _el$242, _co$64);
|
|
4325
|
+
_$insert(_el$238, _$createComponent(Show, {
|
|
4326
|
+
get when() {
|
|
4327
|
+
return !props.onEventActivate;
|
|
4328
|
+
},
|
|
4329
|
+
get children() {
|
|
4330
|
+
return _$createComponent(CalendarEventDetail, {
|
|
4331
|
+
owner: owner,
|
|
4332
|
+
get state() {
|
|
4333
|
+
return detail();
|
|
4334
|
+
},
|
|
4335
|
+
onClose: () => setDetail(null)
|
|
4336
|
+
});
|
|
4337
|
+
}
|
|
4338
|
+
}), _el$244, _co$65);
|
|
4304
4339
|
_$effect(_p$ => {
|
|
4305
4340
|
var _v$60 = `k2b-content-calendar ${props.class ?? ""}`,
|
|
4306
4341
|
_v$61 = props.navigationPending ? "true" : undefined;
|