@tearleads/windowing 0.1.1 → 0.2.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/README.md +32 -6
- package/createRequiredContext.js.map +1 -1
- package/index.js.map +1 -1
- package/menu/Menu.js.map +1 -1
- package/menu/MenuItem.js.map +1 -1
- package/menu/useContextMenuState.js.map +1 -1
- package/menu/useMenuKeyboard.js.map +1 -1
- package/package.json +1 -1
- package/sidebar/SidebarResize.js.map +1 -1
- package/window/CurrentWindowContext.js.map +1 -1
- package/window/Window.d.ts +8 -1
- package/window/Window.js +9 -12
- package/window/Window.js.map +1 -1
- package/window/WindowBody.js.map +1 -1
- package/window/WindowChromeActions.d.ts +7 -0
- package/window/WindowChromeActions.js +3 -1
- package/window/WindowChromeActions.js.map +1 -1
- package/window/WindowCloseButton.js.map +1 -1
- package/window/WindowMaximizeButton.js.map +1 -1
- package/window/WindowMenuBar.js.map +1 -1
- package/window/WindowMenuContext.js.map +1 -1
- package/window/WindowMinimizeButton.js.map +1 -1
- package/window/WindowResizeHandle.css +121 -32
- package/window/WindowResizeHandle.d.ts +8 -4
- package/window/WindowResizeHandle.js +18 -3
- package/window/WindowResizeHandle.js.map +1 -1
- package/window/WindowSidebar.js.map +1 -1
- package/window/WindowSidebarContext.js.map +1 -1
- package/window/WindowStateProvider/WindowStateProvider.js.map +1 -1
- package/window/WindowStateProvider/context.js.map +1 -1
- package/window/WindowStateProvider/index.js.map +1 -1
- package/window/WindowStateProvider/types.js.map +1 -1
- package/window/WindowStateProvider/useWindowActions.js.map +1 -1
- package/window/WindowStateProvider/useWindowStateActions.js.map +1 -1
- package/window/WindowStateProvider/useWindowStateData.js.map +1 -1
- package/window/WindowStateProvider/util/bringWindowToFront.js.map +1 -1
- package/window/WindowStateProvider/util/createWindowEntry.js.map +1 -1
- package/window/WindowStateProvider/util/findAdjacentWindow.js.map +1 -1
- package/window/WindowStateProvider/util/findTopWindow.js.map +1 -1
- package/window/WindowStateProvider/util/getMaxWindowZIndex.js.map +1 -1
- package/window/WindowStateProvider/util/index.js.map +1 -1
- package/window/WindowStateProvider/util/swapWindowZIndexes.js.map +1 -1
- package/window/WindowStateProvider/util/updateWindowFlag.js.map +1 -1
- package/window/WindowStatusBar.js.map +1 -1
- package/window/WindowTitleBar.d.ts +1 -0
- package/window/WindowTitleBar.js.map +1 -1
- package/window/WindowToolBar.css +6 -0
- package/window/WindowToolBar.js.map +1 -1
- package/window/useWindowGeometry.d.ts +2 -2
- package/window/useWindowGeometry.js +5 -5
- package/window/useWindowGeometry.js.map +1 -1
- package/window/useWindowItemRegistration.js.map +1 -1
- package/window/useWindowItemRegistry.js.map +1 -1
- package/window/useWindowKeyboardGeometry.js.map +1 -1
- package/window/useWindowLayout.js.map +1 -1
- package/window/useWindowToolbarReservationRegistry.js.map +1 -1
- package/window/windowGeometry.d.ts +2 -2
- package/window/windowGeometry.js +8 -4
- package/window/windowGeometry.js.map +1 -1
- package/window/windowMenuRegistrations.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WindowChromeActions.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"WindowChromeActions.js","sourceRoot":"","sources":["../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowChromeActions.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { ReactNode } from \"react\";\nimport type { WindowTitleBarAction } from \"./WindowTitleBar\";\n\nexport interface WindowTitleBarActionInput {\n disabled?: boolean;\n icon: ReactNode;\n id: string;\n label: string;\n onClick: () => unknown;\n /**\n * Reserves the slot immediately left of the lowest-priority toolbar action.\n * If multiple actions request it, the highest-priority action wins, with the\n * action id providing a deterministic tie-break. A sole action stays sole.\n */\n placement?: \"penultimate\";\n /**\n * Makes the action a toggle: the button announces this value as\n * `aria-pressed` and the toolbar draws it pressed while true. Leave it unset\n * for an action that is not a toggle.\n */\n pressed?: boolean;\n priority?: number;\n}\n\nexport interface WindowBackActionInput {\n disabled?: boolean;\n label: string;\n onClick: () => unknown;\n priority?: number;\n}\n\nexport interface RegisteredWindowTitleBarAction {\n disabled: boolean;\n icon: ReactNode;\n id: string;\n label: string;\n onClick: () => unknown;\n placement: \"penultimate\" | null;\n pressed: boolean | null;\n priority: number;\n}\n\nexport interface RegisteredWindowBackAction {\n disabled: boolean;\n label: string;\n onClick: () => unknown;\n priority: number;\n}\n\nexport interface WindowBackAction {\n disabled?: boolean;\n label: string;\n onClick: () => void;\n}\n\n/**\n * The registered title-bar actions rendered as icon buttons — the shared markup\n * behind the windowed toolbar row and the routed app bar, which differ only in\n * their button class.\n */\nexport function WindowTitleBarActionButtons({\n actions,\n className,\n}: {\n actions: ReadonlyArray<WindowTitleBarAction>;\n className: string;\n}) {\n return (\n <>\n {actions.map((action) => (\n <button\n aria-label={action.label}\n className={className}\n aria-pressed={action.pressed}\n disabled={action.disabled}\n key={action.id}\n title={action.label}\n type=\"button\"\n onClick={action.onClick}\n >\n {action.icon}\n </button>\n ))}\n </>\n );\n}\n\nexport function createTitleBarActions(\n items: ReadonlyMap<object, RegisteredWindowTitleBarAction>,\n): WindowTitleBarAction[] {\n const ordered = Array.from(items.values()).sort(\n (left, right) =>\n right.priority - left.priority ||\n (left.id < right.id ? -1 : left.id > right.id ? 1 : 0),\n );\n const penultimateIndex = ordered.findIndex(\n (item) => item.placement === \"penultimate\",\n );\n if (penultimateIndex >= 0 && ordered.length > 1) {\n const [penultimate] = ordered.splice(penultimateIndex, 1);\n if (penultimate) {\n ordered.splice(ordered.length - 1, 0, penultimate);\n }\n }\n\n return ordered.map((item) => ({\n disabled: item.disabled,\n icon: item.icon,\n id: item.id,\n label: item.label,\n onClick: () => {\n void item.onClick();\n },\n ...(item.pressed === null ? {} : { pressed: item.pressed }),\n }));\n}\n\nexport function createRegisteredTitleBarAction(\n item: WindowTitleBarActionInput,\n onClick: () => unknown,\n): RegisteredWindowTitleBarAction {\n return {\n disabled: item.disabled ?? false,\n icon: item.icon,\n id: item.id,\n label: item.label,\n onClick,\n placement: item.placement ?? null,\n pressed: item.pressed ?? null,\n priority: item.priority ?? 0,\n };\n}\n\nexport function createRegisteredBackAction(\n item: WindowBackActionInput,\n onClick: () => unknown,\n): RegisteredWindowBackAction {\n return {\n disabled: item.disabled ?? false,\n label: item.label,\n onClick,\n priority: item.priority ?? 0,\n };\n}\n\nexport function createBackAction(\n item: RegisteredWindowBackAction | null,\n): WindowBackAction | null {\n if (!item) {\n return null;\n }\n\n return {\n disabled: item.disabled,\n label: item.label,\n onClick: () => {\n void item.onClick();\n },\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WindowCloseButton.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"WindowCloseButton.js","sourceRoot":"","sources":["../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowCloseButton.tsx"],"names":[],"mappings":";AAEA,8EAA8E;AAC9E,gFAAgF;AAChF,gFAAgF;AAChF,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,EAChC,SAAS,EACT,KAAK,EACL,OAAO,GAKR;IACC,OAAO,CACL,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,cAAc,EACxB,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,SAAS,gBACF,KAAK,EACjB,KAAK,EAAE,KAAK,uBAGL,CACV,CAAC;AACJ,CAAC","sourcesContent":["import type { RefObject } from \"react\";\n\n// The floating-window close control (the `×` in the title bar). Shared beyond\n// WindowTitleBar so any surface dressing as a window — e.g. the note attachment\n// preview — closes with the identical glyph and chrome instead of a look-alike.\n// `label` names it for assistive tech; `buttonRef` lets a caller move focus to it.\nexport function WindowCloseButton({\n buttonRef,\n label,\n onClick,\n}: {\n buttonRef?: RefObject<HTMLButtonElement | null>;\n label?: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n className=\"window-close\"\n onClick={onClick}\n ref={buttonRef}\n aria-label={label}\n title={label}\n >\n ×\n </button>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WindowMaximizeButton.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"WindowMaximizeButton.js","sourceRoot":"","sources":["../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowMaximizeButton.tsx"],"names":[],"mappings":";AAAA,MAAM,UAAU,oBAAoB,CAAC,EAAE,OAAO,EAA2B;IACvE,OAAO,CACL,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,iBAAiB,gBAChB,wBAAwB,EACnC,KAAK,EAAC,wBAAwB,EAC9B,OAAO,EAAE,OAAO,uBAGT,CACV,CAAC;AACJ,CAAC","sourcesContent":["export function WindowMaximizeButton({ onClick }: { onClick: () => void }) {\n return (\n <button\n type=\"button\"\n className=\"window-maximize\"\n aria-label=\"Toggle maximize window\"\n title=\"Toggle maximize window\"\n onClick={onClick}\n >\n □\n </button>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WindowMenuBar.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"WindowMenuBar.js","sourceRoot":"","sources":["../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowMenuBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,qBAAqB,CAAC;AAc7B,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAA2B;IAC9D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO;QAC/B,SAAS,eAAe,CAAC,CAAa;YACpC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;YACxB,IAAI,CAAC,CAAC,MAAM,YAAY,IAAI,CAAC,EAAE,CAAC;gBAC9B,KAAK,EAAE,CAAC;gBACR,OAAO;YACT,CAAC;YAED,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvD,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACxD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAC1E,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAEvB,OAAO,CACL,cAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAC,gBAAgB,EAAC,IAAI,EAAC,SAAS,YACxD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,eAAsB,SAAS,EAAC,qBAAqB,aACnD,iBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,UAAU,mBACD,MAAM,mBACL,SAAS,KAAK,CAAC,EAC9B,SAAS,EACP,SAAS,KAAK,CAAC;wBACb,CAAC,CAAC,uDAAuD;wBACzD,CAAC,CAAC,wBAAwB,EAE9B,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EACvD,YAAY,EAAE,GAAG,EAAE;wBACjB,IAAI,SAAS,KAAK,IAAI;4BAAE,YAAY,CAAC,CAAC,CAAC,CAAC;oBAC1C,CAAC,YAEA,IAAI,CAAC,KAAK,GACJ,EACR,SAAS,KAAK,CAAC,IAAI,CAClB,cAAK,SAAS,EAAC,yBAAyB,EAAC,IAAI,EAAC,MAAM,YACjD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACxB,iBAEE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,UAAU,EACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,OAAO,EAAE,GAAG,EAAE;4BACZ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gCAClB,OAAO;4BACT,CAAC;4BACD,IAAI,CAAC,OAAO,EAAE,CAAC;4BACf,KAAK,EAAE,CAAC;wBACV,CAAC,YAEA,IAAI,CAAC,KAAK,IAZN,IAAI,CAAC,EAAE,CAaL,CACV,CAAC,GACE,CACP,KAtCO,IAAI,CAAC,KAAK,CAuCd,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport \"./WindowMenuBar.css\";\n\nexport interface WindowMenuItem {\n disabled?: boolean;\n id: string;\n label: string;\n onClick: () => void;\n}\n\ninterface WindowMenu {\n label: string;\n items: WindowMenuItem[];\n}\n\nexport function WindowMenuBar({ menus }: { menus: WindowMenu[] }) {\n const [openIndex, setOpenIndex] = useState<number | null>(null);\n const barRef = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => setOpenIndex(null), []);\n\n useEffect(() => {\n if (openIndex === null) return;\n function handleMouseDown(e: MouseEvent) {\n const target = e.target;\n if (!(target instanceof Node)) {\n close();\n return;\n }\n\n if (barRef.current && !barRef.current.contains(target)) {\n close();\n }\n }\n document.addEventListener(\"mousedown\", handleMouseDown);\n return () => document.removeEventListener(\"mousedown\", handleMouseDown);\n }, [openIndex, close]);\n\n return (\n <div ref={barRef} className=\"window-menubar\" role=\"menubar\">\n {menus.map((menu, i) => (\n <div key={menu.label} className=\"window-menubar-item\">\n <button\n type=\"button\"\n role=\"menuitem\"\n aria-haspopup=\"true\"\n aria-expanded={openIndex === i}\n className={\n openIndex === i\n ? \"window-menubar-trigger window-menubar-trigger--active\"\n : \"window-menubar-trigger\"\n }\n onClick={() => setOpenIndex(openIndex === i ? null : i)}\n onMouseEnter={() => {\n if (openIndex !== null) setOpenIndex(i);\n }}\n >\n {menu.label}\n </button>\n {openIndex === i && (\n <div className=\"window-menubar-dropdown\" role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) {\n return;\n }\n item.onClick();\n close();\n }}\n >\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WindowMenuContext.js","sourceRoot":"","sources":["../../../../../../../Users/a2f0/github/tearleads5/packages/windowing/src/window/WindowMenuContext.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n createContext,\n type PropsWithChildren,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useWindowItemRegistration } from \"./useWindowItemRegistration\";\nimport {\n sameWindowItem,\n selectHighestPriorityItem,\n useWindowItemRegistry,\n} from \"./useWindowItemRegistry\";\nimport { useWindowToolbarReservationRegistry } from \"./useWindowToolbarReservationRegistry\";\nimport {\n createBackAction,\n createRegisteredBackAction,\n createRegisteredTitleBarAction,\n createTitleBarActions,\n type RegisteredWindowBackAction,\n type RegisteredWindowTitleBarAction,\n type WindowBackAction,\n type WindowBackActionInput,\n type WindowTitleBarActionInput,\n} from \"./WindowChromeActions\";\nimport type { WindowMenuItem } from \"./WindowMenuBar\";\nimport type { WindowTitleBarAction } from \"./WindowTitleBar\";\nimport {\n createMenuItems,\n createRefreshMenuItem,\n REFRESH_LABEL,\n type RegisteredWindowMenuItem,\n type RegisteredWindowRefreshMenuItem,\n} from \"./windowMenuRegistrations\";\n\ninterface WindowRefreshMenuItemInput {\n disabled?: boolean;\n label?: string;\n onRefresh: () => unknown;\n priority?: number;\n refreshing?: boolean;\n}\n\ninterface WindowFileMenuItemInput {\n disabled?: boolean;\n id: string;\n label: string;\n onClick: () => unknown;\n priority?: number;\n}\n\nfunction createRegisteredMenuItem(\n item: WindowFileMenuItemInput,\n onClick: () => unknown,\n): RegisteredWindowMenuItem {\n return {\n disabled: item.disabled ?? false,\n id: item.id,\n label: item.label,\n onClick,\n priority: item.priority ?? 0,\n };\n}\n\nfunction createRegisteredRefreshMenuItem(\n item: WindowRefreshMenuItemInput,\n onRefresh: () => unknown,\n): RegisteredWindowRefreshMenuItem {\n return {\n disabled: item.disabled ?? false,\n label: item.label ?? REFRESH_LABEL,\n onRefresh,\n priority: item.priority ?? 0,\n refreshing: item.refreshing ?? false,\n };\n}\n\ninterface WindowMenuContextValue {\n fileMenuItems: WindowMenuItem[];\n viewMenuItems: WindowMenuItem[];\n /**\n * The winning refresh registration, also folded into `viewMenuItems` for the\n * windowed menu bar. Exposed on its own because the routed shell has no menu\n * bar and renders it as an app bar toolbar button instead.\n */\n refreshMenuItem: WindowMenuItem | null;\n titleBarActions: WindowTitleBarAction[];\n backAction: WindowBackAction | null;\n toolbarReserved: boolean;\n toolbarReservationReleased: boolean;\n registerFileMenuItem: (id: object, item: RegisteredWindowMenuItem) => void;\n unregisterFileMenuItem: (id: object) => void;\n registerViewMenuItem: (id: object, item: RegisteredWindowMenuItem) => void;\n unregisterViewMenuItem: (id: object) => void;\n registerTitleBarAction: (\n id: object,\n item: RegisteredWindowTitleBarAction,\n ) => void;\n unregisterTitleBarAction: (id: object) => void;\n registerBackAction: (id: object, item: RegisteredWindowBackAction) => void;\n unregisterBackAction: (id: object) => void;\n registerRefreshMenuItem: (\n id: object,\n item: RegisteredWindowRefreshMenuItem,\n ) => void;\n unregisterRefreshMenuItem: (id: object) => void;\n registerToolbarReservation: (id: object, reserved: boolean) => void;\n unregisterToolbarReservation: (id: object) => void;\n}\n\nconst WindowMenuContext = createContext<WindowMenuContextValue>({\n fileMenuItems: [],\n viewMenuItems: [],\n refreshMenuItem: null,\n titleBarActions: [],\n backAction: null,\n toolbarReserved: false,\n toolbarReservationReleased: false,\n registerFileMenuItem: () => {},\n unregisterFileMenuItem: () => {},\n registerViewMenuItem: () => {},\n unregisterViewMenuItem: () => {},\n registerTitleBarAction: () => {},\n unregisterTitleBarAction: () => {},\n registerBackAction: () => {},\n unregisterBackAction: () => {},\n registerRefreshMenuItem: () => {},\n unregisterRefreshMenuItem: () => {},\n registerToolbarReservation: () => {},\n unregisterToolbarReservation: () => {},\n});\n\nfunction useWindowMenuContextValue(): WindowMenuContextValue {\n const fileMenu =\n useWindowItemRegistry<RegisteredWindowMenuItem>(sameWindowItem);\n const viewMenu =\n useWindowItemRegistry<RegisteredWindowMenuItem>(sameWindowItem);\n const titleBar =\n useWindowItemRegistry<RegisteredWindowTitleBarAction>(sameWindowItem);\n const back =\n useWindowItemRegistry<RegisteredWindowBackAction>(sameWindowItem);\n const refresh =\n useWindowItemRegistry<RegisteredWindowRefreshMenuItem>(sameWindowItem);\n const toolbarReservation = useWindowToolbarReservationRegistry();\n\n const fileMenuItemList = useMemo(\n () => createMenuItems(fileMenu.items),\n [fileMenu.items],\n );\n const refreshMenuItem = useMemo(\n () => createRefreshMenuItem(selectHighestPriorityItem(refresh.items)),\n [refresh.items],\n );\n const viewMenuItemList = useMemo(\n () => [\n ...createMenuItems(viewMenu.items),\n ...(refreshMenuItem ? [refreshMenuItem] : []),\n ],\n [refreshMenuItem, viewMenu.items],\n );\n const titleBarActionList = useMemo(\n () => createTitleBarActions(titleBar.items),\n [titleBar.items],\n );\n const backAction = useMemo(\n () => createBackAction(selectHighestPriorityItem(back.items)),\n [back.items],\n );\n\n const value = useMemo(\n () => ({\n fileMenuItems: fileMenuItemList,\n viewMenuItems: viewMenuItemList,\n refreshMenuItem,\n titleBarActions: titleBarActionList,\n backAction,\n toolbarReserved: toolbarReservation.reserved,\n toolbarReservationReleased: toolbarReservation.released,\n registerFileMenuItem: fileMenu.registerItem,\n unregisterFileMenuItem: fileMenu.unregisterItem,\n registerViewMenuItem: viewMenu.registerItem,\n unregisterViewMenuItem: viewMenu.unregisterItem,\n registerTitleBarAction: titleBar.registerItem,\n unregisterTitleBarAction: titleBar.unregisterItem,\n registerBackAction: back.registerItem,\n unregisterBackAction: back.unregisterItem,\n registerRefreshMenuItem: refresh.registerItem,\n unregisterRefreshMenuItem: refresh.unregisterItem,\n registerToolbarReservation: toolbarReservation.register,\n unregisterToolbarReservation: toolbarReservation.unregister,\n }),\n [\n fileMenuItemList,\n viewMenuItemList,\n refreshMenuItem,\n titleBarActionList,\n backAction,\n toolbarReservation,\n fileMenu.registerItem,\n fileMenu.unregisterItem,\n viewMenu.registerItem,\n viewMenu.unregisterItem,\n titleBar.registerItem,\n titleBar.unregisterItem,\n back.registerItem,\n back.unregisterItem,\n refresh.registerItem,\n refresh.unregisterItem,\n ],\n );\n\n return value;\n}\n\nexport function WindowMenuProvider({ children }: PropsWithChildren) {\n const value = useWindowMenuContextValue();\n\n return (\n <WindowMenuContext.Provider value={value}>\n {children}\n </WindowMenuContext.Provider>\n );\n}\n\nexport function useWindowFileMenuItems(): WindowMenuItem[] {\n return useContext(WindowMenuContext).fileMenuItems;\n}\n\nexport function useWindowViewMenuItems(): WindowMenuItem[] {\n return useContext(WindowMenuContext).viewMenuItems;\n}\n\nexport function useWindowRefreshMenuItemValue(): WindowMenuItem | null {\n return useContext(WindowMenuContext).refreshMenuItem;\n}\n\nexport function useWindowTitleBarActions(): WindowTitleBarAction[] {\n return useContext(WindowMenuContext).titleBarActions;\n}\n\nexport function useWindowBackActionValue(): WindowBackAction | null {\n return useContext(WindowMenuContext).backAction;\n}\n\nexport function useWindowToolbarReserved(): boolean {\n return useContext(WindowMenuContext).toolbarReserved;\n}\n\nexport function useWindowToolbarReservationReleased(): boolean {\n return useContext(WindowMenuContext).toolbarReservationReleased;\n}\n\nfunction useRegisteredWindowMenuItem(\n item: WindowFileMenuItemInput | null,\n registerMenuItem: (id: object, item: RegisteredWindowMenuItem) => void,\n unregisterMenuItem: (id: object) => void,\n): void {\n useWindowItemRegistration({\n action: item?.onClick ?? null,\n createRegisteredItem: createRegisteredMenuItem,\n input: item,\n registerItem: registerMenuItem,\n unregisterItem: unregisterMenuItem,\n });\n}\n\nexport function useWindowFileMenuItem(\n item: WindowFileMenuItemInput | null,\n): void {\n const { registerFileMenuItem, unregisterFileMenuItem } =\n useContext(WindowMenuContext);\n useRegisteredWindowMenuItem(\n item,\n registerFileMenuItem,\n unregisterFileMenuItem,\n );\n}\n\nexport function useWindowViewMenuItem(\n item: WindowFileMenuItemInput | null,\n): void {\n const { registerViewMenuItem, unregisterViewMenuItem } =\n useContext(WindowMenuContext);\n useRegisteredWindowMenuItem(\n item,\n registerViewMenuItem,\n unregisterViewMenuItem,\n );\n}\n\n/**\n * Registers an action in the current window's title bar.\n *\n * Keep `item` and its `icon` reference-stable, such as by memoizing them with\n * `useMemo`, so the window does not re-register the action on every render.\n */\nexport function useWindowTitleBarAction(\n item: WindowTitleBarActionInput | null,\n): void {\n const { registerTitleBarAction, unregisterTitleBarAction } =\n useContext(WindowMenuContext);\n useWindowItemRegistration({\n action: item?.onClick ?? null,\n createRegisteredItem: createRegisteredTitleBarAction,\n input: item,\n registerItem: registerTitleBarAction,\n unregisterItem: unregisterTitleBarAction,\n });\n}\n\nexport function useWindowBackAction(item: WindowBackActionInput | null): void {\n const { registerBackAction, unregisterBackAction } =\n useContext(WindowMenuContext);\n useWindowItemRegistration({\n action: item?.onClick ?? null,\n createRegisteredItem: createRegisteredBackAction,\n input: item,\n registerItem: registerBackAction,\n unregisterItem: unregisterBackAction,\n });\n}\n\n/**\n * Keeps this window's toolbar row reserved (rendered) while the caller is\n * mounted, even when it registers no title-bar or back actions. A mini-app that\n * wants explorer-style chrome on every route — a blank bar on the routes that\n * have no actions rather than a collapsing/reappearing row — calls this once.\n * Pass `reserve = false` to release the reservation without unmounting.\n */\nexport function useWindowToolbarReservation(reserve = true): void {\n const { registerToolbarReservation, unregisterToolbarReservation } =\n useContext(WindowMenuContext);\n const idRef = useRef<object>({});\n const hasEverReservedRef = useRef(false);\n\n useEffect(() => {\n const id = idRef.current;\n\n if (reserve) {\n hasEverReservedRef.current = true;\n registerToolbarReservation(id, true);\n return () => unregisterToolbarReservation(id);\n }\n\n if (!hasEverReservedRef.current) {\n return;\n }\n\n // A caller that previously reserved the row is now explicitly releasing it.\n // This lets WindowToolBar clear its latched blank row while callers that\n // never opted into reservations keep the older latch-once behavior.\n registerToolbarReservation(id, false);\n return () => unregisterToolbarReservation(id);\n }, [reserve, registerToolbarReservation, unregisterToolbarReservation]);\n}\n\nexport function useWindowRefreshMenuItem(\n item: WindowRefreshMenuItemInput | null,\n): void {\n const { registerRefreshMenuItem, unregisterRefreshMenuItem } =\n useContext(WindowMenuContext);\n useWindowItemRegistration({\n action: item?.onRefresh ?? null,\n createRegisteredItem: createRegisteredRefreshMenuItem,\n input: item,\n registerItem: registerRefreshMenuItem,\n unregisterItem: unregisterRefreshMenuItem,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"WindowMenuContext.js","sourceRoot":"","sources":["../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowMenuContext.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n createContext,\n type PropsWithChildren,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useWindowItemRegistration } from \"./useWindowItemRegistration\";\nimport {\n sameWindowItem,\n selectHighestPriorityItem,\n useWindowItemRegistry,\n} from \"./useWindowItemRegistry\";\nimport { useWindowToolbarReservationRegistry } from \"./useWindowToolbarReservationRegistry\";\nimport {\n createBackAction,\n createRegisteredBackAction,\n createRegisteredTitleBarAction,\n createTitleBarActions,\n type RegisteredWindowBackAction,\n type RegisteredWindowTitleBarAction,\n type WindowBackAction,\n type WindowBackActionInput,\n type WindowTitleBarActionInput,\n} from \"./WindowChromeActions\";\nimport type { WindowMenuItem } from \"./WindowMenuBar\";\nimport type { WindowTitleBarAction } from \"./WindowTitleBar\";\nimport {\n createMenuItems,\n createRefreshMenuItem,\n REFRESH_LABEL,\n type RegisteredWindowMenuItem,\n type RegisteredWindowRefreshMenuItem,\n} from \"./windowMenuRegistrations\";\n\ninterface WindowRefreshMenuItemInput {\n disabled?: boolean;\n label?: string;\n onRefresh: () => unknown;\n priority?: number;\n refreshing?: boolean;\n}\n\ninterface WindowFileMenuItemInput {\n disabled?: boolean;\n id: string;\n label: string;\n onClick: () => unknown;\n priority?: number;\n}\n\nfunction createRegisteredMenuItem(\n item: WindowFileMenuItemInput,\n onClick: () => unknown,\n): RegisteredWindowMenuItem {\n return {\n disabled: item.disabled ?? false,\n id: item.id,\n label: item.label,\n onClick,\n priority: item.priority ?? 0,\n };\n}\n\nfunction createRegisteredRefreshMenuItem(\n item: WindowRefreshMenuItemInput,\n onRefresh: () => unknown,\n): RegisteredWindowRefreshMenuItem {\n return {\n disabled: item.disabled ?? false,\n label: item.label ?? REFRESH_LABEL,\n onRefresh,\n priority: item.priority ?? 0,\n refreshing: item.refreshing ?? false,\n };\n}\n\ninterface WindowMenuContextValue {\n fileMenuItems: WindowMenuItem[];\n viewMenuItems: WindowMenuItem[];\n /**\n * The winning refresh registration, also folded into `viewMenuItems` for the\n * windowed menu bar. Exposed on its own because the routed shell has no menu\n * bar and renders it as an app bar toolbar button instead.\n */\n refreshMenuItem: WindowMenuItem | null;\n titleBarActions: WindowTitleBarAction[];\n backAction: WindowBackAction | null;\n toolbarReserved: boolean;\n toolbarReservationReleased: boolean;\n registerFileMenuItem: (id: object, item: RegisteredWindowMenuItem) => void;\n unregisterFileMenuItem: (id: object) => void;\n registerViewMenuItem: (id: object, item: RegisteredWindowMenuItem) => void;\n unregisterViewMenuItem: (id: object) => void;\n registerTitleBarAction: (\n id: object,\n item: RegisteredWindowTitleBarAction,\n ) => void;\n unregisterTitleBarAction: (id: object) => void;\n registerBackAction: (id: object, item: RegisteredWindowBackAction) => void;\n unregisterBackAction: (id: object) => void;\n registerRefreshMenuItem: (\n id: object,\n item: RegisteredWindowRefreshMenuItem,\n ) => void;\n unregisterRefreshMenuItem: (id: object) => void;\n registerToolbarReservation: (id: object, reserved: boolean) => void;\n unregisterToolbarReservation: (id: object) => void;\n}\n\nconst WindowMenuContext = createContext<WindowMenuContextValue>({\n fileMenuItems: [],\n viewMenuItems: [],\n refreshMenuItem: null,\n titleBarActions: [],\n backAction: null,\n toolbarReserved: false,\n toolbarReservationReleased: false,\n registerFileMenuItem: () => {},\n unregisterFileMenuItem: () => {},\n registerViewMenuItem: () => {},\n unregisterViewMenuItem: () => {},\n registerTitleBarAction: () => {},\n unregisterTitleBarAction: () => {},\n registerBackAction: () => {},\n unregisterBackAction: () => {},\n registerRefreshMenuItem: () => {},\n unregisterRefreshMenuItem: () => {},\n registerToolbarReservation: () => {},\n unregisterToolbarReservation: () => {},\n});\n\nfunction useWindowMenuContextValue(): WindowMenuContextValue {\n const fileMenu =\n useWindowItemRegistry<RegisteredWindowMenuItem>(sameWindowItem);\n const viewMenu =\n useWindowItemRegistry<RegisteredWindowMenuItem>(sameWindowItem);\n const titleBar =\n useWindowItemRegistry<RegisteredWindowTitleBarAction>(sameWindowItem);\n const back =\n useWindowItemRegistry<RegisteredWindowBackAction>(sameWindowItem);\n const refresh =\n useWindowItemRegistry<RegisteredWindowRefreshMenuItem>(sameWindowItem);\n const toolbarReservation = useWindowToolbarReservationRegistry();\n\n const fileMenuItemList = useMemo(\n () => createMenuItems(fileMenu.items),\n [fileMenu.items],\n );\n const refreshMenuItem = useMemo(\n () => createRefreshMenuItem(selectHighestPriorityItem(refresh.items)),\n [refresh.items],\n );\n const viewMenuItemList = useMemo(\n () => [\n ...createMenuItems(viewMenu.items),\n ...(refreshMenuItem ? [refreshMenuItem] : []),\n ],\n [refreshMenuItem, viewMenu.items],\n );\n const titleBarActionList = useMemo(\n () => createTitleBarActions(titleBar.items),\n [titleBar.items],\n );\n const backAction = useMemo(\n () => createBackAction(selectHighestPriorityItem(back.items)),\n [back.items],\n );\n\n const value = useMemo(\n () => ({\n fileMenuItems: fileMenuItemList,\n viewMenuItems: viewMenuItemList,\n refreshMenuItem,\n titleBarActions: titleBarActionList,\n backAction,\n toolbarReserved: toolbarReservation.reserved,\n toolbarReservationReleased: toolbarReservation.released,\n registerFileMenuItem: fileMenu.registerItem,\n unregisterFileMenuItem: fileMenu.unregisterItem,\n registerViewMenuItem: viewMenu.registerItem,\n unregisterViewMenuItem: viewMenu.unregisterItem,\n registerTitleBarAction: titleBar.registerItem,\n unregisterTitleBarAction: titleBar.unregisterItem,\n registerBackAction: back.registerItem,\n unregisterBackAction: back.unregisterItem,\n registerRefreshMenuItem: refresh.registerItem,\n unregisterRefreshMenuItem: refresh.unregisterItem,\n registerToolbarReservation: toolbarReservation.register,\n unregisterToolbarReservation: toolbarReservation.unregister,\n }),\n [\n fileMenuItemList,\n viewMenuItemList,\n refreshMenuItem,\n titleBarActionList,\n backAction,\n toolbarReservation,\n fileMenu.registerItem,\n fileMenu.unregisterItem,\n viewMenu.registerItem,\n viewMenu.unregisterItem,\n titleBar.registerItem,\n titleBar.unregisterItem,\n back.registerItem,\n back.unregisterItem,\n refresh.registerItem,\n refresh.unregisterItem,\n ],\n );\n\n return value;\n}\n\nexport function WindowMenuProvider({ children }: PropsWithChildren) {\n const value = useWindowMenuContextValue();\n\n return (\n <WindowMenuContext.Provider value={value}>\n {children}\n </WindowMenuContext.Provider>\n );\n}\n\nexport function useWindowFileMenuItems(): WindowMenuItem[] {\n return useContext(WindowMenuContext).fileMenuItems;\n}\n\nexport function useWindowViewMenuItems(): WindowMenuItem[] {\n return useContext(WindowMenuContext).viewMenuItems;\n}\n\nexport function useWindowRefreshMenuItemValue(): WindowMenuItem | null {\n return useContext(WindowMenuContext).refreshMenuItem;\n}\n\nexport function useWindowTitleBarActions(): WindowTitleBarAction[] {\n return useContext(WindowMenuContext).titleBarActions;\n}\n\nexport function useWindowBackActionValue(): WindowBackAction | null {\n return useContext(WindowMenuContext).backAction;\n}\n\nexport function useWindowToolbarReserved(): boolean {\n return useContext(WindowMenuContext).toolbarReserved;\n}\n\nexport function useWindowToolbarReservationReleased(): boolean {\n return useContext(WindowMenuContext).toolbarReservationReleased;\n}\n\nfunction useRegisteredWindowMenuItem(\n item: WindowFileMenuItemInput | null,\n registerMenuItem: (id: object, item: RegisteredWindowMenuItem) => void,\n unregisterMenuItem: (id: object) => void,\n): void {\n useWindowItemRegistration({\n action: item?.onClick ?? null,\n createRegisteredItem: createRegisteredMenuItem,\n input: item,\n registerItem: registerMenuItem,\n unregisterItem: unregisterMenuItem,\n });\n}\n\nexport function useWindowFileMenuItem(\n item: WindowFileMenuItemInput | null,\n): void {\n const { registerFileMenuItem, unregisterFileMenuItem } =\n useContext(WindowMenuContext);\n useRegisteredWindowMenuItem(\n item,\n registerFileMenuItem,\n unregisterFileMenuItem,\n );\n}\n\nexport function useWindowViewMenuItem(\n item: WindowFileMenuItemInput | null,\n): void {\n const { registerViewMenuItem, unregisterViewMenuItem } =\n useContext(WindowMenuContext);\n useRegisteredWindowMenuItem(\n item,\n registerViewMenuItem,\n unregisterViewMenuItem,\n );\n}\n\n/**\n * Registers an action in the current window's title bar.\n *\n * Keep `item` and its `icon` reference-stable, such as by memoizing them with\n * `useMemo`, so the window does not re-register the action on every render.\n */\nexport function useWindowTitleBarAction(\n item: WindowTitleBarActionInput | null,\n): void {\n const { registerTitleBarAction, unregisterTitleBarAction } =\n useContext(WindowMenuContext);\n useWindowItemRegistration({\n action: item?.onClick ?? null,\n createRegisteredItem: createRegisteredTitleBarAction,\n input: item,\n registerItem: registerTitleBarAction,\n unregisterItem: unregisterTitleBarAction,\n });\n}\n\nexport function useWindowBackAction(item: WindowBackActionInput | null): void {\n const { registerBackAction, unregisterBackAction } =\n useContext(WindowMenuContext);\n useWindowItemRegistration({\n action: item?.onClick ?? null,\n createRegisteredItem: createRegisteredBackAction,\n input: item,\n registerItem: registerBackAction,\n unregisterItem: unregisterBackAction,\n });\n}\n\n/**\n * Keeps this window's toolbar row reserved (rendered) while the caller is\n * mounted, even when it registers no title-bar or back actions. A mini-app that\n * wants explorer-style chrome on every route — a blank bar on the routes that\n * have no actions rather than a collapsing/reappearing row — calls this once.\n * Pass `reserve = false` to release the reservation without unmounting.\n */\nexport function useWindowToolbarReservation(reserve = true): void {\n const { registerToolbarReservation, unregisterToolbarReservation } =\n useContext(WindowMenuContext);\n const idRef = useRef<object>({});\n const hasEverReservedRef = useRef(false);\n\n useEffect(() => {\n const id = idRef.current;\n\n if (reserve) {\n hasEverReservedRef.current = true;\n registerToolbarReservation(id, true);\n return () => unregisterToolbarReservation(id);\n }\n\n if (!hasEverReservedRef.current) {\n return;\n }\n\n // A caller that previously reserved the row is now explicitly releasing it.\n // This lets WindowToolBar clear its latched blank row while callers that\n // never opted into reservations keep the older latch-once behavior.\n registerToolbarReservation(id, false);\n return () => unregisterToolbarReservation(id);\n }, [reserve, registerToolbarReservation, unregisterToolbarReservation]);\n}\n\nexport function useWindowRefreshMenuItem(\n item: WindowRefreshMenuItemInput | null,\n): void {\n const { registerRefreshMenuItem, unregisterRefreshMenuItem } =\n useContext(WindowMenuContext);\n useWindowItemRegistration({\n action: item?.onRefresh ?? null,\n createRegisteredItem: createRegisteredRefreshMenuItem,\n input: item,\n registerItem: registerRefreshMenuItem,\n unregisterItem: unregisterRefreshMenuItem,\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WindowMinimizeButton.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"WindowMinimizeButton.js","sourceRoot":"","sources":["../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowMinimizeButton.tsx"],"names":[],"mappings":";AAAA,MAAM,UAAU,oBAAoB,CAAC,EAAE,OAAO,EAA2B;IACvE,OAAO,CACL,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,iBAAiB,gBAChB,iBAAiB,EAC5B,KAAK,EAAC,iBAAiB,EACvB,OAAO,EAAE,OAAO,uBAGT,CACV,CAAC;AACJ,CAAC","sourcesContent":["export function WindowMinimizeButton({ onClick }: { onClick: () => void }) {\n return (\n <button\n type=\"button\"\n className=\"window-minimize\"\n aria-label=\"Minimize window\"\n title=\"Minimize window\"\n onClick={onClick}\n >\n –\n </button>\n );\n}\n"]}
|
|
@@ -1,20 +1,113 @@
|
|
|
1
1
|
/*
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
2
|
+
* Resize handles: invisible hit targets along the window's four sides and over
|
|
3
|
+
* its four corners. The corners render after the sides, so they paint above the
|
|
4
|
+
* sides and win where the two meet. Each target straddles the window's outer
|
|
5
|
+
* border edge, reaching --window-resize-outset past it so the pointer can take
|
|
6
|
+
* an edge from just outside the window, and a little way inside it.
|
|
7
|
+
*
|
|
8
|
+
* Every target stays square. border-radius clips hit testing as well as
|
|
9
|
+
* painting, so a rounded target would leave the outermost pixels of a corner,
|
|
10
|
+
* the ones a pointer aims for, falling through to whatever lies beneath.
|
|
11
11
|
*/
|
|
12
12
|
.window-resize {
|
|
13
|
+
--window-resize-outset: 4px;
|
|
14
|
+
--window-resize-reach: calc(
|
|
15
|
+
var(--border-width) +
|
|
16
|
+
var(--window-resize-outset)
|
|
17
|
+
);
|
|
13
18
|
position: absolute;
|
|
14
|
-
width: 14px;
|
|
15
|
-
height: 14px;
|
|
16
19
|
touch-action: none;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.window-resize--n,
|
|
23
|
+
.window-resize--s {
|
|
24
|
+
right: 0;
|
|
25
|
+
left: 0;
|
|
26
|
+
height: calc(var(--window-resize-outset) + 4px);
|
|
27
|
+
cursor: ns-resize;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.window-resize--e,
|
|
31
|
+
.window-resize--w {
|
|
32
|
+
top: 0;
|
|
33
|
+
bottom: 0;
|
|
34
|
+
width: calc(var(--window-resize-outset) + 4px);
|
|
35
|
+
cursor: ew-resize;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.window-resize--n {
|
|
39
|
+
top: calc(-1 * var(--window-resize-reach));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.window-resize--s {
|
|
43
|
+
bottom: calc(-1 * var(--window-resize-reach));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.window-resize--e {
|
|
47
|
+
right: calc(-1 * var(--window-resize-reach));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.window-resize--w {
|
|
51
|
+
left: calc(-1 * var(--window-resize-reach));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.window-resize--ne,
|
|
55
|
+
.window-resize--nw,
|
|
56
|
+
.window-resize--se,
|
|
57
|
+
.window-resize--sw {
|
|
58
|
+
width: calc(var(--window-resize-outset) + 16px);
|
|
59
|
+
height: calc(var(--window-resize-outset) + 16px);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.window-resize--ne,
|
|
63
|
+
.window-resize--sw {
|
|
64
|
+
cursor: nesw-resize;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.window-resize--nw,
|
|
68
|
+
.window-resize--se {
|
|
69
|
+
cursor: nwse-resize;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.window-resize--ne,
|
|
73
|
+
.window-resize--nw {
|
|
74
|
+
top: calc(-1 * var(--window-resize-reach));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.window-resize--se,
|
|
78
|
+
.window-resize--sw {
|
|
79
|
+
bottom: calc(-1 * var(--window-resize-reach));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.window-resize--ne,
|
|
83
|
+
.window-resize--se {
|
|
84
|
+
right: calc(-1 * var(--window-resize-reach));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.window-resize--nw,
|
|
88
|
+
.window-resize--sw {
|
|
89
|
+
left: calc(-1 * var(--window-resize-reach));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/*
|
|
93
|
+
* On hover a corner paints an L-shaped bracket over the window's own border:
|
|
94
|
+
* the two outward edges, with the window's corner radius, so the corner itself
|
|
95
|
+
* lights up rather than only the cursor changing. Its outer edge sits exactly
|
|
96
|
+
* on the window's outer border edge, so the bracket's curve traces the
|
|
97
|
+
* window's. It is drawn in --color-dark, the theme's foreground primitive, so
|
|
98
|
+
* it reads as the window's edge lit up and stays crisp in both themes. The
|
|
99
|
+
* bracket is a pseudo-element, so its radius never rounds the hit target.
|
|
100
|
+
*/
|
|
101
|
+
.window-resize--ne::before,
|
|
102
|
+
.window-resize--nw::before,
|
|
103
|
+
.window-resize--se::before,
|
|
104
|
+
.window-resize--sw::before {
|
|
105
|
+
position: absolute;
|
|
106
|
+
width: calc(var(--app-radius-surface) + 6px);
|
|
107
|
+
height: calc(var(--app-radius-surface) + 6px);
|
|
17
108
|
border: 0 solid transparent;
|
|
109
|
+
content: "";
|
|
110
|
+
pointer-events: none;
|
|
18
111
|
transition: border-color var(--transition);
|
|
19
112
|
}
|
|
20
113
|
|
|
@@ -23,43 +116,39 @@
|
|
|
23
116
|
the rule to fine pointers means it simply never applies there. Corner-drag
|
|
24
117
|
resize is a pointer affordance anyway, so touch loses nothing. */
|
|
25
118
|
@media (hover: hover) {
|
|
26
|
-
.window-resize:hover {
|
|
119
|
+
.window-resize:hover::before {
|
|
27
120
|
border-color: var(--color-dark);
|
|
28
121
|
}
|
|
29
122
|
}
|
|
30
123
|
|
|
31
|
-
.window-resize--se {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
bottom: 0;
|
|
35
|
-
cursor: se-resize;
|
|
124
|
+
.window-resize--se::before {
|
|
125
|
+
right: var(--window-resize-outset);
|
|
126
|
+
bottom: var(--window-resize-outset);
|
|
36
127
|
border-right-width: 2px;
|
|
37
128
|
border-bottom-width: 2px;
|
|
129
|
+
border-bottom-right-radius: var(--app-radius-surface);
|
|
38
130
|
}
|
|
39
131
|
|
|
40
|
-
.window-resize--sw {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
left: 0;
|
|
44
|
-
cursor: sw-resize;
|
|
132
|
+
.window-resize--sw::before {
|
|
133
|
+
bottom: var(--window-resize-outset);
|
|
134
|
+
left: var(--window-resize-outset);
|
|
45
135
|
border-bottom-width: 2px;
|
|
46
136
|
border-left-width: 2px;
|
|
137
|
+
border-bottom-left-radius: var(--app-radius-surface);
|
|
47
138
|
}
|
|
48
139
|
|
|
49
|
-
.window-resize--ne {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
right: 0;
|
|
53
|
-
cursor: ne-resize;
|
|
140
|
+
.window-resize--ne::before {
|
|
141
|
+
top: var(--window-resize-outset);
|
|
142
|
+
right: var(--window-resize-outset);
|
|
54
143
|
border-top-width: 2px;
|
|
55
144
|
border-right-width: 2px;
|
|
145
|
+
border-top-right-radius: var(--app-radius-surface);
|
|
56
146
|
}
|
|
57
147
|
|
|
58
|
-
.window-resize--nw {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
left: 0;
|
|
62
|
-
cursor: nw-resize;
|
|
148
|
+
.window-resize--nw::before {
|
|
149
|
+
top: var(--window-resize-outset);
|
|
150
|
+
left: var(--window-resize-outset);
|
|
63
151
|
border-top-width: 2px;
|
|
64
152
|
border-left-width: 2px;
|
|
153
|
+
border-top-left-radius: var(--app-radius-surface);
|
|
65
154
|
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import type { PointerEvent as ReactPointerEvent } from "react";
|
|
2
|
+
type ResizeCorner = "se" | "sw" | "ne" | "nw";
|
|
3
|
+
type ResizeSide = "n" | "e" | "s" | "w";
|
|
4
|
+
export type ResizeEdge = ResizeCorner | ResizeSide;
|
|
5
|
+
type ResizePointerDown = (event: ReactPointerEvent, edge: ResizeEdge) => void;
|
|
6
|
+
export declare function WindowResizeHandles({ handleResizePointerDown, }: {
|
|
7
|
+
handleResizePointerDown: ResizePointerDown;
|
|
5
8
|
}): import("react").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -1,6 +1,21 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import "./WindowResizeHandle.css";
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
// Sides first, so the corners paint over the ends of the sides and win where
|
|
4
|
+
// the two meet.
|
|
5
|
+
const RESIZE_EDGES = [
|
|
6
|
+
"n",
|
|
7
|
+
"e",
|
|
8
|
+
"s",
|
|
9
|
+
"w",
|
|
10
|
+
"se",
|
|
11
|
+
"sw",
|
|
12
|
+
"ne",
|
|
13
|
+
"nw",
|
|
14
|
+
];
|
|
15
|
+
function WindowResizeHandle({ edge, onPointerDown, }) {
|
|
16
|
+
return (_jsx("div", { role: "none", className: `window-resize window-resize--${edge}`, onPointerDown: (event) => onPointerDown(event, edge) }));
|
|
17
|
+
}
|
|
18
|
+
export function WindowResizeHandles({ handleResizePointerDown, }) {
|
|
19
|
+
return (_jsx(_Fragment, { children: RESIZE_EDGES.map((edge) => (_jsx(WindowResizeHandle, { edge: edge, onPointerDown: handleResizePointerDown }, edge))) }));
|
|
5
20
|
}
|
|
6
21
|
//# sourceMappingURL=WindowResizeHandle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WindowResizeHandle.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"WindowResizeHandle.js","sourceRoot":"","sources":["../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowResizeHandle.tsx"],"names":[],"mappings":";AACA,OAAO,0BAA0B,CAAC;AAUlC,6EAA6E;AAC7E,gBAAgB;AAChB,MAAM,YAAY,GAA8B;IAC9C,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;CACL,CAAC;AAEF,SAAS,kBAAkB,CAAC,EAC1B,IAAI,EACJ,aAAa,GAId;IACC,OAAO,CACL,cACE,IAAI,EAAC,MAAM,EACX,SAAS,EAAE,gCAAgC,IAAI,EAAE,EACjD,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,GACpD,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAClC,uBAAuB,GAGxB;IACC,OAAO,CACL,4BACG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC1B,KAAC,kBAAkB,IACjB,IAAI,EAAE,IAAI,EAEV,aAAa,EAAE,uBAAuB,IADjC,IAAI,CAET,CACH,CAAC,GACD,CACJ,CAAC;AACJ,CAAC","sourcesContent":["import type { PointerEvent as ReactPointerEvent } from \"react\";\nimport \"./WindowResizeHandle.css\";\n\ntype ResizeCorner = \"se\" | \"sw\" | \"ne\" | \"nw\";\ntype ResizeSide = \"n\" | \"e\" | \"s\" | \"w\";\n\n// The compass point a handle drags: a corner moves two edges, a side one.\nexport type ResizeEdge = ResizeCorner | ResizeSide;\n\ntype ResizePointerDown = (event: ReactPointerEvent, edge: ResizeEdge) => void;\n\n// Sides first, so the corners paint over the ends of the sides and win where\n// the two meet.\nconst RESIZE_EDGES: ReadonlyArray<ResizeEdge> = [\n \"n\",\n \"e\",\n \"s\",\n \"w\",\n \"se\",\n \"sw\",\n \"ne\",\n \"nw\",\n];\n\nfunction WindowResizeHandle({\n edge,\n onPointerDown,\n}: {\n edge: ResizeEdge;\n onPointerDown: ResizePointerDown;\n}) {\n return (\n <div\n role=\"none\"\n className={`window-resize window-resize--${edge}`}\n onPointerDown={(event) => onPointerDown(event, edge)}\n />\n );\n}\n\nexport function WindowResizeHandles({\n handleResizePointerDown,\n}: {\n handleResizePointerDown: ResizePointerDown;\n}) {\n return (\n <>\n {RESIZE_EDGES.map((edge) => (\n <WindowResizeHandle\n edge={edge}\n key={edge}\n onPointerDown={handleResizePointerDown}\n />\n ))}\n </>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WindowSidebar.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"WindowSidebar.js","sourceRoot":"","sources":["../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowSidebar.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,qBAAqB,CAAC;AAE7B,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B,MAAM,UAAU,aAAa,CAAC,EAC5B,UAAU,EACV,YAAY,GAAG,aAAa,EAC5B,OAAO,EACP,QAAQ,GAKR;IACA,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;IAElD,OAAO,CACL,eAAK,SAAS,EAAC,uBAAuB,aACpC,cACE,SAAS,EAAC,gBAAgB,EAC1B,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,YAAY,EAAE,YAE7C,OAAO,GACJ,EACN,KAAC,mBAAmB,IAClB,SAAS,EAAC,uBAAuB,EACjC,YAAY,EAAE,MAAM,CAAC,aAAa,EAClC,SAAS,EAAE,MAAM,CAAC,aAAa,EAC/B,aAAa,EAAE,MAAM,CAAC,iBAAiB,GACvC,EAGF,cAAK,SAAS,EAAC,wBAAwB,EAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,YACnE,cAAK,SAAS,EAAC,+BAA+B,YAAE,QAAQ,GAAO,GAC3D,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["import type { PropsWithChildren, Ref } from \"react\";\nimport {\n SidebarResizeHandle,\n useSidebarResize,\n} from \"../sidebar/SidebarResize\";\nimport \"./WindowSidebar.css\";\n\nconst DEFAULT_WIDTH = 160;\n\nexport function WindowSidebar({\n contentRef,\n defaultWidth = DEFAULT_WIDTH,\n sidebar,\n children,\n}: PropsWithChildren<{\n contentRef?: Ref<HTMLDivElement> | undefined;\n defaultWidth?: number;\n sidebar?: React.ReactNode;\n}>) {\n const resize = useSidebarResize({ defaultWidth });\n\n return (\n <div className=\"window-sidebar-layout\">\n <div\n className=\"window-sidebar\"\n ref={resize.sidebarRef}\n style={{ width: resize.width ?? defaultWidth }}\n >\n {sidebar}\n </div>\n <SidebarResizeHandle\n className=\"window-sidebar-handle\"\n currentWidth={resize.resolvedWidth}\n onKeyDown={resize.handleKeyDown}\n onPointerDown={resize.handlePointerDown}\n />\n {/* Focusable only to script, like `.window-body-content`: the overlay host\n is where focus lands when an overlay outlives the control that opened it. */}\n <div className=\"window-sidebar-content\" ref={contentRef} tabIndex={-1}>\n <div className=\"window-sidebar-content-scroll\">{children}</div>\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WindowSidebarContext.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"WindowSidebarContext.js","sourceRoot":"","sources":["../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowSidebarContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EAGb,UAAU,EACV,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AAOf,MAAM,oBAAoB,GAAG,aAAa,CAA4B;IACpE,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,UAAU,qBAAqB,CAAC,EAAE,QAAQ,EAAqB;IACnE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAY,IAAI,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,OAAO,CACL,KAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACxC,QAAQ,GACqB,CACjC,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,kEAAkE;AAClE,MAAM,UAAU,gBAAgB,CAAC,OAAkB;IACjD,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,UAAU,CAAC,oBAAoB,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,EACzC,OAAO,GAAG,IAAI,EACd,UAAU,EACV,OAAO,GAKR;IACC,4EAA4E;IAC5E,2EAA2E;IAC3E,4EAA4E;IAC5E,4CAA4C;IAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACzC,aAAa,CAAC,OAAO,GAAG,UAAU,CAAC;IAEnC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,UAAU,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnC,2EAA2E;IAC3E,qEAAqE;IACrE,uBAAuB;IACvB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AAChB,CAAC","sourcesContent":["import {\n createContext,\n type PropsWithChildren,\n type ReactNode,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\ninterface WindowSidebarContextValue {\n sidebar: ReactNode;\n setSidebar: (node: ReactNode) => void;\n}\n\nconst WindowSidebarContext = createContext<WindowSidebarContextValue>({\n sidebar: null,\n setSidebar: () => {},\n});\n\nexport function WindowSidebarProvider({ children }: PropsWithChildren) {\n const [sidebar, setSidebar] = useState<ReactNode>(null);\n const value = useMemo(() => ({ sidebar, setSidebar }), [sidebar]);\n return (\n <WindowSidebarContext.Provider value={value}>\n {children}\n </WindowSidebarContext.Provider>\n );\n}\n\n// `sidebar` is a ReactNode, so `false`/`null`/`undefined` all mean \"no\n// sidebar\" while renderable falsy values like `0` or `\"\"` do not.\nexport function hasWindowSidebar(sidebar: ReactNode): boolean {\n return sidebar !== null && sidebar !== undefined && sidebar !== false;\n}\n\nexport function useWindowSidebar() {\n return useContext(WindowSidebarContext);\n}\n\nexport function useRegisteredWindowSidebar({\n enabled = true,\n setSidebar,\n sidebar,\n}: {\n enabled?: boolean;\n setSidebar: (node: ReactNode) => void;\n sidebar: ReactNode;\n}) {\n // The ref keeps the clearing cleanup pinned to [enabled] even when a caller\n // passes a setter that is not referentially stable: with setSidebar in the\n // cleanup's deps, every such render would clear-then-reregister the sidebar\n // and re-render the window shell in a loop.\n const setSidebarRef = useRef(setSidebar);\n setSidebarRef.current = setSidebar;\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n setSidebar(sidebar);\n }, [enabled, setSidebar, sidebar]);\n\n // Clearing stays in its own effect so a sidebar-node change swaps the node\n // without a transient null; the cleanup runs only on unmount or when\n // `enabled` flips off.\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n return () => setSidebarRef.current(null);\n }, [enabled]);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WindowStateProvider.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"WindowStateProvider.js","sourceRoot":"","sources":["../../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowStateProvider/WindowStateProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAA0B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAErE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,UAAU,mBAAmB,CAAC,EAAE,QAAQ,EAAqB;IACjE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,EAAE,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,OAAO,CACvB,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,EAC1E,CAAC,OAAO,CAAC,CACV,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC;QACL,OAAO;QACP,SAAS;KACV,CAAC,EACF,CAAC,OAAO,EAAE,SAAS,CAAC,CACrB,CAAC;IACF,OAAO,CACL,KAAC,oBAAoB,CAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,OAAO,YACnD,KAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAC9C,QAAQ,GAC2B,GACA,CACzC,CAAC;AACJ,CAAC","sourcesContent":["import { type PropsWithChildren, useMemo, useRef, useState } from \"react\";\nimport { windowActionsContext, windowStateContext } from \"./context\";\nimport type { WindowEntry, WindowStateData } from \"./types\";\nimport { useWindowStateActions } from \"./useWindowStateActions\";\n\nexport function WindowStateProvider({ children }: PropsWithChildren) {\n const [windows, setWindows] = useState<WindowEntry[]>([]);\n const counter = useRef(0);\n const actions = useWindowStateActions({ counter, setWindows });\n const windowMap = useMemo(\n () => new Map(windows.map((windowEntry) => [windowEntry.id, windowEntry])),\n [windows],\n );\n const state = useMemo<WindowStateData>(\n () => ({\n windows,\n windowMap,\n }),\n [windows, windowMap],\n );\n return (\n <windowActionsContext.context.Provider value={actions}>\n <windowStateContext.context.Provider value={state}>\n {children}\n </windowStateContext.context.Provider>\n </windowActionsContext.context.Provider>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowStateProvider/context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAEtB,MAAM,6BAA6B,CAAC;AAGrC,0EAA0E;AAC1E,4EAA4E;AAC5E,UAAU;AACV,MAAM,CAAC,MAAM,kBAAkB,GAC7B,qBAAqB,CAAC,iDAAiD,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,oBAAoB,GAC/B,qBAAqB,CAAC,+CAA+C,CAAC,CAAC","sourcesContent":["import {\n createRequiredContext,\n type RequiredContext,\n} from \"../../createRequiredContext\";\nimport type { WindowStateActions, WindowStateData } from \"./types\";\n\n// Keep state and actions in separate contexts so consumers that only need\n// stable actions like create/restore do not re-render on every window-state\n// change.\nexport const windowStateContext: RequiredContext<WindowStateData> =\n createRequiredContext(\"useWindowStateData requires WindowStateProvider\");\n\nexport const windowActionsContext: RequiredContext<WindowStateActions> =\n createRequiredContext(\"useWindowActions requires WindowStateProvider\");\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowStateProvider/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC","sourcesContent":["export type {\n WindowCreateOptions,\n WindowEntry,\n WindowGeometry,\n WindowPosition,\n WindowSize,\n WindowStateActions,\n WindowStateData,\n} from \"./types\";\nexport { useWindowActions } from \"./useWindowActions\";\nexport { useWindowStateData } from \"./useWindowStateData\";\nexport { findTopWindow } from \"./util\";\nexport { WindowStateProvider } from \"./WindowStateProvider\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowStateProvider/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ComponentType } from \"react\";\n\nexport type WindowMoveDirection = \"forward\" | \"backward\";\n\n// Window geometry is relative to the desktop surface a window is rendered in\n// (the window's offset parent), not to the viewport.\nexport interface WindowPosition {\n x: number;\n y: number;\n}\n\nexport interface WindowSize {\n width: number;\n height: number;\n}\n\nexport interface WindowGeometry {\n position: WindowPosition;\n size?: WindowSize | undefined;\n}\n\nexport interface WindowEntry {\n // An opaque key naming the app that owns this window. The window layer only\n // stores and compares it; the host interprets it (see Window's\n // ContentBoundary).\n appId?: string;\n id: string;\n initialShowSidebar?: boolean | undefined;\n pathSegments?: ReadonlyArray<string> | undefined;\n // The window's own Back stack: routes previously visited in this window, the\n // most recent last. A window is not backed by browser history (only the\n // routed shell is), so this is what gives the windowed toolbar a working Back\n // caret. Forward is deliberately not modelled — the toolbar offers Back only.\n routeHistory?: ReadonlyArray<ReadonlyArray<string>> | undefined;\n title: string;\n // Where the window first appears, in viewport coordinates (for example the\n // point a launcher was clicked). Ignored once position is known.\n initialX: number;\n initialY: number;\n // The window's committed geometry. Set when the window is first laid out and\n // whenever a drag or resize ends, so a host can save and restore a layout.\n // Without size the window takes its stylesheet's default size.\n position?: WindowPosition | undefined;\n size?: WindowSize | undefined;\n // maximized and minimized live here rather than inside Window so the taskbar\n // can drive both without reaching into a window's local state.\n maximized: boolean;\n minimized: boolean;\n zIndex: number;\n component?: ComponentType;\n}\n\nexport interface WindowCreateOptions {\n appId?: string;\n initialShowSidebar?: boolean | undefined;\n pathSegments?: ReadonlyArray<string> | undefined;\n // Surface-relative geometry to open with, such as a restored layout. A\n // position takes precedence over create's viewport x/y.\n position?: WindowPosition | undefined;\n size?: WindowSize | undefined;\n}\n\nexport interface WindowStateData {\n // windows is the raw useState array — stable and cheap to iterate for\n // rendering lists. windowMap is derived via useMemo for O(1) lookups by ID.\n // Both are already memoized so neither adds redundant computation.\n windows: WindowEntry[];\n windowMap: Map<string, WindowEntry>;\n}\n\nexport interface WindowStateActions {\n create: (\n title: string,\n x: number,\n y: number,\n component?: ComponentType,\n options?: WindowCreateOptions,\n ) => string;\n close: (id: string) => void;\n maximize: (id: string) => void;\n minimize: (id: string) => void;\n restore: (id: string) => void;\n toggleMaximize: (id: string) => void;\n updateRoute: (\n id: string,\n pathSegments: ReadonlyArray<string>,\n options?: { replace?: boolean | undefined },\n ) => void;\n goBackRoute: (id: string) => void;\n updateTitle: (id: string, title: string) => void;\n moveForward: (id: string) => void;\n moveBackward: (id: string) => void;\n bringToFront: (id: string) => void;\n setGeometry: (id: string, geometry: WindowGeometry) => void;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWindowActions.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"useWindowActions.js","sourceRoot":"","sources":["../../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowStateProvider/useWindowActions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,WAAW,CAAC","sourcesContent":["import { windowActionsContext } from \"./context\";\n\nexport const useWindowActions = windowActionsContext.useRequired;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWindowStateActions.js","sourceRoot":"","sources":["../../../../../../../../Users/a2f0/github/tearleads5/packages/windowing/src/window/WindowStateProvider/useWindowStateActions.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ComponentType,\n Dispatch,\n MutableRefObject,\n SetStateAction,\n} from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport type { WindowCreateOptions, WindowEntry, WindowGeometry } from \"./types\";\nimport {\n bringWindowToFront,\n createWindowEntry,\n getMaxWindowZIndex,\n swapWindowZIndexes,\n updateWindowFlag,\n} from \"./util\";\n\ninterface UseWindowStateActionsParams {\n counter: MutableRefObject<number>;\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>;\n}\n\nfunction arePathSegmentsEqual(\n left: ReadonlyArray<string>,\n right: ReadonlyArray<string>,\n) {\n return (\n left.length === right.length &&\n left.every((segment, index) => segment === right[index])\n );\n}\n\nfunction hasGeometry(entry: WindowEntry, geometry: WindowGeometry) {\n return (\n entry.position?.x === geometry.position.x &&\n entry.position?.y === geometry.position.y &&\n entry.size?.width === geometry.size?.width &&\n entry.size?.height === geometry.size?.height\n );\n}\n\nfunction useSetGeometryAction(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n return useCallback(\n (id: string, geometry: WindowGeometry) => {\n setWindows((previousWindows) => {\n const targetWindow = previousWindows.find(\n (windowEntry) => windowEntry.id === id,\n );\n if (!targetWindow || hasGeometry(targetWindow, geometry)) {\n return previousWindows;\n }\n\n return updateWindowFlag(previousWindows, id, {\n position: { ...geometry.position },\n size: geometry.size ? { ...geometry.size } : undefined,\n });\n });\n },\n [setWindows],\n );\n}\n\nfunction useUpdateRouteAction(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n return useCallback(\n (\n id: string,\n pathSegments: ReadonlyArray<string>,\n options: { replace?: boolean | undefined } = {},\n ) => {\n setWindows((previousWindows) => {\n const targetWindow = previousWindows.find(\n (windowEntry) => windowEntry.id === id,\n );\n if (!targetWindow) {\n return previousWindows;\n }\n\n const currentPathSegments = targetWindow.pathSegments ?? [];\n if (arePathSegmentsEqual(currentPathSegments, pathSegments)) {\n return previousWindows;\n }\n\n // A replacing navigation swaps the current entry rather than stacking on\n // it — the transient step it replaces (a type picker, an unavailable\n // route corrected to the default) must not become a Back destination.\n const nextHistory = options.replace\n ? (targetWindow.routeHistory ?? [])\n : [...(targetWindow.routeHistory ?? []), currentPathSegments];\n\n return previousWindows.map((windowEntry) =>\n windowEntry.id === id\n ? {\n ...windowEntry,\n pathSegments: [...pathSegments],\n routeHistory: nextHistory,\n }\n : windowEntry,\n );\n });\n },\n [setWindows],\n );\n}\n\nfunction useGoBackRouteAction(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n return useCallback(\n (id: string) => {\n setWindows((previousWindows) => {\n const targetWindow = previousWindows.find(\n (windowEntry) => windowEntry.id === id,\n );\n const history = targetWindow?.routeHistory ?? [];\n const previousPathSegments = history[history.length - 1];\n if (!targetWindow || previousPathSegments === undefined) {\n return previousWindows;\n }\n\n return previousWindows.map((windowEntry) =>\n windowEntry.id === id\n ? {\n ...windowEntry,\n pathSegments: [...previousPathSegments],\n routeHistory: history.slice(0, -1),\n }\n : windowEntry,\n );\n });\n },\n [setWindows],\n );\n}\n\nfunction useCloseWindowAction(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n return useCallback(\n (id: string) => {\n setWindows((previousWindows) =>\n previousWindows.filter((windowEntry) => windowEntry.id !== id),\n );\n },\n [setWindows],\n );\n}\n\nfunction useWindowMaximizeActions(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n // Maximizing always reveals the window, so it un-minimizes and raises in one\n // step — the taskbar can offer \"Maximize\" on a minimized window directly.\n const maximize = useCallback(\n (id: string) => {\n setWindows((previousWindows) =>\n updateWindowFlag(bringWindowToFront(previousWindows, id), id, {\n maximized: true,\n minimized: false,\n }),\n );\n },\n [setWindows],\n );\n\n const toggleMaximize = useCallback(\n (id: string) => {\n setWindows((previousWindows) => {\n const target = previousWindows.find(\n (windowEntry) => windowEntry.id === id,\n );\n if (!target) {\n return previousWindows;\n }\n\n const maximized = !target.maximized;\n return updateWindowFlag(\n maximized ? bringWindowToFront(previousWindows, id) : previousWindows,\n id,\n { maximized },\n );\n });\n },\n [setWindows],\n );\n\n return { maximize, toggleMaximize };\n}\n\nfunction useWindowZOrderActions(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n const moveForward = useCallback(\n (id: string) => {\n setWindows((previousWindows) =>\n swapWindowZIndexes(previousWindows, id, \"forward\"),\n );\n },\n [setWindows],\n );\n\n const moveBackward = useCallback(\n (id: string) => {\n setWindows((previousWindows) =>\n swapWindowZIndexes(previousWindows, id, \"backward\"),\n );\n },\n [setWindows],\n );\n\n const bringToFront = useCallback(\n (id: string) => {\n setWindows((previousWindows) => bringWindowToFront(previousWindows, id));\n },\n [setWindows],\n );\n\n return { bringToFront, moveBackward, moveForward };\n}\n\n// Updates to a single window's own fields: its title and its geometry.\nfunction useWindowFieldActions(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n const updateTitle = useCallback(\n (id: string, title: string) => {\n setWindows((previousWindows) =>\n updateWindowFlag(previousWindows, id, { title }),\n );\n },\n [setWindows],\n );\n const setGeometry = useSetGeometryAction(setWindows);\n\n return { setGeometry, updateTitle };\n}\n\nexport function useWindowStateActions({\n counter,\n setWindows,\n}: UseWindowStateActionsParams) {\n const create = useCallback(\n (\n title: string,\n x: number,\n y: number,\n component?: ComponentType,\n options: WindowCreateOptions = {},\n ) => {\n const id = String(++counter.current);\n setWindows((previousWindows) => {\n const maxZIndex = getMaxWindowZIndex(previousWindows);\n return [\n ...previousWindows,\n createWindowEntry(id, title, x, y, maxZIndex + 1, component, options),\n ];\n });\n return id;\n },\n [counter, setWindows],\n );\n\n const close = useCloseWindowAction(setWindows);\n\n const minimize = useCallback(\n (id: string) => {\n setWindows((previousWindows) =>\n updateWindowFlag(previousWindows, id, { minimized: true }),\n );\n },\n [setWindows],\n );\n\n const restore = useCallback(\n (id: string) => {\n setWindows((previousWindows) => {\n const frontWindows = bringWindowToFront(previousWindows, id);\n return updateWindowFlag(frontWindows, id, { minimized: false });\n });\n },\n [setWindows],\n );\n\n const { maximize, toggleMaximize } = useWindowMaximizeActions(setWindows);\n\n const updateRoute = useUpdateRouteAction(setWindows);\n const goBackRoute = useGoBackRouteAction(setWindows);\n\n const { setGeometry, updateTitle } = useWindowFieldActions(setWindows);\n\n const { bringToFront, moveBackward, moveForward } =\n useWindowZOrderActions(setWindows);\n\n return useMemo(\n () => ({\n bringToFront,\n close,\n create,\n goBackRoute,\n maximize,\n minimize,\n moveBackward,\n moveForward,\n restore,\n setGeometry,\n toggleMaximize,\n updateRoute,\n updateTitle,\n }),\n [\n bringToFront,\n close,\n create,\n goBackRoute,\n maximize,\n minimize,\n moveBackward,\n moveForward,\n restore,\n setGeometry,\n toggleMaximize,\n updateRoute,\n updateTitle,\n ],\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"useWindowStateActions.js","sourceRoot":"","sources":["../../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowStateProvider/useWindowStateActions.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ComponentType,\n Dispatch,\n MutableRefObject,\n SetStateAction,\n} from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport type { WindowCreateOptions, WindowEntry, WindowGeometry } from \"./types\";\nimport {\n bringWindowToFront,\n createWindowEntry,\n getMaxWindowZIndex,\n swapWindowZIndexes,\n updateWindowFlag,\n} from \"./util\";\n\ninterface UseWindowStateActionsParams {\n counter: MutableRefObject<number>;\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>;\n}\n\nfunction arePathSegmentsEqual(\n left: ReadonlyArray<string>,\n right: ReadonlyArray<string>,\n) {\n return (\n left.length === right.length &&\n left.every((segment, index) => segment === right[index])\n );\n}\n\nfunction hasGeometry(entry: WindowEntry, geometry: WindowGeometry) {\n return (\n entry.position?.x === geometry.position.x &&\n entry.position?.y === geometry.position.y &&\n entry.size?.width === geometry.size?.width &&\n entry.size?.height === geometry.size?.height\n );\n}\n\nfunction useSetGeometryAction(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n return useCallback(\n (id: string, geometry: WindowGeometry) => {\n setWindows((previousWindows) => {\n const targetWindow = previousWindows.find(\n (windowEntry) => windowEntry.id === id,\n );\n if (!targetWindow || hasGeometry(targetWindow, geometry)) {\n return previousWindows;\n }\n\n return updateWindowFlag(previousWindows, id, {\n position: { ...geometry.position },\n size: geometry.size ? { ...geometry.size } : undefined,\n });\n });\n },\n [setWindows],\n );\n}\n\nfunction useUpdateRouteAction(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n return useCallback(\n (\n id: string,\n pathSegments: ReadonlyArray<string>,\n options: { replace?: boolean | undefined } = {},\n ) => {\n setWindows((previousWindows) => {\n const targetWindow = previousWindows.find(\n (windowEntry) => windowEntry.id === id,\n );\n if (!targetWindow) {\n return previousWindows;\n }\n\n const currentPathSegments = targetWindow.pathSegments ?? [];\n if (arePathSegmentsEqual(currentPathSegments, pathSegments)) {\n return previousWindows;\n }\n\n // A replacing navigation swaps the current entry rather than stacking on\n // it — the transient step it replaces (a type picker, an unavailable\n // route corrected to the default) must not become a Back destination.\n const nextHistory = options.replace\n ? (targetWindow.routeHistory ?? [])\n : [...(targetWindow.routeHistory ?? []), currentPathSegments];\n\n return previousWindows.map((windowEntry) =>\n windowEntry.id === id\n ? {\n ...windowEntry,\n pathSegments: [...pathSegments],\n routeHistory: nextHistory,\n }\n : windowEntry,\n );\n });\n },\n [setWindows],\n );\n}\n\nfunction useGoBackRouteAction(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n return useCallback(\n (id: string) => {\n setWindows((previousWindows) => {\n const targetWindow = previousWindows.find(\n (windowEntry) => windowEntry.id === id,\n );\n const history = targetWindow?.routeHistory ?? [];\n const previousPathSegments = history[history.length - 1];\n if (!targetWindow || previousPathSegments === undefined) {\n return previousWindows;\n }\n\n return previousWindows.map((windowEntry) =>\n windowEntry.id === id\n ? {\n ...windowEntry,\n pathSegments: [...previousPathSegments],\n routeHistory: history.slice(0, -1),\n }\n : windowEntry,\n );\n });\n },\n [setWindows],\n );\n}\n\nfunction useCloseWindowAction(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n return useCallback(\n (id: string) => {\n setWindows((previousWindows) =>\n previousWindows.filter((windowEntry) => windowEntry.id !== id),\n );\n },\n [setWindows],\n );\n}\n\nfunction useWindowMaximizeActions(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n // Maximizing always reveals the window, so it un-minimizes and raises in one\n // step — the taskbar can offer \"Maximize\" on a minimized window directly.\n const maximize = useCallback(\n (id: string) => {\n setWindows((previousWindows) =>\n updateWindowFlag(bringWindowToFront(previousWindows, id), id, {\n maximized: true,\n minimized: false,\n }),\n );\n },\n [setWindows],\n );\n\n const toggleMaximize = useCallback(\n (id: string) => {\n setWindows((previousWindows) => {\n const target = previousWindows.find(\n (windowEntry) => windowEntry.id === id,\n );\n if (!target) {\n return previousWindows;\n }\n\n const maximized = !target.maximized;\n return updateWindowFlag(\n maximized ? bringWindowToFront(previousWindows, id) : previousWindows,\n id,\n { maximized },\n );\n });\n },\n [setWindows],\n );\n\n return { maximize, toggleMaximize };\n}\n\nfunction useWindowZOrderActions(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n const moveForward = useCallback(\n (id: string) => {\n setWindows((previousWindows) =>\n swapWindowZIndexes(previousWindows, id, \"forward\"),\n );\n },\n [setWindows],\n );\n\n const moveBackward = useCallback(\n (id: string) => {\n setWindows((previousWindows) =>\n swapWindowZIndexes(previousWindows, id, \"backward\"),\n );\n },\n [setWindows],\n );\n\n const bringToFront = useCallback(\n (id: string) => {\n setWindows((previousWindows) => bringWindowToFront(previousWindows, id));\n },\n [setWindows],\n );\n\n return { bringToFront, moveBackward, moveForward };\n}\n\n// Updates to a single window's own fields: its title and its geometry.\nfunction useWindowFieldActions(\n setWindows: Dispatch<SetStateAction<WindowEntry[]>>,\n) {\n const updateTitle = useCallback(\n (id: string, title: string) => {\n setWindows((previousWindows) =>\n updateWindowFlag(previousWindows, id, { title }),\n );\n },\n [setWindows],\n );\n const setGeometry = useSetGeometryAction(setWindows);\n\n return { setGeometry, updateTitle };\n}\n\nexport function useWindowStateActions({\n counter,\n setWindows,\n}: UseWindowStateActionsParams) {\n const create = useCallback(\n (\n title: string,\n x: number,\n y: number,\n component?: ComponentType,\n options: WindowCreateOptions = {},\n ) => {\n const id = String(++counter.current);\n setWindows((previousWindows) => {\n const maxZIndex = getMaxWindowZIndex(previousWindows);\n return [\n ...previousWindows,\n createWindowEntry(id, title, x, y, maxZIndex + 1, component, options),\n ];\n });\n return id;\n },\n [counter, setWindows],\n );\n\n const close = useCloseWindowAction(setWindows);\n\n const minimize = useCallback(\n (id: string) => {\n setWindows((previousWindows) =>\n updateWindowFlag(previousWindows, id, { minimized: true }),\n );\n },\n [setWindows],\n );\n\n const restore = useCallback(\n (id: string) => {\n setWindows((previousWindows) => {\n const frontWindows = bringWindowToFront(previousWindows, id);\n return updateWindowFlag(frontWindows, id, { minimized: false });\n });\n },\n [setWindows],\n );\n\n const { maximize, toggleMaximize } = useWindowMaximizeActions(setWindows);\n\n const updateRoute = useUpdateRouteAction(setWindows);\n const goBackRoute = useGoBackRouteAction(setWindows);\n\n const { setGeometry, updateTitle } = useWindowFieldActions(setWindows);\n\n const { bringToFront, moveBackward, moveForward } =\n useWindowZOrderActions(setWindows);\n\n return useMemo(\n () => ({\n bringToFront,\n close,\n create,\n goBackRoute,\n maximize,\n minimize,\n moveBackward,\n moveForward,\n restore,\n setGeometry,\n toggleMaximize,\n updateRoute,\n updateTitle,\n }),\n [\n bringToFront,\n close,\n create,\n goBackRoute,\n maximize,\n minimize,\n moveBackward,\n moveForward,\n restore,\n setGeometry,\n toggleMaximize,\n updateRoute,\n updateTitle,\n ],\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWindowStateData.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"useWindowStateData.js","sourceRoot":"","sources":["../../../../home/a2f0/github/tearleads/packages/windowing/src/window/WindowStateProvider/useWindowStateData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,WAAW,CAAC","sourcesContent":["import { windowStateContext } from \"./context\";\n\nexport const useWindowStateData = windowStateContext.useRequired;\n"]}
|