@liberation-data/desk 0.1.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/LICENSE +201 -0
- package/NOTICE +4 -0
- package/README.md +436 -0
- package/dist/core/commands.d.ts +40 -0
- package/dist/core/commands.d.ts.map +1 -0
- package/dist/core/commands.js +92 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/desk.d.ts +46 -0
- package/dist/core/desk.d.ts.map +1 -0
- package/dist/core/desk.js +178 -0
- package/dist/core/desk.js.map +1 -0
- package/dist/core/events.d.ts +42 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +54 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/location.d.ts +30 -0
- package/dist/core/location.d.ts.map +1 -0
- package/dist/core/location.js +99 -0
- package/dist/core/location.js.map +1 -0
- package/dist/core/shortcuts.d.ts +36 -0
- package/dist/core/shortcuts.d.ts.map +1 -0
- package/dist/core/shortcuts.js +73 -0
- package/dist/core/shortcuts.js.map +1 -0
- package/dist/core/titles.d.ts +3 -0
- package/dist/core/titles.d.ts.map +1 -0
- package/dist/core/titles.js +26 -0
- package/dist/core/titles.js.map +1 -0
- package/dist/core/types.d.ts +51 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/desk.css +2550 -0
- package/dist/react/Desktop.d.ts +24 -0
- package/dist/react/Desktop.d.ts.map +1 -0
- package/dist/react/Desktop.js +212 -0
- package/dist/react/Desktop.js.map +1 -0
- package/dist/react/Dock.d.ts +42 -0
- package/dist/react/Dock.d.ts.map +1 -0
- package/dist/react/Dock.js +103 -0
- package/dist/react/Dock.js.map +1 -0
- package/dist/react/MenuBar.d.ts +64 -0
- package/dist/react/MenuBar.d.ts.map +1 -0
- package/dist/react/MenuBar.js +245 -0
- package/dist/react/MenuBar.js.map +1 -0
- package/dist/react/appFrame.d.ts +37 -0
- package/dist/react/appFrame.d.ts.map +1 -0
- package/dist/react/appFrame.js +119 -0
- package/dist/react/appFrame.js.map +1 -0
- package/dist/react/arrange.d.ts +24 -0
- package/dist/react/arrange.d.ts.map +1 -0
- package/dist/react/arrange.js +61 -0
- package/dist/react/arrange.js.map +1 -0
- package/dist/react/commands.d.ts +23 -0
- package/dist/react/commands.d.ts.map +1 -0
- package/dist/react/commands.js +41 -0
- package/dist/react/commands.js.map +1 -0
- package/dist/react/context.d.ts +25 -0
- package/dist/react/context.d.ts.map +1 -0
- package/dist/react/context.js +28 -0
- package/dist/react/context.js.map +1 -0
- package/dist/react/controls.d.ts +111 -0
- package/dist/react/controls.d.ts.map +1 -0
- package/dist/react/controls.js +83 -0
- package/dist/react/controls.js.map +1 -0
- package/dist/react/conversation.d.ts +41 -0
- package/dist/react/conversation.d.ts.map +1 -0
- package/dist/react/conversation.js +73 -0
- package/dist/react/conversation.js.map +1 -0
- package/dist/react/dnd.d.ts +51 -0
- package/dist/react/dnd.d.ts.map +1 -0
- package/dist/react/dnd.js +138 -0
- package/dist/react/dnd.js.map +1 -0
- package/dist/react/dragContext.d.ts +32 -0
- package/dist/react/dragContext.d.ts.map +1 -0
- package/dist/react/dragContext.js +14 -0
- package/dist/react/dragContext.js.map +1 -0
- package/dist/react/events.d.ts +41 -0
- package/dist/react/events.d.ts.map +1 -0
- package/dist/react/events.js +91 -0
- package/dist/react/events.js.map +1 -0
- package/dist/react/index.d.ts +43 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +22 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/layers.d.ts +5 -0
- package/dist/react/layers.d.ts.map +1 -0
- package/dist/react/layers.js +65 -0
- package/dist/react/layers.js.map +1 -0
- package/dist/react/overlays.d.ts +67 -0
- package/dist/react/overlays.d.ts.map +1 -0
- package/dist/react/overlays.js +98 -0
- package/dist/react/overlays.js.map +1 -0
- package/dist/react/popup.d.ts +21 -0
- package/dist/react/popup.d.ts.map +1 -0
- package/dist/react/popup.js +94 -0
- package/dist/react/popup.js.map +1 -0
- package/dist/react/search.d.ts +33 -0
- package/dist/react/search.d.ts.map +1 -0
- package/dist/react/search.js +82 -0
- package/dist/react/search.js.map +1 -0
- package/dist/react/setupProgress.d.ts +35 -0
- package/dist/react/setupProgress.d.ts.map +1 -0
- package/dist/react/setupProgress.js +68 -0
- package/dist/react/setupProgress.js.map +1 -0
- package/dist/react/shell.d.ts +17 -0
- package/dist/react/shell.d.ts.map +1 -0
- package/dist/react/shell.js +13 -0
- package/dist/react/shell.js.map +1 -0
- package/dist/react/sidebar.d.ts +23 -0
- package/dist/react/sidebar.d.ts.map +1 -0
- package/dist/react/sidebar.js +26 -0
- package/dist/react/sidebar.js.map +1 -0
- package/dist/react/table.d.ts +39 -0
- package/dist/react/table.d.ts.map +1 -0
- package/dist/react/table.js +86 -0
- package/dist/react/table.js.map +1 -0
- package/dist/react/tasks.d.ts +41 -0
- package/dist/react/tasks.d.ts.map +1 -0
- package/dist/react/tasks.js +79 -0
- package/dist/react/tasks.js.map +1 -0
- package/dist/react/tour.d.ts +42 -0
- package/dist/react/tour.d.ts.map +1 -0
- package/dist/react/tour.js +68 -0
- package/dist/react/tour.js.map +1 -0
- package/dist/react/windowBoundary.d.ts +22 -0
- package/dist/react/windowBoundary.d.ts.map +1 -0
- package/dist/react/windowBoundary.js +50 -0
- package/dist/react/windowBoundary.js.map +1 -0
- package/dist/react/wizard.d.ts +41 -0
- package/dist/react/wizard.d.ts.map +1 -0
- package/dist/react/wizard.js +60 -0
- package/dist/react/wizard.js.map +1 -0
- package/llms.txt +410 -0
- package/package.json +64 -0
- package/src/core/commands.ts +142 -0
- package/src/core/desk.ts +229 -0
- package/src/core/events.ts +99 -0
- package/src/core/index.ts +43 -0
- package/src/core/location.ts +127 -0
- package/src/core/shortcuts.ts +119 -0
- package/src/core/titles.ts +28 -0
- package/src/core/types.ts +49 -0
- package/src/desk.css +2550 -0
- package/src/react/Desktop.tsx +349 -0
- package/src/react/Dock.tsx +258 -0
- package/src/react/MenuBar.tsx +350 -0
- package/src/react/appFrame.tsx +183 -0
- package/src/react/arrange.ts +82 -0
- package/src/react/commands.ts +60 -0
- package/src/react/context.tsx +55 -0
- package/src/react/controls.tsx +364 -0
- package/src/react/conversation.tsx +208 -0
- package/src/react/dnd.tsx +189 -0
- package/src/react/dragContext.tsx +60 -0
- package/src/react/events.tsx +149 -0
- package/src/react/index.ts +64 -0
- package/src/react/layers.ts +66 -0
- package/src/react/overlays.tsx +254 -0
- package/src/react/popup.tsx +176 -0
- package/src/react/search.tsx +177 -0
- package/src/react/setupProgress.ts +113 -0
- package/src/react/shell.tsx +27 -0
- package/src/react/sidebar.tsx +84 -0
- package/src/react/table.tsx +176 -0
- package/src/react/tasks.tsx +176 -0
- package/src/react/tour.tsx +183 -0
- package/src/react/windowBoundary.tsx +110 -0
- package/src/react/wizard.tsx +150 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dnd.js","sourceRoot":"","sources":["../../src/react/dnd.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface Drag<T = unknown> {
|
|
3
|
+
readonly type: string;
|
|
4
|
+
readonly payload: T;
|
|
5
|
+
/** The window it was picked up in, when it was picked up in one. */
|
|
6
|
+
readonly from: string | null;
|
|
7
|
+
}
|
|
8
|
+
export type Accepts = string | readonly string[] | ((type: string) => boolean);
|
|
9
|
+
export declare const accepted: (accepts: Accepts, type: string) => boolean;
|
|
10
|
+
export interface Target {
|
|
11
|
+
readonly accepts: Accepts;
|
|
12
|
+
readonly onDrop: (drag: Drag) => void;
|
|
13
|
+
}
|
|
14
|
+
export interface DragState {
|
|
15
|
+
readonly drag: Drag;
|
|
16
|
+
readonly x: number;
|
|
17
|
+
readonly y: number;
|
|
18
|
+
readonly over: string | null;
|
|
19
|
+
readonly preview: ReactNode;
|
|
20
|
+
}
|
|
21
|
+
export interface DragContextValue {
|
|
22
|
+
readonly state: DragState | null;
|
|
23
|
+
readonly targets: Map<string, Target>;
|
|
24
|
+
readonly setState: (state: DragState | null) => void;
|
|
25
|
+
}
|
|
26
|
+
export declare const DragContext: import("react").Context<DragContextValue | null>;
|
|
27
|
+
export declare const TARGET_ATTRIBUTE = "data-desk-drop";
|
|
28
|
+
/** Holds what is being carried. A desk provides one; this is for sharing or nesting. */
|
|
29
|
+
export declare function DragProvider({ children }: {
|
|
30
|
+
readonly children: ReactNode;
|
|
31
|
+
}): import("react").JSX.Element;
|
|
32
|
+
//# sourceMappingURL=dragContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dragContext.d.ts","sourceRoot":"","sources":["../../src/react/dragContext.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAQtC,MAAM,WAAW,IAAI,CAAC,CAAC,GAAG,OAAO;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IACnB,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAA;AAE9E,eAAO,MAAM,QAAQ,YAAa,OAAO,QAAQ,MAAM,YACkE,CAAA;AAEzH,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;CACtC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAA;CACrD;AAED,eAAO,MAAM,WAAW,kDAA+C,CAAA;AAEvE,eAAO,MAAM,gBAAgB,mBAAmB,CAAA;AAEhD,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAc1E"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useMemo, useState } from 'react';
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
4
|
+
export const accepted = (accepts, type) => typeof accepts === 'function' ? accepts(type) : typeof accepts === 'string' ? accepts === type : accepts.includes(type);
|
|
5
|
+
export const DragContext = createContext(null);
|
|
6
|
+
export const TARGET_ATTRIBUTE = 'data-desk-drop';
|
|
7
|
+
/** Holds what is being carried. A desk provides one; this is for sharing or nesting. */
|
|
8
|
+
export function DragProvider({ children }) {
|
|
9
|
+
const [state, setState] = useState(null);
|
|
10
|
+
const [targets] = useState(() => new Map());
|
|
11
|
+
const value = useMemo(() => ({ state, targets, setState }), [state, targets]);
|
|
12
|
+
return (_jsxs(DragContext.Provider, { value: value, children: [children, state && (_jsx("div", { className: "desk-drag-preview", style: { left: state.x, top: state.y }, "aria-hidden": "true", children: state.preview }))] }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=dragContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dragContext.js","sourceRoot":"","sources":["../../src/react/dragContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAgBxC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAgB,EAAE,IAAY,EAAE,EAAE,CACzD,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AAqBzH,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAA;AAEvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAA;AAEhD,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,EAAoC;IACzE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAmB,IAAI,CAAC,CAAA;IAC1D,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,EAAkB,CAAC,CAAA;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;IAC7E,OAAO,CACL,MAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,aAC/B,QAAQ,EACR,KAAK,IAAI,CACR,cAAK,SAAS,EAAC,mBAAmB,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,iBAAc,MAAM,YAC1F,KAAK,CAAC,OAAO,GACV,CACP,IACoB,CACxB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { Bus, DeskEvent, EventHandler, SubscribeOptions } from '../core/events.js';
|
|
3
|
+
/** Supplies a bus of your own, or shares one across several desks. A desk already has one. */
|
|
4
|
+
export declare function BusProvider({ bus, children }: {
|
|
5
|
+
readonly bus?: Bus;
|
|
6
|
+
readonly children: ReactNode;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
8
|
+
export declare function useBus(): Bus;
|
|
9
|
+
/** Publishes an event, stamped with the window it came from. */
|
|
10
|
+
export declare function usePublish(): <T>(topic: string, payload: T) => DeskEvent<T>;
|
|
11
|
+
/** Answers events on a topic (`ride.selected`, `ride.*`, `*`) while mounted. */
|
|
12
|
+
export declare function useDeskEvent<T = unknown>(topic: string, handler: EventHandler<T>, options?: SubscribeOptions): void;
|
|
13
|
+
export interface WindowInputOptions {
|
|
14
|
+
readonly placeholder?: string;
|
|
15
|
+
/** What the bar says the text will reach. Defaults to the window's id. */
|
|
16
|
+
readonly target?: string;
|
|
17
|
+
readonly disabled?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Takes the text typed into the desk's input bar while this window is key.
|
|
21
|
+
* A window that registers nothing lets the bar's own fallback have it.
|
|
22
|
+
*/
|
|
23
|
+
export declare function useWindowInput(handler: (text: string) => void, options?: WindowInputOptions): void;
|
|
24
|
+
export interface InputBarProps {
|
|
25
|
+
/** Used when no window takes the text. */
|
|
26
|
+
readonly onSubmit: (text: string) => void;
|
|
27
|
+
readonly fallbackPlaceholder?: string;
|
|
28
|
+
readonly fallbackTarget?: string;
|
|
29
|
+
readonly label?: string;
|
|
30
|
+
/**
|
|
31
|
+
* `summoned` (the default) stays out of the way until called for, then opens
|
|
32
|
+
* over the middle of the screen. `inline` is always there, wherever you put it.
|
|
33
|
+
*/
|
|
34
|
+
readonly mode?: 'summoned' | 'inline';
|
|
35
|
+
/** Summons the bar. Default `mod+j`; `null` binds nothing (a menu item may own the key). */
|
|
36
|
+
readonly shortcut?: string | null;
|
|
37
|
+
readonly className?: string;
|
|
38
|
+
}
|
|
39
|
+
/** One place to type, which reaches whichever window you are working in. */
|
|
40
|
+
export declare function InputBar({ onSubmit, fallbackPlaceholder, fallbackTarget, label, mode, shortcut, className, }: InputBarProps): import("react").JSX.Element | null;
|
|
41
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/react/events.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAoB,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAOzG,8FAA8F;AAC9F,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAGlG;AAED,wBAAgB,MAAM,IAAI,GAAG,CAI5B;AAED,gEAAgE;AAChE,wBAAgB,UAAU,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAI3E;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,gBAAqB,GAAG,IAAI,CAMvH;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,OAAO,GAAE,kBAAuB,GAAG,IAAI,CAWtG;AAED,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAA;IACrC,4FAA4F;IAC5F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,mBAAkC,EAClC,cAAc,EACd,KAAmB,EACnB,IAAiB,EACjB,QAAkB,EAClB,SAAS,GACV,EAAE,aAAa,sCA2Df"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useContext, useEffect, useId, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
4
|
+
import { perform } from '../core/commands.js';
|
|
5
|
+
import { createBus, InputCommands } from '../core/events.js';
|
|
6
|
+
import { useCommand, useShortcuts } from './commands.js';
|
|
7
|
+
import { Composer } from './conversation.js';
|
|
8
|
+
import { useFocusTrap, useLayer } from './layers.js';
|
|
9
|
+
import { BusContext, useDesk, useDeskState, useWindowId } from './context.js';
|
|
10
|
+
/** Supplies a bus of your own, or shares one across several desks. A desk already has one. */
|
|
11
|
+
export function BusProvider({ bus, children }) {
|
|
12
|
+
const [value] = useState(() => bus ?? createBus());
|
|
13
|
+
return _jsx(BusContext.Provider, { value: value, children: children });
|
|
14
|
+
}
|
|
15
|
+
export function useBus() {
|
|
16
|
+
const bus = useContext(BusContext);
|
|
17
|
+
if (!bus)
|
|
18
|
+
throw new Error('useBus must be used inside a <DeskProvider> or <BusProvider>');
|
|
19
|
+
return bus;
|
|
20
|
+
}
|
|
21
|
+
/** Publishes an event, stamped with the window it came from. */
|
|
22
|
+
export function usePublish() {
|
|
23
|
+
const bus = useBus();
|
|
24
|
+
const from = useWindowId();
|
|
25
|
+
return useCallback((topic, payload) => bus.publish(topic, payload, { from }), [bus, from]);
|
|
26
|
+
}
|
|
27
|
+
/** Answers events on a topic (`ride.selected`, `ride.*`, `*`) while mounted. */
|
|
28
|
+
export function useDeskEvent(topic, handler, options = {}) {
|
|
29
|
+
const bus = useBus();
|
|
30
|
+
const latest = useRef(handler);
|
|
31
|
+
latest.current = handler;
|
|
32
|
+
const { replay } = options;
|
|
33
|
+
useEffect(() => bus.subscribe(topic, event => latest.current(event), { replay: replay ?? false }), [bus, topic, replay]);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Takes the text typed into the desk's input bar while this window is key.
|
|
37
|
+
* A window that registers nothing lets the bar's own fallback have it.
|
|
38
|
+
*/
|
|
39
|
+
export function useWindowInput(handler, options = {}) {
|
|
40
|
+
const windowId = useWindowId();
|
|
41
|
+
const { placeholder, target, disabled } = options;
|
|
42
|
+
useCommand(InputCommands.submit, handler, { enabled: !disabled });
|
|
43
|
+
// The bar asks the chain how to present itself; the answer is written into the object it sends.
|
|
44
|
+
useCommand(InputCommands.describe, description => {
|
|
45
|
+
if (placeholder)
|
|
46
|
+
description.placeholder = placeholder;
|
|
47
|
+
const named = target ?? windowId;
|
|
48
|
+
if (named)
|
|
49
|
+
description.target = named;
|
|
50
|
+
description.disabled = disabled ?? false;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/** One place to type, which reaches whichever window you are working in. */
|
|
54
|
+
export function InputBar({ onSubmit, fallbackPlaceholder = 'Type here…', fallbackTarget, label = 'Type here', mode = 'summoned', shortcut = 'mod+j', className, }) {
|
|
55
|
+
const desk = useDesk();
|
|
56
|
+
const state = useDeskState();
|
|
57
|
+
const [value, setValue] = useState('');
|
|
58
|
+
const [open, setOpen] = useState(mode === 'inline');
|
|
59
|
+
const [description, setDescription] = useState({});
|
|
60
|
+
const panel = useRef(null);
|
|
61
|
+
const id = useId();
|
|
62
|
+
const summoned = mode === 'summoned';
|
|
63
|
+
useCommand(InputCommands.open, () => setOpen(true), { at: 'app' });
|
|
64
|
+
useShortcuts(useMemo(() => (shortcut && summoned ? { [shortcut]: InputCommands.open } : {}), [shortcut, summoned]));
|
|
65
|
+
useLayer(id, summoned && open, () => setOpen(false));
|
|
66
|
+
useFocusTrap(panel, summoned && open);
|
|
67
|
+
// Re-ask whenever the key window changes, or the bar is summoned: it belongs to whoever is in front.
|
|
68
|
+
const key = state.stack.at(-1) ?? null;
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
if (!open)
|
|
71
|
+
return;
|
|
72
|
+
const answer = {};
|
|
73
|
+
perform(desk, InputCommands.describe, answer);
|
|
74
|
+
setDescription(answer);
|
|
75
|
+
}, [desk, key, open, id]);
|
|
76
|
+
if (!open)
|
|
77
|
+
return null;
|
|
78
|
+
const submit = (text) => {
|
|
79
|
+
if (!perform(desk, InputCommands.submit, text))
|
|
80
|
+
onSubmit(text);
|
|
81
|
+
setValue('');
|
|
82
|
+
if (summoned)
|
|
83
|
+
setOpen(false);
|
|
84
|
+
};
|
|
85
|
+
const target = description.target ?? fallbackTarget;
|
|
86
|
+
const bar = (_jsxs("div", { ref: panel, className: ['desk-inputbar', className].filter(Boolean).join(' '), "data-mode": mode, children: [_jsx(Composer, { value: value, onChange: setValue, onSubmit: submit, label: label, placeholder: description.placeholder ?? fallbackPlaceholder, maxRows: 4, ...(description.disabled ? { disabled: true } : {}) }), target && (_jsxs("span", { className: "desk-inputbar-target", "aria-live": "polite", children: ["goes to ", _jsx("b", { children: target })] }))] }));
|
|
87
|
+
if (!summoned)
|
|
88
|
+
return bar;
|
|
89
|
+
return createPortal(_jsx("div", { className: "desk-inputbar-scrim", onPointerDown: event => event.target === event.currentTarget && setOpen(false), children: bar }), document.body);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/react/events.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export { APP_BRIDGE_SCRIPT, AppFrame, withAppBridge } from './appFrame.js';
|
|
2
|
+
export type { AppFrameProps } from './appFrame.js';
|
|
3
|
+
export { DragProvider, useDraggable, useDragging, useDragSource, useDropTarget } from './dnd.js';
|
|
4
|
+
export type { Accepts, Drag, DraggableOptions, DraggableResult, DragSource, DragSourceOptions, DropTargetOptions, DropTargetResult, } from './dnd.js';
|
|
5
|
+
export { DeskShell } from './shell.js';
|
|
6
|
+
export type { DeskShellProps } from './shell.js';
|
|
7
|
+
export { DeskProvider, useDesk, useDeskState, useWindowId } from './context.js';
|
|
8
|
+
export type { DeskProviderProps } from './context.js';
|
|
9
|
+
export { useCanPerform, useCommand, usePerform, useShortcuts } from './commands.js';
|
|
10
|
+
export type { UseCommandOptions } from './commands.js';
|
|
11
|
+
export { Desktop } from './Desktop.js';
|
|
12
|
+
export type { DeskLayout, DesktopProps } from './Desktop.js';
|
|
13
|
+
export { lazyWindow } from './windowBoundary.js';
|
|
14
|
+
export type { WindowFailed, WindowLoading } from './windowBoundary.js';
|
|
15
|
+
export { Button, Checkbox, ChoiceGroup, RadioGroup, SegmentedControl, Slider, TextField, Toggle } from './controls.js';
|
|
16
|
+
export type { ButtonIntent, ButtonProps, CheckboxProps, ChoiceGroupProps, ChoiceOption, RadioGroupProps, RadioOption, SegmentedControlProps, SegmentedOption, SliderProps, TextFieldProps, ToggleProps, } from './controls.js';
|
|
17
|
+
export { Checklist, useTasks } from './tasks.js';
|
|
18
|
+
export { localSetupStore, useSetupProgress } from './setupProgress.js';
|
|
19
|
+
export type { SetupProgress, SetupProgressOptions, SetupRecord, SetupStore } from './setupProgress.js';
|
|
20
|
+
export type { ChecklistProps, Task, TaskProgress, Tasks, TaskState } from './tasks.js';
|
|
21
|
+
export { PopUpButton } from './popup.js';
|
|
22
|
+
export type { PopUpButtonProps, PopUpOption } from './popup.js';
|
|
23
|
+
export { Table } from './table.js';
|
|
24
|
+
export type { Column, Sort, TableProps } from './table.js';
|
|
25
|
+
export { Sidebar } from './sidebar.js';
|
|
26
|
+
export type { SidebarItem, SidebarProps, SidebarSection } from './sidebar.js';
|
|
27
|
+
export { Wizard } from './wizard.js';
|
|
28
|
+
export type { WizardProps, WizardStep } from './wizard.js';
|
|
29
|
+
export { TourBar } from './tour.js';
|
|
30
|
+
export type { Tour, TourBarProps, TourStep } from './tour.js';
|
|
31
|
+
export { SearchCommand, SearchPalette, windowResults } from './search.js';
|
|
32
|
+
export type { SearchPaletteProps, SearchResult } from './search.js';
|
|
33
|
+
export { BusProvider, InputBar, useBus, useDeskEvent, usePublish, useWindowInput } from './events.js';
|
|
34
|
+
export type { InputBarProps, WindowInputOptions } from './events.js';
|
|
35
|
+
export { Composer, Thread } from './conversation.js';
|
|
36
|
+
export type { ComposerProps, Message, ThreadProps } from './conversation.js';
|
|
37
|
+
export { Alert, Popover, Sheet, ToastProvider, useToast } from './overlays.js';
|
|
38
|
+
export type { AlertProps, PopoverProps, PopoverTriggerProps, SheetProps, Toast, ToastInput } from './overlays.js';
|
|
39
|
+
export { MenuBar, menuAction, menuCommand, menuHeader, menuSeparator, windowMenuItems } from './MenuBar.js';
|
|
40
|
+
export type { Menu, MenuBarProps, MenuItem } from './MenuBar.js';
|
|
41
|
+
export { Dock, dockItem, dockSeparator, dockStack } from './Dock.js';
|
|
42
|
+
export type { DockEntry, DockItem, DockProps, DockStack } from './Dock.js';
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export { APP_BRIDGE_SCRIPT, AppFrame, withAppBridge } from './appFrame.js';
|
|
2
|
+
export { DragProvider, useDraggable, useDragging, useDragSource, useDropTarget } from './dnd.js';
|
|
3
|
+
export { DeskShell } from './shell.js';
|
|
4
|
+
export { DeskProvider, useDesk, useDeskState, useWindowId } from './context.js';
|
|
5
|
+
export { useCanPerform, useCommand, usePerform, useShortcuts } from './commands.js';
|
|
6
|
+
export { Desktop } from './Desktop.js';
|
|
7
|
+
export { lazyWindow } from './windowBoundary.js';
|
|
8
|
+
export { Button, Checkbox, ChoiceGroup, RadioGroup, SegmentedControl, Slider, TextField, Toggle } from './controls.js';
|
|
9
|
+
export { Checklist, useTasks } from './tasks.js';
|
|
10
|
+
export { localSetupStore, useSetupProgress } from './setupProgress.js';
|
|
11
|
+
export { PopUpButton } from './popup.js';
|
|
12
|
+
export { Table } from './table.js';
|
|
13
|
+
export { Sidebar } from './sidebar.js';
|
|
14
|
+
export { Wizard } from './wizard.js';
|
|
15
|
+
export { TourBar } from './tour.js';
|
|
16
|
+
export { SearchCommand, SearchPalette, windowResults } from './search.js';
|
|
17
|
+
export { BusProvider, InputBar, useBus, useDeskEvent, usePublish, useWindowInput } from './events.js';
|
|
18
|
+
export { Composer, Thread } from './conversation.js';
|
|
19
|
+
export { Alert, Popover, Sheet, ToastProvider, useToast } from './overlays.js';
|
|
20
|
+
export { MenuBar, menuAction, menuCommand, menuHeader, menuSeparator, windowMenuItems } from './MenuBar.js';
|
|
21
|
+
export { Dock, dockItem, dockSeparator, dockStack } from './Dock.js';
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE1E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAWhG,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEnF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAetH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAGtE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEzE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAErG,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAEpD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE9E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE3G,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RefObject } from 'react';
|
|
2
|
+
export declare function useLayer(id: string, open: boolean, onEscape: () => void): void;
|
|
3
|
+
/** Holds keyboard focus inside `panel` while open, and gives it back on close. */
|
|
4
|
+
export declare function useFocusTrap(panel: RefObject<HTMLElement | null>, open: boolean): void;
|
|
5
|
+
//# sourceMappingURL=layers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../../src/react/layers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAUtC,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,QAiBvE;AAOD,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,QA4B/E"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
|
2
|
+
/*
|
|
3
|
+
* What every overlay needs: a shared stack so Escape dismisses the topmost one
|
|
4
|
+
* rather than all of them, and a focus trap that gives focus back on the way out.
|
|
5
|
+
*/
|
|
6
|
+
const layers = [];
|
|
7
|
+
const isTopLayer = (id) => layers.at(-1) === id;
|
|
8
|
+
export function useLayer(id, open, onEscape) {
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
if (!open)
|
|
11
|
+
return;
|
|
12
|
+
layers.push(id);
|
|
13
|
+
const onKeyDown = (event) => {
|
|
14
|
+
if (event.key !== 'Escape' || !isTopLayer(id))
|
|
15
|
+
return;
|
|
16
|
+
event.preventDefault();
|
|
17
|
+
event.stopPropagation();
|
|
18
|
+
onEscape();
|
|
19
|
+
};
|
|
20
|
+
document.addEventListener('keydown', onKeyDown, true);
|
|
21
|
+
return () => {
|
|
22
|
+
const at = layers.lastIndexOf(id);
|
|
23
|
+
if (at >= 0)
|
|
24
|
+
layers.splice(at, 1);
|
|
25
|
+
document.removeEventListener('keydown', onKeyDown, true);
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const TABBABLE = 'a[href], button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex="-1"])';
|
|
30
|
+
const tabbable = (root) => [...root.querySelectorAll(TABBABLE)].filter(el => !el.closest('[inert]'));
|
|
31
|
+
/** Holds keyboard focus inside `panel` while open, and gives it back on close. */
|
|
32
|
+
export function useFocusTrap(panel, open) {
|
|
33
|
+
const returnTo = useRef(null);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (!open)
|
|
36
|
+
return;
|
|
37
|
+
returnTo.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
38
|
+
const first = panel.current && (tabbable(panel.current)[0] ?? panel.current);
|
|
39
|
+
first?.focus({ preventScroll: true });
|
|
40
|
+
const onKeyDown = (event) => {
|
|
41
|
+
if (event.key !== 'Tab' || !panel.current)
|
|
42
|
+
return;
|
|
43
|
+
const stops = tabbable(panel.current);
|
|
44
|
+
if (!stops.length)
|
|
45
|
+
return;
|
|
46
|
+
const [first, last] = [stops[0], stops.at(-1)];
|
|
47
|
+
const active = document.activeElement;
|
|
48
|
+
if (event.shiftKey && (active === first || !panel.current.contains(active))) {
|
|
49
|
+
event.preventDefault();
|
|
50
|
+
last.focus();
|
|
51
|
+
}
|
|
52
|
+
else if (!event.shiftKey && active === last) {
|
|
53
|
+
event.preventDefault();
|
|
54
|
+
first.focus();
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
document.addEventListener('keydown', onKeyDown, true);
|
|
58
|
+
return () => {
|
|
59
|
+
document.removeEventListener('keydown', onKeyDown, true);
|
|
60
|
+
if (returnTo.current?.isConnected)
|
|
61
|
+
returnTo.current.focus({ preventScroll: true });
|
|
62
|
+
};
|
|
63
|
+
}, [open, panel]);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=layers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layers.js","sourceRoot":"","sources":["../../src/react/layers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode, RefObject } from 'react';
|
|
2
|
+
export interface PopoverTriggerProps {
|
|
3
|
+
readonly ref: RefObject<HTMLButtonElement | null>;
|
|
4
|
+
readonly 'aria-haspopup': 'dialog';
|
|
5
|
+
readonly 'aria-expanded': boolean;
|
|
6
|
+
readonly onClick: () => void;
|
|
7
|
+
}
|
|
8
|
+
export interface PopoverProps {
|
|
9
|
+
readonly open: boolean;
|
|
10
|
+
readonly onOpenChange: (open: boolean) => void;
|
|
11
|
+
/** The accessible name of the popover. */
|
|
12
|
+
readonly label: string;
|
|
13
|
+
/** Renders the control the popover hangs from; spread the props it is given. */
|
|
14
|
+
readonly trigger: (props: PopoverTriggerProps) => ReactElement;
|
|
15
|
+
readonly placement?: 'below' | 'above';
|
|
16
|
+
readonly align?: 'start' | 'end';
|
|
17
|
+
readonly children: ReactNode;
|
|
18
|
+
}
|
|
19
|
+
export declare function Popover({ open, onOpenChange, label, trigger, placement, align, children }: PopoverProps): import("react").JSX.Element;
|
|
20
|
+
export interface SheetProps {
|
|
21
|
+
readonly open: boolean;
|
|
22
|
+
readonly onDismiss: () => void;
|
|
23
|
+
readonly title: string;
|
|
24
|
+
readonly description?: ReactNode;
|
|
25
|
+
/** Buttons, trailing-aligned. Cancel before the default button. */
|
|
26
|
+
readonly actions?: ReactNode;
|
|
27
|
+
readonly children?: ReactNode;
|
|
28
|
+
}
|
|
29
|
+
export declare function Sheet({ open, onDismiss, title, description, actions, children }: SheetProps): import("react").ReactPortal | null;
|
|
30
|
+
export interface AlertProps {
|
|
31
|
+
readonly open: boolean;
|
|
32
|
+
readonly title: string;
|
|
33
|
+
readonly message?: ReactNode;
|
|
34
|
+
/** The action the alert is asking about. */
|
|
35
|
+
readonly confirmLabel: string;
|
|
36
|
+
readonly onConfirm: () => void;
|
|
37
|
+
readonly onCancel: () => void;
|
|
38
|
+
readonly cancelLabel?: string;
|
|
39
|
+
/** Use for anything that cannot be undone. */
|
|
40
|
+
readonly destructive?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export declare function Alert({ open, title, message, confirmLabel, onConfirm, onCancel, cancelLabel, destructive }: AlertProps): import("react").ReactPortal | null;
|
|
43
|
+
export interface Toast {
|
|
44
|
+
readonly id: string;
|
|
45
|
+
readonly message: ReactNode;
|
|
46
|
+
readonly tone?: 'neutral' | 'ok' | 'bad';
|
|
47
|
+
/** Usually Undo. Dismisses the toast when chosen. */
|
|
48
|
+
readonly action?: {
|
|
49
|
+
readonly label: string;
|
|
50
|
+
readonly onSelect: () => void;
|
|
51
|
+
};
|
|
52
|
+
/** Milliseconds. 0 keeps it until dismissed. Default 6000. */
|
|
53
|
+
readonly duration?: number;
|
|
54
|
+
}
|
|
55
|
+
export type ToastInput = Omit<Toast, 'id'> & {
|
|
56
|
+
readonly id?: string;
|
|
57
|
+
};
|
|
58
|
+
interface ToastApi {
|
|
59
|
+
show: (toast: ToastInput) => string;
|
|
60
|
+
dismiss: (id: string) => void;
|
|
61
|
+
}
|
|
62
|
+
export declare function ToastProvider({ children }: {
|
|
63
|
+
readonly children: ReactNode;
|
|
64
|
+
}): import("react").JSX.Element;
|
|
65
|
+
export declare function useToast(): ToastApi;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=overlays.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../../src/react/overlays.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
4
|
+
import { windowElement } from '../core/commands.js';
|
|
5
|
+
import { Button } from './controls.js';
|
|
6
|
+
import { useWindowId } from './context.js';
|
|
7
|
+
import { useFocusTrap, useLayer } from './layers.js';
|
|
8
|
+
export function Popover({ open, onOpenChange, label, trigger, placement = 'below', align = 'start', children }) {
|
|
9
|
+
const id = useId();
|
|
10
|
+
const button = useRef(null);
|
|
11
|
+
const panel = useRef(null);
|
|
12
|
+
useLayer(id, open, () => onOpenChange(false));
|
|
13
|
+
useFocusTrap(panel, open);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (!open)
|
|
16
|
+
return;
|
|
17
|
+
const onPointerDown = (event) => {
|
|
18
|
+
const target = event.target;
|
|
19
|
+
if (!panel.current?.contains(target) && !button.current?.contains(target))
|
|
20
|
+
onOpenChange(false);
|
|
21
|
+
};
|
|
22
|
+
document.addEventListener('pointerdown', onPointerDown, true);
|
|
23
|
+
return () => document.removeEventListener('pointerdown', onPointerDown, true);
|
|
24
|
+
}, [open, onOpenChange]);
|
|
25
|
+
return (_jsxs("span", { className: "desk-popover-anchor", children: [trigger({ ref: button, 'aria-haspopup': 'dialog', 'aria-expanded': open, onClick: () => onOpenChange(!open) }), open && (_jsx("div", { ref: panel, role: "dialog", "aria-label": label, className: "desk-popover", "data-placement": placement, "data-align": align, children: children }))] }));
|
|
26
|
+
}
|
|
27
|
+
export function Sheet({ open, onDismiss, title, description, actions, children }) {
|
|
28
|
+
const id = useId();
|
|
29
|
+
const panel = useRef(null);
|
|
30
|
+
const windowId = useWindowId();
|
|
31
|
+
// A sheet blocks its own window and nothing else, so it lives inside that window. It is
|
|
32
|
+
// found in the document rather than through a ref: a window's ref is attached after the
|
|
33
|
+
// effects of the content it holds have already run.
|
|
34
|
+
const [host, setHost] = useState(null);
|
|
35
|
+
useLayoutEffect(() => {
|
|
36
|
+
if (!open) {
|
|
37
|
+
setHost(null);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const element = windowId ? windowElement(document, windowId) : null;
|
|
41
|
+
setHost(element instanceof HTMLElement ? element : document.body);
|
|
42
|
+
}, [open, windowId]);
|
|
43
|
+
useLayer(id, open, onDismiss);
|
|
44
|
+
useFocusTrap(panel, open && host !== null);
|
|
45
|
+
if (!open || !host)
|
|
46
|
+
return null;
|
|
47
|
+
return createPortal(_jsx("div", { className: "desk-sheet-scrim", children: _jsxs("div", { ref: panel, role: "dialog", "aria-modal": "true", "aria-labelledby": `${id}-title`, className: "desk-sheet", children: [_jsx("h2", { id: `${id}-title`, className: "desk-sheet-title", children: title }), description && _jsx("p", { className: "desk-sheet-description", children: description }), children, actions && _jsx("div", { className: "desk-sheet-actions", children: actions })] }) }), host);
|
|
48
|
+
}
|
|
49
|
+
export function Alert({ open, title, message, confirmLabel, onConfirm, onCancel, cancelLabel = 'Cancel', destructive }) {
|
|
50
|
+
const id = useId();
|
|
51
|
+
const panel = useRef(null);
|
|
52
|
+
useLayer(id, open, onCancel);
|
|
53
|
+
useFocusTrap(panel, open);
|
|
54
|
+
if (!open)
|
|
55
|
+
return null;
|
|
56
|
+
return createPortal(_jsx("div", { className: "desk-alert-scrim", children: _jsxs("div", { ref: panel, role: "alertdialog", "aria-modal": "true", "aria-labelledby": `${id}-title`, "aria-describedby": message ? `${id}-message` : undefined, className: "desk-alert", children: [_jsx("h2", { id: `${id}-title`, className: "desk-alert-title", children: title }), message && _jsx("p", { id: `${id}-message`, className: "desk-alert-message", children: message }), _jsxs("div", { className: "desk-alert-actions", children: [_jsx(Button, { onClick: onCancel, children: cancelLabel }), _jsx(Button, { intent: destructive ? 'destructive' : 'default', onClick: onConfirm, children: confirmLabel })] })] }) }), document.body);
|
|
57
|
+
}
|
|
58
|
+
const ToastContext = createContext(null);
|
|
59
|
+
export function ToastProvider({ children }) {
|
|
60
|
+
const [toasts, setToasts] = useState([]);
|
|
61
|
+
const counter = useRef(0);
|
|
62
|
+
const dismiss = useCallback((id) => setToasts(list => list.filter(t => t.id !== id)), []);
|
|
63
|
+
const show = useCallback((toast) => {
|
|
64
|
+
const id = toast.id ?? `toast-${(counter.current += 1)}`;
|
|
65
|
+
setToasts(list => [...list.filter(t => t.id !== id), { ...toast, id }]);
|
|
66
|
+
return id;
|
|
67
|
+
}, []);
|
|
68
|
+
const api = useMemo(() => ({ show, dismiss }), [show, dismiss]);
|
|
69
|
+
return (_jsxs(ToastContext.Provider, { value: api, children: [children, _jsx(ToastStack, { toasts: toasts, onDismiss: dismiss })] }));
|
|
70
|
+
}
|
|
71
|
+
export function useToast() {
|
|
72
|
+
const api = useContext(ToastContext);
|
|
73
|
+
if (!api)
|
|
74
|
+
throw new Error('useToast must be used inside a <ToastProvider>');
|
|
75
|
+
return api;
|
|
76
|
+
}
|
|
77
|
+
function ToastStack({ toasts, onDismiss }) {
|
|
78
|
+
if (!toasts.length)
|
|
79
|
+
return null;
|
|
80
|
+
return createPortal(_jsx("div", { className: "desk-toasts", children: toasts.map(toast => (_jsx(ToastView, { toast: toast, onDismiss: () => onDismiss(toast.id) }, toast.id))) }), document.body);
|
|
81
|
+
}
|
|
82
|
+
function ToastView({ toast, onDismiss }) {
|
|
83
|
+
const [paused, setPaused] = useState(false);
|
|
84
|
+
const duration = toast.duration ?? 6000;
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
if (!duration || paused)
|
|
87
|
+
return;
|
|
88
|
+
const timer = setTimeout(onDismiss, duration);
|
|
89
|
+
return () => clearTimeout(timer);
|
|
90
|
+
}, [duration, paused, onDismiss]);
|
|
91
|
+
return (_jsxs("div", { className: "desk-toast", "data-tone": toast.tone ?? 'neutral', role: toast.tone === 'bad' ? 'alert' : 'status',
|
|
92
|
+
// Reading it, or reaching for Undo, should not start the clock against you.
|
|
93
|
+
onPointerEnter: () => setPaused(true), onPointerLeave: () => setPaused(false), onFocusCapture: () => setPaused(true), onBlurCapture: () => setPaused(false), children: [_jsx("span", { className: "desk-toast-message", children: toast.message }), toast.action && (_jsx(Button, { size: "small", intent: "quiet", onClick: () => {
|
|
94
|
+
toast.action?.onSelect();
|
|
95
|
+
onDismiss();
|
|
96
|
+
}, children: toast.action.label })), _jsx(Button, { size: "small", intent: "quiet", "aria-label": "Dismiss", onClick: onDismiss, children: "\u2715" })] }));
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=overlays.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlays.js","sourceRoot":"","sources":["../../src/react/overlays.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface PopUpOption<T extends string> {
|
|
3
|
+
readonly value: T;
|
|
4
|
+
readonly label: string;
|
|
5
|
+
readonly description?: string;
|
|
6
|
+
readonly icon?: ReactNode;
|
|
7
|
+
readonly disabled?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface PopUpButtonProps<T extends string> {
|
|
10
|
+
readonly value: T | null;
|
|
11
|
+
readonly onChange: (value: T) => void;
|
|
12
|
+
readonly options: readonly PopUpOption<T>[];
|
|
13
|
+
readonly label: string;
|
|
14
|
+
/** Hides the label on screen but keeps it for assistive technology. */
|
|
15
|
+
readonly labelHidden?: boolean;
|
|
16
|
+
readonly placeholder?: string;
|
|
17
|
+
readonly disabled?: boolean;
|
|
18
|
+
readonly size?: 'regular' | 'small';
|
|
19
|
+
}
|
|
20
|
+
export declare function PopUpButton<T extends string>({ value, onChange, options, label, labelHidden, placeholder, disabled, size, }: PopUpButtonProps<T>): import("react").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=popup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popup.d.ts","sourceRoot":"","sources":["../../src/react/popup.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAA;AAQrD,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM;IAC3C,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;IACjB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAA;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM;IAChD,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,uEAAuE;IACvE,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAA;CACpC;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,EAC5C,KAAK,EACL,QAAQ,EACR,OAAO,EACP,KAAK,EACL,WAAW,EACX,WAAuB,EACvB,QAAQ,EACR,IAAgB,GACjB,EAAE,gBAAgB,CAAC,CAAC,CAAC,+BAyIrB"}
|