@k2b/ui 0.44.0 → 0.46.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/actions/Dropdown.js +8 -1
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/FilterChip.js +11 -5
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/Tabs.js +3 -4
- package/dist/browser/actions/Tabs.js.map +1 -1
- package/dist/browser/actions/ViewTabs.js +225 -93
- package/dist/browser/actions/ViewTabs.js.map +1 -1
- package/dist/browser/actions/menu-sheet.js +2 -3
- package/dist/browser/actions/menu-sheet.js.map +1 -1
- package/dist/browser/actions/phone-sheet.js +4 -0
- package/dist/browser/actions/phone-sheet.js.map +1 -0
- package/dist/browser/content/DataTable.js +47 -51
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/FileGrid.js +125 -99
- package/dist/browser/content/FileGrid.js.map +1 -1
- package/dist/browser/feedback/dialog-core.js +5 -1
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/feedback/dialog-tone.js +26 -0
- package/dist/browser/feedback/dialog-tone.js.map +1 -0
- package/dist/browser/feedback/index.js.map +1 -1
- package/dist/browser/feedback/prompt-confirm.js +223 -0
- package/dist/browser/feedback/prompt-confirm.js.map +1 -0
- package/dist/browser/feedback/prompts.js +195 -343
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/inputs/ChoiceList.js +45 -17
- package/dist/browser/inputs/ChoiceList.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +1647 -334
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/TextInput.js +5 -4
- package/dist/browser/inputs/TextInput.js.map +1 -1
- package/dist/browser/inputs/choice.js +36 -9
- package/dist/browser/inputs/choice.js.map +1 -1
- package/dist/browser/inputs/date-input-messages.js +128 -0
- package/dist/browser/inputs/date-input-messages.js.map +1 -0
- package/dist/browser/inputs/date-input-status.js +132 -0
- package/dist/browser/inputs/date-input-status.js.map +1 -0
- package/dist/browser/inputs/date-input.js +334 -0
- package/dist/browser/inputs/date-input.js.map +1 -0
- package/dist/browser/inputs/date-sheet.js +49 -0
- package/dist/browser/inputs/date-sheet.js.map +1 -0
- package/dist/browser/internal/reveal-in-scroller.js +28 -0
- package/dist/browser/internal/reveal-in-scroller.js.map +1 -0
- package/dist/browser/intl/messages.js +6 -0
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +556 -528
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/BottomSheet.js +3 -0
- package/dist/browser/layout/BottomSheet.js.map +1 -1
- package/dist/browser/layout/DetailPanel.js +130 -108
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/DetailSections.js +1019 -0
- package/dist/browser/layout/DetailSections.js.map +1 -0
- package/dist/browser/layout/DetailsToggle.js +32 -0
- package/dist/browser/layout/DetailsToggle.js.map +1 -0
- package/dist/browser/layout/Discussion.js +3 -0
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/MobileShell.js +116 -94
- package/dist/browser/layout/MobileShell.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +33 -10
- package/dist/browser/layout/PageTitle.js.map +1 -1
- package/dist/browser/layout/PanelDialog.js +167 -132
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/Settings.js +175 -139
- package/dist/browser/layout/Settings.js.map +1 -1
- package/dist/browser/layout/SettingsModal.js +2 -4
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js +12 -0
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/detail-sections-messages.js +123 -0
- package/dist/browser/layout/detail-sections-messages.js.map +1 -0
- package/dist/browser/layout/index.js +2 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/surfaces/Avatar.js +3 -1
- package/dist/browser/surfaces/Avatar.js.map +1 -1
- package/dist/browser/surfaces/AvatarStack.js +95 -61
- package/dist/browser/surfaces/AvatarStack.js.map +1 -1
- package/dist/browser/surfaces/ChangeList.js +77 -0
- package/dist/browser/surfaces/ChangeList.js.map +1 -0
- package/dist/browser/surfaces/StatusBadge.js +47 -14
- package/dist/browser/surfaces/StatusBadge.js.map +1 -1
- package/dist/browser/surfaces/index.js +2 -1
- package/dist/browser/surfaces/index.js.map +1 -1
- package/dist/browser/text-editor/TextEditor.js +26 -8
- package/dist/browser/text-editor/TextEditor.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +6 -0
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +1 -1
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/Tabs.js +3 -4
- package/dist/ssr/actions/Tabs.js.map +1 -1
- package/dist/ssr/actions/ViewTabs.js +144 -37
- package/dist/ssr/actions/ViewTabs.js.map +1 -1
- package/dist/ssr/actions/menu-sheet.js +2 -3
- package/dist/ssr/actions/menu-sheet.js.map +1 -1
- package/dist/ssr/actions/phone-sheet.js +4 -0
- package/dist/ssr/actions/phone-sheet.js.map +1 -0
- package/dist/ssr/content/DataTable.js +1 -2
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/FileGrid.js +36 -22
- package/dist/ssr/content/FileGrid.js.map +1 -1
- package/dist/ssr/feedback/dialog-core.js +5 -1
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/feedback/dialog-tone.js +26 -0
- package/dist/ssr/feedback/dialog-tone.js.map +1 -0
- package/dist/ssr/feedback/index.js.map +1 -1
- package/dist/ssr/feedback/prompt-confirm.js +123 -0
- package/dist/ssr/feedback/prompt-confirm.js.map +1 -0
- package/dist/ssr/feedback/prompts.js +60 -132
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/inputs/ChoiceList.js +29 -9
- package/dist/ssr/inputs/ChoiceList.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +1183 -166
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/TextInput.js +5 -4
- package/dist/ssr/inputs/TextInput.js.map +1 -1
- package/dist/ssr/inputs/choice.js +36 -9
- package/dist/ssr/inputs/choice.js.map +1 -1
- package/dist/ssr/inputs/date-input-messages.js +128 -0
- package/dist/ssr/inputs/date-input-messages.js.map +1 -0
- package/dist/ssr/inputs/date-input-status.js +132 -0
- package/dist/ssr/inputs/date-input-status.js.map +1 -0
- package/dist/ssr/inputs/date-input.js +334 -0
- package/dist/ssr/inputs/date-input.js.map +1 -0
- package/dist/ssr/inputs/date-sheet.js +44 -0
- package/dist/ssr/inputs/date-sheet.js.map +1 -0
- package/dist/ssr/internal/reveal-in-scroller.js +28 -0
- package/dist/ssr/internal/reveal-in-scroller.js.map +1 -0
- package/dist/ssr/intl/messages.js +6 -0
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +71 -50
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/BottomSheet.js +3 -0
- package/dist/ssr/layout/BottomSheet.js.map +1 -1
- package/dist/ssr/layout/DetailPanel.js +17 -0
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/DetailSections.js +762 -0
- package/dist/ssr/layout/DetailSections.js.map +1 -0
- package/dist/ssr/layout/DetailsToggle.js +29 -0
- package/dist/ssr/layout/DetailsToggle.js.map +1 -0
- package/dist/ssr/layout/Discussion.js +3 -0
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/MobileShell.js +45 -28
- package/dist/ssr/layout/MobileShell.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +29 -6
- package/dist/ssr/layout/PageTitle.js.map +1 -1
- package/dist/ssr/layout/PanelDialog.js +48 -30
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/Settings.js +34 -18
- package/dist/ssr/layout/Settings.js.map +1 -1
- package/dist/ssr/layout/SettingsModal.js +2 -4
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js +12 -0
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/detail-sections-messages.js +123 -0
- package/dist/ssr/layout/detail-sections-messages.js.map +1 -0
- package/dist/ssr/layout/index.js +2 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/surfaces/Avatar.js +3 -1
- package/dist/ssr/surfaces/Avatar.js.map +1 -1
- package/dist/ssr/surfaces/AvatarStack.js +61 -32
- package/dist/ssr/surfaces/AvatarStack.js.map +1 -1
- package/dist/ssr/surfaces/ChangeList.js +37 -0
- package/dist/ssr/surfaces/ChangeList.js.map +1 -0
- package/dist/ssr/surfaces/StatusBadge.js +26 -8
- package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
- package/dist/ssr/surfaces/index.js +2 -1
- package/dist/ssr/surfaces/index.js.map +1 -1
- package/dist/ssr/text-editor/TextEditor.js +26 -8
- package/dist/ssr/text-editor/TextEditor.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/FilterChip.d.ts +4 -0
- package/dist/types/actions/ViewTabs.d.ts +11 -1
- package/dist/types/actions/menu-sheet.d.ts +1 -3
- package/dist/types/actions/phone-sheet.d.ts +3 -0
- package/dist/types/content/FileGrid.d.ts +6 -0
- package/dist/types/feedback/dialog-tone.d.ts +10 -0
- package/dist/types/feedback/index.d.ts +1 -0
- package/dist/types/feedback/prompt-confirm.d.ts +19 -0
- package/dist/types/feedback/prompts.d.ts +4 -8
- package/dist/types/inputs/ChoiceList.d.ts +7 -3
- package/dist/types/inputs/DatePicker.d.ts +13 -3
- package/dist/types/inputs/TextInput.d.ts +1 -1
- package/dist/types/inputs/choice.d.ts +9 -3
- package/dist/types/inputs/date-input-messages.d.ts +64 -0
- package/dist/types/inputs/date-input-status.d.ts +35 -0
- package/dist/types/inputs/date-input.d.ts +90 -0
- package/dist/types/inputs/date-sheet.d.ts +14 -0
- package/dist/types/internal/reveal-in-scroller.d.ts +6 -0
- package/dist/types/intl/messages.d.ts +3 -0
- package/dist/types/layout/AppWorkspace.d.ts +14 -0
- package/dist/types/layout/BottomSheet.d.ts +3 -0
- package/dist/types/layout/DetailPanel.d.ts +9 -0
- package/dist/types/layout/DetailSections.d.ts +156 -0
- package/dist/types/layout/DetailsToggle.d.ts +13 -0
- package/dist/types/layout/PageTitle.d.ts +7 -0
- package/dist/types/layout/PanelDialog.d.ts +3 -0
- package/dist/types/layout/Settings.d.ts +17 -1
- package/dist/types/layout/detail-sections-messages.d.ts +59 -0
- package/dist/types/layout/index.d.ts +5 -2
- package/dist/types/surfaces/Avatar.d.ts +3 -0
- package/dist/types/surfaces/AvatarStack.d.ts +20 -1
- package/dist/types/surfaces/ChangeList.d.ts +20 -0
- package/dist/types/surfaces/StatusBadge.d.ts +5 -0
- package/dist/types/surfaces/index.d.ts +5 -3
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["layout/DetailSections.tsx"],"sourcesContent":["import { createMemo, createSignal, For, type JSX, onCleanup, Show } from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { Avatar, type AvatarShape } from \"../surfaces/Avatar\";\nimport { AvatarStack, type AvatarStackPerson } from \"../surfaces/AvatarStack\";\nimport { personColor } from \"../surfaces/person-color\";\nimport DetailPanel from \"./DetailPanel\";\nimport { useDetailPanelMessages } from \"./detail-panel-messages\";\nimport { useDetailSectionMessages } from \"./detail-sections-messages\";\n\n/*\n * Shared sections of an object's detail panel. Each one is a `DetailPanel.Section` with its icon, title, and count, so\n * its content starts on the title's text edge, and each keeps its height while its data changes. Apps pass data; the\n * order of sections is a convention (see the DetailPanel UI context).\n */\n\nconst listNames = (names: readonly string[], and: string): string =>\n names.length <= 1 ? (names[0] ?? \"\") : `${names.slice(0, -1).join(\", \")} ${and} ${names.at(-1)}`;\n\n// ── Presence ────────────────────────────────────────────────────────────\n\nexport type DetailPresencePerson = {\n /** Stable key, such as the account id. */\n id: string;\n name: string;\n /** A shorter name for the chip and the line below it, such as the first name. Defaults to `name`. */\n shortName?: string;\n src?: string | null;\n icon?: string;\n /** `square` for agents and service accounts. */\n shape?: AvatarShape;\n /** The person's color, the same as their cursor and comments. Defaults to `personColor(name)`. */\n color?: string;\n /** Writing shows a pen and the person's place; reading shows an eye. */\n activity?: \"writing\" | \"reading\";\n /** Where the person is, such as the heading of the section they write in. */\n place?: string;\n /** Short text at the end of the person's row in the full list, such as \"2 tabs\". */\n trailing?: JSX.Element;\n /** Goes to the person's place. */\n onSelect?: () => void;\n /** The person viewing: the fixed \"You\" chip at the end, never one of the others. */\n self?: boolean;\n};\n\n/** `offline` keeps the last known people, pale and without live dots; `unavailable` offers `onRetry`. */\nexport type DetailPresenceState = \"live\" | \"loading\" | \"offline\" | \"unavailable\";\n\nexport type DetailPresenceProps = {\n people: readonly DetailPresencePerson[];\n state?: DetailPresenceState;\n /**\n * The quiet line below the people when it does not say who writes where: alone (\"Whoever opens the note appears\n * here\"), offline (\"Offline · as of 19:24\"), or unavailable (\"Your changes are still being saved\").\n */\n note?: JSX.Element;\n onRetry?: () => void;\n /** One control at the end of the title row, such as \"Copy link\". */\n actions?: JSX.Element;\n /** Defaults to \"Here now\". */\n title?: string;\n /** One quiet line below the full list. */\n listHint?: JSX.Element;\n class?: string;\n};\n\nconst PresenceFace = (props: { person: DetailPresencePerson; live: boolean }): JSX.Element => (\n <span class=\"k2b-detail-presence__face\" data-live={props.live ? \"true\" : undefined}>\n <Avatar name={props.person.name} src={props.person.src} icon={props.person.icon} shape={props.person.shape} size=\"xs\" alt=\"\" />\n <span class=\"k2b-detail-presence__dot\" aria-hidden=\"true\" />\n </span>\n);\n\n/**\n * \"Here now\": who has the object open, what they do, and where. Always two lines tall in every state, so people\n * coming, going, or moving never shift the panel. Chips that do not fit wrap into a hidden line and count as \"+n\";\n * \"+n\" and \"You\" open the full list, which `AvatarStack` shows beside it or as a sheet on phones.\n */\nexport function DetailPresence(props: DetailPresenceProps): JSX.Element {\n const t = useDetailSectionMessages();\n const state = () => props.state ?? \"live\";\n const others = createMemo(() => props.people.filter((person) => !person.self));\n const self = createMemo(() => props.people.find((person) => person.self));\n const short = (person: DetailPresencePerson) => person.shortName ?? person.name;\n const color = (person: DetailPresencePerson) => person.color ?? personColor(person.name);\n const [hidden, setHidden] = createSignal(0);\n let chips: HTMLDivElement | undefined;\n\n // Chips that do not fit wrap into the clipped second line; they leave the tab order and count as \"+n\".\n const fit = () => {\n if (!chips) return;\n const all = Array.from(chips.children).filter((child): child is HTMLElement => child instanceof HTMLElement);\n const top = all[0]?.offsetTop ?? 0;\n let wrapped = 0;\n for (const chip of all) {\n const out = chip.offsetTop > top;\n chip.inert = out;\n if (out) wrapped += 1;\n }\n setHidden(wrapped);\n };\n // The strip mounts again after loading or an outage, so each mounted strip watches itself.\n const watchChips = (element: HTMLDivElement) => {\n chips = element;\n if (typeof ResizeObserver === \"undefined\") return;\n const resized = new ResizeObserver(fit);\n resized.observe(element);\n const changed = new MutationObserver(fit);\n changed.observe(element, { childList: true });\n queueMicrotask(fit);\n onCleanup(() => {\n resized.disconnect();\n changed.disconnect();\n });\n };\n\n const describe = (person: DetailPresencePerson) =>\n person.activity === \"writing\"\n ? t().personWriting({ name: person.name, place: person.place ?? \"\" })\n : t().personReading({ name: person.name });\n\n const listPeople = createMemo<AvatarStackPerson[]>(() =>\n props.people.map((person) => ({\n id: person.id,\n name: person.self ? t().you : person.name,\n src: person.src,\n icon: person.icon,\n shape: person.shape,\n self: person.self,\n detailIcon: person.self ? undefined : person.activity === \"writing\" ? \"ti ti-pencil\" : \"ti ti-eye\",\n detail: [person.self ? undefined : person.activity === \"writing\" ? t().writing : t().reading, person.place]\n .filter(Boolean)\n .join(\" · \"),\n trailing: person.trailing,\n onSelect: person.onSelect,\n })),\n );\n\n const where = (): JSX.Element => {\n if (state() === \"offline\" || others().length === 0) return props.note;\n const writers = others().filter((person) => person.activity === \"writing\");\n const readers = others().filter((person) => person.activity !== \"writing\");\n return (\n <>\n <For each={writers}>\n {(person, index) => (\n <>\n {index() > 0 ? \", \" : \"\"}\n <span class=\"k2b-detail-presence__swatch\" style={{ \"--k2b-person-color\": color(person) }} aria-hidden=\"true\" />\n <strong>{short(person)}</strong>\n <Show when={person.place}>\n {(place) => (\n <>\n {\" \"}\n {t().writesIn} {place()}\n </>\n )}\n </Show>\n </>\n )}\n </For>\n <Show when={writers.length > 0 && readers.length > 0}>{\" · \"}</Show>\n <Show when={readers.length > 0}>{t().readingAlong({ names: listNames(readers.map(short), t().and), count: readers.length })}</Show>\n </>\n );\n };\n\n const chip = (person: DetailPresencePerson): JSX.Element => {\n const content = (\n <>\n <PresenceFace person={person} live={state() === \"live\"} />\n {short(person)}\n <i\n class={person.activity === \"writing\" ? \"ti ti-pencil k2b-detail-presence__activity\" : \"ti ti-eye k2b-detail-presence__activity\"}\n data-activity={person.activity ?? \"reading\"}\n aria-hidden=\"true\"\n />\n </>\n );\n return (\n <Show\n when={person.onSelect && state() === \"live\"}\n fallback={\n <span class=\"k2b-detail-presence__chip\" style={{ \"--k2b-person-color\": color(person) }} title={describe(person)}>\n <span class=\"k2b-sr-only\">{describe(person)}</span>\n <span aria-hidden=\"true\" class=\"k2b-detail-presence__chip-content\">\n {content}\n </span>\n </span>\n }\n >\n <button\n type=\"button\"\n class=\"k2b-detail-presence__chip\"\n style={{ \"--k2b-person-color\": color(person) }}\n title={describe(person)}\n aria-label={t().jumpTo({ name: person.name, place: person.place ?? \"\" })}\n onClick={() => person.onSelect?.()}\n >\n <span aria-hidden=\"true\" class=\"k2b-detail-presence__chip-content\">\n {content}\n </span>\n </button>\n </Show>\n );\n };\n\n const count = () => ((state() === \"live\" || state() === \"offline\") && others().length > 0 ? others().length : undefined);\n const meta = () => (state() === \"live\" && others().length === 0 ? t().onlyYou : undefined);\n\n return (\n <DetailPanel.Section\n title={props.title ?? t().hereNow}\n icon=\"ti ti-users\"\n count={count()}\n meta={meta()}\n actions={props.actions}\n class={props.class}\n >\n <div class=\"k2b-detail-presence\" data-state={state()} aria-busy={state() === \"loading\" ? \"true\" : undefined}>\n <Show\n when={state() !== \"loading\" && state() !== \"unavailable\"}\n fallback={\n <Show\n when={state() === \"unavailable\"}\n fallback={\n <>\n <div class=\"k2b-detail-presence__strip\" aria-hidden=\"true\">\n <span class=\"k2b-detail-presence__skeleton\" />\n <span class=\"k2b-detail-presence__skeleton\" />\n <span class=\"k2b-detail-presence__skeleton\" />\n </div>\n <p class=\"k2b-detail-presence__where\">\n <span class=\"k2b-detail-presence__skeleton-line\" aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\" role=\"status\">\n {t().presenceLoading}\n </span>\n </p>\n </>\n }\n >\n <div class=\"k2b-detail-presence__strip k2b-detail-presence__problem\" role=\"status\">\n <i class=\"ti ti-alert-triangle\" aria-hidden=\"true\" />\n <span class=\"k2b-truncate-fade\">{t().presenceUnavailable}</span>\n <Show when={props.onRetry}>\n {(retry) => (\n <Button variant=\"text\" size=\"xs\" class=\"k2b-detail-presence__retry\" onClick={() => retry()()}>\n <i class=\"ti ti-refresh\" aria-hidden=\"true\" /> {t().retry}\n </Button>\n )}\n </Show>\n </div>\n <p class=\"k2b-detail-presence__where k2b-truncate-fade\">{props.note}</p>\n </Show>\n }\n >\n <div class=\"k2b-detail-presence__strip\">\n <div ref={watchChips} class=\"k2b-detail-presence__chips\">\n <For each={others()}>{(person) => chip(person)}</For>\n </div>\n <AvatarStack\n class=\"k2b-detail-presence__all\"\n people={listPeople()}\n title={props.title ?? t().hereNow}\n label={t().everyoneHere({ count: props.people.length })}\n hint={props.listHint}\n trigger={\n <>\n <span class=\"k2b-detail-presence__more\" data-empty={hidden() === 0 ? \"true\" : undefined}>\n +{hidden()}\n </span>\n <Show when={self()}>\n {(person) => (\n <span class=\"k2b-detail-presence__self\">\n <PresenceFace person={person()} live={false} />\n {t().you}\n </span>\n )}\n </Show>\n </>\n }\n />\n </div>\n <p class=\"k2b-detail-presence__where k2b-truncate-fade\">{where()}</p>\n </Show>\n </div>\n </DetailPanel.Section>\n );\n}\n\n/** A fixed slot at the end of a row for the people working there, such as an outline heading. Always the same width. */\nexport function DetailPresenceSlot(props: { people: readonly DetailPresencePerson[]; max?: number }): JSX.Element {\n const max = () => Math.max(1, props.max ?? 2);\n return (\n <span class=\"k2b-detail-presence-slot\" aria-hidden=\"true\">\n <For each={props.people.slice(0, max())}>\n {(person) => <Avatar name={person.name} src={person.src} icon={person.icon} shape={person.shape} size=\"xs\" alt=\"\" />}\n </For>\n <Show when={props.people.length > max()}>\n <span class=\"k2b-detail-presence-slot__more\">+{props.people.length - max()}</span>\n </Show>\n </span>\n );\n}\n\n// ── Access ──────────────────────────────────────────────────────────────\n\nexport type DetailAccessEntry = {\n id: string;\n name: string;\n /** Sets the avatar: a person's picture or initials, a group, a service, all signed-in people, or public. */\n kind?: \"person\" | \"group\" | \"service\" | \"everyone\" | \"public\";\n src?: string | null;\n /** One quiet word after the name, such as \"Service\". */\n detail?: JSX.Element;\n /** The role in words, such as \"Can edit\". */\n role: JSX.Element;\n /** The person viewing; listed as \"You\". */\n self?: boolean;\n};\n\nexport type DetailAccessProps = {\n entries: readonly DetailAccessEntry[];\n state?: \"ready\" | \"loading\" | \"error\";\n onRetry?: () => void;\n /** Rows before \"Show n more\". Defaults to 5. */\n limit?: number;\n /** A way to change access, only for people who may; others read the list. */\n manage?: { label: string; href?: string; onClick?: () => void };\n /** A quiet line below the list, such as \"Applies to the whole notebook\". */\n note?: JSX.Element;\n /** Defaults to \"Access\". */\n title?: string;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n class?: string;\n};\n\nconst ACCESS_ICONS: Record<NonNullable<DetailAccessEntry[\"kind\"]>, string | undefined> = {\n person: undefined,\n service: undefined,\n group: \"ti ti-users-group\",\n everyone: \"ti ti-users\",\n public: \"ti ti-world\",\n};\n\n/**\n * Who has access and with which role, read-only. Closed it names the first entries; open it lists `limit` rows and\n * \"Show n more\". A list that may load later passes `state=\"loading\"` and keeps its place.\n */\nexport function DetailAccess(props: DetailAccessProps): JSX.Element {\n const t = useDetailSectionMessages();\n const panel = useDetailPanelMessages();\n const [all, setAll] = createSignal(false);\n const limit = () => Math.max(1, props.limit ?? 5);\n const state = () => props.state ?? \"ready\";\n const shown = () => (all() ? props.entries : props.entries.slice(0, limit()));\n const hiddenCount = () => Math.max(0, props.entries.length - limit());\n const nameOf = (entry: DetailAccessEntry) => (entry.self ? t().you : entry.name);\n const summary = () => {\n if (state() === \"loading\") return t().accessLoading;\n if (state() === \"error\") return t().accessFailed;\n const names = props.entries.slice(0, 2).map(nameOf);\n return names.length ? t().accessSummary({ names: names.join(\", \"), more: Math.max(0, props.entries.length - 2) }) : undefined;\n };\n const leading = (entry: DetailAccessEntry) => {\n const kind = entry.kind ?? \"person\";\n return (\n <Avatar\n name={entry.name}\n src={kind === \"person\" ? entry.src : undefined}\n icon={ACCESS_ICONS[kind]}\n shape={kind === \"person\" ? \"circle\" : \"square\"}\n size=\"xs\"\n alt=\"\"\n />\n );\n };\n return (\n <DetailPanel.Section\n title={props.title ?? t().access}\n icon=\"ti ti-lock-access\"\n count={state() === \"ready\" ? props.entries.length : undefined}\n collapsible\n summary={summary()}\n defaultOpen={props.defaultOpen}\n open={props.open}\n onOpenChange={props.onOpenChange}\n class={props.class}\n >\n <div class=\"k2b-detail-section-rows\" aria-busy={state() === \"loading\" ? \"true\" : undefined}>\n <Show when={state() === \"loading\"}>\n <For each={[0, 1, 2]}>\n {() => (\n <DetailPanel.Row leading={<span class=\"k2b-detail-row-skeleton__face\" />} title={<span class=\"k2b-detail-row-skeleton\" />} />\n )}\n </For>\n <span class=\"k2b-sr-only\" role=\"status\">\n {t().accessLoading}\n </span>\n </Show>\n <Show when={state() === \"error\"}>\n <div class=\"k2b-detail-section-error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n <span>{t().accessFailed}</span>\n <Show when={props.onRetry}>\n {(retry) => (\n <Button variant=\"text\" size=\"xs\" onClick={() => retry()()}>\n {t().retry}\n </Button>\n )}\n </Show>\n </div>\n </Show>\n <Show when={state() === \"ready\"}>\n <For each={shown()}>\n {(entry) => <DetailPanel.Row leading={leading(entry)} title={nameOf(entry)} description={entry.detail} trailing={entry.role} />}\n </For>\n <Show when={hiddenCount() > 0}>\n <DetailPanel.Action\n type=\"button\"\n aria-expanded={all()}\n leading={<i class={all() ? \"ti ti-chevron-up\" : \"ti ti-chevron-down\"} aria-hidden=\"true\" />}\n title={all() ? panel().showLess : panel().showMore({ count: hiddenCount() })}\n onClick={() => setAll(!all())}\n />\n </Show>\n </Show>\n <Show when={props.manage}>\n {(manage) => (\n <Show\n when={manage().href}\n fallback={\n <DetailPanel.Action\n type=\"button\"\n leading={<i class=\"ti ti-settings\" aria-hidden=\"true\" />}\n title={manage().label}\n onClick={() => manage().onClick?.()}\n />\n }\n >\n {(href) => (\n <DetailPanel.Action href={href()} leading={<i class=\"ti ti-settings\" aria-hidden=\"true\" />} title={manage().label} />\n )}\n </Show>\n )}\n </Show>\n <Show when={props.note}>\n <p class=\"k2b-detail-section-note\">{props.note}</p>\n </Show>\n </div>\n </DetailPanel.Section>\n );\n}\n\n// ── Links ───────────────────────────────────────────────────────────────\n\nexport type DetailLinkItem = {\n id: string;\n title: string;\n href?: string;\n onClick?: (event: MouseEvent) => void;\n /** Defaults to a document. */\n icon?: string;\n /** Quiet text at the end, such as the other notebook's name. */\n trailing?: JSX.Element;\n};\n\nexport type DetailLinksProps = {\n /** What links here. */\n incoming: readonly DetailLinkItem[];\n /** What this object links to. */\n outgoing: readonly DetailLinkItem[];\n /** Rows per direction before \"Show n more\". Defaults to 5. */\n limit?: number;\n /** Defaults to \"Links\". */\n title?: string;\n defaultOpen?: boolean;\n class?: string;\n};\n\nconst LinkGroup = (props: { label: string; items: readonly DetailLinkItem[]; limit: number }): JSX.Element => {\n const panel = useDetailPanelMessages();\n const [all, setAll] = createSignal(false);\n const hiddenCount = () => Math.max(0, props.items.length - props.limit);\n return (\n <div class=\"k2b-detail-section-group\">\n <div class=\"k2b-detail-section-label\">{props.label}</div>\n <For each={all() ? props.items : props.items.slice(0, props.limit)}>\n {(item) => {\n const shared = {\n leading: <i class={item.icon ?? \"ti ti-file-text\"} aria-hidden=\"true\" />,\n title: item.title,\n trailing: item.trailing,\n };\n return (\n <Show when={item.href} fallback={<DetailPanel.Action type=\"button\" onClick={(event) => item.onClick?.(event)} {...shared} />}>\n {(href) => <DetailPanel.Action href={href()} onClick={(event: MouseEvent) => item.onClick?.(event)} {...shared} />}\n </Show>\n );\n }}\n </For>\n <Show when={hiddenCount() > 0}>\n <DetailPanel.Action\n type=\"button\"\n aria-expanded={all()}\n leading={<i class={all() ? \"ti ti-chevron-up\" : \"ti ti-chevron-down\"} aria-hidden=\"true\" />}\n title={all() ? panel().showLess : panel().showMore({ count: hiddenCount() })}\n onClick={() => setAll(!all())}\n />\n </Show>\n </div>\n );\n};\n\n/** \"Linked from\" and \"Links to\" in one section. Without links it is one row: the title and \"None yet\". */\nexport function DetailLinks(props: DetailLinksProps): JSX.Element {\n const t = useDetailSectionMessages();\n const limit = () => Math.max(1, props.limit ?? 5);\n const total = () => props.incoming.length + props.outgoing.length;\n const summary = () => {\n const names = (items: readonly DetailLinkItem[]) => ({\n names: listNames(\n items.slice(0, 2).map((item) => item.title),\n t().and,\n ),\n more: Math.max(0, items.length - 2),\n });\n return props.incoming.length ? t().linkedBySummary(names(props.incoming)) : t().linksToSummary(names(props.outgoing));\n };\n return (\n <Show\n when={total() > 0}\n fallback={<DetailPanel.Section title={props.title ?? t().links} icon=\"ti ti-arrows-exchange\" count={0} class={props.class} />}\n >\n <DetailPanel.Section\n title={props.title ?? t().links}\n icon=\"ti ti-arrows-exchange\"\n count={total()}\n collapsible\n defaultOpen={props.defaultOpen ?? true}\n summary={summary()}\n class={props.class}\n >\n <div class=\"k2b-detail-section-rows\">\n <Show when={props.incoming.length > 0}>\n <LinkGroup label={t().linkedBy({ count: props.incoming.length })} items={props.incoming} limit={limit()} />\n </Show>\n <Show when={props.outgoing.length > 0}>\n <LinkGroup label={t().linksTo({ count: props.outgoing.length })} items={props.outgoing} limit={limit()} />\n </Show>\n </div>\n </DetailPanel.Section>\n </Show>\n );\n}\n\n// ── Properties ──────────────────────────────────────────────────────────\n\nexport type DetailProperty = {\n id: string;\n label: JSX.Element;\n value: JSX.Element;\n /** An avatar or icon before the value. */\n leading?: JSX.Element;\n /** Makes the value a link, such as \"23 versions\" to the version history. */\n href?: string;\n};\n\nexport type DetailPropertiesProps = {\n items: readonly DetailProperty[];\n /** Defaults to \"Properties\". */\n title?: string;\n icon?: string;\n /** One line for the closed section, such as \"412 words · created 12 March by Jana Berger\". */\n summary?: JSX.Element;\n /** Open by default only when the properties are the object's main content. */\n defaultOpen?: boolean;\n class?: string;\n};\n\n/** Facts about the object as label and value rows, such as created, edited, size, and the way to its history. */\nexport function DetailProperties(props: DetailPropertiesProps): JSX.Element {\n const t = useDetailSectionMessages();\n return (\n <DetailPanel.Section\n title={props.title ?? t().properties}\n icon={props.icon ?? \"ti ti-info-square\"}\n collapsible\n defaultOpen={props.defaultOpen}\n summary={props.summary}\n class={props.class}\n >\n <dl class=\"k2b-detail-properties\">\n <For each={props.items}>\n {(item) => (\n <div class=\"k2b-detail-properties__item\">\n <dt>{item.label}</dt>\n <dd>\n <Show when={item.leading}>\n <span class=\"k2b-detail-properties__leading\">{item.leading}</span>\n </Show>\n <Show when={item.href} fallback={<span class=\"k2b-detail-properties__value\">{item.value}</span>}>\n {(href) => (\n <a class=\"k2b-detail-properties__value k2b-detail-properties__link\" href={href()}>\n {item.value}\n </a>\n )}\n </Show>\n </dd>\n </div>\n )}\n </For>\n </dl>\n </DetailPanel.Section>\n );\n}\n\n// ── Tags ────────────────────────────────────────────────────────────────\n\nexport type DetailTag = {\n id: string;\n label: string;\n /** Where the tag leads, such as everything with that tag. */\n href?: string;\n};\n\nexport type DetailTagsProps = {\n tags: readonly DetailTag[];\n /** Defaults to \"Tags\". */\n title?: string;\n /** Shown without tags, such as how to add one. */\n emptyHint?: JSX.Element;\n class?: string;\n};\n\n/** The object's tags as chips; a chip with `href` leads to everything with that tag. */\nexport function DetailTags(props: DetailTagsProps): JSX.Element {\n const t = useDetailSectionMessages();\n return (\n <DetailPanel.Section title={props.title ?? t().tags} icon=\"ti ti-hash\" count={props.tags.length} class={props.class}>\n <Show when={props.tags.length > 0} fallback={props.emptyHint ? <p class=\"k2b-detail-section-note\">{props.emptyHint}</p> : undefined}>\n <ul class=\"k2b-detail-tags\">\n <For each={props.tags}>\n {(tag) => (\n <li>\n <Show when={tag.href} fallback={<span class=\"k2b-detail-tag\">#{tag.label}</span>}>\n {(href) => (\n <a class=\"k2b-detail-tag\" href={href()}>\n #{tag.label}\n </a>\n )}\n </Show>\n </li>\n )}\n </For>\n </ul>\n </Show>\n </DetailPanel.Section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
2
|
+
import { mergeProps as _$mergeProps } from "solid-js/web";
|
|
3
|
+
import { ssr as _$ssr } from "solid-js/web";
|
|
4
|
+
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
5
|
+
import { escape as _$escape } from "solid-js/web";
|
|
6
|
+
import { memo as _$memo } from "solid-js/web";
|
|
7
|
+
var _tmpl$ = ["<i", " aria-hidden=\"true\"></i>"];
|
|
8
|
+
import { splitProps } from "solid-js";
|
|
9
|
+
import { IconButton } from "../actions/Button";
|
|
10
|
+
|
|
11
|
+
/** The one icon for "Details" in every app: a circle, so it never reads as the side panel's rectangle with an arrow. */
|
|
12
|
+
export const DETAILS_ICON = "ti ti-info-circle";
|
|
13
|
+
/**
|
|
14
|
+
* An icon-only Details button for an app's own toolbar or reader head. It shows the selection fill while its panel
|
|
15
|
+
* is open (`aria-expanded="true"`), without a border or shadow, like `AppWorkspace.Detail`'s own button.
|
|
16
|
+
*/
|
|
17
|
+
export function DetailsToggle(props) {
|
|
18
|
+
const [local, rest] = splitProps(props, ["class", "iconClass"]);
|
|
19
|
+
return _$createComponent(IconButton, _$mergeProps(rest, {
|
|
20
|
+
variant: "ghost",
|
|
21
|
+
get ["class"]() {
|
|
22
|
+
return _$memo(() => !!local.class)() ? `k2b-details-toggle ${local.class}` : "k2b-details-toggle";
|
|
23
|
+
},
|
|
24
|
+
get children() {
|
|
25
|
+
return _$ssr(_tmpl$, _$ssrAttribute("class", local.iconClass ? `${_$escape(DETAILS_ICON, true)} ${_$escape(local.iconClass, true)}` : _$escape(DETAILS_ICON, true), false));
|
|
26
|
+
}
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=DetailsToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["layout/DetailsToggle.tsx"],"sourcesContent":["import { type JSX, splitProps } from \"solid-js\";\nimport { IconButton, type IconButtonProps } from \"../actions/Button\";\n\n/** The one icon for \"Details\" in every app: a circle, so it never reads as the side panel's rectangle with an arrow. */\nexport const DETAILS_ICON = \"ti ti-info-circle\";\n\nexport type DetailsToggleProps = Omit<IconButtonProps, \"children\" | \"variant\"> & {\n /** Extra classes for the glyph, such as a text size in a dense toolbar. */\n iconClass?: string;\n};\n\n/**\n * An icon-only Details button for an app's own toolbar or reader head. It shows the selection fill while its panel\n * is open (`aria-expanded=\"true\"`), without a border or shadow, like `AppWorkspace.Detail`'s own button.\n */\nexport function DetailsToggle(props: DetailsToggleProps): JSX.Element {\n const [local, rest] = splitProps(props, [\"class\", \"iconClass\"]);\n return (\n <IconButton {...rest} variant=\"ghost\" class={local.class ? `k2b-details-toggle ${local.class}` : \"k2b-details-toggle\"}>\n <i class={local.iconClass ? `${DETAILS_ICON} ${local.iconClass}` : DETAILS_ICON} aria-hidden=\"true\" />\n </IconButton>\n );\n}\n"],"mappings":";;;;;;;AAAA,SAAmB,UAAU,QAAQ,UAAU;AAC/C,SAAS,UAAU,QAA8B,mBAAmB;;AAEpE;AACA,OAAO,MAAM,YAAY,GAAG,mBAAmB;AAO/C;AACA;AACA;AACA;AACA,OAAO,SAAS,aAAa,CAAC,KAAyB,EAAe;EACpE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;EAC/D,yBACG,UAAU,eAAK,IAAI;IAAE,OAAO;IAAA;MAAA,OAAgB,oBAAK,CAAC,KAAK,MAAG,sBAAsB,KAAK,CAAC,KAAK,EAAE,GAAG,oBAAoB;IAAA;IAAA;MAAA,6CACzG,KAAK,CAAC,SAAS,GAAG,YAAG,YAAY,oBAAI,KAAK,CAAC,SAAS,SAAE,YAAG,YAAY;IAAA;EAAA;AAGrF","ignoreList":[]}
|
|
@@ -46,6 +46,9 @@ const DiscussionRoot = props => {
|
|
|
46
46
|
get ["data-surface"]() {
|
|
47
47
|
return local.surface ?? "default";
|
|
48
48
|
},
|
|
49
|
+
get ["data-icon"]() {
|
|
50
|
+
return local.icon ? "true" : undefined;
|
|
51
|
+
},
|
|
49
52
|
"aria-labelledby": headingId
|
|
50
53
|
}), [_$ssr(_tmpl$3, _$escape(_$createComponent(Show, {
|
|
51
54
|
get when() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["layout/Discussion.tsx"],"sourcesContent":["import { children, createEffect, createSignal, createUniqueId, type JSX, onCleanup, onMount, Show, splitProps } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { useChatMessages } from \"../chat/chat-messages\";\nimport { MarkdownEditor } from \"../inputs/markdown/MarkdownEditor\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { DetailPanelCount } from \"./DetailPanel\";\nimport { useDetailPanelMessages } from \"./detail-panel-messages\";\n\nexport type DiscussionProps = Omit<JSX.HTMLAttributes<HTMLElement>, \"children\" | \"class\"> & {\n label: JSX.Element;\n children: JSX.Element;\n icon?: string | false;\n count?: number;\n actions?: JSX.Element;\n as?: \"h2\" | \"h3\";\n surface?: \"default\" | \"bare\";\n class?: string;\n};\n\nexport type DiscussionComposerProps = Omit<JSX.FormHTMLAttributes<HTMLFormElement>, \"children\" | \"class\" | \"onSubmit\"> & {\n label: string;\n onSubmit: (message: string) => boolean | void | Promise<boolean | void>;\n initialValue?: string;\n placeholder?: string;\n submitLabel?: string;\n cancelLabel?: string;\n onCancel?: () => void;\n lines?: number;\n class?: string;\n};\n\nexport type DiscussionListProps = {\n children?: JSX.Element;\n loading?: boolean;\n loadingLabel?: string;\n error?: string | null;\n onRetry?: () => void | Promise<void>;\n hasMore?: boolean;\n loadingMore?: boolean;\n loadMoreLabel?: string;\n onLoadMore?: () => boolean | void | Promise<boolean | void>;\n /**\n * Shows only the newest `fold` entries and a \"Show n older\" toggle above them. Expanded, the toggle reads \"Show less\"\n * and earlier pages load as usual. Omit it to show every loaded entry.\n */\n fold?: number;\n /** Controls the fold, for example to reveal an older entry; `onExpandedChange` requests a change. */\n expanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n class?: string;\n};\n\nexport type DiscussionItemProps = Omit<JSX.LiHTMLAttributes<HTMLLIElement>, \"children\" | \"class\"> & {\n author: JSX.Element;\n children: JSX.Element;\n avatar?: JSX.Element;\n timestamp?: JSX.Element;\n meta?: JSX.Element;\n replyContext?: JSX.Element;\n actions?: JSX.Element;\n actionVisibility?: \"always\" | \"progressive\";\n class?: string;\n};\n\ntype DiscussionComponent = ((props: DiscussionProps) => JSX.Element) & {\n Composer: (props: DiscussionComposerProps) => JSX.Element;\n List: (props: DiscussionListProps) => JSX.Element;\n Item: (props: DiscussionItemProps) => JSX.Element;\n};\n\nconst classNames = (base: string, extra?: string): string => (extra ? `${base} ${extra}` : base);\n\nconst DiscussionRoot = (props: DiscussionProps): JSX.Element => {\n const headingId = `k2b-discussion-${createUniqueId()}`;\n const [local, sectionProps] = splitProps(props, [\"label\", \"children\", \"icon\", \"count\", \"actions\", \"as\", \"surface\", \"class\"]);\n\n return (\n <section\n {...sectionProps}\n class={classNames(\"k2b-discussion\", local.class)}\n data-surface={local.surface ?? \"default\"}\n aria-labelledby={headingId}\n >\n <header class=\"k2b-discussion__header\">\n <Show when={local.icon !== false && local.icon}>\n {(icon) => (\n <span class=\"k2b-discussion__icon\" aria-hidden=\"true\">\n <i class={icon()} />\n </span>\n )}\n </Show>\n <Show when={local.as === \"h2\"} fallback={<h3 id={headingId}>{local.label}</h3>}>\n <h2 id={headingId}>{local.label}</h2>\n </Show>\n <Show when={local.count !== undefined}>\n <DetailPanelCount count={local.count ?? 0} />\n </Show>\n <Show when={local.actions !== undefined}>\n <div class=\"k2b-discussion__actions\">{local.actions}</div>\n </Show>\n </header>\n <div class=\"k2b-discussion__body\">{local.children}</div>\n </section>\n );\n};\n\nconst DiscussionComposer = (props: DiscussionComposerProps): JSX.Element => {\n const messages = useUiMessages();\n const chatMessages = useChatMessages();\n const [local, formProps] = splitProps(props, [\n \"label\",\n \"onSubmit\",\n \"initialValue\",\n \"placeholder\",\n \"submitLabel\",\n \"cancelLabel\",\n \"onCancel\",\n \"lines\",\n \"class\",\n ]);\n const [message, setMessage] = createSignal(local.initialValue ?? \"\");\n const [submitting, setSubmitting] = createSignal(false);\n const [submitError, setSubmitError] = createSignal<string | null>(null);\n\n const submit = async () => {\n const normalized = message().trim();\n if (!normalized || submitting()) return;\n setSubmitting(true);\n setSubmitError(null);\n try {\n const accepted = await local.onSubmit(normalized);\n if (accepted !== false) setMessage(\"\");\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : chatMessages().couldNotPostMessage);\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <form\n {...formProps}\n class={classNames(\"k2b-discussion__composer\", local.class)}\n onSubmit={(event) => {\n event.preventDefault();\n void submit();\n }}\n >\n <div class=\"k2b-discussion__composer-field\" data-has-inset-action=\"true\">\n <MarkdownEditor\n aria-label={local.label}\n value={message}\n onValueChange={(value) => {\n // The error belongs to the submitted text; any edit, including clearing it, makes it stale.\n if (value !== message()) setSubmitError(null);\n setMessage(value);\n }}\n placeholder={local.placeholder}\n lines={local.lines ?? 4}\n noToolbar\n showStats={false}\n disabled={submitting()}\n error={submitError() !== null}\n onSubmit={() => void submit()}\n />\n <div class=\"k2b-discussion__composer-inset-action\">\n <IconButton\n type=\"submit\"\n label={local.submitLabel ?? chatMessages().postMessage}\n size=\"sm\"\n variant=\"primary\"\n loading={submitting()}\n disabled={submitting() || !message().trim()}\n >\n <i class=\"ti ti-send\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n </div>\n <Show when={submitError()}>\n {(error) => (\n <p class=\"k2b-discussion__status\" role=\"alert\">\n {error()}\n </p>\n )}\n </Show>\n <Show when={local.onCancel}>\n {(onCancel) => (\n <footer>\n <Button type=\"button\" variant=\"ghost\" size=\"xs\" disabled={submitting()} onClick={onCancel()}>\n {local.cancelLabel ?? messages().cancel}\n </Button>\n </footer>\n )}\n </Show>\n </form>\n );\n};\n\nconst scrollOwner = (element: HTMLElement): HTMLElement | null => {\n let parent = element.parentElement;\n while (parent) {\n const style = getComputedStyle(parent);\n if (style.overflowY === \"auto\" || style.overflowY === \"scroll\" || style.overflow === \"auto\" || style.overflow === \"scroll\")\n return parent;\n parent = parent.parentElement;\n }\n return document.scrollingElement instanceof HTMLElement ? document.scrollingElement : null;\n};\n\nconst DiscussionList = (props: DiscussionListProps): JSX.Element => {\n const messages = useUiMessages();\n const chatMessages = useChatMessages();\n const foldMessages = useDetailPanelMessages();\n const [internalExpanded, setInternalExpanded] = createSignal(false);\n const expanded = () => props.expanded ?? internalExpanded();\n const setExpanded = (next: boolean) => {\n if (props.expanded === undefined) setInternalExpanded(next);\n props.onExpandedChange?.(next);\n };\n const resolved = children(() => props.children);\n const entries = () => resolved.toArray();\n const hidden = () => (props.fold !== undefined && !expanded() ? Math.max(0, entries().length - props.fold) : 0);\n const folded = () => props.fold !== undefined && entries().length > props.fold;\n const visible = () => (hidden() > 0 ? entries().slice(hidden()) : entries());\n const [loadingMoreInternally, setLoadingMoreInternally] = createSignal(false);\n const [loadMoreError, setLoadMoreError] = createSignal<string | null>(null);\n const [sentinelVisible, setSentinelVisible] = createSignal(false);\n const [automaticLoadAttempted, setAutomaticLoadAttempted] = createSignal(false);\n let listRef: HTMLOListElement | undefined;\n let sentinelRef: HTMLDivElement | undefined;\n let observer: IntersectionObserver | undefined;\n let adjustmentFrame: number | undefined;\n let active = true;\n\n const loadingMore = () => Boolean(props.loadingMore || loadingMoreInternally());\n const canLoadMore = () =>\n Boolean(!props.loading && !props.error && !loadMoreError() && hidden() === 0 && props.hasMore && props.onLoadMore && !loadingMore());\n\n const loadMore = async (retry = false): Promise<boolean> => {\n if (props.loading || props.error || (!retry && loadMoreError()) || hidden() > 0 || !props.onLoadMore || !props.hasMore || loadingMore())\n return false;\n const owner = listRef ? scrollOwner(listRef) : null;\n const previousScrollHeight = owner?.scrollHeight ?? 0;\n setLoadMoreError(null);\n setLoadingMoreInternally(true);\n let loaded = false;\n try {\n loaded = (await props.onLoadMore()) !== false;\n } catch (error) {\n if (active) setLoadMoreError(error instanceof Error ? error.message : chatMessages().couldNotLoadEarlierMessages);\n } finally {\n if (active) setLoadingMoreInternally(false);\n }\n if (!active || !loaded || !owner) return false;\n queueMicrotask(() => {\n if (!active) return;\n adjustmentFrame = requestAnimationFrame(() => {\n if (!active) return;\n owner.scrollTop += owner.scrollHeight - previousScrollHeight;\n });\n });\n return true;\n };\n\n createEffect(() => {\n if (!sentinelVisible()) {\n setAutomaticLoadAttempted(false);\n return;\n }\n if (automaticLoadAttempted() || !canLoadMore()) return;\n setAutomaticLoadAttempted(true);\n void loadMore();\n });\n\n onMount(() => {\n if (typeof IntersectionObserver === \"undefined\" || !sentinelRef) return;\n observer = new IntersectionObserver(\n (entries) => {\n setSentinelVisible(entries.some((entry) => entry.isIntersecting));\n },\n { rootMargin: \"160px 0px 0px\" },\n );\n observer.observe(sentinelRef);\n });\n\n onCleanup(() => {\n active = false;\n observer?.disconnect();\n if (adjustmentFrame !== undefined) cancelAnimationFrame(adjustmentFrame);\n });\n\n return (\n <div class={classNames(\"k2b-discussion__list-region\", props.class)} aria-busy={props.loading || loadingMore() ? \"true\" : undefined}>\n <div ref={sentinelRef} class=\"k2b-discussion__sentinel\" aria-hidden=\"true\" />\n <Show when={props.loading}>\n <p class=\"k2b-discussion__status\" role=\"status\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" /> {props.loadingLabel ?? chatMessages().loadingMessages}\n </p>\n </Show>\n <Show when={props.error}>\n {(error) => (\n <div class=\"k2b-discussion__status\" role=\"alert\">\n <span>{error()}</span>\n <Show when={props.onRetry}>\n <button type=\"button\" onClick={props.onRetry}>\n {messages().retry}\n </button>\n </Show>\n </div>\n )}\n </Show>\n <Show when={loadMoreError()}>\n {(error) => (\n <div class=\"k2b-discussion__status\" role=\"alert\">\n <span>{error()}</span>\n <button type=\"button\" onClick={() => void loadMore(true)}>\n {messages().retry}\n </button>\n </div>\n )}\n </Show>\n {/* The toggle stays above the entries in both states, so nothing above it moves. A failed refresh keeps it:\n the entries it folds are still there. */}\n <Show when={folded() && !props.loading}>\n <button type=\"button\" class=\"k2b-discussion__fold\" aria-expanded={hidden() === 0} onClick={() => setExpanded(hidden() > 0)}>\n <i class={`ti ${hidden() > 0 ? \"ti-chevron-down\" : \"ti-chevron-up\"}`} aria-hidden=\"true\" />\n {hidden() > 0 ? foldMessages().showOlder({ count: hidden() }) : foldMessages().showLess}\n </button>\n </Show>\n <Show when={!props.loading && !props.error && !loadMoreError() && (canLoadMore() || loadingMore())}>\n <button type=\"button\" class=\"k2b-discussion__load-more\" disabled={loadingMore()} onClick={() => void loadMore()}>\n <i class={`ti ${loadingMore() ? \"ti-loader-2 k2b-spin\" : \"ti-history\"}`} aria-hidden=\"true\" />\n {loadingMore() ? (props.loadingLabel ?? chatMessages().loadingMessages) : (props.loadMoreLabel ?? chatMessages().loadEarlier)}\n </button>\n </Show>\n <ol ref={listRef} class=\"k2b-discussion__list\">\n {visible()}\n </ol>\n </div>\n );\n};\n\nconst DiscussionItem = (props: DiscussionItemProps): JSX.Element => {\n const [local, itemProps] = splitProps(props, [\n \"author\",\n \"children\",\n \"avatar\",\n \"timestamp\",\n \"meta\",\n \"replyContext\",\n \"actions\",\n \"actionVisibility\",\n \"class\",\n ]);\n return (\n <li\n {...itemProps}\n class={classNames(\"k2b-discussion__item\", local.class)}\n data-has-avatar={local.avatar !== undefined ? \"true\" : undefined}\n >\n <Show when={local.avatar !== undefined}>\n <div class=\"k2b-discussion__avatar\">{local.avatar}</div>\n </Show>\n <div class=\"k2b-discussion__entry\">\n <header>\n <strong>{local.author}</strong>\n <Show when={local.meta !== undefined}>\n <span class=\"k2b-discussion__meta\">{local.meta}</span>\n </Show>\n {/* Times end on the panel's trailing edge; item actions sit just before them. */}\n <Show when={local.actions !== undefined}>\n <div class=\"k2b-discussion__item-actions\" data-visibility={local.actionVisibility ?? \"progressive\"}>\n {local.actions}\n </div>\n </Show>\n <Show when={local.timestamp !== undefined}>\n <span class=\"k2b-discussion__timestamp\">{local.timestamp}</span>\n </Show>\n </header>\n <Show when={local.replyContext !== undefined}>\n <div class=\"k2b-discussion__reply-context\">{local.replyContext}</div>\n </Show>\n <div class=\"k2b-discussion__content\">{local.children}</div>\n </div>\n </li>\n );\n};\n\nconst Discussion = DiscussionRoot as DiscussionComponent;\nDiscussion.Composer = DiscussionComposer;\nDiscussion.List = DiscussionList;\nDiscussion.Item = DiscussionItem;\n\nexport default Discussion;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["layout/Discussion.tsx"],"sourcesContent":["import { children, createEffect, createSignal, createUniqueId, type JSX, onCleanup, onMount, Show, splitProps } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { useChatMessages } from \"../chat/chat-messages\";\nimport { MarkdownEditor } from \"../inputs/markdown/MarkdownEditor\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { DetailPanelCount } from \"./DetailPanel\";\nimport { useDetailPanelMessages } from \"./detail-panel-messages\";\n\nexport type DiscussionProps = Omit<JSX.HTMLAttributes<HTMLElement>, \"children\" | \"class\"> & {\n label: JSX.Element;\n children: JSX.Element;\n icon?: string | false;\n count?: number;\n actions?: JSX.Element;\n as?: \"h2\" | \"h3\";\n surface?: \"default\" | \"bare\";\n class?: string;\n};\n\nexport type DiscussionComposerProps = Omit<JSX.FormHTMLAttributes<HTMLFormElement>, \"children\" | \"class\" | \"onSubmit\"> & {\n label: string;\n onSubmit: (message: string) => boolean | void | Promise<boolean | void>;\n initialValue?: string;\n placeholder?: string;\n submitLabel?: string;\n cancelLabel?: string;\n onCancel?: () => void;\n lines?: number;\n class?: string;\n};\n\nexport type DiscussionListProps = {\n children?: JSX.Element;\n loading?: boolean;\n loadingLabel?: string;\n error?: string | null;\n onRetry?: () => void | Promise<void>;\n hasMore?: boolean;\n loadingMore?: boolean;\n loadMoreLabel?: string;\n onLoadMore?: () => boolean | void | Promise<boolean | void>;\n /**\n * Shows only the newest `fold` entries and a \"Show n older\" toggle above them. Expanded, the toggle reads \"Show less\"\n * and earlier pages load as usual. Omit it to show every loaded entry.\n */\n fold?: number;\n /** Controls the fold, for example to reveal an older entry; `onExpandedChange` requests a change. */\n expanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n class?: string;\n};\n\nexport type DiscussionItemProps = Omit<JSX.LiHTMLAttributes<HTMLLIElement>, \"children\" | \"class\"> & {\n author: JSX.Element;\n children: JSX.Element;\n avatar?: JSX.Element;\n timestamp?: JSX.Element;\n meta?: JSX.Element;\n replyContext?: JSX.Element;\n actions?: JSX.Element;\n actionVisibility?: \"always\" | \"progressive\";\n class?: string;\n};\n\ntype DiscussionComponent = ((props: DiscussionProps) => JSX.Element) & {\n Composer: (props: DiscussionComposerProps) => JSX.Element;\n List: (props: DiscussionListProps) => JSX.Element;\n Item: (props: DiscussionItemProps) => JSX.Element;\n};\n\nconst classNames = (base: string, extra?: string): string => (extra ? `${base} ${extra}` : base);\n\nconst DiscussionRoot = (props: DiscussionProps): JSX.Element => {\n const headingId = `k2b-discussion-${createUniqueId()}`;\n const [local, sectionProps] = splitProps(props, [\"label\", \"children\", \"icon\", \"count\", \"actions\", \"as\", \"surface\", \"class\"]);\n\n return (\n <section\n {...sectionProps}\n class={classNames(\"k2b-discussion\", local.class)}\n data-surface={local.surface ?? \"default\"}\n data-icon={local.icon ? \"true\" : undefined}\n aria-labelledby={headingId}\n >\n <header class=\"k2b-discussion__header\">\n <Show when={local.icon !== false && local.icon}>\n {(icon) => (\n <span class=\"k2b-discussion__icon\" aria-hidden=\"true\">\n <i class={icon()} />\n </span>\n )}\n </Show>\n <Show when={local.as === \"h2\"} fallback={<h3 id={headingId}>{local.label}</h3>}>\n <h2 id={headingId}>{local.label}</h2>\n </Show>\n <Show when={local.count !== undefined}>\n <DetailPanelCount count={local.count ?? 0} />\n </Show>\n <Show when={local.actions !== undefined}>\n <div class=\"k2b-discussion__actions\">{local.actions}</div>\n </Show>\n </header>\n <div class=\"k2b-discussion__body\">{local.children}</div>\n </section>\n );\n};\n\nconst DiscussionComposer = (props: DiscussionComposerProps): JSX.Element => {\n const messages = useUiMessages();\n const chatMessages = useChatMessages();\n const [local, formProps] = splitProps(props, [\n \"label\",\n \"onSubmit\",\n \"initialValue\",\n \"placeholder\",\n \"submitLabel\",\n \"cancelLabel\",\n \"onCancel\",\n \"lines\",\n \"class\",\n ]);\n const [message, setMessage] = createSignal(local.initialValue ?? \"\");\n const [submitting, setSubmitting] = createSignal(false);\n const [submitError, setSubmitError] = createSignal<string | null>(null);\n\n const submit = async () => {\n const normalized = message().trim();\n if (!normalized || submitting()) return;\n setSubmitting(true);\n setSubmitError(null);\n try {\n const accepted = await local.onSubmit(normalized);\n if (accepted !== false) setMessage(\"\");\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : chatMessages().couldNotPostMessage);\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <form\n {...formProps}\n class={classNames(\"k2b-discussion__composer\", local.class)}\n onSubmit={(event) => {\n event.preventDefault();\n void submit();\n }}\n >\n <div class=\"k2b-discussion__composer-field\" data-has-inset-action=\"true\">\n <MarkdownEditor\n aria-label={local.label}\n value={message}\n onValueChange={(value) => {\n // The error belongs to the submitted text; any edit, including clearing it, makes it stale.\n if (value !== message()) setSubmitError(null);\n setMessage(value);\n }}\n placeholder={local.placeholder}\n lines={local.lines ?? 4}\n noToolbar\n showStats={false}\n disabled={submitting()}\n error={submitError() !== null}\n onSubmit={() => void submit()}\n />\n <div class=\"k2b-discussion__composer-inset-action\">\n <IconButton\n type=\"submit\"\n label={local.submitLabel ?? chatMessages().postMessage}\n size=\"sm\"\n variant=\"primary\"\n loading={submitting()}\n disabled={submitting() || !message().trim()}\n >\n <i class=\"ti ti-send\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n </div>\n <Show when={submitError()}>\n {(error) => (\n <p class=\"k2b-discussion__status\" role=\"alert\">\n {error()}\n </p>\n )}\n </Show>\n <Show when={local.onCancel}>\n {(onCancel) => (\n <footer>\n <Button type=\"button\" variant=\"ghost\" size=\"xs\" disabled={submitting()} onClick={onCancel()}>\n {local.cancelLabel ?? messages().cancel}\n </Button>\n </footer>\n )}\n </Show>\n </form>\n );\n};\n\nconst scrollOwner = (element: HTMLElement): HTMLElement | null => {\n let parent = element.parentElement;\n while (parent) {\n const style = getComputedStyle(parent);\n if (style.overflowY === \"auto\" || style.overflowY === \"scroll\" || style.overflow === \"auto\" || style.overflow === \"scroll\")\n return parent;\n parent = parent.parentElement;\n }\n return document.scrollingElement instanceof HTMLElement ? document.scrollingElement : null;\n};\n\nconst DiscussionList = (props: DiscussionListProps): JSX.Element => {\n const messages = useUiMessages();\n const chatMessages = useChatMessages();\n const foldMessages = useDetailPanelMessages();\n const [internalExpanded, setInternalExpanded] = createSignal(false);\n const expanded = () => props.expanded ?? internalExpanded();\n const setExpanded = (next: boolean) => {\n if (props.expanded === undefined) setInternalExpanded(next);\n props.onExpandedChange?.(next);\n };\n const resolved = children(() => props.children);\n const entries = () => resolved.toArray();\n const hidden = () => (props.fold !== undefined && !expanded() ? Math.max(0, entries().length - props.fold) : 0);\n const folded = () => props.fold !== undefined && entries().length > props.fold;\n const visible = () => (hidden() > 0 ? entries().slice(hidden()) : entries());\n const [loadingMoreInternally, setLoadingMoreInternally] = createSignal(false);\n const [loadMoreError, setLoadMoreError] = createSignal<string | null>(null);\n const [sentinelVisible, setSentinelVisible] = createSignal(false);\n const [automaticLoadAttempted, setAutomaticLoadAttempted] = createSignal(false);\n let listRef: HTMLOListElement | undefined;\n let sentinelRef: HTMLDivElement | undefined;\n let observer: IntersectionObserver | undefined;\n let adjustmentFrame: number | undefined;\n let active = true;\n\n const loadingMore = () => Boolean(props.loadingMore || loadingMoreInternally());\n const canLoadMore = () =>\n Boolean(!props.loading && !props.error && !loadMoreError() && hidden() === 0 && props.hasMore && props.onLoadMore && !loadingMore());\n\n const loadMore = async (retry = false): Promise<boolean> => {\n if (props.loading || props.error || (!retry && loadMoreError()) || hidden() > 0 || !props.onLoadMore || !props.hasMore || loadingMore())\n return false;\n const owner = listRef ? scrollOwner(listRef) : null;\n const previousScrollHeight = owner?.scrollHeight ?? 0;\n setLoadMoreError(null);\n setLoadingMoreInternally(true);\n let loaded = false;\n try {\n loaded = (await props.onLoadMore()) !== false;\n } catch (error) {\n if (active) setLoadMoreError(error instanceof Error ? error.message : chatMessages().couldNotLoadEarlierMessages);\n } finally {\n if (active) setLoadingMoreInternally(false);\n }\n if (!active || !loaded || !owner) return false;\n queueMicrotask(() => {\n if (!active) return;\n adjustmentFrame = requestAnimationFrame(() => {\n if (!active) return;\n owner.scrollTop += owner.scrollHeight - previousScrollHeight;\n });\n });\n return true;\n };\n\n createEffect(() => {\n if (!sentinelVisible()) {\n setAutomaticLoadAttempted(false);\n return;\n }\n if (automaticLoadAttempted() || !canLoadMore()) return;\n setAutomaticLoadAttempted(true);\n void loadMore();\n });\n\n onMount(() => {\n if (typeof IntersectionObserver === \"undefined\" || !sentinelRef) return;\n observer = new IntersectionObserver(\n (entries) => {\n setSentinelVisible(entries.some((entry) => entry.isIntersecting));\n },\n { rootMargin: \"160px 0px 0px\" },\n );\n observer.observe(sentinelRef);\n });\n\n onCleanup(() => {\n active = false;\n observer?.disconnect();\n if (adjustmentFrame !== undefined) cancelAnimationFrame(adjustmentFrame);\n });\n\n return (\n <div class={classNames(\"k2b-discussion__list-region\", props.class)} aria-busy={props.loading || loadingMore() ? \"true\" : undefined}>\n <div ref={sentinelRef} class=\"k2b-discussion__sentinel\" aria-hidden=\"true\" />\n <Show when={props.loading}>\n <p class=\"k2b-discussion__status\" role=\"status\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" /> {props.loadingLabel ?? chatMessages().loadingMessages}\n </p>\n </Show>\n <Show when={props.error}>\n {(error) => (\n <div class=\"k2b-discussion__status\" role=\"alert\">\n <span>{error()}</span>\n <Show when={props.onRetry}>\n <button type=\"button\" onClick={props.onRetry}>\n {messages().retry}\n </button>\n </Show>\n </div>\n )}\n </Show>\n <Show when={loadMoreError()}>\n {(error) => (\n <div class=\"k2b-discussion__status\" role=\"alert\">\n <span>{error()}</span>\n <button type=\"button\" onClick={() => void loadMore(true)}>\n {messages().retry}\n </button>\n </div>\n )}\n </Show>\n {/* The toggle stays above the entries in both states, so nothing above it moves. A failed refresh keeps it:\n the entries it folds are still there. */}\n <Show when={folded() && !props.loading}>\n <button type=\"button\" class=\"k2b-discussion__fold\" aria-expanded={hidden() === 0} onClick={() => setExpanded(hidden() > 0)}>\n <i class={`ti ${hidden() > 0 ? \"ti-chevron-down\" : \"ti-chevron-up\"}`} aria-hidden=\"true\" />\n {hidden() > 0 ? foldMessages().showOlder({ count: hidden() }) : foldMessages().showLess}\n </button>\n </Show>\n <Show when={!props.loading && !props.error && !loadMoreError() && (canLoadMore() || loadingMore())}>\n <button type=\"button\" class=\"k2b-discussion__load-more\" disabled={loadingMore()} onClick={() => void loadMore()}>\n <i class={`ti ${loadingMore() ? \"ti-loader-2 k2b-spin\" : \"ti-history\"}`} aria-hidden=\"true\" />\n {loadingMore() ? (props.loadingLabel ?? chatMessages().loadingMessages) : (props.loadMoreLabel ?? chatMessages().loadEarlier)}\n </button>\n </Show>\n <ol ref={listRef} class=\"k2b-discussion__list\">\n {visible()}\n </ol>\n </div>\n );\n};\n\nconst DiscussionItem = (props: DiscussionItemProps): JSX.Element => {\n const [local, itemProps] = splitProps(props, [\n \"author\",\n \"children\",\n \"avatar\",\n \"timestamp\",\n \"meta\",\n \"replyContext\",\n \"actions\",\n \"actionVisibility\",\n \"class\",\n ]);\n return (\n <li\n {...itemProps}\n class={classNames(\"k2b-discussion__item\", local.class)}\n data-has-avatar={local.avatar !== undefined ? \"true\" : undefined}\n >\n <Show when={local.avatar !== undefined}>\n <div class=\"k2b-discussion__avatar\">{local.avatar}</div>\n </Show>\n <div class=\"k2b-discussion__entry\">\n <header>\n <strong>{local.author}</strong>\n <Show when={local.meta !== undefined}>\n <span class=\"k2b-discussion__meta\">{local.meta}</span>\n </Show>\n {/* Times end on the panel's trailing edge; item actions sit just before them. */}\n <Show when={local.actions !== undefined}>\n <div class=\"k2b-discussion__item-actions\" data-visibility={local.actionVisibility ?? \"progressive\"}>\n {local.actions}\n </div>\n </Show>\n <Show when={local.timestamp !== undefined}>\n <span class=\"k2b-discussion__timestamp\">{local.timestamp}</span>\n </Show>\n </header>\n <Show when={local.replyContext !== undefined}>\n <div class=\"k2b-discussion__reply-context\">{local.replyContext}</div>\n </Show>\n <div class=\"k2b-discussion__content\">{local.children}</div>\n </div>\n </li>\n );\n};\n\nconst Discussion = DiscussionRoot as DiscussionComponent;\nDiscussion.Composer = DiscussionComposer;\nDiscussion.List = DiscussionList;\nDiscussion.Item = DiscussionItem;\n\nexport default Discussion;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -4,23 +4,31 @@ import { createComponent as _$createComponent } from "solid-js/web";
|
|
|
4
4
|
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
5
5
|
import { escape as _$escape } from "solid-js/web";
|
|
6
6
|
var _tmpl$ = ["<div", ">", "", "<main class=\"k2b-mobile-shell__main\">", "</main>", "</div>"],
|
|
7
|
-
_tmpl$2 =
|
|
8
|
-
_tmpl$3 = ["<span class=\"k2b-mobile-shell__title-
|
|
9
|
-
_tmpl$4 = ["<
|
|
10
|
-
_tmpl$5 = ["<
|
|
11
|
-
_tmpl$6 = "<
|
|
12
|
-
_tmpl$7 =
|
|
13
|
-
_tmpl$8 = ["<span class=\"k2b-
|
|
14
|
-
_tmpl$9 = ["<
|
|
15
|
-
_tmpl$0 = ["<
|
|
16
|
-
_tmpl$1 = ["<
|
|
17
|
-
_tmpl$10 = ["<
|
|
18
|
-
_tmpl$11 = ["<
|
|
19
|
-
_tmpl$12 = ["<
|
|
7
|
+
_tmpl$2 = "<style>:where(html *) { touch-action: pan-x pan-y; }</style>",
|
|
8
|
+
_tmpl$3 = ["<span class=\"k2b-mobile-shell__title-narrow\">", "</span>"],
|
|
9
|
+
_tmpl$4 = ["<span class=\"k2b-mobile-shell__title-wide\">", "</span>"],
|
|
10
|
+
_tmpl$5 = ["<div class=\"k2b-mobile-shell__actions\">", "</div>"],
|
|
11
|
+
_tmpl$6 = ["<header class=\"k2b-mobile-shell__header\">", "<h1 class=\"k2b-mobile-shell__title\">", "</h1>", "</header>"],
|
|
12
|
+
_tmpl$7 = "<i class=\"ti ti-chevron-left\" aria-hidden=\"true\"></i>",
|
|
13
|
+
_tmpl$8 = ["<a", "><i", " aria-hidden=\"true\"></i><span class=\"k2b-truncate-fade\">", "</span>", "</a>"],
|
|
14
|
+
_tmpl$9 = ["<span class=\"k2b-mobile-shell__sidebar-count\">", "</span>"],
|
|
15
|
+
_tmpl$0 = ["<ul>", "</ul>"],
|
|
16
|
+
_tmpl$1 = ["<li>", "</li>"],
|
|
17
|
+
_tmpl$10 = ["<div class=\"k2b-mobile-shell__sidebar-foot\">", "</div>"],
|
|
18
|
+
_tmpl$11 = ["<nav class=\"k2b-mobile-shell__sidebar\"", "><div class=\"k2b-mobile-shell__sidebar-head\">", "<span class=\"k2b-truncate-fade\">", "</span></div><div class=\"k2b-mobile-shell__sidebar-body\">", "", "</div>", "</nav>"],
|
|
19
|
+
_tmpl$12 = ["<img", " alt width=\"32\" height=\"32\">"],
|
|
20
|
+
_tmpl$13 = ["<section><h2>", "</h2>", "</section>"];
|
|
20
21
|
import { For, onCleanup, onMount, Show } from "solid-js";
|
|
21
22
|
import { IconButton, IconButtonLink } from "../actions/Button";
|
|
22
23
|
import ScrollArea from "./ScrollArea";
|
|
23
24
|
import { installScrollFades } from "./scroll-fade";
|
|
25
|
+
/**
|
|
26
|
+
* On the document element while a shell is the page: `"sidebar"` when it shows its sidebar, otherwise empty. A host
|
|
27
|
+
* that renders the shell on the server writes it into its `<html>` too, so the first paint already has it.
|
|
28
|
+
*/
|
|
29
|
+
const SHELL_ATTRIBUTE = "data-k2b-mobile-shell";
|
|
30
|
+
/** On the document element while a shell is mounted and a modal dialog is open. */
|
|
31
|
+
const MODAL_ATTRIBUTE = "data-k2b-mobile-shell-modal";
|
|
24
32
|
/** Read by the toast rail, which is portalled outside the shell, so it lives on the body. */
|
|
25
33
|
const FOOTER_HEIGHT = "--k2b-mobile-shell-footer-height";
|
|
26
34
|
/** How much of the scroll area a persistent toast covers; local to the shell. */
|
|
@@ -160,6 +168,11 @@ export function observeMobileShell(root) {
|
|
|
160
168
|
const body = main?.querySelector(":scope > .k2b-mobile-shell__body");
|
|
161
169
|
if (!main) return () => {};
|
|
162
170
|
const stopLinkTaps = observeLinkTaps(root);
|
|
171
|
+
// The document says that a shell is the page, for the controls and toasts portalled outside it. An attribute, not
|
|
172
|
+
// `html:has(.k2b-mobile-shell)`: a `:has()` on the document restyles the whole page on every change inside it.
|
|
173
|
+
const documentRoot = root.ownerDocument.documentElement;
|
|
174
|
+
const previousShell = documentRoot.getAttribute(SHELL_ATTRIBUTE);
|
|
175
|
+
documentRoot.setAttribute(SHELL_ATTRIBUTE, root.querySelector(":scope > .k2b-mobile-shell__sidebar") ? "sidebar" : "");
|
|
163
176
|
// Content with its own scroll areas keeps its own fades; the room a toast takes applies to the whole main area.
|
|
164
177
|
const stopScrollFades = body ? installScrollFades(body) : () => {};
|
|
165
178
|
let frame = 0;
|
|
@@ -181,6 +194,8 @@ export function observeMobileShell(root) {
|
|
|
181
194
|
const footer = Math.max(0, rootBottom - main.getBoundingClientRect().bottom, owned);
|
|
182
195
|
document.body.style.setProperty(FOOTER_HEIGHT, `${footer}px`);
|
|
183
196
|
root.style.setProperty(TOAST_INSET, `${persistentToastInset(body ?? main)}px`);
|
|
197
|
+
// A modal dialog takes the bottom edge back for its footer; the toast rules read this, not `html:has(dialog:modal)`.
|
|
198
|
+
documentRoot.toggleAttribute(MODAL_ATTRIBUTE, document.querySelector("dialog:modal") !== null);
|
|
184
199
|
};
|
|
185
200
|
const schedule = () => {
|
|
186
201
|
if (!frame) frame = requestAnimationFrame(measure);
|
|
@@ -206,6 +221,8 @@ export function observeMobileShell(root) {
|
|
|
206
221
|
mutations.disconnect();
|
|
207
222
|
document.removeEventListener("transitionend", schedule, true);
|
|
208
223
|
document.body.style.removeProperty(FOOTER_HEIGHT);
|
|
224
|
+
documentRoot.removeAttribute(MODAL_ATTRIBUTE);
|
|
225
|
+
if (previousShell === null) documentRoot.removeAttribute(SHELL_ATTRIBUTE);else documentRoot.setAttribute(SHELL_ATTRIBUTE, previousShell);
|
|
209
226
|
stopLinkTaps();
|
|
210
227
|
stopScrollFades();
|
|
211
228
|
};
|
|
@@ -213,7 +230,7 @@ export function observeMobileShell(root) {
|
|
|
213
230
|
function MobileShellRoot(props) {
|
|
214
231
|
let root;
|
|
215
232
|
onMount(() => onCleanup(observeMobileShell(root)));
|
|
216
|
-
return _$ssr(_tmpl$, _$ssrAttribute("class", props.class ? `k2b-mobile-shell ${_$escape(props.class, true)}` : "k2b-mobile-shell", false) + _$ssrAttribute("data-k2b-content-heads", props.scroll === false ? "" : _$escape(undefined, true), false), _$escape(props.sidebar), _$escape(props.header), _$escape(_$createComponent(Show, {
|
|
233
|
+
return [_$ssr(_tmpl$, _$ssrAttribute("class", props.class ? `k2b-mobile-shell ${_$escape(props.class, true)}` : "k2b-mobile-shell", false) + _$ssrAttribute("data-k2b-content-heads", props.scroll === false ? "" : _$escape(undefined, true), false), _$escape(props.sidebar), _$escape(props.header), _$escape(_$createComponent(Show, {
|
|
217
234
|
get when() {
|
|
218
235
|
return props.scroll !== false;
|
|
219
236
|
},
|
|
@@ -228,10 +245,10 @@ function MobileShellRoot(props) {
|
|
|
228
245
|
}
|
|
229
246
|
});
|
|
230
247
|
}
|
|
231
|
-
})), _$escape(props.footer));
|
|
248
|
+
})), _$escape(props.footer)), _$ssr(_tmpl$2)];
|
|
232
249
|
}
|
|
233
250
|
function MobileShellHeader(props) {
|
|
234
|
-
return _$ssr(_tmpl$
|
|
251
|
+
return _$ssr(_tmpl$6, _$escape(_$createComponent(Show, {
|
|
235
252
|
get when() {
|
|
236
253
|
return props.back;
|
|
237
254
|
},
|
|
@@ -251,7 +268,7 @@ function MobileShellHeader(props) {
|
|
|
251
268
|
tooltip: false,
|
|
252
269
|
onClick: () => back().onClick?.(),
|
|
253
270
|
get children() {
|
|
254
|
-
return _$ssr(_tmpl$
|
|
271
|
+
return _$ssr(_tmpl$7);
|
|
255
272
|
}
|
|
256
273
|
});
|
|
257
274
|
},
|
|
@@ -269,7 +286,7 @@ function MobileShellHeader(props) {
|
|
|
269
286
|
tooltip: false,
|
|
270
287
|
onClick: () => back().onClick?.(),
|
|
271
288
|
get children() {
|
|
272
|
-
return _$ssr(_tmpl$
|
|
289
|
+
return _$ssr(_tmpl$7);
|
|
273
290
|
}
|
|
274
291
|
})
|
|
275
292
|
})
|
|
@@ -281,23 +298,23 @@ function MobileShellHeader(props) {
|
|
|
281
298
|
return props.title;
|
|
282
299
|
},
|
|
283
300
|
get children() {
|
|
284
|
-
return [_$ssr(_tmpl$
|
|
301
|
+
return [_$ssr(_tmpl$3, _$escape(props.title)), _$ssr(_tmpl$4, _$escape(props.sidebarTitle))];
|
|
285
302
|
}
|
|
286
303
|
})), _$escape(_$createComponent(Show, {
|
|
287
304
|
get when() {
|
|
288
305
|
return props.actions;
|
|
289
306
|
},
|
|
290
307
|
get children() {
|
|
291
|
-
return _$ssr(_tmpl$
|
|
308
|
+
return _$ssr(_tmpl$5, _$escape(props.actions));
|
|
292
309
|
}
|
|
293
310
|
})));
|
|
294
311
|
}
|
|
295
312
|
function SidebarLink(props) {
|
|
296
|
-
return _$ssr(_tmpl$
|
|
313
|
+
return _$ssr(_tmpl$8, _$ssrAttribute("href", _$escape(props.item.href, true), false) + _$ssrAttribute("aria-current", props.item.current ? "page" : _$escape(undefined, true), false) + _$ssrAttribute("data-tab", _$escape(props.item.id, true), false) + _$ssrAttribute("data-k2b-title", _$escape(props.item.title ?? props.item.label, true), false), _$ssrAttribute("class", _$escape(props.item.icon, true), false), _$escape(props.item.label), _$escape(_$createComponent(Show, {
|
|
297
314
|
get when() {
|
|
298
315
|
return props.item.badge ?? props.item.count;
|
|
299
316
|
},
|
|
300
|
-
children: mark => _$ssr(_tmpl$
|
|
317
|
+
children: mark => _$ssr(_tmpl$9, _$escape(mark()))
|
|
301
318
|
})));
|
|
302
319
|
}
|
|
303
320
|
|
|
@@ -307,28 +324,28 @@ function SidebarLink(props) {
|
|
|
307
324
|
* as on a tab, and the row of a loading page pulses.
|
|
308
325
|
*/
|
|
309
326
|
function MobileShellSidebar(props) {
|
|
310
|
-
const list = items => _$ssr(_tmpl$
|
|
327
|
+
const list = items => _$ssr(_tmpl$0, _$escape(_$createComponent(For, {
|
|
311
328
|
each: items,
|
|
312
|
-
children: item => _$ssr(_tmpl$
|
|
329
|
+
children: item => _$ssr(_tmpl$1, _$escape(_$createComponent(SidebarLink, {
|
|
313
330
|
item: item
|
|
314
331
|
})))
|
|
315
332
|
})));
|
|
316
|
-
return _$ssr(_tmpl$
|
|
333
|
+
return _$ssr(_tmpl$11, _$ssrAttribute("aria-label", _$escape(props.label, true), false), _$escape(_$createComponent(Show, {
|
|
317
334
|
get when() {
|
|
318
335
|
return props.logo;
|
|
319
336
|
},
|
|
320
|
-
children: logo => _$ssr(_tmpl$
|
|
337
|
+
children: logo => _$ssr(_tmpl$12, _$ssrAttribute("src", _$escape(logo(), true), false))
|
|
321
338
|
})), _$escape(props.title), _$escape(list(props.items)), _$escape(_$createComponent(For, {
|
|
322
339
|
get each() {
|
|
323
340
|
return (props.sections ?? []).filter(section => section.items.length > 0);
|
|
324
341
|
},
|
|
325
|
-
children: section => _$ssr(_tmpl$
|
|
342
|
+
children: section => _$ssr(_tmpl$13, _$escape(section.title), _$escape(list(section.items)))
|
|
326
343
|
})), _$escape(_$createComponent(Show, {
|
|
327
344
|
get when() {
|
|
328
345
|
return props.footer?.length;
|
|
329
346
|
},
|
|
330
347
|
get children() {
|
|
331
|
-
return _$ssr(_tmpl$
|
|
348
|
+
return _$ssr(_tmpl$10, _$escape(list(props.footer ?? [])));
|
|
332
349
|
}
|
|
333
350
|
})));
|
|
334
351
|
}
|