@graview/primitives 0.1.64 → 0.1.66
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/README.md +1 -1
- package/dist/app-bar.d.ts +88 -15
- package/dist/app-bar.d.ts.map +1 -1
- package/dist/app-bar.js +177 -131
- package/dist/app-bar.js.map +1 -1
- package/dist/app-menu.d.ts +9 -0
- package/dist/app-menu.d.ts.map +1 -0
- package/dist/app-menu.js +60 -0
- package/dist/app-menu.js.map +1 -0
- package/dist/bar-activity.d.ts +5 -9
- package/dist/bar-activity.d.ts.map +1 -1
- package/dist/bar-activity.js +24 -7
- package/dist/bar-activity.js.map +1 -1
- package/dist/bar-panes.d.ts +5 -5
- package/dist/bar-panes.d.ts.map +1 -1
- package/dist/bar-panes.js +9 -5
- package/dist/bar-panes.js.map +1 -1
- package/dist/bar-suggested.d.ts +9 -1
- package/dist/bar-suggested.d.ts.map +1 -1
- package/dist/bar-suggested.js +11 -17
- package/dist/bar-suggested.js.map +1 -1
- package/dist/better-bar.d.ts +65 -0
- package/dist/better-bar.d.ts.map +1 -0
- package/dist/better-bar.js +252 -0
- package/dist/better-bar.js.map +1 -0
- package/dist/better-panel.d.ts +50 -0
- package/dist/better-panel.d.ts.map +1 -0
- package/dist/better-panel.js +151 -0
- package/dist/better-panel.js.map +1 -0
- package/dist/chat.js +1 -1
- package/dist/chat.js.map +1 -1
- package/dist/editable.d.ts +8 -1
- package/dist/editable.d.ts.map +1 -1
- package/dist/editable.js +140 -16
- package/dist/editable.js.map +1 -1
- package/dist/find.js +3 -3
- package/dist/find.js.map +1 -1
- package/dist/first-look-door.d.ts +2 -2
- package/dist/first-look-door.js +2 -2
- package/dist/first-look.d.ts.map +1 -1
- package/dist/first-look.js +10 -8
- package/dist/first-look.js.map +1 -1
- package/dist/frame.d.ts +2 -2
- package/dist/frame.d.ts.map +1 -1
- package/dist/frame.js +1 -1
- package/dist/frame.js.map +1 -1
- package/dist/here.d.ts +1 -1
- package/dist/here.js +2 -2
- package/dist/here.js.map +1 -1
- package/dist/inbox-pane.d.ts +31 -0
- package/dist/inbox-pane.d.ts.map +1 -0
- package/dist/inbox-pane.js +89 -0
- package/dist/inbox-pane.js.map +1 -0
- package/dist/inbox.d.ts +17 -0
- package/dist/inbox.d.ts.map +1 -0
- package/dist/inbox.js +84 -0
- package/dist/inbox.js.map +1 -0
- package/dist/index.d.ts +8 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/inline-ai-menu.d.ts +4 -2
- package/dist/inline-ai-menu.d.ts.map +1 -1
- package/dist/inline-ai-menu.js +34 -8
- package/dist/inline-ai-menu.js.map +1 -1
- package/dist/kind-stop.d.ts.map +1 -1
- package/dist/kind-stop.js +204 -21
- package/dist/kind-stop.js.map +1 -1
- package/dist/lines-key.d.ts.map +1 -1
- package/dist/lines-key.js +22 -2
- package/dist/lines-key.js.map +1 -1
- package/dist/map-panel.js +98 -6
- package/dist/map-panel.js.map +1 -1
- package/dist/menu-rank.d.ts +25 -0
- package/dist/menu-rank.d.ts.map +1 -0
- package/dist/menu-rank.js +56 -0
- package/dist/menu-rank.js.map +1 -0
- package/dist/menu-suggested.d.ts +54 -0
- package/dist/menu-suggested.d.ts.map +1 -0
- package/dist/menu-suggested.js +140 -0
- package/dist/menu-suggested.js.map +1 -0
- package/dist/menu-told-door.d.ts +17 -0
- package/dist/menu-told-door.d.ts.map +1 -0
- package/dist/menu-told-door.js +49 -0
- package/dist/menu-told-door.js.map +1 -0
- package/dist/menu-told.d.ts +44 -0
- package/dist/menu-told.d.ts.map +1 -0
- package/dist/menu-told.js +90 -0
- package/dist/menu-told.js.map +1 -0
- package/dist/menu-words.d.ts +15 -0
- package/dist/menu-words.d.ts.map +1 -0
- package/dist/menu-words.js +28 -0
- package/dist/menu-words.js.map +1 -0
- package/dist/notify-sheet.js +2 -2
- package/dist/notify-sheet.js.map +1 -1
- package/dist/page-better.d.ts +13 -0
- package/dist/page-better.d.ts.map +1 -0
- package/dist/page-better.js +714 -0
- package/dist/page-better.js.map +1 -0
- package/dist/page-parts.d.ts +41 -0
- package/dist/page-parts.d.ts.map +1 -0
- package/dist/page-parts.js +100 -0
- package/dist/page-parts.js.map +1 -0
- package/dist/pages.d.ts +4 -3
- package/dist/pages.d.ts.map +1 -1
- package/dist/pages.js +4 -3
- package/dist/pages.js.map +1 -1
- package/dist/profile.d.ts +1 -10
- package/dist/profile.d.ts.map +1 -1
- package/dist/profile.js +2 -3
- package/dist/profile.js.map +1 -1
- package/dist/quick-ask-desk.d.ts +16 -0
- package/dist/quick-ask-desk.d.ts.map +1 -1
- package/dist/quick-ask-desk.js +20 -0
- package/dist/quick-ask-desk.js.map +1 -1
- package/dist/quick-ask-door.d.ts.map +1 -1
- package/dist/quick-ask-door.js +5 -0
- package/dist/quick-ask-door.js.map +1 -1
- package/dist/quick-ask-plan.d.ts +52 -0
- package/dist/quick-ask-plan.d.ts.map +1 -0
- package/dist/quick-ask-plan.js +112 -0
- package/dist/quick-ask-plan.js.map +1 -0
- package/dist/quick-ask.d.ts.map +1 -1
- package/dist/quick-ask.js +341 -19
- package/dist/quick-ask.js.map +1 -1
- package/dist/scene-bar.d.ts +1 -1
- package/dist/scene-bar.d.ts.map +1 -1
- package/dist/scene-bar.js +4 -7
- package/dist/scene-bar.js.map +1 -1
- package/dist/scene-css.d.ts.map +1 -1
- package/dist/scene-css.js +16 -6
- package/dist/scene-css.js.map +1 -1
- package/dist/scene-places.d.ts +3 -2
- package/dist/scene-places.d.ts.map +1 -1
- package/dist/scene-places.js +47 -8
- package/dist/scene-places.js.map +1 -1
- package/dist/scene.d.ts +2 -0
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +2 -0
- package/dist/scene.js.map +1 -1
- package/dist/section-better.d.ts +76 -0
- package/dist/section-better.d.ts.map +1 -0
- package/dist/section-better.js +529 -0
- package/dist/section-better.js.map +1 -0
- package/dist/section-door.d.ts +39 -0
- package/dist/section-door.d.ts.map +1 -0
- package/dist/section-door.js +66 -0
- package/dist/section-door.js.map +1 -0
- package/dist/section-menu.d.ts +32 -0
- package/dist/section-menu.d.ts.map +1 -0
- package/dist/section-menu.js +229 -0
- package/dist/section-menu.js.map +1 -0
- package/dist/section-outline.d.ts +8 -0
- package/dist/section-outline.d.ts.map +1 -0
- package/dist/section-outline.js +48 -0
- package/dist/section-outline.js.map +1 -0
- package/dist/section-words.d.ts +32 -0
- package/dist/section-words.d.ts.map +1 -0
- package/dist/section-words.js +116 -0
- package/dist/section-words.js.map +1 -0
- package/dist/shell.d.ts +5 -1
- package/dist/shell.d.ts.map +1 -1
- package/dist/shell.js +5 -2
- package/dist/shell.js.map +1 -1
- package/dist/subject.js +2 -2
- package/dist/subject.js.map +1 -1
- package/dist/suggested.d.ts +21 -10
- package/dist/suggested.d.ts.map +1 -1
- package/dist/suggested.js +43 -64
- package/dist/suggested.js.map +1 -1
- package/dist/told-card.d.ts +66 -0
- package/dist/told-card.d.ts.map +1 -0
- package/dist/told-card.js +197 -0
- package/dist/told-card.js.map +1 -0
- package/dist/told-listed.d.ts +14 -0
- package/dist/told-listed.d.ts.map +1 -0
- package/dist/told-listed.js +46 -0
- package/dist/told-listed.js.map +1 -0
- package/dist/told-panel-door.d.ts +17 -0
- package/dist/told-panel-door.d.ts.map +1 -0
- package/dist/told-panel-door.js +6 -0
- package/dist/told-panel-door.js.map +1 -0
- package/dist/told-panel.d.ts +19 -0
- package/dist/told-panel.d.ts.map +1 -0
- package/dist/told-panel.js +83 -0
- package/dist/told-panel.js.map +1 -0
- package/dist/told-ui.d.ts +5 -0
- package/dist/told-ui.d.ts.map +1 -0
- package/dist/told-ui.js +12 -0
- package/dist/told-ui.js.map +1 -0
- package/dist/when-words.d.ts +21 -0
- package/dist/when-words.d.ts.map +1 -0
- package/dist/when-words.js +43 -0
- package/dist/when-words.js.map +1 -0
- package/dist/workbench/activity.d.ts +44 -0
- package/dist/workbench/activity.d.ts.map +1 -1
- package/dist/workbench/activity.js +74 -59
- package/dist/workbench/activity.js.map +1 -1
- package/dist/workbench/ai-entries.d.ts.map +1 -1
- package/dist/workbench/ai-entries.js +23 -2
- package/dist/workbench/ai-entries.js.map +1 -1
- package/dist/workbench/back-out.js +1 -1
- package/dist/workbench/back-out.js.map +1 -1
- package/dist/workbench/inspector.d.ts.map +1 -1
- package/dist/workbench/inspector.js +366 -27
- package/dist/workbench/inspector.js.map +1 -1
- package/dist/workbench/standing.d.ts.map +1 -1
- package/dist/workbench/standing.js +1 -1
- package/dist/workbench/standing.js.map +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-door.d.ts","sourceRoot":"","sources":["../src/section-door.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,iBAAiB,EAAmB,MAAM,yBAAyB,CAAC;AAE9F,OAAO,EAAoD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAYjE,sGAAsG;AACtG,wBAAgB,uBAAuB,IAAI,iBAAiB,GAAG,IAAI,CA8BlE;AAID,wFAAwF;AACxF,wBAAgB,qBAAqB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAInF;AAED,2GAA2G;AAC3G,wBAAgB,iBAAiB,uCAWhC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { alsoWhenSectionsArrive, MenuSections } from "@graview/react/drawing";
|
|
3
|
+
import { useGraview } from "@graview/react/provider";
|
|
4
|
+
import { inlineAiOn } from "@graview/tools/frame";
|
|
5
|
+
import { useEffect, useMemo, useRef, useSyncExternalStore } from "react";
|
|
6
|
+
let menu;
|
|
7
|
+
const heard = /* @__PURE__ */ new Set();
|
|
8
|
+
const hear = (listener) => (heard.add(listener), () => void heard.delete(listener));
|
|
9
|
+
const load = () => import("./section-menu.js").then((module) => {
|
|
10
|
+
menu = module;
|
|
11
|
+
heard.forEach((listener) => listener());
|
|
12
|
+
});
|
|
13
|
+
/** "Make “This week” better" on the context menu, or nothing where it is not this seat's to offer. */
|
|
14
|
+
export function useSectionBetterSection() {
|
|
15
|
+
const here = useGraview();
|
|
16
|
+
const { ai, keptViews, onProposeChange, composeChange } = here;
|
|
17
|
+
const held = useRef(here);
|
|
18
|
+
held.current = here;
|
|
19
|
+
const pages = (onProposeChange !== undefined && composeChange !== undefined) || typeof keptViews?.fork === "function";
|
|
20
|
+
const on = inlineAiOn(ai) && (typeof keptViews?.revise === "function" || pages);
|
|
21
|
+
if (on)
|
|
22
|
+
alsoWhenSectionsArrive(load);
|
|
23
|
+
/*
|
|
24
|
+
* In the scene, a right-click on a place or a record offers Better UI for
|
|
25
|
+
* its page: the menu's section is fetched with the first one, and the
|
|
26
|
+
* menu draws it once it is here.
|
|
27
|
+
*/
|
|
28
|
+
const loaded = useSyncExternalStore(hear, () => menu !== undefined, () => false);
|
|
29
|
+
return useMemo(() => on
|
|
30
|
+
? (target) => {
|
|
31
|
+
const asks = target.section || target.page || (target.face === "scene" && pages && (target.on !== undefined || target.place !== undefined || target.about.length === 1));
|
|
32
|
+
if (!asks)
|
|
33
|
+
return null;
|
|
34
|
+
if (!menu) {
|
|
35
|
+
void load();
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return menu.sectionFor(target, held.current);
|
|
39
|
+
}
|
|
40
|
+
: null,
|
|
41
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
42
|
+
[on, pages, loaded]);
|
|
43
|
+
}
|
|
44
|
+
const NONE = [];
|
|
45
|
+
/** The context menu drawn inside, with "Make this better" in it where it is offered. */
|
|
46
|
+
export function SectionBetterSections({ children }) {
|
|
47
|
+
const section = useSectionBetterSection();
|
|
48
|
+
const sections = useMemo(() => (section ? [section] : NONE), [section]);
|
|
49
|
+
return _jsx(MenuSections, { sections: sections, children: children });
|
|
50
|
+
}
|
|
51
|
+
/** Where the outline and the card are drawn, once the first right-click inside a view has fetched them. */
|
|
52
|
+
export function SectionBetterDoor() {
|
|
53
|
+
const Door = useSyncExternalStore(hear, () => menu?.SectionDoor, () => undefined);
|
|
54
|
+
// A Better UI asked in the scene, carried to the pages: what opens it is fetched at once.
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
try {
|
|
57
|
+
if (sessionStorage.getItem("graview.better.from-scene"))
|
|
58
|
+
void load();
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// No session to carry it in: nothing was carried.
|
|
62
|
+
}
|
|
63
|
+
}, []);
|
|
64
|
+
return Door ? _jsx(Door, {}) : null;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=section-door.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-door.js","sourceRoot":"","sources":["../src/section-door.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AnySchema } from "@graview/core";
|
|
2
|
+
import { type PagePart } from "./page-parts.js";
|
|
3
|
+
import { type AiDesk, type GraviewContextValue, type MenuSection, type MenuTarget, type MenuViewSection } from "@graview/react/provider";
|
|
4
|
+
type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;
|
|
5
|
+
/** How the card was asked for. */
|
|
6
|
+
/** How the card was asked for: at once, in words, by pointing — or opened to choose (Better UI with nothing typed). */
|
|
7
|
+
export type SectionMode = "just" | "describe" | "highlight" | "choose";
|
|
8
|
+
/** The card asked for: on which section of a view, or which part of a built-in page; how; and the words, where the menu was typed in. */
|
|
9
|
+
export type SectionAsk = ({
|
|
10
|
+
readonly section: MenuViewSection;
|
|
11
|
+
readonly part?: undefined;
|
|
12
|
+
} | {
|
|
13
|
+
readonly part: PagePart;
|
|
14
|
+
readonly section?: undefined;
|
|
15
|
+
}) & {
|
|
16
|
+
readonly mode: SectionMode;
|
|
17
|
+
readonly words?: string;
|
|
18
|
+
/** Asked with a right-click in the scene, and opened on the part's page: the card says so. */
|
|
19
|
+
readonly fromScene?: boolean;
|
|
20
|
+
readonly at: number;
|
|
21
|
+
readonly returnTo?: HTMLElement | null;
|
|
22
|
+
};
|
|
23
|
+
/** Opens the section's card on this app's desk; null puts it away. */
|
|
24
|
+
export declare function askSection(desk: AiDesk, ask: DistributiveOmit<SectionAsk, "at"> | null): void;
|
|
25
|
+
/** What the menu's section reads of the provider as it opens: the desk, the host's views and its door to a change to the app. */
|
|
26
|
+
export type SectionHere = Pick<GraviewContextValue<AnySchema>, "aiDesk" | "ai" | "keptViews" | "store" | "principal" | "onProposeChange" | "composeChange" | "app" | "views">;
|
|
27
|
+
/** ✨ Better UI for a menu opened on a section of a view or on a page's part, or nothing where it is not this seat's to offer. */
|
|
28
|
+
export declare function sectionFor(target: MenuTarget, here: SectionHere): MenuSection | null;
|
|
29
|
+
/** Where the outline and the card are drawn: nothing at all until a menu is open on a section or a card is asked for. */
|
|
30
|
+
export declare function SectionDoor(): import("react").JSX.Element | null;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=section-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-menu.d.ts","sourceRoot":"","sources":["../src/section-menu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAA+C,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE7F,OAAO,EAAmC,KAAK,MAAM,EAAE,KAAK,mBAAmB,EAAiB,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGzL,KAAK,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,WAAW,IAAI,CAAC,SAAS,OAAO,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;AAazF,kCAAkC;AAClC,uHAAuH;AACvH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEvE,yIAAyI;AACzI,MAAM,MAAM,UAAU,GAAG,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,GAAG;IACxJ,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,8FAA8F;IAC9F,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CACxC,CAAC;AA+BF,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAI7F;AASD,iIAAiI;AACjI,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,iBAAiB,GAAG,eAAe,GAAG,KAAK,GAAG,OAAO,CAAC,CAAC;AA6D9K,iIAAiI;AACjI,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CA+BpF;AAKD,yHAAyH;AACzH,wBAAgB,WAAW,uCAqF1B"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { retryingImport } from "@graview/core/retry";
|
|
3
|
+
import { viewPlaceOf } from "@graview/react/drawing";
|
|
4
|
+
import { placeOfSection } from "./section-words.js";
|
|
5
|
+
import { nudgesFor, pageMayChange, pagePartOf, PARTS } from "./page-parts.js";
|
|
6
|
+
import { aboutTheLook } from "@graview/tools/section";
|
|
7
|
+
import { lazyModule, useGoTo, useGraview } from "@graview/react/provider";
|
|
8
|
+
import { pluralLabel } from "@graview/core";
|
|
9
|
+
import { Suspense, useEffect, useId, useMemo, useRef, useSyncExternalStore } from "react";
|
|
10
|
+
import { SectionOutline } from "./section-outline.js";
|
|
11
|
+
import { FACE_EVENT } from "./frame.js";
|
|
12
|
+
const HELD = /* @__PURE__ */ new WeakMap();
|
|
13
|
+
/* The helds with a door drawn now: where a page's card goes when the door it was in is drawn again elsewhere. */
|
|
14
|
+
const OPEN = /* @__PURE__ */ new Set();
|
|
15
|
+
const heldOf = (desk) => {
|
|
16
|
+
let held = HELD.get(desk);
|
|
17
|
+
if (!held)
|
|
18
|
+
HELD.set(desk, (held = { ask: null, doors: [], heard: new Set() }));
|
|
19
|
+
return held;
|
|
20
|
+
};
|
|
21
|
+
const tell = (held) => held.heard.forEach((listener) => listener());
|
|
22
|
+
let asked = 0;
|
|
23
|
+
/*
|
|
24
|
+
* A PAGE'S CARD OUTLIVES THE APP IT CHANGED (Roadmap f-make-any-page-better):
|
|
25
|
+
* a host that hands the page a changed app (`setApp`) may draw it all again
|
|
26
|
+
* — a new provider, a new desk — for a draft shown or a change kept. A
|
|
27
|
+
* page's card asked when its last door went is carried to the next door
|
|
28
|
+
* drawn within a few seconds, so the draft keeps its Keep and the change
|
|
29
|
+
* its Undo.
|
|
30
|
+
*/
|
|
31
|
+
let carried = null;
|
|
32
|
+
/* A conversation may draw the page again many times, each a moment apart, while a model thinks for minutes. */
|
|
33
|
+
const CARRIED_MS = 60_000;
|
|
34
|
+
/** Opens the section's card on this app's desk; null puts it away. */
|
|
35
|
+
export function askSection(desk, ask) {
|
|
36
|
+
const held = heldOf(desk);
|
|
37
|
+
held.ask = ask ? { ...ask, at: ++asked } : null;
|
|
38
|
+
tell(held);
|
|
39
|
+
}
|
|
40
|
+
/* The outline over a section a menu is open on and the card asked for, fetched with the first right-click inside a view (the menu's `prepare`). */
|
|
41
|
+
const drawn = /* @__PURE__ */ lazyModule(retryingImport(() => import("./section-better.js")));
|
|
42
|
+
const Drawn = /* @__PURE__ */ drawn.part((module, props) => {
|
|
43
|
+
const Part = module.SectionDrawn;
|
|
44
|
+
return _jsx(Part, { ...props });
|
|
45
|
+
}, { what: "Make this better" });
|
|
46
|
+
/*
|
|
47
|
+
* ✨ BETTER UI, A WAY TO ASK UNDER THE MENU'S FIELD (Roadmap
|
|
48
|
+
* f-make-any-page-better): its button beside Chat, lit where the Fast slot
|
|
49
|
+
* reads typed words as about how the part looks (`aboutTheLook`); pressed
|
|
50
|
+
* with words, the card asks them at once; with none, it opens to choose —
|
|
51
|
+
* Just do it, Describe changes…, Highlight area….
|
|
52
|
+
*/
|
|
53
|
+
const betterMode = (here, name, open, nudges, prepare) => ({
|
|
54
|
+
id: "make-better",
|
|
55
|
+
at: "start",
|
|
56
|
+
mode: {
|
|
57
|
+
id: "better",
|
|
58
|
+
label: "Better UI",
|
|
59
|
+
mark: "✨",
|
|
60
|
+
claims: async (words) => (await aboutTheLook(here.ai, words, name)).about === "look",
|
|
61
|
+
open,
|
|
62
|
+
nudges,
|
|
63
|
+
},
|
|
64
|
+
prepare,
|
|
65
|
+
});
|
|
66
|
+
/*
|
|
67
|
+
* ✨ BETTER UI IN THE SCENE (Roadmap f-make-any-page-better). A right-click
|
|
68
|
+
* on a place or a record in the scene offered Chat alone: Better UI came
|
|
69
|
+
* only from the routed face's page parts. The scene draws a place and a
|
|
70
|
+
* kind's records with the same declaration the pages draw them with, and a
|
|
71
|
+
* new design is made and judged on a page, so the scene offers Better UI
|
|
72
|
+
* for what is under the pointer — the place ("The lists"), or the kind's
|
|
73
|
+
* list a record is on ("Tasks") — and opens it on that page: the pages are
|
|
74
|
+
* switched to, the page gone to, and the card opened there, saying it came
|
|
75
|
+
* from the scene. Carried across the switch in this tab's session, which a
|
|
76
|
+
* host that draws the pages at their own address reloads into.
|
|
77
|
+
*/
|
|
78
|
+
const CARRY = "graview.better.from-scene";
|
|
79
|
+
/** How long a Better UI asked in the scene waits for its page to be drawn. */
|
|
80
|
+
const CARRY_MS = 30_000;
|
|
81
|
+
/** The part of the pages a right-click in the scene is about: a place by its title, or the list of the kind it is on. */
|
|
82
|
+
function scenePartOf(target, here) {
|
|
83
|
+
const schema = here.store.schema;
|
|
84
|
+
const places = here.views.places?.() ?? [];
|
|
85
|
+
const placed = (as) => places.find((one) => one.as === as);
|
|
86
|
+
const one = target.on ?? (target.about.length === 1 ? target.about[0] : undefined);
|
|
87
|
+
const aggregate = one?.startsWith("aggregate:") ? one.slice("aggregate:".length) : undefined;
|
|
88
|
+
const node = one && !aggregate ? here.store.graph.getNode(one) : undefined;
|
|
89
|
+
const place = target.place !== undefined ? placed(target.place) : aggregate && !aggregate.includes("+") ? places.find((each) => each.kind === aggregate) : undefined;
|
|
90
|
+
if (place)
|
|
91
|
+
return { name: place.title, to: { place: place.as }, part: { name: place.title, slot: "place", kind: place.kind, place: place.as, elements: [], main: null } };
|
|
92
|
+
const kind = aggregate && !aggregate.includes("+") && schema.tryDefinition(aggregate) ? aggregate : node?.kind;
|
|
93
|
+
if (!kind)
|
|
94
|
+
return undefined;
|
|
95
|
+
const name = pluralLabel(schema, kind);
|
|
96
|
+
return { name, to: { list: kind }, part: { name, slot: "list", kind, elements: [], main: null } };
|
|
97
|
+
}
|
|
98
|
+
/** ✨ Better UI for a menu opened on a section of a view or on a page's part, or nothing where it is not this seat's to offer. */
|
|
99
|
+
export function sectionFor(target, here) {
|
|
100
|
+
const { aiDesk, keptViews } = here;
|
|
101
|
+
const section = target.section;
|
|
102
|
+
const returnTo = target.element ?? null;
|
|
103
|
+
if (!section && target.face === "scene") {
|
|
104
|
+
// The pages are a row of the app menu (Roadmap f-app-bar-calm), drawn only while it is open: its control says the bar holds them, and is asked to go there.
|
|
105
|
+
const door = typeof document === "undefined" ? null : document.querySelector('[data-testid="app-menu-open"][data-pages]');
|
|
106
|
+
const pages = door ? { click: () => door.dispatchEvent(new CustomEvent(FACE_EVENT, { detail: "pages" })) } : null;
|
|
107
|
+
const scene = scenePartOf(target, here);
|
|
108
|
+
if (!pages || !scene || !pageMayChange(scene.part, here))
|
|
109
|
+
return null;
|
|
110
|
+
const open = (words) => {
|
|
111
|
+
try {
|
|
112
|
+
sessionStorage.setItem(CARRY, JSON.stringify({ to: scene.to, mode: words ? "describe" : "choose", ...(words ? { words } : {}), at: Date.now() }));
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
pages.click();
|
|
118
|
+
};
|
|
119
|
+
return betterMode(here, scene.name, open, () => [`Make “${scene.name}” easier to read at a glance`], () => drawn.prefetch());
|
|
120
|
+
}
|
|
121
|
+
if (section) {
|
|
122
|
+
// Asked as the menu opens: the host says who may change views now, and the view's place must lend a revision.
|
|
123
|
+
if (!keptViews?.revise || keptViews.current().may.views !== true || !viewPlaceOf(placeOfSection(section)))
|
|
124
|
+
return null;
|
|
125
|
+
const open = (words) => askSection(aiDesk, words ? { section, mode: "describe", words, returnTo } : { section, mode: "choose", returnTo });
|
|
126
|
+
return betterMode(here, section.name, open, () => [`Make “${section.name}” easier to read at a glance`], () => drawn.prefetch());
|
|
127
|
+
}
|
|
128
|
+
const part = target.page && target.face === "pages" ? pagePartOf(target.page, here) : undefined;
|
|
129
|
+
if (!part || !pageMayChange(part, here))
|
|
130
|
+
return null;
|
|
131
|
+
PARTS.set(target.page.at, part);
|
|
132
|
+
const open = (words) => askSection(aiDesk, words ? { part, mode: "describe", words, returnTo } : { part, mode: "choose", returnTo });
|
|
133
|
+
return betterMode(here, part.name, open, () => nudgesFor(part, here), () => drawn.prefetch());
|
|
134
|
+
}
|
|
135
|
+
/** The elements of the page's part a menu is open on, where "Make … better" named one. */
|
|
136
|
+
const outlinedPart = (page) => PARTS.get(page.at)?.elements;
|
|
137
|
+
/** Where the outline and the card are drawn: nothing at all until a menu is open on a section or a card is asked for. */
|
|
138
|
+
export function SectionDoor() {
|
|
139
|
+
const here = useGraview();
|
|
140
|
+
const { aiDesk, menuAt } = here;
|
|
141
|
+
const goTo = useGoTo();
|
|
142
|
+
const latest = useRef({ here, goTo });
|
|
143
|
+
latest.current = { here, goTo };
|
|
144
|
+
/* A Better UI asked in the scene: once the pages are drawn here, its page is gone to and its card opened on it. */
|
|
145
|
+
useEffect(() => {
|
|
146
|
+
let carried = null;
|
|
147
|
+
try {
|
|
148
|
+
carried = JSON.parse(sessionStorage.getItem(CARRY) ?? "null");
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (!carried || Date.now() - carried.at > CARRY_MS)
|
|
154
|
+
return;
|
|
155
|
+
const to = carried.to;
|
|
156
|
+
try {
|
|
157
|
+
sessionStorage.removeItem(CARRY);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Kept or not, it is taken now.
|
|
161
|
+
}
|
|
162
|
+
// The page asked for, gone to at once; the card opened on it once it is drawn.
|
|
163
|
+
if ("list" in to)
|
|
164
|
+
latest.current.goTo.list(to.list);
|
|
165
|
+
else
|
|
166
|
+
latest.current.goTo.place(to.place);
|
|
167
|
+
let tries = 0;
|
|
168
|
+
const timer = setInterval(() => {
|
|
169
|
+
tries += 1;
|
|
170
|
+
// A page drawn: its own region, else the region around its title (a product's own design marks no region).
|
|
171
|
+
const title = document.querySelector("[data-graview-page-title]");
|
|
172
|
+
const pages = document.querySelector("[data-graview-page-main]") ?? title?.closest("main") ?? title?.parentElement?.parentElement ?? null;
|
|
173
|
+
if (!pages || tries < 4) {
|
|
174
|
+
if (tries > 150)
|
|
175
|
+
clearInterval(timer);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
clearInterval(timer);
|
|
179
|
+
const page = "place" in to ? { at: pages, place: to.place } : { at: pages, about: [`aggregate:${to.list}`] };
|
|
180
|
+
const part = pagePartOf(page, latest.current.here);
|
|
181
|
+
if (!part || !pageMayChange(part, latest.current.here))
|
|
182
|
+
return;
|
|
183
|
+
PARTS.set(pages, part);
|
|
184
|
+
askSection(latest.current.here.aiDesk, carried.words ? { part, mode: "describe", words: carried.words, fromScene: true } : { part, mode: carried.mode, fromScene: true });
|
|
185
|
+
}, 120);
|
|
186
|
+
return () => clearInterval(timer);
|
|
187
|
+
}, []);
|
|
188
|
+
const held = heldOf(aiDesk);
|
|
189
|
+
const id = useId();
|
|
190
|
+
const subscribe = useMemo(() => (listener) => {
|
|
191
|
+
held.heard.add(listener);
|
|
192
|
+
return () => void held.heard.delete(listener);
|
|
193
|
+
}, [held]);
|
|
194
|
+
useEffect(() => {
|
|
195
|
+
held.doors.push(id);
|
|
196
|
+
OPEN.add(held);
|
|
197
|
+
if (!held.ask && carried && carried.ask.part && Date.now() - carried.at < CARRIED_MS)
|
|
198
|
+
held.ask = carried.ask;
|
|
199
|
+
carried = null;
|
|
200
|
+
tell(held);
|
|
201
|
+
return () => {
|
|
202
|
+
held.doors.splice(held.doors.indexOf(id), 1);
|
|
203
|
+
if (held.doors.length === 0) {
|
|
204
|
+
OPEN.delete(held);
|
|
205
|
+
if (held.ask?.part) {
|
|
206
|
+
// Carried to a door already drawn again on another desk — the page drawn anew before this one went — else to the next one drawn.
|
|
207
|
+
const next = [...OPEN].find((one) => !one.ask);
|
|
208
|
+
if (next) {
|
|
209
|
+
next.ask = held.ask;
|
|
210
|
+
tell(next);
|
|
211
|
+
}
|
|
212
|
+
else
|
|
213
|
+
carried = { ask: held.ask, at: Date.now() };
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
tell(held);
|
|
217
|
+
};
|
|
218
|
+
}, [held, id]);
|
|
219
|
+
const mine = useSyncExternalStore(subscribe, () => held.doors[0] === id, () => false);
|
|
220
|
+
const ask = useSyncExternalStore(subscribe, () => held.ask, () => null);
|
|
221
|
+
const open = menuAt?.section?.elements ?? (menuAt?.page ? outlinedPart(menuAt.page) : undefined);
|
|
222
|
+
if (!mine || (!ask && !open))
|
|
223
|
+
return null;
|
|
224
|
+
/* The outline at once, over the section or the part a menu is open on; the card fetched when asked for. */
|
|
225
|
+
if (!ask)
|
|
226
|
+
return _jsx(SectionOutline, { elements: open });
|
|
227
|
+
return (_jsx(Suspense, { fallback: null, children: _jsx(Drawn, { ask: ask, close: () => askSection(aiDesk, null) }) }));
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=section-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-menu.js","sourceRoot":"","sources":["../src/section-menu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** The box around a section's elements, in the window. */
|
|
2
|
+
export declare function boxOf(elements: readonly Element[]): DOMRect | null;
|
|
3
|
+
/** A dashed outline over a section, following it as the page moves, never in the way of a pointer. */
|
|
4
|
+
export declare function SectionOutline({ elements, label }: {
|
|
5
|
+
readonly elements: readonly Element[];
|
|
6
|
+
readonly label?: string;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=section-outline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-outline.d.ts","sourceRoot":"","sources":["../src/section-outline.tsx"],"names":[],"mappings":"AASA,0DAA0D;AAC1D,wBAAgB,KAAK,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,GAAG,IAAI,CASlE;AAED,sGAAsG;AACtG,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,+BA0BrH"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { layer } from "@graview/core";
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
/*
|
|
5
|
+
* THE OUTLINE OVER A SECTION (Roadmap f-make-this-section-better): dashed,
|
|
6
|
+
* following it as the page moves, never in the way of a pointer — over a
|
|
7
|
+
* section a menu is open on, and over a draft while the card offers it.
|
|
8
|
+
*/
|
|
9
|
+
/** The box around a section's elements, in the window. */
|
|
10
|
+
export function boxOf(elements) {
|
|
11
|
+
let box = null;
|
|
12
|
+
for (const element of elements) {
|
|
13
|
+
if (!element.isConnected)
|
|
14
|
+
continue;
|
|
15
|
+
const at = element.getBoundingClientRect();
|
|
16
|
+
if (at.width === 0 && at.height === 0)
|
|
17
|
+
continue;
|
|
18
|
+
box = box ? { left: Math.min(box.left, at.left), top: Math.min(box.top, at.top), right: Math.max(box.right, at.right), bottom: Math.max(box.bottom, at.bottom) } : { left: at.left, top: at.top, right: at.right, bottom: at.bottom };
|
|
19
|
+
}
|
|
20
|
+
return box ? new DOMRect(box.left, box.top, box.right - box.left, box.bottom - box.top) : null;
|
|
21
|
+
}
|
|
22
|
+
/** A dashed outline over a section, following it as the page moves, never in the way of a pointer. */
|
|
23
|
+
export function SectionOutline({ elements, label }) {
|
|
24
|
+
const mark = useRef(null);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
let frame = 0;
|
|
27
|
+
const place = () => {
|
|
28
|
+
const box = boxOf(elements);
|
|
29
|
+
const at = mark.current;
|
|
30
|
+
if (at) {
|
|
31
|
+
at.style.display = box ? "block" : "none";
|
|
32
|
+
if (box) {
|
|
33
|
+
at.style.left = `${Math.round(box.left - 3)}px`;
|
|
34
|
+
at.style.top = `${Math.round(box.top - 3)}px`;
|
|
35
|
+
at.style.width = `${Math.round(box.width + 6)}px`;
|
|
36
|
+
at.style.height = `${Math.round(box.height + 6)}px`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
frame = requestAnimationFrame(place);
|
|
40
|
+
};
|
|
41
|
+
place();
|
|
42
|
+
return () => cancelAnimationFrame(frame);
|
|
43
|
+
}, [elements]);
|
|
44
|
+
return (_jsx("div", { ref: mark, "aria-hidden": "true", "data-testid": "section-outline", style: OUTLINE, children: label ? _jsx("span", { style: OUTLINE_LABEL, children: label }) : null }));
|
|
45
|
+
}
|
|
46
|
+
const OUTLINE = { position: "fixed", display: "none", boxSizing: "border-box", border: "2px dashed var(--graview-accent)", borderRadius: 8, pointerEvents: "none", zIndex: layer("popover") };
|
|
47
|
+
const OUTLINE_LABEL = { position: "absolute", top: -11, left: 8, padding: "0 6px", fontSize: "0.6875rem", lineHeight: "18px", borderRadius: 999, color: "var(--graview-accent-ink, #fff)", background: "var(--graview-accent)" };
|
|
48
|
+
//# sourceMappingURL=section-outline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-outline.js","sourceRoot":"","sources":["../src/section-outline.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE1C;;;;GAIG;AAEH,0DAA0D;AAC1D,MAAM,UAAU,KAAK,CAAC,QAA4B;IAChD,IAAI,GAAG,GAAwE,IAAI,CAAC;IACpF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,WAAW;YAAE,SAAS;QACnC,MAAM,EAAE,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAC3C,IAAI,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChD,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;IACxO,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjG,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,cAAc,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAsE;IACpH,MAAM,IAAI,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,EAAE,CAAC;gBACP,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC1C,IAAI,GAAG,EAAE,CAAC;oBACR,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;oBAChD,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC9C,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;oBAClD,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;gBACtD,CAAC;YACH,CAAC;YACD,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC;QACF,KAAK,EAAE,CAAC;QACR,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACf,OAAO,CACL,cAAK,GAAG,EAAE,IAAI,iBAAc,MAAM,iBAAa,iBAAiB,EAAC,KAAK,EAAE,OAAO,YAC5E,KAAK,CAAC,CAAC,CAAC,eAAM,KAAK,EAAE,aAAa,YAAG,KAAK,GAAQ,CAAC,CAAC,CAAC,IAAI,GACtD,CACP,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,kCAAkC,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,EAAW,CAAC;AACvM,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,iCAAiC,EAAE,UAAU,EAAE,uBAAuB,EAAW,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { MenuViewSection } from "@graview/react/provider";
|
|
2
|
+
/** The element a view is drawn in (`data-worker-view-place`), from a section of it. */
|
|
3
|
+
export declare function placeOfSection(section: MenuViewSection): Element | undefined;
|
|
4
|
+
/** One part, as it is read for its name. */
|
|
5
|
+
export interface PartRead {
|
|
6
|
+
readonly tag: string;
|
|
7
|
+
readonly classes: readonly string[];
|
|
8
|
+
readonly text: string;
|
|
9
|
+
readonly box: {
|
|
10
|
+
readonly left: number;
|
|
11
|
+
readonly top: number;
|
|
12
|
+
readonly width: number;
|
|
13
|
+
readonly height: number;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* THE PARTS, NAMED: one by its words ("the heading “This week”"), several
|
|
18
|
+
* by what they share and how they stand ("the three day columns"), else by
|
|
19
|
+
* what they are ("two links and a picture").
|
|
20
|
+
*/
|
|
21
|
+
export declare function nameParts(parts: readonly PartRead[]): string;
|
|
22
|
+
/** Each part in a line the model is told: what it is, its classes, its first words. */
|
|
23
|
+
export declare function partLines(parts: readonly PartRead[]): string[];
|
|
24
|
+
/**
|
|
25
|
+
* WHAT A PART IS CALLED, BY ITS OWN HEADING: "Someday" for a group pointed
|
|
26
|
+
* at, never its words run together ("Someday 4Find someone who moves
|
|
27
|
+
* pianos⚠…"). The heading a part is, or the first one in it, without a
|
|
28
|
+
* count or a disclosure's arrow; undefined where it has none, for the
|
|
29
|
+
* part's description to name it instead.
|
|
30
|
+
*/
|
|
31
|
+
export declare function aboutOf(elements: readonly Element[]): string | undefined;
|
|
32
|
+
//# sourceMappingURL=section-words.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-words.d.ts","sourceRoot":"","sources":["../src/section-words.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,GAAG,SAAS,CAG5E;AAED,4CAA4C;AAC5C,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAChH;AA2CD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CA0B5D;AAED,uFAAuF;AACvF,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,EAAE,CAE9D;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,GAAG,SAAS,CAYxE"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHAT A HIGHLIGHTED AREA COVERS, IN WORDS (Roadmap
|
|
3
|
+
* f-make-this-section-better): the parts of a view a person dragged over or
|
|
4
|
+
* clicked, named as they would name them — "the three day columns", "the
|
|
5
|
+
* heading “Dinner”" — from what each part is (its classes, its element,
|
|
6
|
+
* its words) and how they stand (side by side, one under another).
|
|
7
|
+
*/
|
|
8
|
+
/** The element a view is drawn in (`data-worker-view-place`), from a section of it. */
|
|
9
|
+
export function placeOfSection(section) {
|
|
10
|
+
const root = section.elements[0]?.getRootNode();
|
|
11
|
+
return root?.host?.closest("[data-worker-view-place]") ?? root?.host?.parentElement ?? undefined;
|
|
12
|
+
}
|
|
13
|
+
const NUMBERS = ["no", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve"];
|
|
14
|
+
const counted = (n) => NUMBERS[n] ?? String(n);
|
|
15
|
+
const words = (text) => text.replace(/\s+/g, " ").trim();
|
|
16
|
+
/** What an element is called, by what it is: one, and many. */
|
|
17
|
+
const NOUNS = {
|
|
18
|
+
li: ["item", "items"],
|
|
19
|
+
a: ["link", "links"],
|
|
20
|
+
button: ["button", "buttons"],
|
|
21
|
+
img: ["picture", "pictures"],
|
|
22
|
+
p: ["paragraph", "paragraphs"],
|
|
23
|
+
ul: ["list", "lists"],
|
|
24
|
+
ol: ["list", "lists"],
|
|
25
|
+
table: ["table", "tables"],
|
|
26
|
+
tr: ["row", "rows"],
|
|
27
|
+
td: ["cell", "cells"],
|
|
28
|
+
th: ["column heading", "column headings"],
|
|
29
|
+
section: ["section", "sections"],
|
|
30
|
+
article: ["card", "cards"],
|
|
31
|
+
nav: ["menu", "menus"],
|
|
32
|
+
form: ["form", "forms"],
|
|
33
|
+
input: ["field", "fields"],
|
|
34
|
+
label: ["label", "labels"],
|
|
35
|
+
};
|
|
36
|
+
const GENERIC = new Set(["js", "is", "has", "item", "items", "wrap", "inner", "outer", "box", "el", "block", "row", "col", "cell", "card", "pick", "active", "selected"]);
|
|
37
|
+
/** The word a class names its parts by: "hf-wk-day" is a day. */
|
|
38
|
+
function wordOfClass(name) {
|
|
39
|
+
const parts = name.split(/[-_]+/).filter((part) => /^[a-z]{3,}$/i.test(part) && !GENERIC.has(part.toLowerCase()));
|
|
40
|
+
return parts.at(-1)?.toLowerCase();
|
|
41
|
+
}
|
|
42
|
+
/** Whether boxes stand side by side (columns), one under another (rows), or neither. */
|
|
43
|
+
function standing(boxes) {
|
|
44
|
+
if (boxes.length < 2)
|
|
45
|
+
return undefined;
|
|
46
|
+
const near = (a, b) => Math.abs(a - b) <= 6;
|
|
47
|
+
if (boxes.every((box) => near(box.top, boxes[0].top)))
|
|
48
|
+
return "columns";
|
|
49
|
+
if (boxes.every((box) => near(box.left, boxes[0].left)))
|
|
50
|
+
return "rows";
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* THE PARTS, NAMED: one by its words ("the heading “This week”"), several
|
|
55
|
+
* by what they share and how they stand ("the three day columns"), else by
|
|
56
|
+
* what they are ("two links and a picture").
|
|
57
|
+
*/
|
|
58
|
+
export function nameParts(parts) {
|
|
59
|
+
if (parts.length === 0)
|
|
60
|
+
return "nothing";
|
|
61
|
+
if (parts.length === 1) {
|
|
62
|
+
const [one] = parts;
|
|
63
|
+
const heading = /^h[1-6]$/.test(one.tag);
|
|
64
|
+
const noun = heading ? "heading" : (NOUNS[one.tag]?.[0] ?? one.classes.map(wordOfClass).find(Boolean) ?? "part");
|
|
65
|
+
const said = words(one.text);
|
|
66
|
+
return said ? `the ${noun} “${said.length > 40 ? `${said.slice(0, 39)}…` : said}”` : `the ${noun}`;
|
|
67
|
+
}
|
|
68
|
+
const shared = parts[0].classes.filter((name) => parts.every((part) => part.classes.includes(name)));
|
|
69
|
+
const word = shared.map(wordOfClass).find(Boolean);
|
|
70
|
+
const tags = new Set(parts.map((part) => part.tag));
|
|
71
|
+
const stand = standing(parts.map((part) => part.box));
|
|
72
|
+
if (word)
|
|
73
|
+
return `the ${counted(parts.length)} ${word} ${stand ?? (tags.size === 1 && NOUNS[parts[0].tag] ? NOUNS[parts[0].tag][1] : "blocks")}`;
|
|
74
|
+
if (tags.size === 1) {
|
|
75
|
+
const noun = NOUNS[parts[0].tag]?.[1] ?? (/^h[1-6]$/.test(parts[0].tag) ? "headings" : (stand ?? "parts"));
|
|
76
|
+
return `the ${counted(parts.length)} ${noun}`;
|
|
77
|
+
}
|
|
78
|
+
// Different things: each kind counted, in the order first met.
|
|
79
|
+
const counts = new Map();
|
|
80
|
+
for (const part of parts) {
|
|
81
|
+
const noun = /^h[1-6]$/.test(part.tag) ? "heading" : (NOUNS[part.tag]?.[0] ?? "part");
|
|
82
|
+
counts.set(noun, (counts.get(noun) ?? 0) + 1);
|
|
83
|
+
}
|
|
84
|
+
const listed = [...counts].map(([noun, n]) => (n === 1 ? `a ${noun}` : `${counted(n)} ${NOUNS[Object.keys(NOUNS).find((tag) => NOUNS[tag][0] === noun) ?? ""]?.[1] ?? `${noun}s`}`));
|
|
85
|
+
return listed.length === 1 ? listed[0] : `${listed.slice(0, -1).join(", ")} and ${listed.at(-1)}`;
|
|
86
|
+
}
|
|
87
|
+
/** Each part in a line the model is told: what it is, its classes, its first words. */
|
|
88
|
+
export function partLines(parts) {
|
|
89
|
+
return parts.map((part) => `<${part.tag}${part.classes.length ? ` class="${part.classes.join(" ")}"` : ""}> ${words(part.text).slice(0, 60)}`.trim());
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* WHAT A PART IS CALLED, BY ITS OWN HEADING: "Someday" for a group pointed
|
|
93
|
+
* at, never its words run together ("Someday 4Find someone who moves
|
|
94
|
+
* pianos⚠…"). The heading a part is, or the first one in it, without a
|
|
95
|
+
* count or a disclosure's arrow; undefined where it has none, for the
|
|
96
|
+
* part's description to name it instead.
|
|
97
|
+
*/
|
|
98
|
+
export function aboutOf(elements) {
|
|
99
|
+
// Several parts pointed at together ("the three day columns") are named by what they are, not by the first one's heading.
|
|
100
|
+
if (elements.length !== 1)
|
|
101
|
+
return undefined;
|
|
102
|
+
for (const element of elements) {
|
|
103
|
+
const heading = element.matches("h1, h2, h3, h4, [role='heading']") ? element : element.querySelector("h1, h2, h3, h4, [role='heading']");
|
|
104
|
+
if (!heading)
|
|
105
|
+
continue;
|
|
106
|
+
const copy = heading.cloneNode(true);
|
|
107
|
+
for (const span of copy.querySelectorAll("span"))
|
|
108
|
+
if (/^[\s·\d]+$/.test(span.textContent ?? ""))
|
|
109
|
+
span.remove();
|
|
110
|
+
const said = (copy.textContent ?? "").replace(/\s+/g, " ").trim().replace(/^[▸▾]\s*/, "").replace(/\s*\d+$/, "");
|
|
111
|
+
if (said)
|
|
112
|
+
return said.length > 60 ? `${said.slice(0, 57)}…` : said;
|
|
113
|
+
}
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=section-words.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-words.js","sourceRoot":"","sources":["../src/section-words.ts"],"names":[],"mappings":"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"}
|
package/dist/shell.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { ToolCall } from "@graview/tools";
|
|
|
4
4
|
import { type ReactNode } from "react";
|
|
5
5
|
import { type HostAction } from "./profile.js";
|
|
6
6
|
import { type NoticeBoard, type NoticeReport } from "./notices.js";
|
|
7
|
-
import { type BarAction } from "./app-bar.js";
|
|
7
|
+
import { type AppMenuRow, type BarAction, type BarShare } from "./app-bar.js";
|
|
8
8
|
import { type FirstLook } from "./first-look-door.js";
|
|
9
9
|
/**
|
|
10
10
|
* The shell: everything an application's window holds that is not about
|
|
@@ -71,6 +71,10 @@ export interface ShellProps {
|
|
|
71
71
|
* folded into one control on a narrow bar. A host's, never the app's.
|
|
72
72
|
*/
|
|
73
73
|
readonly barActions?: readonly BarAction[];
|
|
74
|
+
/** THE HOST'S ROWS IN THE APP MENU (Roadmap f-app-bar-calm), after the scene and the pages. */
|
|
75
|
+
readonly appMenu?: readonly AppMenuRow[];
|
|
76
|
+
/** A HOST'S SHARE beside the people (Roadmap f-app-bar-calm): who can open the app, in a sentence, and where that changes. */
|
|
77
|
+
readonly share?: BarShare;
|
|
74
78
|
/**
|
|
75
79
|
* THE HOST'S "REPORT THIS" (FR-237): given, every warning or error toast
|
|
76
80
|
* the framework raises itself carries a button that hands the host the
|