@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,1019 @@
|
|
|
1
|
+
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { delegateEvents as _$delegateEvents } from "solid-js/web";
|
|
3
|
+
import { mergeProps as _$mergeProps } from "solid-js/web";
|
|
4
|
+
import { use as _$use } from "solid-js/web";
|
|
5
|
+
import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
|
|
6
|
+
import { className as _$className } from "solid-js/web";
|
|
7
|
+
import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
|
|
8
|
+
import { memo as _$memo } from "solid-js/web";
|
|
9
|
+
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
10
|
+
import { effect as _$effect } from "solid-js/web";
|
|
11
|
+
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
12
|
+
import { getNextMarker as _$getNextMarker } from "solid-js/web";
|
|
13
|
+
import { insert as _$insert } from "solid-js/web";
|
|
14
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
15
|
+
var _tmpl$ = /*#__PURE__*/_$template(`<span class=k2b-detail-presence__face><!$><!/><span class=k2b-detail-presence__dot aria-hidden=true>`),
|
|
16
|
+
_tmpl$2 = /*#__PURE__*/_$template(`<span class=k2b-detail-presence__swatch aria-hidden=true>`),
|
|
17
|
+
_tmpl$3 = /*#__PURE__*/_$template(`<strong>`),
|
|
18
|
+
_tmpl$4 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
|
|
19
|
+
_tmpl$5 = /*#__PURE__*/_$template(`<button type=button class=k2b-detail-presence__chip><span aria-hidden=true class=k2b-detail-presence__chip-content>`),
|
|
20
|
+
_tmpl$6 = /*#__PURE__*/_$template(`<span class=k2b-detail-presence__chip><span class=k2b-sr-only></span><span aria-hidden=true class=k2b-detail-presence__chip-content>`),
|
|
21
|
+
_tmpl$7 = /*#__PURE__*/_$template(`<div class=k2b-detail-presence__strip><div class=k2b-detail-presence__chips></div><!$><!/>`),
|
|
22
|
+
_tmpl$8 = /*#__PURE__*/_$template(`<p class="k2b-detail-presence__where k2b-truncate-fade">`),
|
|
23
|
+
_tmpl$9 = /*#__PURE__*/_$template(`<div class=k2b-detail-presence>`),
|
|
24
|
+
_tmpl$0 = /*#__PURE__*/_$template(`<div class="k2b-detail-presence__strip k2b-detail-presence__problem"role=status><i class="ti ti-alert-triangle"aria-hidden=true></i><span class=k2b-truncate-fade></span><!$><!/>`),
|
|
25
|
+
_tmpl$1 = /*#__PURE__*/_$template(`<div class=k2b-detail-presence__strip aria-hidden=true><span class=k2b-detail-presence__skeleton></span><span class=k2b-detail-presence__skeleton></span><span class=k2b-detail-presence__skeleton>`),
|
|
26
|
+
_tmpl$10 = /*#__PURE__*/_$template(`<p class=k2b-detail-presence__where><span class=k2b-detail-presence__skeleton-line aria-hidden=true></span><span class=k2b-sr-only role=status>`),
|
|
27
|
+
_tmpl$11 = /*#__PURE__*/_$template(`<i class="ti ti-refresh"aria-hidden=true>`),
|
|
28
|
+
_tmpl$12 = /*#__PURE__*/_$template(`<span class=k2b-detail-presence__more>+<!$><!/>`),
|
|
29
|
+
_tmpl$13 = /*#__PURE__*/_$template(`<span class=k2b-detail-presence__self><!$><!/><!$><!/>`),
|
|
30
|
+
_tmpl$14 = /*#__PURE__*/_$template(`<span class=k2b-detail-presence-slot__more>+<!$><!/>`),
|
|
31
|
+
_tmpl$15 = /*#__PURE__*/_$template(`<span class=k2b-detail-presence-slot aria-hidden=true><!$><!/><!$><!/>`),
|
|
32
|
+
_tmpl$16 = /*#__PURE__*/_$template(`<span class=k2b-sr-only role=status>`),
|
|
33
|
+
_tmpl$17 = /*#__PURE__*/_$template(`<div class=k2b-detail-section-error role=alert><i class="ti ti-alert-circle"aria-hidden=true></i><span></span><!$><!/>`),
|
|
34
|
+
_tmpl$18 = /*#__PURE__*/_$template(`<p class=k2b-detail-section-note>`),
|
|
35
|
+
_tmpl$19 = /*#__PURE__*/_$template(`<div class=k2b-detail-section-rows><!$><!/><!$><!/><!$><!/><!$><!/><!$><!/>`),
|
|
36
|
+
_tmpl$20 = /*#__PURE__*/_$template(`<span class=k2b-detail-row-skeleton__face>`),
|
|
37
|
+
_tmpl$21 = /*#__PURE__*/_$template(`<span class=k2b-detail-row-skeleton>`),
|
|
38
|
+
_tmpl$22 = /*#__PURE__*/_$template(`<i class="ti ti-settings"aria-hidden=true>`),
|
|
39
|
+
_tmpl$23 = /*#__PURE__*/_$template(`<div class=k2b-detail-section-group><div class=k2b-detail-section-label></div><!$><!/><!$><!/>`),
|
|
40
|
+
_tmpl$24 = /*#__PURE__*/_$template(`<div class=k2b-detail-section-rows><!$><!/><!$><!/>`),
|
|
41
|
+
_tmpl$25 = /*#__PURE__*/_$template(`<dl class=k2b-detail-properties>`),
|
|
42
|
+
_tmpl$26 = /*#__PURE__*/_$template(`<span class=k2b-detail-properties__leading>`),
|
|
43
|
+
_tmpl$27 = /*#__PURE__*/_$template(`<div class=k2b-detail-properties__item><dt></dt><dd><!$><!/><!$><!/>`),
|
|
44
|
+
_tmpl$28 = /*#__PURE__*/_$template(`<span class=k2b-detail-properties__value>`),
|
|
45
|
+
_tmpl$29 = /*#__PURE__*/_$template(`<a class="k2b-detail-properties__value k2b-detail-properties__link">`),
|
|
46
|
+
_tmpl$30 = /*#__PURE__*/_$template(`<ul class=k2b-detail-tags>`),
|
|
47
|
+
_tmpl$31 = /*#__PURE__*/_$template(`<li>`),
|
|
48
|
+
_tmpl$32 = /*#__PURE__*/_$template(`<span class=k2b-detail-tag>#<!$><!/>`),
|
|
49
|
+
_tmpl$33 = /*#__PURE__*/_$template(`<a class=k2b-detail-tag>#<!$><!/>`);
|
|
50
|
+
import { createMemo, createSignal, For, onCleanup, Show } from "solid-js";
|
|
51
|
+
import { Button } from "../actions/Button";
|
|
52
|
+
import { Avatar } from "../surfaces/Avatar";
|
|
53
|
+
import { AvatarStack } from "../surfaces/AvatarStack";
|
|
54
|
+
import { personColor } from "../surfaces/person-color";
|
|
55
|
+
import DetailPanel from "./DetailPanel";
|
|
56
|
+
import { useDetailPanelMessages } from "./detail-panel-messages";
|
|
57
|
+
import { useDetailSectionMessages } from "./detail-sections-messages";
|
|
58
|
+
|
|
59
|
+
/*
|
|
60
|
+
* Shared sections of an object's detail panel. Each one is a `DetailPanel.Section` with its icon, title, and count, so
|
|
61
|
+
* its content starts on the title's text edge, and each keeps its height while its data changes. Apps pass data; the
|
|
62
|
+
* order of sections is a convention (see the DetailPanel UI context).
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
const listNames = (names, and) => names.length <= 1 ? names[0] ?? "" : `${names.slice(0, -1).join(", ")} ${and} ${names.at(-1)}`;
|
|
66
|
+
|
|
67
|
+
// ── Presence ────────────────────────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
/** `offline` keeps the last known people, pale and without live dots; `unavailable` offers `onRetry`. */
|
|
70
|
+
|
|
71
|
+
const PresenceFace = props => (() => {
|
|
72
|
+
var _el$ = _$getNextElement(_tmpl$),
|
|
73
|
+
_el$3 = _el$.firstChild,
|
|
74
|
+
[_el$4, _co$] = _$getNextMarker(_el$3.nextSibling),
|
|
75
|
+
_el$2 = _el$4.nextSibling;
|
|
76
|
+
_$insert(_el$, _$createComponent(Avatar, {
|
|
77
|
+
get name() {
|
|
78
|
+
return props.person.name;
|
|
79
|
+
},
|
|
80
|
+
get src() {
|
|
81
|
+
return props.person.src;
|
|
82
|
+
},
|
|
83
|
+
get icon() {
|
|
84
|
+
return props.person.icon;
|
|
85
|
+
},
|
|
86
|
+
get shape() {
|
|
87
|
+
return props.person.shape;
|
|
88
|
+
},
|
|
89
|
+
size: "xs",
|
|
90
|
+
alt: ""
|
|
91
|
+
}), _el$4, _co$);
|
|
92
|
+
_$effect(() => _$setAttribute(_el$, "data-live", props.live ? "true" : undefined));
|
|
93
|
+
return _el$;
|
|
94
|
+
})();
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* "Here now": who has the object open, what they do, and where. Always two lines tall in every state, so people
|
|
98
|
+
* coming, going, or moving never shift the panel. Chips that do not fit wrap into a hidden line and count as "+n";
|
|
99
|
+
* "+n" and "You" open the full list, which `AvatarStack` shows beside it or as a sheet on phones.
|
|
100
|
+
*/
|
|
101
|
+
export function DetailPresence(props) {
|
|
102
|
+
const t = useDetailSectionMessages();
|
|
103
|
+
const state = () => props.state ?? "live";
|
|
104
|
+
const others = createMemo(() => props.people.filter(person => !person.self));
|
|
105
|
+
const self = createMemo(() => props.people.find(person => person.self));
|
|
106
|
+
const short = person => person.shortName ?? person.name;
|
|
107
|
+
const color = person => person.color ?? personColor(person.name);
|
|
108
|
+
const [hidden, setHidden] = createSignal(0);
|
|
109
|
+
let chips;
|
|
110
|
+
|
|
111
|
+
// Chips that do not fit wrap into the clipped second line; they leave the tab order and count as "+n".
|
|
112
|
+
const fit = () => {
|
|
113
|
+
if (!chips) return;
|
|
114
|
+
const all = Array.from(chips.children).filter(child => child instanceof HTMLElement);
|
|
115
|
+
const top = all[0]?.offsetTop ?? 0;
|
|
116
|
+
let wrapped = 0;
|
|
117
|
+
for (const chip of all) {
|
|
118
|
+
const out = chip.offsetTop > top;
|
|
119
|
+
chip.inert = out;
|
|
120
|
+
if (out) wrapped += 1;
|
|
121
|
+
}
|
|
122
|
+
setHidden(wrapped);
|
|
123
|
+
};
|
|
124
|
+
// The strip mounts again after loading or an outage, so each mounted strip watches itself.
|
|
125
|
+
const watchChips = element => {
|
|
126
|
+
chips = element;
|
|
127
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
128
|
+
const resized = new ResizeObserver(fit);
|
|
129
|
+
resized.observe(element);
|
|
130
|
+
const changed = new MutationObserver(fit);
|
|
131
|
+
changed.observe(element, {
|
|
132
|
+
childList: true
|
|
133
|
+
});
|
|
134
|
+
queueMicrotask(fit);
|
|
135
|
+
onCleanup(() => {
|
|
136
|
+
resized.disconnect();
|
|
137
|
+
changed.disconnect();
|
|
138
|
+
});
|
|
139
|
+
};
|
|
140
|
+
const describe = person => person.activity === "writing" ? t().personWriting({
|
|
141
|
+
name: person.name,
|
|
142
|
+
place: person.place ?? ""
|
|
143
|
+
}) : t().personReading({
|
|
144
|
+
name: person.name
|
|
145
|
+
});
|
|
146
|
+
const listPeople = createMemo(() => props.people.map(person => ({
|
|
147
|
+
id: person.id,
|
|
148
|
+
name: person.self ? t().you : person.name,
|
|
149
|
+
src: person.src,
|
|
150
|
+
icon: person.icon,
|
|
151
|
+
shape: person.shape,
|
|
152
|
+
self: person.self,
|
|
153
|
+
detailIcon: person.self ? undefined : person.activity === "writing" ? "ti ti-pencil" : "ti ti-eye",
|
|
154
|
+
detail: [person.self ? undefined : person.activity === "writing" ? t().writing : t().reading, person.place].filter(Boolean).join(" · "),
|
|
155
|
+
trailing: person.trailing,
|
|
156
|
+
onSelect: person.onSelect
|
|
157
|
+
})));
|
|
158
|
+
const where = () => {
|
|
159
|
+
if (state() === "offline" || others().length === 0) return props.note;
|
|
160
|
+
const writers = others().filter(person => person.activity === "writing");
|
|
161
|
+
const readers = others().filter(person => person.activity !== "writing");
|
|
162
|
+
return [_$createComponent(For, {
|
|
163
|
+
each: writers,
|
|
164
|
+
children: (person, index) => [_$memo(() => index() > 0 ? ", " : ""), (() => {
|
|
165
|
+
var _el$5 = _$getNextElement(_tmpl$2);
|
|
166
|
+
_$effect(_$p => _$setStyleProperty(_el$5, "--k2b-person-color", color(person)));
|
|
167
|
+
return _el$5;
|
|
168
|
+
})(), (() => {
|
|
169
|
+
var _el$6 = _$getNextElement(_tmpl$3);
|
|
170
|
+
_$insert(_el$6, () => short(person));
|
|
171
|
+
return _el$6;
|
|
172
|
+
})(), _$createComponent(Show, {
|
|
173
|
+
get when() {
|
|
174
|
+
return person.place;
|
|
175
|
+
},
|
|
176
|
+
children: place => [" ", _$memo(() => t().writesIn), " ", _$memo(place)]
|
|
177
|
+
})]
|
|
178
|
+
}), _$createComponent(Show, {
|
|
179
|
+
get when() {
|
|
180
|
+
return _$memo(() => writers.length > 0)() && readers.length > 0;
|
|
181
|
+
},
|
|
182
|
+
children: " · "
|
|
183
|
+
}), _$createComponent(Show, {
|
|
184
|
+
get when() {
|
|
185
|
+
return readers.length > 0;
|
|
186
|
+
},
|
|
187
|
+
get children() {
|
|
188
|
+
return t().readingAlong({
|
|
189
|
+
names: listNames(readers.map(short), t().and),
|
|
190
|
+
count: readers.length
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
})];
|
|
194
|
+
};
|
|
195
|
+
const chip = person => {
|
|
196
|
+
const content = [_$createComponent(PresenceFace, {
|
|
197
|
+
person: person,
|
|
198
|
+
get live() {
|
|
199
|
+
return state() === "live";
|
|
200
|
+
}
|
|
201
|
+
}), _$memo(() => short(person)), (() => {
|
|
202
|
+
var _el$7 = _$getNextElement(_tmpl$4);
|
|
203
|
+
_$effect(_p$ => {
|
|
204
|
+
var _v$ = person.activity === "writing" ? "ti ti-pencil k2b-detail-presence__activity" : "ti ti-eye k2b-detail-presence__activity",
|
|
205
|
+
_v$2 = person.activity ?? "reading";
|
|
206
|
+
_v$ !== _p$.e && _$className(_el$7, _p$.e = _v$);
|
|
207
|
+
_v$2 !== _p$.t && _$setAttribute(_el$7, "data-activity", _p$.t = _v$2);
|
|
208
|
+
return _p$;
|
|
209
|
+
}, {
|
|
210
|
+
e: undefined,
|
|
211
|
+
t: undefined
|
|
212
|
+
});
|
|
213
|
+
return _el$7;
|
|
214
|
+
})()];
|
|
215
|
+
return _$createComponent(Show, {
|
|
216
|
+
get when() {
|
|
217
|
+
return _$memo(() => !!person.onSelect)() && state() === "live";
|
|
218
|
+
},
|
|
219
|
+
get fallback() {
|
|
220
|
+
return (() => {
|
|
221
|
+
var _el$0 = _$getNextElement(_tmpl$6),
|
|
222
|
+
_el$1 = _el$0.firstChild,
|
|
223
|
+
_el$10 = _el$1.nextSibling;
|
|
224
|
+
_$insert(_el$1, () => describe(person));
|
|
225
|
+
_$insert(_el$10, content);
|
|
226
|
+
_$effect(_p$ => {
|
|
227
|
+
var _v$6 = color(person),
|
|
228
|
+
_v$7 = describe(person);
|
|
229
|
+
_v$6 !== _p$.e && _$setStyleProperty(_el$0, "--k2b-person-color", _p$.e = _v$6);
|
|
230
|
+
_v$7 !== _p$.t && _$setAttribute(_el$0, "title", _p$.t = _v$7);
|
|
231
|
+
return _p$;
|
|
232
|
+
}, {
|
|
233
|
+
e: undefined,
|
|
234
|
+
t: undefined
|
|
235
|
+
});
|
|
236
|
+
return _el$0;
|
|
237
|
+
})();
|
|
238
|
+
},
|
|
239
|
+
get children() {
|
|
240
|
+
var _el$8 = _$getNextElement(_tmpl$5),
|
|
241
|
+
_el$9 = _el$8.firstChild;
|
|
242
|
+
_el$8.$$click = () => person.onSelect?.();
|
|
243
|
+
_$insert(_el$9, content);
|
|
244
|
+
_$effect(_p$ => {
|
|
245
|
+
var _v$3 = color(person),
|
|
246
|
+
_v$4 = describe(person),
|
|
247
|
+
_v$5 = t().jumpTo({
|
|
248
|
+
name: person.name,
|
|
249
|
+
place: person.place ?? ""
|
|
250
|
+
});
|
|
251
|
+
_v$3 !== _p$.e && _$setStyleProperty(_el$8, "--k2b-person-color", _p$.e = _v$3);
|
|
252
|
+
_v$4 !== _p$.t && _$setAttribute(_el$8, "title", _p$.t = _v$4);
|
|
253
|
+
_v$5 !== _p$.a && _$setAttribute(_el$8, "aria-label", _p$.a = _v$5);
|
|
254
|
+
return _p$;
|
|
255
|
+
}, {
|
|
256
|
+
e: undefined,
|
|
257
|
+
t: undefined,
|
|
258
|
+
a: undefined
|
|
259
|
+
});
|
|
260
|
+
_$runHydrationEvents();
|
|
261
|
+
return _el$8;
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
};
|
|
265
|
+
const count = () => (state() === "live" || state() === "offline") && others().length > 0 ? others().length : undefined;
|
|
266
|
+
const meta = () => state() === "live" && others().length === 0 ? t().onlyYou : undefined;
|
|
267
|
+
return _$createComponent(DetailPanel.Section, {
|
|
268
|
+
get title() {
|
|
269
|
+
return props.title ?? t().hereNow;
|
|
270
|
+
},
|
|
271
|
+
icon: "ti ti-users",
|
|
272
|
+
get count() {
|
|
273
|
+
return count();
|
|
274
|
+
},
|
|
275
|
+
get meta() {
|
|
276
|
+
return meta();
|
|
277
|
+
},
|
|
278
|
+
get actions() {
|
|
279
|
+
return props.actions;
|
|
280
|
+
},
|
|
281
|
+
get ["class"]() {
|
|
282
|
+
return props.class;
|
|
283
|
+
},
|
|
284
|
+
get children() {
|
|
285
|
+
var _el$11 = _$getNextElement(_tmpl$9);
|
|
286
|
+
_$insert(_el$11, _$createComponent(Show, {
|
|
287
|
+
get when() {
|
|
288
|
+
return _$memo(() => state() !== "loading")() && state() !== "unavailable";
|
|
289
|
+
},
|
|
290
|
+
get fallback() {
|
|
291
|
+
return _$createComponent(Show, {
|
|
292
|
+
get when() {
|
|
293
|
+
return state() === "unavailable";
|
|
294
|
+
},
|
|
295
|
+
get fallback() {
|
|
296
|
+
return [_$getNextElement(_tmpl$1), (() => {
|
|
297
|
+
var _el$24 = _$getNextElement(_tmpl$10),
|
|
298
|
+
_el$25 = _el$24.firstChild,
|
|
299
|
+
_el$26 = _el$25.nextSibling;
|
|
300
|
+
_$insert(_el$26, () => t().presenceLoading);
|
|
301
|
+
return _el$24;
|
|
302
|
+
})()];
|
|
303
|
+
},
|
|
304
|
+
get children() {
|
|
305
|
+
return [(() => {
|
|
306
|
+
var _el$17 = _$getNextElement(_tmpl$0),
|
|
307
|
+
_el$18 = _el$17.firstChild,
|
|
308
|
+
_el$19 = _el$18.nextSibling,
|
|
309
|
+
_el$20 = _el$19.nextSibling,
|
|
310
|
+
[_el$21, _co$3] = _$getNextMarker(_el$20.nextSibling);
|
|
311
|
+
_$insert(_el$19, () => t().presenceUnavailable);
|
|
312
|
+
_$insert(_el$17, _$createComponent(Show, {
|
|
313
|
+
get when() {
|
|
314
|
+
return props.onRetry;
|
|
315
|
+
},
|
|
316
|
+
children: retry => _$createComponent(Button, {
|
|
317
|
+
variant: "text",
|
|
318
|
+
size: "xs",
|
|
319
|
+
"class": "k2b-detail-presence__retry",
|
|
320
|
+
onClick: () => retry()(),
|
|
321
|
+
get children() {
|
|
322
|
+
return [_$getNextElement(_tmpl$11), " ", _$memo(() => t().retry)];
|
|
323
|
+
}
|
|
324
|
+
})
|
|
325
|
+
}), _el$21, _co$3);
|
|
326
|
+
return _el$17;
|
|
327
|
+
})(), (() => {
|
|
328
|
+
var _el$22 = _$getNextElement(_tmpl$8);
|
|
329
|
+
_$insert(_el$22, () => props.note);
|
|
330
|
+
return _el$22;
|
|
331
|
+
})()];
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
},
|
|
335
|
+
get children() {
|
|
336
|
+
return [(() => {
|
|
337
|
+
var _el$12 = _$getNextElement(_tmpl$7),
|
|
338
|
+
_el$13 = _el$12.firstChild,
|
|
339
|
+
_el$14 = _el$13.nextSibling,
|
|
340
|
+
[_el$15, _co$2] = _$getNextMarker(_el$14.nextSibling);
|
|
341
|
+
_$use(watchChips, _el$13);
|
|
342
|
+
_$insert(_el$13, _$createComponent(For, {
|
|
343
|
+
get each() {
|
|
344
|
+
return others();
|
|
345
|
+
},
|
|
346
|
+
children: person => chip(person)
|
|
347
|
+
}));
|
|
348
|
+
_$insert(_el$12, _$createComponent(AvatarStack, {
|
|
349
|
+
"class": "k2b-detail-presence__all",
|
|
350
|
+
get people() {
|
|
351
|
+
return listPeople();
|
|
352
|
+
},
|
|
353
|
+
get title() {
|
|
354
|
+
return props.title ?? t().hereNow;
|
|
355
|
+
},
|
|
356
|
+
get label() {
|
|
357
|
+
return t().everyoneHere({
|
|
358
|
+
count: props.people.length
|
|
359
|
+
});
|
|
360
|
+
},
|
|
361
|
+
get hint() {
|
|
362
|
+
return props.listHint;
|
|
363
|
+
},
|
|
364
|
+
get trigger() {
|
|
365
|
+
return [(() => {
|
|
366
|
+
var _el$28 = _$getNextElement(_tmpl$12),
|
|
367
|
+
_el$29 = _el$28.firstChild,
|
|
368
|
+
_el$30 = _el$29.nextSibling,
|
|
369
|
+
[_el$31, _co$4] = _$getNextMarker(_el$30.nextSibling);
|
|
370
|
+
_$insert(_el$28, hidden, _el$31, _co$4);
|
|
371
|
+
_$effect(() => _$setAttribute(_el$28, "data-empty", hidden() === 0 ? "true" : undefined));
|
|
372
|
+
return _el$28;
|
|
373
|
+
})(), _$createComponent(Show, {
|
|
374
|
+
get when() {
|
|
375
|
+
return self();
|
|
376
|
+
},
|
|
377
|
+
children: person => (() => {
|
|
378
|
+
var _el$32 = _$getNextElement(_tmpl$13),
|
|
379
|
+
_el$33 = _el$32.firstChild,
|
|
380
|
+
[_el$34, _co$5] = _$getNextMarker(_el$33.nextSibling),
|
|
381
|
+
_el$35 = _el$34.nextSibling,
|
|
382
|
+
[_el$36, _co$6] = _$getNextMarker(_el$35.nextSibling);
|
|
383
|
+
_$insert(_el$32, _$createComponent(PresenceFace, {
|
|
384
|
+
get person() {
|
|
385
|
+
return person();
|
|
386
|
+
},
|
|
387
|
+
live: false
|
|
388
|
+
}), _el$34, _co$5);
|
|
389
|
+
_$insert(_el$32, () => t().you, _el$36, _co$6);
|
|
390
|
+
return _el$32;
|
|
391
|
+
})()
|
|
392
|
+
})];
|
|
393
|
+
}
|
|
394
|
+
}), _el$15, _co$2);
|
|
395
|
+
return _el$12;
|
|
396
|
+
})(), (() => {
|
|
397
|
+
var _el$16 = _$getNextElement(_tmpl$8);
|
|
398
|
+
_$insert(_el$16, where);
|
|
399
|
+
return _el$16;
|
|
400
|
+
})()];
|
|
401
|
+
}
|
|
402
|
+
}));
|
|
403
|
+
_$effect(_p$ => {
|
|
404
|
+
var _v$8 = state(),
|
|
405
|
+
_v$9 = state() === "loading" ? "true" : undefined;
|
|
406
|
+
_v$8 !== _p$.e && _$setAttribute(_el$11, "data-state", _p$.e = _v$8);
|
|
407
|
+
_v$9 !== _p$.t && _$setAttribute(_el$11, "aria-busy", _p$.t = _v$9);
|
|
408
|
+
return _p$;
|
|
409
|
+
}, {
|
|
410
|
+
e: undefined,
|
|
411
|
+
t: undefined
|
|
412
|
+
});
|
|
413
|
+
return _el$11;
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/** A fixed slot at the end of a row for the people working there, such as an outline heading. Always the same width. */
|
|
419
|
+
export function DetailPresenceSlot(props) {
|
|
420
|
+
const max = () => Math.max(1, props.max ?? 2);
|
|
421
|
+
return (() => {
|
|
422
|
+
var _el$37 = _$getNextElement(_tmpl$15),
|
|
423
|
+
_el$42 = _el$37.firstChild,
|
|
424
|
+
[_el$43, _co$8] = _$getNextMarker(_el$42.nextSibling),
|
|
425
|
+
_el$44 = _el$43.nextSibling,
|
|
426
|
+
[_el$45, _co$9] = _$getNextMarker(_el$44.nextSibling);
|
|
427
|
+
_$insert(_el$37, _$createComponent(For, {
|
|
428
|
+
get each() {
|
|
429
|
+
return props.people.slice(0, max());
|
|
430
|
+
},
|
|
431
|
+
children: person => _$createComponent(Avatar, {
|
|
432
|
+
get name() {
|
|
433
|
+
return person.name;
|
|
434
|
+
},
|
|
435
|
+
get src() {
|
|
436
|
+
return person.src;
|
|
437
|
+
},
|
|
438
|
+
get icon() {
|
|
439
|
+
return person.icon;
|
|
440
|
+
},
|
|
441
|
+
get shape() {
|
|
442
|
+
return person.shape;
|
|
443
|
+
},
|
|
444
|
+
size: "xs",
|
|
445
|
+
alt: ""
|
|
446
|
+
})
|
|
447
|
+
}), _el$43, _co$8);
|
|
448
|
+
_$insert(_el$37, _$createComponent(Show, {
|
|
449
|
+
get when() {
|
|
450
|
+
return props.people.length > max();
|
|
451
|
+
},
|
|
452
|
+
get children() {
|
|
453
|
+
var _el$38 = _$getNextElement(_tmpl$14),
|
|
454
|
+
_el$39 = _el$38.firstChild,
|
|
455
|
+
_el$40 = _el$39.nextSibling,
|
|
456
|
+
[_el$41, _co$7] = _$getNextMarker(_el$40.nextSibling);
|
|
457
|
+
_$insert(_el$38, () => props.people.length - max(), _el$41, _co$7);
|
|
458
|
+
return _el$38;
|
|
459
|
+
}
|
|
460
|
+
}), _el$45, _co$9);
|
|
461
|
+
return _el$37;
|
|
462
|
+
})();
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// ── Access ──────────────────────────────────────────────────────────────
|
|
466
|
+
|
|
467
|
+
const ACCESS_ICONS = {
|
|
468
|
+
person: undefined,
|
|
469
|
+
service: undefined,
|
|
470
|
+
group: "ti ti-users-group",
|
|
471
|
+
everyone: "ti ti-users",
|
|
472
|
+
public: "ti ti-world"
|
|
473
|
+
};
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* Who has access and with which role, read-only. Closed it names the first entries; open it lists `limit` rows and
|
|
477
|
+
* "Show n more". A list that may load later passes `state="loading"` and keeps its place.
|
|
478
|
+
*/
|
|
479
|
+
export function DetailAccess(props) {
|
|
480
|
+
const t = useDetailSectionMessages();
|
|
481
|
+
const panel = useDetailPanelMessages();
|
|
482
|
+
const [all, setAll] = createSignal(false);
|
|
483
|
+
const limit = () => Math.max(1, props.limit ?? 5);
|
|
484
|
+
const state = () => props.state ?? "ready";
|
|
485
|
+
const shown = () => all() ? props.entries : props.entries.slice(0, limit());
|
|
486
|
+
const hiddenCount = () => Math.max(0, props.entries.length - limit());
|
|
487
|
+
const nameOf = entry => entry.self ? t().you : entry.name;
|
|
488
|
+
const summary = () => {
|
|
489
|
+
if (state() === "loading") return t().accessLoading;
|
|
490
|
+
if (state() === "error") return t().accessFailed;
|
|
491
|
+
const names = props.entries.slice(0, 2).map(nameOf);
|
|
492
|
+
return names.length ? t().accessSummary({
|
|
493
|
+
names: names.join(", "),
|
|
494
|
+
more: Math.max(0, props.entries.length - 2)
|
|
495
|
+
}) : undefined;
|
|
496
|
+
};
|
|
497
|
+
const leading = entry => {
|
|
498
|
+
const kind = entry.kind ?? "person";
|
|
499
|
+
return _$createComponent(Avatar, {
|
|
500
|
+
get name() {
|
|
501
|
+
return entry.name;
|
|
502
|
+
},
|
|
503
|
+
get src() {
|
|
504
|
+
return kind === "person" ? entry.src : undefined;
|
|
505
|
+
},
|
|
506
|
+
get icon() {
|
|
507
|
+
return ACCESS_ICONS[kind];
|
|
508
|
+
},
|
|
509
|
+
shape: kind === "person" ? "circle" : "square",
|
|
510
|
+
size: "xs",
|
|
511
|
+
alt: ""
|
|
512
|
+
});
|
|
513
|
+
};
|
|
514
|
+
return _$createComponent(DetailPanel.Section, {
|
|
515
|
+
get title() {
|
|
516
|
+
return props.title ?? t().access;
|
|
517
|
+
},
|
|
518
|
+
icon: "ti ti-lock-access",
|
|
519
|
+
get count() {
|
|
520
|
+
return _$memo(() => state() === "ready")() ? props.entries.length : undefined;
|
|
521
|
+
},
|
|
522
|
+
collapsible: true,
|
|
523
|
+
get summary() {
|
|
524
|
+
return summary();
|
|
525
|
+
},
|
|
526
|
+
get defaultOpen() {
|
|
527
|
+
return props.defaultOpen;
|
|
528
|
+
},
|
|
529
|
+
get open() {
|
|
530
|
+
return props.open;
|
|
531
|
+
},
|
|
532
|
+
get onOpenChange() {
|
|
533
|
+
return props.onOpenChange;
|
|
534
|
+
},
|
|
535
|
+
get ["class"]() {
|
|
536
|
+
return props.class;
|
|
537
|
+
},
|
|
538
|
+
get children() {
|
|
539
|
+
var _el$46 = _$getNextElement(_tmpl$19),
|
|
540
|
+
_el$54 = _el$46.firstChild,
|
|
541
|
+
[_el$55, _co$1] = _$getNextMarker(_el$54.nextSibling),
|
|
542
|
+
_el$56 = _el$55.nextSibling,
|
|
543
|
+
[_el$57, _co$10] = _$getNextMarker(_el$56.nextSibling),
|
|
544
|
+
_el$58 = _el$57.nextSibling,
|
|
545
|
+
[_el$59, _co$11] = _$getNextMarker(_el$58.nextSibling),
|
|
546
|
+
_el$60 = _el$59.nextSibling,
|
|
547
|
+
[_el$61, _co$12] = _$getNextMarker(_el$60.nextSibling),
|
|
548
|
+
_el$62 = _el$61.nextSibling,
|
|
549
|
+
[_el$63, _co$13] = _$getNextMarker(_el$62.nextSibling);
|
|
550
|
+
_$insert(_el$46, _$createComponent(Show, {
|
|
551
|
+
get when() {
|
|
552
|
+
return state() === "loading";
|
|
553
|
+
},
|
|
554
|
+
get children() {
|
|
555
|
+
return [_$createComponent(For, {
|
|
556
|
+
each: [0, 1, 2],
|
|
557
|
+
children: () => _$createComponent(DetailPanel.Row, {
|
|
558
|
+
get leading() {
|
|
559
|
+
return _$getNextElement(_tmpl$20);
|
|
560
|
+
},
|
|
561
|
+
get title() {
|
|
562
|
+
return _$getNextElement(_tmpl$21);
|
|
563
|
+
}
|
|
564
|
+
})
|
|
565
|
+
}), (() => {
|
|
566
|
+
var _el$47 = _$getNextElement(_tmpl$16);
|
|
567
|
+
_$insert(_el$47, () => t().accessLoading);
|
|
568
|
+
return _el$47;
|
|
569
|
+
})()];
|
|
570
|
+
}
|
|
571
|
+
}), _el$55, _co$1);
|
|
572
|
+
_$insert(_el$46, _$createComponent(Show, {
|
|
573
|
+
get when() {
|
|
574
|
+
return state() === "error";
|
|
575
|
+
},
|
|
576
|
+
get children() {
|
|
577
|
+
var _el$48 = _$getNextElement(_tmpl$17),
|
|
578
|
+
_el$49 = _el$48.firstChild,
|
|
579
|
+
_el$50 = _el$49.nextSibling,
|
|
580
|
+
_el$51 = _el$50.nextSibling,
|
|
581
|
+
[_el$52, _co$0] = _$getNextMarker(_el$51.nextSibling);
|
|
582
|
+
_$insert(_el$50, () => t().accessFailed);
|
|
583
|
+
_$insert(_el$48, _$createComponent(Show, {
|
|
584
|
+
get when() {
|
|
585
|
+
return props.onRetry;
|
|
586
|
+
},
|
|
587
|
+
children: retry => _$createComponent(Button, {
|
|
588
|
+
variant: "text",
|
|
589
|
+
size: "xs",
|
|
590
|
+
onClick: () => retry()(),
|
|
591
|
+
get children() {
|
|
592
|
+
return t().retry;
|
|
593
|
+
}
|
|
594
|
+
})
|
|
595
|
+
}), _el$52, _co$0);
|
|
596
|
+
return _el$48;
|
|
597
|
+
}
|
|
598
|
+
}), _el$57, _co$10);
|
|
599
|
+
_$insert(_el$46, _$createComponent(Show, {
|
|
600
|
+
get when() {
|
|
601
|
+
return state() === "ready";
|
|
602
|
+
},
|
|
603
|
+
get children() {
|
|
604
|
+
return [_$createComponent(For, {
|
|
605
|
+
get each() {
|
|
606
|
+
return shown();
|
|
607
|
+
},
|
|
608
|
+
children: entry => _$createComponent(DetailPanel.Row, {
|
|
609
|
+
get leading() {
|
|
610
|
+
return leading(entry);
|
|
611
|
+
},
|
|
612
|
+
get title() {
|
|
613
|
+
return nameOf(entry);
|
|
614
|
+
},
|
|
615
|
+
get description() {
|
|
616
|
+
return entry.detail;
|
|
617
|
+
},
|
|
618
|
+
get trailing() {
|
|
619
|
+
return entry.role;
|
|
620
|
+
}
|
|
621
|
+
})
|
|
622
|
+
}), _$createComponent(Show, {
|
|
623
|
+
get when() {
|
|
624
|
+
return hiddenCount() > 0;
|
|
625
|
+
},
|
|
626
|
+
get children() {
|
|
627
|
+
return _$createComponent(DetailPanel.Action, {
|
|
628
|
+
type: "button",
|
|
629
|
+
get ["aria-expanded"]() {
|
|
630
|
+
return all();
|
|
631
|
+
},
|
|
632
|
+
get leading() {
|
|
633
|
+
return (() => {
|
|
634
|
+
var _el$66 = _$getNextElement(_tmpl$4);
|
|
635
|
+
_$effect(() => _$className(_el$66, all() ? "ti ti-chevron-up" : "ti ti-chevron-down"));
|
|
636
|
+
return _el$66;
|
|
637
|
+
})();
|
|
638
|
+
},
|
|
639
|
+
get title() {
|
|
640
|
+
return _$memo(() => !!all())() ? panel().showLess : panel().showMore({
|
|
641
|
+
count: hiddenCount()
|
|
642
|
+
});
|
|
643
|
+
},
|
|
644
|
+
onClick: () => setAll(!all())
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
})];
|
|
648
|
+
}
|
|
649
|
+
}), _el$59, _co$11);
|
|
650
|
+
_$insert(_el$46, _$createComponent(Show, {
|
|
651
|
+
get when() {
|
|
652
|
+
return props.manage;
|
|
653
|
+
},
|
|
654
|
+
children: manage => _$createComponent(Show, {
|
|
655
|
+
get when() {
|
|
656
|
+
return manage().href;
|
|
657
|
+
},
|
|
658
|
+
get fallback() {
|
|
659
|
+
return _$createComponent(DetailPanel.Action, {
|
|
660
|
+
type: "button",
|
|
661
|
+
get leading() {
|
|
662
|
+
return _$getNextElement(_tmpl$22);
|
|
663
|
+
},
|
|
664
|
+
get title() {
|
|
665
|
+
return manage().label;
|
|
666
|
+
},
|
|
667
|
+
onClick: () => manage().onClick?.()
|
|
668
|
+
});
|
|
669
|
+
},
|
|
670
|
+
children: href => _$createComponent(DetailPanel.Action, {
|
|
671
|
+
get href() {
|
|
672
|
+
return href();
|
|
673
|
+
},
|
|
674
|
+
get leading() {
|
|
675
|
+
return _$getNextElement(_tmpl$22);
|
|
676
|
+
},
|
|
677
|
+
get title() {
|
|
678
|
+
return manage().label;
|
|
679
|
+
}
|
|
680
|
+
})
|
|
681
|
+
})
|
|
682
|
+
}), _el$61, _co$12);
|
|
683
|
+
_$insert(_el$46, _$createComponent(Show, {
|
|
684
|
+
get when() {
|
|
685
|
+
return props.note;
|
|
686
|
+
},
|
|
687
|
+
get children() {
|
|
688
|
+
var _el$53 = _$getNextElement(_tmpl$18);
|
|
689
|
+
_$insert(_el$53, () => props.note);
|
|
690
|
+
return _el$53;
|
|
691
|
+
}
|
|
692
|
+
}), _el$63, _co$13);
|
|
693
|
+
_$effect(() => _$setAttribute(_el$46, "aria-busy", state() === "loading" ? "true" : undefined));
|
|
694
|
+
return _el$46;
|
|
695
|
+
}
|
|
696
|
+
});
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// ── Links ───────────────────────────────────────────────────────────────
|
|
700
|
+
|
|
701
|
+
const LinkGroup = props => {
|
|
702
|
+
const panel = useDetailPanelMessages();
|
|
703
|
+
const [all, setAll] = createSignal(false);
|
|
704
|
+
const hiddenCount = () => Math.max(0, props.items.length - props.limit);
|
|
705
|
+
return (() => {
|
|
706
|
+
var _el$69 = _$getNextElement(_tmpl$23),
|
|
707
|
+
_el$70 = _el$69.firstChild,
|
|
708
|
+
_el$71 = _el$70.nextSibling,
|
|
709
|
+
[_el$72, _co$14] = _$getNextMarker(_el$71.nextSibling),
|
|
710
|
+
_el$73 = _el$72.nextSibling,
|
|
711
|
+
[_el$74, _co$15] = _$getNextMarker(_el$73.nextSibling);
|
|
712
|
+
_$insert(_el$70, () => props.label);
|
|
713
|
+
_$insert(_el$69, _$createComponent(For, {
|
|
714
|
+
get each() {
|
|
715
|
+
return _$memo(() => !!all())() ? props.items : props.items.slice(0, props.limit);
|
|
716
|
+
},
|
|
717
|
+
children: item => {
|
|
718
|
+
const shared = {
|
|
719
|
+
leading: (() => {
|
|
720
|
+
var _el$75 = _$getNextElement(_tmpl$4);
|
|
721
|
+
_$effect(() => _$className(_el$75, item.icon ?? "ti ti-file-text"));
|
|
722
|
+
return _el$75;
|
|
723
|
+
})(),
|
|
724
|
+
title: item.title,
|
|
725
|
+
trailing: item.trailing
|
|
726
|
+
};
|
|
727
|
+
return _$createComponent(Show, {
|
|
728
|
+
get when() {
|
|
729
|
+
return item.href;
|
|
730
|
+
},
|
|
731
|
+
get fallback() {
|
|
732
|
+
return _$createComponent(DetailPanel.Action, _$mergeProps({
|
|
733
|
+
type: "button",
|
|
734
|
+
onClick: event => item.onClick?.(event)
|
|
735
|
+
}, shared));
|
|
736
|
+
},
|
|
737
|
+
children: href => _$createComponent(DetailPanel.Action, _$mergeProps({
|
|
738
|
+
get href() {
|
|
739
|
+
return href();
|
|
740
|
+
},
|
|
741
|
+
onClick: event => item.onClick?.(event)
|
|
742
|
+
}, shared))
|
|
743
|
+
});
|
|
744
|
+
}
|
|
745
|
+
}), _el$72, _co$14);
|
|
746
|
+
_$insert(_el$69, _$createComponent(Show, {
|
|
747
|
+
get when() {
|
|
748
|
+
return hiddenCount() > 0;
|
|
749
|
+
},
|
|
750
|
+
get children() {
|
|
751
|
+
return _$createComponent(DetailPanel.Action, {
|
|
752
|
+
type: "button",
|
|
753
|
+
get ["aria-expanded"]() {
|
|
754
|
+
return all();
|
|
755
|
+
},
|
|
756
|
+
get leading() {
|
|
757
|
+
return (() => {
|
|
758
|
+
var _el$76 = _$getNextElement(_tmpl$4);
|
|
759
|
+
_$effect(() => _$className(_el$76, all() ? "ti ti-chevron-up" : "ti ti-chevron-down"));
|
|
760
|
+
return _el$76;
|
|
761
|
+
})();
|
|
762
|
+
},
|
|
763
|
+
get title() {
|
|
764
|
+
return _$memo(() => !!all())() ? panel().showLess : panel().showMore({
|
|
765
|
+
count: hiddenCount()
|
|
766
|
+
});
|
|
767
|
+
},
|
|
768
|
+
onClick: () => setAll(!all())
|
|
769
|
+
});
|
|
770
|
+
}
|
|
771
|
+
}), _el$74, _co$15);
|
|
772
|
+
return _el$69;
|
|
773
|
+
})();
|
|
774
|
+
};
|
|
775
|
+
|
|
776
|
+
/** "Linked from" and "Links to" in one section. Without links it is one row: the title and "None yet". */
|
|
777
|
+
export function DetailLinks(props) {
|
|
778
|
+
const t = useDetailSectionMessages();
|
|
779
|
+
const limit = () => Math.max(1, props.limit ?? 5);
|
|
780
|
+
const total = () => props.incoming.length + props.outgoing.length;
|
|
781
|
+
const summary = () => {
|
|
782
|
+
const names = items => ({
|
|
783
|
+
names: listNames(items.slice(0, 2).map(item => item.title), t().and),
|
|
784
|
+
more: Math.max(0, items.length - 2)
|
|
785
|
+
});
|
|
786
|
+
return props.incoming.length ? t().linkedBySummary(names(props.incoming)) : t().linksToSummary(names(props.outgoing));
|
|
787
|
+
};
|
|
788
|
+
return _$createComponent(Show, {
|
|
789
|
+
get when() {
|
|
790
|
+
return total() > 0;
|
|
791
|
+
},
|
|
792
|
+
get fallback() {
|
|
793
|
+
return _$createComponent(DetailPanel.Section, {
|
|
794
|
+
get title() {
|
|
795
|
+
return props.title ?? t().links;
|
|
796
|
+
},
|
|
797
|
+
icon: "ti ti-arrows-exchange",
|
|
798
|
+
count: 0,
|
|
799
|
+
get ["class"]() {
|
|
800
|
+
return props.class;
|
|
801
|
+
}
|
|
802
|
+
});
|
|
803
|
+
},
|
|
804
|
+
get children() {
|
|
805
|
+
return _$createComponent(DetailPanel.Section, {
|
|
806
|
+
get title() {
|
|
807
|
+
return props.title ?? t().links;
|
|
808
|
+
},
|
|
809
|
+
icon: "ti ti-arrows-exchange",
|
|
810
|
+
get count() {
|
|
811
|
+
return total();
|
|
812
|
+
},
|
|
813
|
+
collapsible: true,
|
|
814
|
+
get defaultOpen() {
|
|
815
|
+
return props.defaultOpen ?? true;
|
|
816
|
+
},
|
|
817
|
+
get summary() {
|
|
818
|
+
return summary();
|
|
819
|
+
},
|
|
820
|
+
get ["class"]() {
|
|
821
|
+
return props.class;
|
|
822
|
+
},
|
|
823
|
+
get children() {
|
|
824
|
+
var _el$77 = _$getNextElement(_tmpl$24),
|
|
825
|
+
_el$78 = _el$77.firstChild,
|
|
826
|
+
[_el$79, _co$16] = _$getNextMarker(_el$78.nextSibling),
|
|
827
|
+
_el$80 = _el$79.nextSibling,
|
|
828
|
+
[_el$81, _co$17] = _$getNextMarker(_el$80.nextSibling);
|
|
829
|
+
_$insert(_el$77, _$createComponent(Show, {
|
|
830
|
+
get when() {
|
|
831
|
+
return props.incoming.length > 0;
|
|
832
|
+
},
|
|
833
|
+
get children() {
|
|
834
|
+
return _$createComponent(LinkGroup, {
|
|
835
|
+
get label() {
|
|
836
|
+
return t().linkedBy({
|
|
837
|
+
count: props.incoming.length
|
|
838
|
+
});
|
|
839
|
+
},
|
|
840
|
+
get items() {
|
|
841
|
+
return props.incoming;
|
|
842
|
+
},
|
|
843
|
+
get limit() {
|
|
844
|
+
return limit();
|
|
845
|
+
}
|
|
846
|
+
});
|
|
847
|
+
}
|
|
848
|
+
}), _el$79, _co$16);
|
|
849
|
+
_$insert(_el$77, _$createComponent(Show, {
|
|
850
|
+
get when() {
|
|
851
|
+
return props.outgoing.length > 0;
|
|
852
|
+
},
|
|
853
|
+
get children() {
|
|
854
|
+
return _$createComponent(LinkGroup, {
|
|
855
|
+
get label() {
|
|
856
|
+
return t().linksTo({
|
|
857
|
+
count: props.outgoing.length
|
|
858
|
+
});
|
|
859
|
+
},
|
|
860
|
+
get items() {
|
|
861
|
+
return props.outgoing;
|
|
862
|
+
},
|
|
863
|
+
get limit() {
|
|
864
|
+
return limit();
|
|
865
|
+
}
|
|
866
|
+
});
|
|
867
|
+
}
|
|
868
|
+
}), _el$81, _co$17);
|
|
869
|
+
return _el$77;
|
|
870
|
+
}
|
|
871
|
+
});
|
|
872
|
+
}
|
|
873
|
+
});
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
// ── Properties ──────────────────────────────────────────────────────────
|
|
877
|
+
|
|
878
|
+
/** Facts about the object as label and value rows, such as created, edited, size, and the way to its history. */
|
|
879
|
+
export function DetailProperties(props) {
|
|
880
|
+
const t = useDetailSectionMessages();
|
|
881
|
+
return _$createComponent(DetailPanel.Section, {
|
|
882
|
+
get title() {
|
|
883
|
+
return props.title ?? t().properties;
|
|
884
|
+
},
|
|
885
|
+
get icon() {
|
|
886
|
+
return props.icon ?? "ti ti-info-square";
|
|
887
|
+
},
|
|
888
|
+
collapsible: true,
|
|
889
|
+
get defaultOpen() {
|
|
890
|
+
return props.defaultOpen;
|
|
891
|
+
},
|
|
892
|
+
get summary() {
|
|
893
|
+
return props.summary;
|
|
894
|
+
},
|
|
895
|
+
get ["class"]() {
|
|
896
|
+
return props.class;
|
|
897
|
+
},
|
|
898
|
+
get children() {
|
|
899
|
+
var _el$82 = _$getNextElement(_tmpl$25);
|
|
900
|
+
_$insert(_el$82, _$createComponent(For, {
|
|
901
|
+
get each() {
|
|
902
|
+
return props.items;
|
|
903
|
+
},
|
|
904
|
+
children: item => (() => {
|
|
905
|
+
var _el$83 = _$getNextElement(_tmpl$27),
|
|
906
|
+
_el$84 = _el$83.firstChild,
|
|
907
|
+
_el$85 = _el$84.nextSibling,
|
|
908
|
+
_el$87 = _el$85.firstChild,
|
|
909
|
+
[_el$88, _co$18] = _$getNextMarker(_el$87.nextSibling),
|
|
910
|
+
_el$89 = _el$88.nextSibling,
|
|
911
|
+
[_el$90, _co$19] = _$getNextMarker(_el$89.nextSibling);
|
|
912
|
+
_$insert(_el$84, () => item.label);
|
|
913
|
+
_$insert(_el$85, _$createComponent(Show, {
|
|
914
|
+
get when() {
|
|
915
|
+
return item.leading;
|
|
916
|
+
},
|
|
917
|
+
get children() {
|
|
918
|
+
var _el$86 = _$getNextElement(_tmpl$26);
|
|
919
|
+
_$insert(_el$86, () => item.leading);
|
|
920
|
+
return _el$86;
|
|
921
|
+
}
|
|
922
|
+
}), _el$88, _co$18);
|
|
923
|
+
_$insert(_el$85, _$createComponent(Show, {
|
|
924
|
+
get when() {
|
|
925
|
+
return item.href;
|
|
926
|
+
},
|
|
927
|
+
get fallback() {
|
|
928
|
+
return (() => {
|
|
929
|
+
var _el$91 = _$getNextElement(_tmpl$28);
|
|
930
|
+
_$insert(_el$91, () => item.value);
|
|
931
|
+
return _el$91;
|
|
932
|
+
})();
|
|
933
|
+
},
|
|
934
|
+
children: href => (() => {
|
|
935
|
+
var _el$92 = _$getNextElement(_tmpl$29);
|
|
936
|
+
_$insert(_el$92, () => item.value);
|
|
937
|
+
_$effect(() => _$setAttribute(_el$92, "href", href()));
|
|
938
|
+
return _el$92;
|
|
939
|
+
})()
|
|
940
|
+
}), _el$90, _co$19);
|
|
941
|
+
return _el$83;
|
|
942
|
+
})()
|
|
943
|
+
}));
|
|
944
|
+
return _el$82;
|
|
945
|
+
}
|
|
946
|
+
});
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
// ── Tags ────────────────────────────────────────────────────────────────
|
|
950
|
+
|
|
951
|
+
/** The object's tags as chips; a chip with `href` leads to everything with that tag. */
|
|
952
|
+
export function DetailTags(props) {
|
|
953
|
+
const t = useDetailSectionMessages();
|
|
954
|
+
return _$createComponent(DetailPanel.Section, {
|
|
955
|
+
get title() {
|
|
956
|
+
return props.title ?? t().tags;
|
|
957
|
+
},
|
|
958
|
+
icon: "ti ti-hash",
|
|
959
|
+
get count() {
|
|
960
|
+
return props.tags.length;
|
|
961
|
+
},
|
|
962
|
+
get ["class"]() {
|
|
963
|
+
return props.class;
|
|
964
|
+
},
|
|
965
|
+
get children() {
|
|
966
|
+
return _$createComponent(Show, {
|
|
967
|
+
get when() {
|
|
968
|
+
return props.tags.length > 0;
|
|
969
|
+
},
|
|
970
|
+
get fallback() {
|
|
971
|
+
return _$memo(() => !!props.emptyHint)() ? (() => {
|
|
972
|
+
var _el$94 = _$getNextElement(_tmpl$18);
|
|
973
|
+
_$insert(_el$94, () => props.emptyHint);
|
|
974
|
+
return _el$94;
|
|
975
|
+
})() : undefined;
|
|
976
|
+
},
|
|
977
|
+
get children() {
|
|
978
|
+
var _el$93 = _$getNextElement(_tmpl$30);
|
|
979
|
+
_$insert(_el$93, _$createComponent(For, {
|
|
980
|
+
get each() {
|
|
981
|
+
return props.tags;
|
|
982
|
+
},
|
|
983
|
+
children: tag => (() => {
|
|
984
|
+
var _el$95 = _$getNextElement(_tmpl$31);
|
|
985
|
+
_$insert(_el$95, _$createComponent(Show, {
|
|
986
|
+
get when() {
|
|
987
|
+
return tag.href;
|
|
988
|
+
},
|
|
989
|
+
get fallback() {
|
|
990
|
+
return (() => {
|
|
991
|
+
var _el$96 = _$getNextElement(_tmpl$32),
|
|
992
|
+
_el$97 = _el$96.firstChild,
|
|
993
|
+
_el$98 = _el$97.nextSibling,
|
|
994
|
+
[_el$99, _co$20] = _$getNextMarker(_el$98.nextSibling);
|
|
995
|
+
_$insert(_el$96, () => tag.label, _el$99, _co$20);
|
|
996
|
+
return _el$96;
|
|
997
|
+
})();
|
|
998
|
+
},
|
|
999
|
+
children: href => (() => {
|
|
1000
|
+
var _el$100 = _$getNextElement(_tmpl$33),
|
|
1001
|
+
_el$101 = _el$100.firstChild,
|
|
1002
|
+
_el$102 = _el$101.nextSibling,
|
|
1003
|
+
[_el$103, _co$21] = _$getNextMarker(_el$102.nextSibling);
|
|
1004
|
+
_$insert(_el$100, () => tag.label, _el$103, _co$21);
|
|
1005
|
+
_$effect(() => _$setAttribute(_el$100, "href", href()));
|
|
1006
|
+
return _el$100;
|
|
1007
|
+
})()
|
|
1008
|
+
}));
|
|
1009
|
+
return _el$95;
|
|
1010
|
+
})()
|
|
1011
|
+
}));
|
|
1012
|
+
return _el$93;
|
|
1013
|
+
}
|
|
1014
|
+
});
|
|
1015
|
+
}
|
|
1016
|
+
});
|
|
1017
|
+
}
|
|
1018
|
+
_$delegateEvents(["click"]);
|
|
1019
|
+
//# sourceMappingURL=DetailSections.js.map
|