@amboss/design-system 3.48.6-canary.0 → 3.48.7
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/build/cjs/components/ChatMessage/ChatMessage.d.ts +46 -0
- package/build/cjs/components/ChatMessage/ChatMessage.js +1 -0
- package/build/cjs/components/ChatMessage/index.d.ts +2 -0
- package/build/cjs/components/ChatMessage/index.js +1 -0
- package/build/cjs/components/ChatResponse/ChatResponse.d.ts +50 -0
- package/build/cjs/components/ChatResponse/ChatResponse.js +1 -0
- package/build/cjs/components/ChatResponse/constants.d.ts +7 -0
- package/build/cjs/components/ChatResponse/constants.js +1 -0
- package/build/cjs/components/ChatResponse/index.d.ts +2 -0
- package/build/cjs/components/ChatResponse/index.js +1 -0
- package/build/cjs/components/Patterns/EmptyState/EmptyState.d.ts +1 -1
- package/build/cjs/components/Patterns/EmptyState/EmptyState.js +1 -1
- package/build/cjs/components/Utilities/FloatingPosition/useFloatingPosition.d.ts +52 -0
- package/build/cjs/components/Utilities/FloatingPosition/useFloatingPosition.js +1 -0
- package/build/cjs/components/Utilities/FloatingPosition/utils.d.ts +26 -0
- package/build/cjs/components/Utilities/FloatingPosition/utils.js +1 -0
- package/build/cjs/index.d.ts +2 -1
- package/build/cjs/index.js +1 -1
- package/build/cjs/web-tokens/_sizes.json +51 -51
- package/build/cjs/web-tokens/assets/icons.json +1 -1
- package/build/esm/components/ChatMessage/ChatMessage.d.ts +46 -0
- package/build/esm/components/ChatMessage/ChatMessage.js +1 -0
- package/build/esm/components/ChatMessage/index.d.ts +2 -0
- package/build/esm/components/ChatMessage/index.js +1 -0
- package/build/esm/components/ChatResponse/ChatResponse.d.ts +50 -0
- package/build/esm/components/ChatResponse/ChatResponse.js +1 -0
- package/build/esm/components/ChatResponse/constants.d.ts +7 -0
- package/build/esm/components/ChatResponse/constants.js +1 -0
- package/build/esm/components/ChatResponse/index.d.ts +2 -0
- package/build/esm/components/ChatResponse/index.js +1 -0
- package/build/esm/components/Patterns/EmptyState/EmptyState.d.ts +1 -1
- package/build/esm/components/Patterns/EmptyState/EmptyState.js +1 -1
- package/build/esm/components/Utilities/FloatingPosition/useFloatingPosition.d.ts +52 -0
- package/build/esm/components/Utilities/FloatingPosition/useFloatingPosition.js +1 -0
- package/build/esm/components/Utilities/FloatingPosition/utils.d.ts +26 -0
- package/build/esm/components/Utilities/FloatingPosition/utils.js +1 -0
- package/build/esm/index.d.ts +2 -1
- package/build/esm/index.js +1 -1
- package/build/esm/web-tokens/_sizes.json +51 -51
- package/build/esm/web-tokens/assets/icons.json +1 -1
- package/package.json +2 -2
- package/build/cjs/components/Internal/LayoutManager/-constants.d.ts +0 -9
- package/build/cjs/components/Internal/LayoutManager/-constants.js +0 -1
- package/build/cjs/components/Internal/LayoutManager/-types.d.ts +0 -181
- package/build/cjs/components/Internal/LayoutManager/-types.js +0 -1
- package/build/cjs/components/Internal/LayoutManager/Layout.d.ts +0 -28
- package/build/cjs/components/Internal/LayoutManager/Layout.js +0 -1
- package/build/cjs/components/Internal/LayoutManager/LayoutProvider.d.ts +0 -9
- package/build/cjs/components/Internal/LayoutManager/LayoutProvider.js +0 -1
- package/build/cjs/components/Internal/LayoutManager/context.d.ts +0 -12
- package/build/cjs/components/Internal/LayoutManager/context.js +0 -1
- package/build/cjs/components/Internal/LayoutManager/index.d.ts +0 -7
- package/build/cjs/components/Internal/LayoutManager/index.js +0 -1
- package/build/cjs/components/Internal/LayoutManager/persistence.d.ts +0 -6
- package/build/cjs/components/Internal/LayoutManager/persistence.js +0 -1
- package/build/cjs/components/Internal/LayoutManager/reconcile.d.ts +0 -2
- package/build/cjs/components/Internal/LayoutManager/reconcile.js +0 -1
- package/build/cjs/components/Internal/LayoutManager/reducer.d.ts +0 -5
- package/build/cjs/components/Internal/LayoutManager/reducer.js +0 -1
- package/build/cjs/components/Internal/LayoutManager/store.d.ts +0 -10
- package/build/cjs/components/Internal/LayoutManager/store.js +0 -1
- package/build/cjs/components/Internal/LayoutManager/useHostNodes.d.ts +0 -9
- package/build/cjs/components/Internal/LayoutManager/useHostNodes.js +0 -1
- package/build/cjs/components/Internal/LayoutManager/useIsMobile.d.ts +0 -5
- package/build/cjs/components/Internal/LayoutManager/useIsMobile.js +0 -1
- package/build/cjs/components/Internal/LayoutManager/useLayout.d.ts +0 -7
- package/build/cjs/components/Internal/LayoutManager/useLayout.js +0 -1
- package/build/esm/components/Internal/LayoutManager/-constants.d.ts +0 -9
- package/build/esm/components/Internal/LayoutManager/-constants.js +0 -1
- package/build/esm/components/Internal/LayoutManager/-types.d.ts +0 -181
- package/build/esm/components/Internal/LayoutManager/-types.js +0 -1
- package/build/esm/components/Internal/LayoutManager/Layout.d.ts +0 -28
- package/build/esm/components/Internal/LayoutManager/Layout.js +0 -1
- package/build/esm/components/Internal/LayoutManager/LayoutProvider.d.ts +0 -9
- package/build/esm/components/Internal/LayoutManager/LayoutProvider.js +0 -1
- package/build/esm/components/Internal/LayoutManager/context.d.ts +0 -12
- package/build/esm/components/Internal/LayoutManager/context.js +0 -1
- package/build/esm/components/Internal/LayoutManager/index.d.ts +0 -7
- package/build/esm/components/Internal/LayoutManager/index.js +0 -1
- package/build/esm/components/Internal/LayoutManager/persistence.d.ts +0 -6
- package/build/esm/components/Internal/LayoutManager/persistence.js +0 -1
- package/build/esm/components/Internal/LayoutManager/reconcile.d.ts +0 -2
- package/build/esm/components/Internal/LayoutManager/reconcile.js +0 -1
- package/build/esm/components/Internal/LayoutManager/reducer.d.ts +0 -5
- package/build/esm/components/Internal/LayoutManager/reducer.js +0 -1
- package/build/esm/components/Internal/LayoutManager/store.d.ts +0 -10
- package/build/esm/components/Internal/LayoutManager/store.js +0 -1
- package/build/esm/components/Internal/LayoutManager/useHostNodes.d.ts +0 -9
- package/build/esm/components/Internal/LayoutManager/useHostNodes.js +0 -1
- package/build/esm/components/Internal/LayoutManager/useIsMobile.d.ts +0 -5
- package/build/esm/components/Internal/LayoutManager/useIsMobile.js +0 -1
- package/build/esm/components/Internal/LayoutManager/useLayout.d.ts +0 -7
- package/build/esm/components/Internal/LayoutManager/useLayout.js +0 -1
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import type { ReactNode } from "react";
|
|
3
|
-
import { LayoutProvider } from "./LayoutProvider";
|
|
4
|
-
import type { ContentProps, FloatProps, LayoutProviderProps, SidePanelProps, SplitProps } from "./-types";
|
|
5
|
-
declare const Sidebar: React.FC<SidePanelProps>;
|
|
6
|
-
declare const RightPanel: React.FC<SidePanelProps>;
|
|
7
|
-
declare const Content: React.FC<ContentProps>;
|
|
8
|
-
declare const Split: React.FC<SplitProps>;
|
|
9
|
-
declare const Float: React.FC<FloatProps>;
|
|
10
|
-
declare function LayoutShell({ children, }: {
|
|
11
|
-
children: ReactNode;
|
|
12
|
-
}): React.ReactElement;
|
|
13
|
-
type LayoutComponent = React.FC<LayoutProviderProps> & {
|
|
14
|
-
Sidebar: typeof Sidebar;
|
|
15
|
-
RightPanel: typeof RightPanel;
|
|
16
|
-
Content: typeof Content;
|
|
17
|
-
Split: typeof Split;
|
|
18
|
-
Float: typeof Float;
|
|
19
|
-
/** Context only (store + mobile breakpoint). Use with `Layout.Shell` when you
|
|
20
|
-
* need chrome (e.g. a NavBar) that calls `useLayout()` but sits OUTSIDE the
|
|
21
|
-
* resizable shell. For the common case use `<Layout>` (provider + shell). */
|
|
22
|
-
Provider: typeof LayoutProvider;
|
|
23
|
-
/** The resizable shell (columns + overlays + floats). Must be rendered inside
|
|
24
|
-
* a `Layout.Provider`. Holds the column markers. */
|
|
25
|
-
Shell: typeof LayoutShell;
|
|
26
|
-
};
|
|
27
|
-
export declare const Layout: LayoutComponent;
|
|
28
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"Layout",{enumerable:!0,get:function(){return Layout}});const _react=/*#__PURE__*/require("@swc/helpers/_/_interop_require_wildcard")._(require("react")),_reactdom=require("react-dom"),_reactresizablepanels=require("react-resizable-panels"),_constants=require("./-constants"),_LayoutProvider=require("./LayoutProvider"),_useHostNodes=require("./useHostNodes"),_useLayout=require("./useLayout"),VALIGNS=["top","center","bottom"],columnHostKey=slot=>`col-${slot}`,overlayHostKey=slot=>`ov-${slot}`,floatHostKey=(align,valign)=>`fl-${align}-${valign}`,FLOAT_HOST_KEYS=["left","center","right"].flatMap(a=>VALIGNS.map(v=>floatHostKey(a,v))),HOST_KEYS=[..._constants.COLUMN_ORDER.map(columnHostKey),overlayHostKey("sidebar"),overlayHostKey("rightPanel"),...FLOAT_HOST_KEYS],HostContext=(0,_react.createContext)({});function useHost(key){return(0,_react.useContext)(HostContext)[key]??null}const ColumnRegistryContext=(0,_react.createContext)(null),FloatRegistryContext=(0,_react.createContext)(null);function useDeclareColumn(slot,reg){let registry=(0,_react.useContext)(ColumnRegistryContext),{minSize,maxSize,collapsible}=reg;(0,_react.useEffect)(()=>{if(registry)return registry.register(slot,{minSize,maxSize,collapsible}),()=>registry.unregister(slot)},[registry,slot,minSize,maxSize,collapsible])}function sideHostKey(slot,mode){return"column"===mode?columnHostKey(slot):"floating"===mode||"sheet"===mode?overlayHostKey(slot):null}function portalInto(node,children){return node?(0,_reactdom.createPortal)(children,node):null}const Sidebar=({children,minSize,maxSize,collapsible=!0})=>{useDeclareColumn("sidebar",{minSize,maxSize,collapsible});let{modes}=(0,_useLayout.useLayout)();return portalInto(useHost(sideHostKey("sidebar",modes.sidebar)??""),children)};Sidebar.displayName="Layout.Sidebar";const RightPanel=({children,minSize,maxSize,collapsible=!0})=>{useDeclareColumn("rightPanel",{minSize,maxSize,collapsible});let{modes}=(0,_useLayout.useLayout)();return portalInto(useHost(sideHostKey("rightPanel",modes.rightPanel)??""),children)};RightPanel.displayName="Layout.RightPanel";const Content=({children,minSize,maxSize})=>(useDeclareColumn("content",{minSize,maxSize,collapsible:!1}),portalInto(useHost(columnHostKey("content")),children));Content.displayName="Layout.Content";const Split=({children,minSize,maxSize})=>{useDeclareColumn("splitview",{minSize,maxSize,collapsible:!0});let{modes}=(0,_useLayout.useLayout)(),host=useHost(columnHostKey("splitview"));return"column"===modes.splitview?portalInto(host,children):null};Split.displayName="Layout.Split";const Float=({children,align,valign})=>{let anchor=floatHostKey(align,valign),registry=(0,_react.useContext)(FloatRegistryContext);(0,_react.useEffect)(()=>{if(registry)return registry.acquire(anchor),()=>registry.release(anchor)},[registry,anchor]);let node=useHost(anchor);return node?(0,_reactdom.createPortal)(_react.default.createElement("div",{style:{pointerEvents:"auto"}},children),node):null};function ColumnRow({columns,declared,sizes,hostFor,onResize,onCollapse}){return _react.default.createElement(_reactresizablepanels.Group,{orientation:"horizontal",style:{height:"100%",width:"100%"},onLayoutChanged:layout=>{columns.forEach(slot=>{let pct=layout[slot];if("number"!=typeof pct)return;let reg=declared[slot];if((reg?.collapsible??"splitview"===slot)&&pct<.5)return void onCollapse(slot);pct>=.5&&onResize(slot,`${pct}%`)})}},columns.map((slot,index)=>{let reg=declared[slot]??{};return _react.default.createElement(_react.default.Fragment,{key:slot},index>0&&_react.default.createElement(_reactresizablepanels.Separator,null),_react.default.createElement(_reactresizablepanels.Panel,{id:slot,defaultSize:"content"===slot?void 0:sizes[slot],collapsible:"content"!==slot,minSize:reg.minSize,maxSize:reg.maxSize},_react.default.createElement("div",{ref:hostFor(columnHostKey(slot)),style:{position:"relative",height:"100%",width:"100%"}})))}))}function SideOverlay({side,sheet,onClose,hostRef}){return _react.default.createElement(_react.default.Fragment,null,sheet&&_react.default.createElement("button",{type:"button","aria-label":"Close","data-ds-id":"LayoutSheetBackdrop",onClick:onClose,style:{position:"absolute",inset:0,border:"none",padding:0,cursor:"pointer",background:"rgba(0,0,0,.4)",pointerEvents:"auto",zIndex:1e3}}),_react.default.createElement("div",{"data-ds-id":"LayoutSideOverlay",style:{position:"absolute",top:12*!sheet,bottom:12*!sheet,[side]:12*!sheet,width:sheet?"80%":320,maxWidth:"90%",background:"var(--ds-surface, #fff)",boxShadow:"0 8px 32px rgba(0,0,0,.2)",borderRadius:8*!sheet,overflow:"auto",pointerEvents:"auto",zIndex:1001},ref:hostRef}))}Float.displayName="Layout.Float";const ALIGN_CSS={left:{left:12,alignItems:"flex-start"},center:{left:"50%",transform:"translateX(-50%)",alignItems:"center"},right:{right:12,alignItems:"flex-end"}},VALIGN_CSS={top:{top:12},center:{top:"50%"},bottom:{bottom:12}};function FloatAnchors({anchors,hostFor}){return _react.default.createElement(_react.default.Fragment,null,anchors.map(key=>{let[align,valign]=key.slice(3).split("-");return _react.default.createElement("div",{key:key,"data-ds-id":`LayoutFloat-${align}-${valign}`,ref:hostFor(key),style:{position:"absolute",display:"flex",zIndex:1002,pointerEvents:"none",...ALIGN_CSS[align],...VALIGN_CSS[valign]}})}))}function LayoutShell({children}){let layout=(0,_useLayout.useLayout)(),{state,modes}=layout,[declared,setDeclared]=(0,_react.useState)({}),registry=(0,_react.useMemo)(()=>({register:(slot,reg)=>setDeclared(prev=>({...prev,[slot]:reg})),unregister:slot=>setDeclared(prev=>{if(!(slot in prev))return prev;let next={...prev};return delete next[slot],next})}),[]),[floatCounts,setFloatCounts]=(0,_react.useState)({}),floatRegistry=(0,_react.useMemo)(()=>({acquire:anchor=>setFloatCounts(prev=>({...prev,[anchor]:(prev[anchor]??0)+1})),release:anchor=>setFloatCounts(prev=>{let next={...prev},count=(next[anchor]??0)-1;return count<=0?delete next[anchor]:next[anchor]=count,next})}),[]),floatAnchors=Object.keys(floatCounts),[nodes,hostCallbacks]=(0,_useHostNodes.useHostNodes)(HOST_KEYS),hostFor=key=>hostCallbacks[key],columns=_constants.COLUMN_ORDER.filter(slot=>declared[slot]&&"column"===modes[slot]),sizes={};columns.forEach(slot=>{sizes[slot]="content"===slot?void 0:state[slot].size});let sideOverlay=(slot,side)=>{let mode=modes[slot];return declared[slot]&&("floating"===mode||"sheet"===mode)?_react.default.createElement(SideOverlay,{side:side,sheet:"sheet"===mode,onClose:()=>layout[slot].close(),hostRef:hostFor(overlayHostKey(slot))}):null};return _react.default.createElement(ColumnRegistryContext.Provider,{value:registry},_react.default.createElement(FloatRegistryContext.Provider,{value:floatRegistry},_react.default.createElement(HostContext.Provider,{value:nodes},_react.default.createElement("div",{"data-ds-id":"Layout",style:{position:"relative",height:"100%",width:"100%"}},columns.length>0&&_react.default.createElement(ColumnRow,{columns:columns,declared:declared,sizes:sizes,hostFor:hostFor,onResize:(key,size)=>layout[key].resize(size),onCollapse:key=>{"sidebar"===key||"rightPanel"===key?layout[key].close():layout[key].hide()}}),sideOverlay("sidebar","left"),sideOverlay("rightPanel","right"),_react.default.createElement(FloatAnchors,{anchors:floatAnchors,hostFor:hostFor}),children))))}const Layout=({children,...rest})=>_react.default.createElement(_LayoutProvider.LayoutProvider,rest,_react.default.createElement(LayoutShell,null,children));Layout.Sidebar=Sidebar,Layout.RightPanel=RightPanel,Layout.Content=Content,Layout.Split=Split,Layout.Float=Float,Layout.Provider=_LayoutProvider.LayoutProvider,Layout.Shell=LayoutShell;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import type { LayoutProviderProps } from "./-types";
|
|
3
|
-
/**
|
|
4
|
-
* Owns the state engine + publishes the mobile breakpoint. Mount once, above the
|
|
5
|
-
* router. Pass `store` to replace the default vanilla engine with a
|
|
6
|
-
* zustand/redux-backed one; otherwise a default store is built from `config`.
|
|
7
|
-
* Hydrates from `persistenceKey` at init and saves (debounced) on change.
|
|
8
|
-
*/
|
|
9
|
-
export declare function LayoutProvider({ children, config, store, persistenceKey, storage, mobileBreakpoint, }: LayoutProviderProps): React.ReactElement;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"LayoutProvider",{enumerable:!0,get:function(){return LayoutProvider}});const _react=/*#__PURE__*/require("@swc/helpers/_/_interop_require_wildcard")._(require("react")),_context=require("./context"),_persistence=require("./persistence"),_reducer=require("./reducer"),_store=require("./store");function LayoutProvider({children,config,store,persistenceKey,storage,mobileBreakpoint}){let storeRef=(0,_react.useRef)(null);if(null===storeRef.current){let initial=(0,_reducer.createInitialState)(config);if(persistenceKey){let snapshot=(0,_persistence.loadSnapshot)((0,_persistence.resolveStorage)(storage),persistenceKey);snapshot&&(initial=(0,_persistence.applyPatch)(initial,snapshot))}storeRef.current=store??(0,_store.createLayoutStore)(initial)}return(0,_react.useEffect)(()=>{let timer;if(!persistenceKey)return;let backend=(0,_persistence.resolveStorage)(storage),activeStore=storeRef.current;if(!backend||!activeStore)return;let unsubscribe=activeStore.subscribe(()=>{timer&&clearTimeout(timer),timer=setTimeout(()=>(0,_persistence.saveSnapshot)(backend,persistenceKey,activeStore.getState()),200)});return()=>{timer&&clearTimeout(timer),unsubscribe()}},[persistenceKey,storage]),_react.default.createElement(_context.LayoutStoreProvider,{value:storeRef.current},_react.default.createElement(_context.MobileBreakpointProvider,{value:mobileBreakpoint},children))}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { LayoutState, LayoutStore } from "./-types";
|
|
2
|
-
export declare const LayoutStoreProvider: React.Provider<LayoutStore>;
|
|
3
|
-
/** Get the store from context, or throw if used outside the provider. */
|
|
4
|
-
export declare function useLayoutStore(): LayoutStore;
|
|
5
|
-
export declare const MobileBreakpointProvider: React.Provider<number>;
|
|
6
|
-
export declare function useMobileBreakpoint(): number | undefined;
|
|
7
|
-
/**
|
|
8
|
-
* Subscribe to a slice of layout state via `useSyncExternalStore`. The selector
|
|
9
|
-
* should return a stable reference when nothing relevant changed — the reducer
|
|
10
|
-
* preserves references for untouched positions, so slice selectors are safe.
|
|
11
|
-
*/
|
|
12
|
-
export declare function useLayoutSelector<T>(selector: (state: LayoutState) => T): T;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var target=exports,all={get LayoutStoreProvider(){return LayoutStoreProvider},get MobileBreakpointProvider(){return MobileBreakpointProvider},get useLayoutSelector(){return useLayoutSelector},get useLayoutStore(){return useLayoutStore},get useMobileBreakpoint(){return useMobileBreakpoint}};for(var name in all)Object.defineProperty(target,name,{enumerable:!0,get:Object.getOwnPropertyDescriptor(all,name).get});const _react=require("react"),LayoutStoreContext=(0,_react.createContext)(null),LayoutStoreProvider=LayoutStoreContext.Provider;function useLayoutStore(){let store=(0,_react.useContext)(LayoutStoreContext);if(!store)throw Error("useLayout must be used within a <LayoutProvider>.");return store}const MobileBreakpointContext=(0,_react.createContext)(void 0),MobileBreakpointProvider=MobileBreakpointContext.Provider;function useMobileBreakpoint(){return(0,_react.useContext)(MobileBreakpointContext)}function useLayoutSelector(selector){let store=useLayoutStore(),getSnapshot=()=>selector(store.getState());return(0,_react.useSyncExternalStore)(store.subscribe,getSnapshot,getSnapshot)}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export { Layout } from "./Layout";
|
|
2
|
-
export { LayoutProvider } from "./LayoutProvider";
|
|
3
|
-
export { useLayout } from "./useLayout";
|
|
4
|
-
export { useIsMobile } from "./useIsMobile";
|
|
5
|
-
export { createLayoutStore } from "./store";
|
|
6
|
-
export { createInitialState, layoutReducer } from "./reducer";
|
|
7
|
-
export * from "./-types";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var target=exports,all={get Layout(){return _Layout.Layout},get LayoutProvider(){return _LayoutProvider.LayoutProvider},get createInitialState(){return _reducer.createInitialState},get createLayoutStore(){return _store.createLayoutStore},get layoutReducer(){return _reducer.layoutReducer},get useIsMobile(){return _useIsMobile.useIsMobile},get useLayout(){return _useLayout.useLayout}};for(var name in all)Object.defineProperty(target,name,{enumerable:!0,get:Object.getOwnPropertyDescriptor(all,name).get});const _export_star=require("@swc/helpers/_/_export_star"),_Layout=require("./Layout"),_LayoutProvider=require("./LayoutProvider"),_useLayout=require("./useLayout"),_useIsMobile=require("./useIsMobile"),_store=require("./store"),_reducer=require("./reducer");_export_star._(require("./-types"),exports);
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { LayoutState, LayoutStatePatch, LayoutStorage } from "./-types";
|
|
2
|
-
export declare function resolveStorage(storage?: LayoutStorage): LayoutStorage | undefined;
|
|
3
|
-
export declare function serializeState(state: LayoutState): LayoutStatePatch;
|
|
4
|
-
export declare function applyPatch(state: LayoutState, patch: LayoutStatePatch): LayoutState;
|
|
5
|
-
export declare function loadSnapshot(storage: LayoutStorage | undefined, key: string): LayoutStatePatch | null;
|
|
6
|
-
export declare function saveSnapshot(storage: LayoutStorage | undefined, key: string, state: LayoutState): void;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var target=exports,all={get applyPatch(){return applyPatch},get loadSnapshot(){return loadSnapshot},get resolveStorage(){return resolveStorage},get saveSnapshot(){return saveSnapshot},get serializeState(){return serializeState}};for(var name in all)Object.defineProperty(target,name,{enumerable:!0,get:Object.getOwnPropertyDescriptor(all,name).get});function resolveStorage(storage){return storage||("undefined"!=typeof window&&window.localStorage?window.localStorage:void 0)}function serializeState(state){return{sidebar:{open:state.sidebar.open,variant:state.sidebar.variant,size:state.sidebar.size},rightPanel:{open:state.rightPanel.open,variant:state.rightPanel.variant,size:state.rightPanel.size},content:{size:state.content.size},splitview:{visible:state.splitview.visible,size:state.splitview.size}}}function applyPatch(state,patch){let next={...state};return Object.keys(patch).forEach(key=>{let incoming=patch[key];incoming&&(next[key]={...next[key],...incoming})}),next}function loadSnapshot(storage,key){if(!storage)return null;try{let raw=storage.getItem(key);if(!raw)return null;let parsed=JSON.parse(raw);if(!parsed||1!==parsed.v||"object"!=typeof parsed.state)return null;return parsed.state}catch{return null}}function saveSnapshot(storage,key,state){if(storage)try{let payload={v:1,state:serializeState(state)};storage.setItem(key,JSON.stringify(payload))}catch{}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"resolveModes",{enumerable:!0,get:function(){return resolveModes}});const _constants=require("./-constants");function sideMode(slot,isMobile){return slot.open?isMobile?"sheet":"floating"===slot.variant?"floating":"column":"hidden"}function resolveModes(state,isMobile){let modes={content:"column",splitview:state.splitview.visible?"column":"hidden",sidebar:sideMode(state.sidebar,isMobile),rightPanel:sideMode(state.rightPanel,isMobile)};return _constants.COLUMN_ORDER.filter(key=>"column"===modes[key]).length>_constants.MAX_VISIBLE_COLUMNS&&"column"===modes.sidebar&&(modes.sidebar="floating"),modes}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { LayoutConfig, LayoutReducer, LayoutState } from "./-types";
|
|
2
|
-
/** Build the initial state from optional config. */
|
|
3
|
-
export declare function createInitialState(config?: LayoutConfig): LayoutState;
|
|
4
|
-
/** Pure reducer. Returns the same reference when nothing changes. */
|
|
5
|
-
export declare const layoutReducer: LayoutReducer;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var target=exports,all={get createInitialState(){return createInitialState},get layoutReducer(){return layoutReducer}};for(var name in all)Object.defineProperty(target,name,{enumerable:!0,get:Object.getOwnPropertyDescriptor(all,name).get});function sidePanel(config={}){return{kind:"sidePanel",open:config.defaultOpen??!0,collapsible:config.collapsible??!0,variant:config.variant??"sidebar",size:config.defaultSize}}function column(config={}){return{kind:"column",visible:config.defaultVisible??!0,size:config.defaultSize}}function createInitialState(config={}){return{sidebar:sidePanel(config.sidebar),rightPanel:sidePanel({defaultOpen:!1,...config.rightPanel}),content:column(config.content),splitview:column({defaultVisible:!1,...config.splitview})}}const layoutReducer=(state,action)=>{switch(action.type){case"setOpen":{let panel=state[action.panel];if(panel.open===action.open)return state;return{...state,[action.panel]:{...panel,open:action.open}}}case"toggleOpen":{let panel=state[action.panel];return{...state,[action.panel]:{...panel,open:!panel.open}}}case"setVariant":{let panel=state[action.panel];if(panel.variant===action.variant)return state;return{...state,[action.panel]:{...panel,variant:action.variant}}}case"setColumnVisible":{let col=state[action.column];if(col.visible===action.visible)return state;return{...state,[action.column]:{...col,visible:action.visible}}}case"resize":{let slot=state[action.slot];if(slot.size===action.size)return state;return{...state,[action.slot]:{...slot,size:action.size}}}case"hydrate":{let next=state;return Object.keys(action.state).forEach(key=>{let incoming=action.state[key];incoming&&(next={...next,[key]:{...next[key],...incoming}})}),next}default:return state}};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { LayoutState, LayoutStore } from "./-types";
|
|
2
|
-
/**
|
|
3
|
-
* Default, dependency-free `LayoutStore` implementation: a tiny pub/sub wrapper
|
|
4
|
-
* around the pure `layoutReducer`. Skips notifying subscribers when an action is
|
|
5
|
-
* a no-op (reducer returns the same reference).
|
|
6
|
-
*
|
|
7
|
-
* Swap this for a zustand/redux-backed store by implementing the same
|
|
8
|
-
* `LayoutStore` interface — bindings and primitives are unaffected.
|
|
9
|
-
*/
|
|
10
|
-
export declare function createLayoutStore(initial: LayoutState): LayoutStore;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"createLayoutStore",{enumerable:!0,get:function(){return createLayoutStore}});const _reducer=require("./reducer");function createLayoutStore(initial){let state=initial,listeners=new Set;return{getState:()=>state,dispatch:action=>{let next=(0,_reducer.layoutReducer)(state,action);next!==state&&(state=next,listeners.forEach(listener=>listener()))},subscribe:listener=>(listeners.add(listener),()=>{listeners.delete(listener)})}}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Manage a map of published DOM host nodes plus stable per-key ref callbacks.
|
|
3
|
-
* Stable callbacks mean React attaches them only on mount/unmount instead of
|
|
4
|
-
* detach/attach every render (which would loop with setState).
|
|
5
|
-
*/
|
|
6
|
-
export declare function useHostNodes<P extends string>(positions: readonly P[]): [
|
|
7
|
-
Partial<Record<P, HTMLElement | null>>,
|
|
8
|
-
Record<P, (el: HTMLElement | null) => void>
|
|
9
|
-
];
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"useHostNodes",{enumerable:!0,get:function(){return useHostNodes}});const _react=require("react");function useHostNodes(positions){let[nodes,setNodes]=(0,_react.useState)({});return[nodes,(0,_react.useMemo)(()=>{let map={};return positions.forEach(position=>{map[position]=el=>setNodes(prev=>prev[position]===el?prev:{...prev,[position]:el})}),map},[positions])]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"useIsMobile",{enumerable:!0,get:function(){return useIsMobile}});const _react=require("react"),_constants=require("./-constants");function useIsMobile(breakpoint=_constants.DEFAULT_MOBILE_BREAKPOINT){let query=`(max-width: ${breakpoint}px)`;return(0,_react.useSyncExternalStore)(onChange=>{if("undefined"==typeof window||!window.matchMedia)return()=>{};let mql=window.matchMedia(query);return mql.addEventListener("change",onChange),()=>mql.removeEventListener("change",onChange)},()=>"undefined"!=typeof window&&!!window.matchMedia&&window.matchMedia(query).matches,()=>!1)}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { LayoutValue } from "./-types";
|
|
2
|
-
/**
|
|
3
|
-
* The single control hook. Returns `state` plus a typed handle per slot and the
|
|
4
|
-
* current `isMobile` flag. Works from any descendant of `<LayoutProvider>` —
|
|
5
|
-
* remote control without prop drilling.
|
|
6
|
-
*/
|
|
7
|
-
export declare function useLayout(): LayoutValue;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"useLayout",{enumerable:!0,get:function(){return useLayout}});const _context=require("./context"),_reconcile=require("./reconcile"),_useIsMobile=require("./useIsMobile"),selectAll=state=>state;function sidePanelHandle(panel,state,dispatch){let slot=state[panel];return{state:slot,isOpen:slot.open,open:()=>dispatch({type:"setOpen",panel,open:!0}),close:()=>dispatch({type:"setOpen",panel,open:!1}),toggle:()=>dispatch({type:"toggleOpen",panel}),resize:size=>dispatch({type:"resize",slot:panel,size}),setVariant:variant=>dispatch({type:"setVariant",panel,variant})}}function columnHandle(column,state,dispatch){let slot=state[column];return{state:slot,isVisible:slot.visible,show:()=>dispatch({type:"setColumnVisible",column,visible:!0}),hide:()=>dispatch({type:"setColumnVisible",column,visible:!1}),toggle:()=>dispatch({type:"setColumnVisible",column,visible:!slot.visible}),resize:size=>dispatch({type:"resize",slot:column,size})}}function useLayout(){let store=(0,_context.useLayoutStore)(),state=(0,_context.useLayoutSelector)(selectAll),{dispatch}=store,isMobile=(0,_useIsMobile.useIsMobile)((0,_context.useMobileBreakpoint)());return{state,sidebar:sidePanelHandle("sidebar",state,dispatch),rightPanel:sidePanelHandle("rightPanel",state,dispatch),content:columnHandle("content",state,dispatch),splitview:columnHandle("splitview",state,dispatch),isMobile,modes:(0,_reconcile.resolveModes)(state,isMobile)}}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { ColumnKey, SidePanelKey, SlotKey } from "./-types";
|
|
2
|
-
export declare const SIDE_PANELS: SidePanelKey[];
|
|
3
|
-
export declare const COLUMNS: ColumnKey[];
|
|
4
|
-
/** Left-to-right column order in the resizable row. */
|
|
5
|
-
export declare const COLUMN_ORDER: SlotKey[];
|
|
6
|
-
/** Default mobile breakpoint (px, inclusive max). Matches the DS `m` token. */
|
|
7
|
-
export declare const DEFAULT_MOBILE_BREAKPOINT = 768;
|
|
8
|
-
/** Most in-flow columns allowed at once. A 4th request demotes the sidebar. */
|
|
9
|
-
export declare const MAX_VISIBLE_COLUMNS = 3;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const SIDE_PANELS=["sidebar","rightPanel"];export const COLUMNS=["content","splitview"];export const COLUMN_ORDER=["sidebar","content","splitview","rightPanel"];export const DEFAULT_MOBILE_BREAKPOINT=768;export const MAX_VISIBLE_COLUMNS=3;
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import type React from "react";
|
|
2
|
-
/**
|
|
3
|
-
* Layout type contract (DS-1355, simplified direction).
|
|
4
|
-
*
|
|
5
|
-
* Surface = compound components (`Layout.Sidebar` / `Layout.RightPanel` /
|
|
6
|
-
* `Layout.Content` / `Layout.Split` / `Layout.Float`) + one control hook
|
|
7
|
-
* (`useLayout()`). The manager owns the open/collapsed/size state; components
|
|
8
|
-
* render per that state. State engine is replaceable (see `LayoutStore`).
|
|
9
|
-
*
|
|
10
|
-
* Slots (max 4 columns, max 3 visible at once — budget enforcement deferred):
|
|
11
|
-
* sidebar | content | splitview | rightPanel
|
|
12
|
-
*/
|
|
13
|
-
/** A size: plain number = pixels; unitless string = percentage ("10%"). */
|
|
14
|
-
export type Size = number | string;
|
|
15
|
-
/** Side-panel render style (shadcn-derived, AMBOSS-renamed; `inset` dropped). */
|
|
16
|
-
export type Variant = "sidebar" | "floating";
|
|
17
|
-
export type SidePanelKey = "sidebar" | "rightPanel";
|
|
18
|
-
export type ColumnKey = "content" | "splitview";
|
|
19
|
-
export type SlotKey = SidePanelKey | ColumnKey;
|
|
20
|
-
/**
|
|
21
|
-
* Effective render mode of a slot, after the requested→effective reconciler
|
|
22
|
-
* applies the mobile rule and the 3-column budget.
|
|
23
|
-
* column — in-flow resizable column
|
|
24
|
-
* floating — detached overlay panel (desktop)
|
|
25
|
-
* sheet — full-height overlay + backdrop (mobile)
|
|
26
|
-
* hidden — not rendered
|
|
27
|
-
*/
|
|
28
|
-
export type SlotMode = "column" | "floating" | "sheet" | "hidden";
|
|
29
|
-
export type EffectiveModes = Record<SlotKey, SlotMode>;
|
|
30
|
-
/** Float anchor. */
|
|
31
|
-
export type Align = "left" | "center" | "right";
|
|
32
|
-
export type VAlign = "top" | "center" | "bottom";
|
|
33
|
-
export type SidePanelState = {
|
|
34
|
-
kind: "sidePanel";
|
|
35
|
-
/** Expanded/visible vs collapsed/off. */
|
|
36
|
-
open: boolean;
|
|
37
|
-
/** Whether it can collapse at all. */
|
|
38
|
-
collapsible: boolean;
|
|
39
|
-
/** Render style. */
|
|
40
|
-
variant: Variant;
|
|
41
|
-
/** Current size (px number or "%" string). */
|
|
42
|
-
size?: Size;
|
|
43
|
-
};
|
|
44
|
-
export type ColumnState = {
|
|
45
|
-
kind: "column";
|
|
46
|
-
/** content is always visible; splitview is toggleable. */
|
|
47
|
-
visible: boolean;
|
|
48
|
-
size?: Size;
|
|
49
|
-
};
|
|
50
|
-
export type LayoutState = {
|
|
51
|
-
sidebar: SidePanelState;
|
|
52
|
-
rightPanel: SidePanelState;
|
|
53
|
-
content: ColumnState;
|
|
54
|
-
splitview: ColumnState;
|
|
55
|
-
};
|
|
56
|
-
export type SidePanelConfig = {
|
|
57
|
-
defaultOpen?: boolean;
|
|
58
|
-
collapsible?: boolean;
|
|
59
|
-
variant?: Variant;
|
|
60
|
-
defaultSize?: Size;
|
|
61
|
-
minSize?: Size;
|
|
62
|
-
maxSize?: Size;
|
|
63
|
-
};
|
|
64
|
-
export type ColumnConfig = {
|
|
65
|
-
defaultVisible?: boolean;
|
|
66
|
-
defaultSize?: Size;
|
|
67
|
-
minSize?: Size;
|
|
68
|
-
maxSize?: Size;
|
|
69
|
-
};
|
|
70
|
-
export type LayoutConfig = {
|
|
71
|
-
sidebar?: SidePanelConfig;
|
|
72
|
-
rightPanel?: SidePanelConfig;
|
|
73
|
-
content?: ColumnConfig;
|
|
74
|
-
splitview?: ColumnConfig;
|
|
75
|
-
};
|
|
76
|
-
/** Per-slot partial patch (used by hydrate + reload persistence). */
|
|
77
|
-
export type LayoutStatePatch = {
|
|
78
|
-
sidebar?: Partial<SidePanelState>;
|
|
79
|
-
rightPanel?: Partial<SidePanelState>;
|
|
80
|
-
content?: Partial<ColumnState>;
|
|
81
|
-
splitview?: Partial<ColumnState>;
|
|
82
|
-
};
|
|
83
|
-
export type LayoutAction = {
|
|
84
|
-
type: "setOpen";
|
|
85
|
-
panel: SidePanelKey;
|
|
86
|
-
open: boolean;
|
|
87
|
-
} | {
|
|
88
|
-
type: "toggleOpen";
|
|
89
|
-
panel: SidePanelKey;
|
|
90
|
-
} | {
|
|
91
|
-
type: "setVariant";
|
|
92
|
-
panel: SidePanelKey;
|
|
93
|
-
variant: Variant;
|
|
94
|
-
} | {
|
|
95
|
-
type: "setColumnVisible";
|
|
96
|
-
column: ColumnKey;
|
|
97
|
-
visible: boolean;
|
|
98
|
-
} | {
|
|
99
|
-
type: "resize";
|
|
100
|
-
slot: SlotKey;
|
|
101
|
-
size: Size;
|
|
102
|
-
} | {
|
|
103
|
-
type: "hydrate";
|
|
104
|
-
state: LayoutStatePatch;
|
|
105
|
-
};
|
|
106
|
-
export type LayoutReducer = (state: LayoutState, action: LayoutAction) => LayoutState;
|
|
107
|
-
/**
|
|
108
|
-
* Replaceable state engine. Matches `useSyncExternalStore` + zustand/redux
|
|
109
|
-
* conventions. The manager depends only on this interface, so a zustand-backed
|
|
110
|
-
* store can be injected via `<LayoutProvider store={…}>`.
|
|
111
|
-
*/
|
|
112
|
-
export type LayoutStore = {
|
|
113
|
-
getState: () => LayoutState;
|
|
114
|
-
dispatch: (action: LayoutAction) => void;
|
|
115
|
-
subscribe: (listener: () => void) => () => void;
|
|
116
|
-
};
|
|
117
|
-
export type LayoutStorage = {
|
|
118
|
-
getItem: (key: string) => string | null;
|
|
119
|
-
setItem: (key: string, value: string) => void;
|
|
120
|
-
};
|
|
121
|
-
export type SidePanelHandle = {
|
|
122
|
-
state: SidePanelState;
|
|
123
|
-
isOpen: boolean;
|
|
124
|
-
open: () => void;
|
|
125
|
-
close: () => void;
|
|
126
|
-
toggle: () => void;
|
|
127
|
-
resize: (size: Size) => void;
|
|
128
|
-
setVariant: (variant: Variant) => void;
|
|
129
|
-
};
|
|
130
|
-
export type ColumnHandle = {
|
|
131
|
-
state: ColumnState;
|
|
132
|
-
isVisible: boolean;
|
|
133
|
-
show: () => void;
|
|
134
|
-
hide: () => void;
|
|
135
|
-
toggle: () => void;
|
|
136
|
-
resize: (size: Size) => void;
|
|
137
|
-
};
|
|
138
|
-
export type LayoutValue = {
|
|
139
|
-
state: LayoutState;
|
|
140
|
-
sidebar: SidePanelHandle;
|
|
141
|
-
rightPanel: SidePanelHandle;
|
|
142
|
-
content: ColumnHandle;
|
|
143
|
-
splitview: ColumnHandle;
|
|
144
|
-
/** True at/below the mobile breakpoint — side panels render as a sheet. */
|
|
145
|
-
isMobile: boolean;
|
|
146
|
-
/** Effective render mode per slot after the reconciler (mobile + budget). */
|
|
147
|
-
modes: EffectiveModes;
|
|
148
|
-
};
|
|
149
|
-
export type SidePanelProps = {
|
|
150
|
-
children: React.ReactNode;
|
|
151
|
-
variant?: Variant;
|
|
152
|
-
collapsible?: boolean;
|
|
153
|
-
defaultSize?: Size;
|
|
154
|
-
minSize?: Size;
|
|
155
|
-
maxSize?: Size;
|
|
156
|
-
};
|
|
157
|
-
export type ContentProps = {
|
|
158
|
-
children: React.ReactNode;
|
|
159
|
-
minSize?: Size;
|
|
160
|
-
maxSize?: Size;
|
|
161
|
-
};
|
|
162
|
-
export type SplitProps = {
|
|
163
|
-
children: React.ReactNode;
|
|
164
|
-
defaultSize?: Size;
|
|
165
|
-
minSize?: Size;
|
|
166
|
-
maxSize?: Size;
|
|
167
|
-
};
|
|
168
|
-
export type FloatProps = {
|
|
169
|
-
children: React.ReactNode;
|
|
170
|
-
align: Align;
|
|
171
|
-
valign: VAlign;
|
|
172
|
-
};
|
|
173
|
-
export type LayoutProviderProps = {
|
|
174
|
-
children: React.ReactNode;
|
|
175
|
-
config?: LayoutConfig;
|
|
176
|
-
store?: LayoutStore;
|
|
177
|
-
persistenceKey?: string;
|
|
178
|
-
storage?: LayoutStorage;
|
|
179
|
-
/** Mobile breakpoint in px (inclusive max). Defaults to the DS `m` token. */
|
|
180
|
-
mobileBreakpoint?: number;
|
|
181
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{};
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import type { ReactNode } from "react";
|
|
3
|
-
import { LayoutProvider } from "./LayoutProvider";
|
|
4
|
-
import type { ContentProps, FloatProps, LayoutProviderProps, SidePanelProps, SplitProps } from "./-types";
|
|
5
|
-
declare const Sidebar: React.FC<SidePanelProps>;
|
|
6
|
-
declare const RightPanel: React.FC<SidePanelProps>;
|
|
7
|
-
declare const Content: React.FC<ContentProps>;
|
|
8
|
-
declare const Split: React.FC<SplitProps>;
|
|
9
|
-
declare const Float: React.FC<FloatProps>;
|
|
10
|
-
declare function LayoutShell({ children, }: {
|
|
11
|
-
children: ReactNode;
|
|
12
|
-
}): React.ReactElement;
|
|
13
|
-
type LayoutComponent = React.FC<LayoutProviderProps> & {
|
|
14
|
-
Sidebar: typeof Sidebar;
|
|
15
|
-
RightPanel: typeof RightPanel;
|
|
16
|
-
Content: typeof Content;
|
|
17
|
-
Split: typeof Split;
|
|
18
|
-
Float: typeof Float;
|
|
19
|
-
/** Context only (store + mobile breakpoint). Use with `Layout.Shell` when you
|
|
20
|
-
* need chrome (e.g. a NavBar) that calls `useLayout()` but sits OUTSIDE the
|
|
21
|
-
* resizable shell. For the common case use `<Layout>` (provider + shell). */
|
|
22
|
-
Provider: typeof LayoutProvider;
|
|
23
|
-
/** The resizable shell (columns + overlays + floats). Must be rendered inside
|
|
24
|
-
* a `Layout.Provider`. Holds the column markers. */
|
|
25
|
-
Shell: typeof LayoutShell;
|
|
26
|
-
};
|
|
27
|
-
export declare const Layout: LayoutComponent;
|
|
28
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import React,{createContext,useContext,useEffect,useMemo,useState}from"react";import{createPortal}from"react-dom";import{Group,Panel,Separator}from"react-resizable-panels";import{COLUMN_ORDER}from"./-constants";import{LayoutProvider}from"./LayoutProvider";import{useHostNodes}from"./useHostNodes";import{useLayout}from"./useLayout";let VALIGNS=["top","center","bottom"],columnHostKey=slot=>`col-${slot}`,overlayHostKey=slot=>`ov-${slot}`,floatHostKey=(align,valign)=>`fl-${align}-${valign}`,FLOAT_HOST_KEYS=["left","center","right"].flatMap(a=>VALIGNS.map(v=>floatHostKey(a,v))),HOST_KEYS=[...COLUMN_ORDER.map(columnHostKey),overlayHostKey("sidebar"),overlayHostKey("rightPanel"),...FLOAT_HOST_KEYS],HostContext=createContext({});function useHost(key){return useContext(HostContext)[key]??null}let ColumnRegistryContext=createContext(null),FloatRegistryContext=createContext(null);function useDeclareColumn(slot,reg){let registry=useContext(ColumnRegistryContext),{minSize,maxSize,collapsible}=reg;useEffect(()=>{if(registry)return registry.register(slot,{minSize,maxSize,collapsible}),()=>registry.unregister(slot)},[registry,slot,minSize,maxSize,collapsible])}function sideHostKey(slot,mode){return"column"===mode?columnHostKey(slot):"floating"===mode||"sheet"===mode?overlayHostKey(slot):null}function portalInto(node,children){return node?createPortal(children,node):null}let Sidebar=({children,minSize,maxSize,collapsible=!0})=>{useDeclareColumn("sidebar",{minSize,maxSize,collapsible});let{modes}=useLayout();return portalInto(useHost(sideHostKey("sidebar",modes.sidebar)??""),children)};Sidebar.displayName="Layout.Sidebar";let RightPanel=({children,minSize,maxSize,collapsible=!0})=>{useDeclareColumn("rightPanel",{minSize,maxSize,collapsible});let{modes}=useLayout();return portalInto(useHost(sideHostKey("rightPanel",modes.rightPanel)??""),children)};RightPanel.displayName="Layout.RightPanel";let Content=({children,minSize,maxSize})=>(useDeclareColumn("content",{minSize,maxSize,collapsible:!1}),portalInto(useHost(columnHostKey("content")),children));Content.displayName="Layout.Content";let Split=({children,minSize,maxSize})=>{useDeclareColumn("splitview",{minSize,maxSize,collapsible:!0});let{modes}=useLayout(),host=useHost(columnHostKey("splitview"));return"column"===modes.splitview?portalInto(host,children):null};Split.displayName="Layout.Split";let Float=({children,align,valign})=>{let anchor=floatHostKey(align,valign),registry=useContext(FloatRegistryContext);useEffect(()=>{if(registry)return registry.acquire(anchor),()=>registry.release(anchor)},[registry,anchor]);let node=useHost(anchor);return node?createPortal(React.createElement("div",{style:{pointerEvents:"auto"}},children),node):null};function ColumnRow({columns,declared,sizes,hostFor,onResize,onCollapse}){return React.createElement(Group,{orientation:"horizontal",style:{height:"100%",width:"100%"},onLayoutChanged:layout=>{columns.forEach(slot=>{let pct=layout[slot];if("number"!=typeof pct)return;let reg=declared[slot];if((reg?.collapsible??"splitview"===slot)&&pct<.5)return void onCollapse(slot);pct>=.5&&onResize(slot,`${pct}%`)})}},columns.map((slot,index)=>{let reg=declared[slot]??{};return React.createElement(React.Fragment,{key:slot},index>0&&React.createElement(Separator,null),React.createElement(Panel,{id:slot,defaultSize:"content"===slot?void 0:sizes[slot],collapsible:"content"!==slot,minSize:reg.minSize,maxSize:reg.maxSize},React.createElement("div",{ref:hostFor(columnHostKey(slot)),style:{position:"relative",height:"100%",width:"100%"}})))}))}function SideOverlay({side,sheet,onClose,hostRef}){return React.createElement(React.Fragment,null,sheet&&React.createElement("button",{type:"button","aria-label":"Close","data-ds-id":"LayoutSheetBackdrop",onClick:onClose,style:{position:"absolute",inset:0,border:"none",padding:0,cursor:"pointer",background:"rgba(0,0,0,.4)",pointerEvents:"auto",zIndex:1e3}}),React.createElement("div",{"data-ds-id":"LayoutSideOverlay",style:{position:"absolute",top:12*!sheet,bottom:12*!sheet,[side]:12*!sheet,width:sheet?"80%":320,maxWidth:"90%",background:"var(--ds-surface, #fff)",boxShadow:"0 8px 32px rgba(0,0,0,.2)",borderRadius:8*!sheet,overflow:"auto",pointerEvents:"auto",zIndex:1001},ref:hostRef}))}Float.displayName="Layout.Float";let ALIGN_CSS={left:{left:12,alignItems:"flex-start"},center:{left:"50%",transform:"translateX(-50%)",alignItems:"center"},right:{right:12,alignItems:"flex-end"}},VALIGN_CSS={top:{top:12},center:{top:"50%"},bottom:{bottom:12}};function FloatAnchors({anchors,hostFor}){return React.createElement(React.Fragment,null,anchors.map(key=>{let[align,valign]=key.slice(3).split("-");return React.createElement("div",{key:key,"data-ds-id":`LayoutFloat-${align}-${valign}`,ref:hostFor(key),style:{position:"absolute",display:"flex",zIndex:1002,pointerEvents:"none",...ALIGN_CSS[align],...VALIGN_CSS[valign]}})}))}function LayoutShell({children}){let layout=useLayout(),{state,modes}=layout,[declared,setDeclared]=useState({}),registry=useMemo(()=>({register:(slot,reg)=>setDeclared(prev=>({...prev,[slot]:reg})),unregister:slot=>setDeclared(prev=>{if(!(slot in prev))return prev;let next={...prev};return delete next[slot],next})}),[]),[floatCounts,setFloatCounts]=useState({}),floatRegistry=useMemo(()=>({acquire:anchor=>setFloatCounts(prev=>({...prev,[anchor]:(prev[anchor]??0)+1})),release:anchor=>setFloatCounts(prev=>{let next={...prev},count=(next[anchor]??0)-1;return count<=0?delete next[anchor]:next[anchor]=count,next})}),[]),floatAnchors=Object.keys(floatCounts),[nodes,hostCallbacks]=useHostNodes(HOST_KEYS),hostFor=key=>hostCallbacks[key],columns=COLUMN_ORDER.filter(slot=>declared[slot]&&"column"===modes[slot]),sizes={};columns.forEach(slot=>{sizes[slot]="content"===slot?void 0:state[slot].size});let sideOverlay=(slot,side)=>{let mode=modes[slot];return declared[slot]&&("floating"===mode||"sheet"===mode)?React.createElement(SideOverlay,{side:side,sheet:"sheet"===mode,onClose:()=>layout[slot].close(),hostRef:hostFor(overlayHostKey(slot))}):null};return React.createElement(ColumnRegistryContext.Provider,{value:registry},React.createElement(FloatRegistryContext.Provider,{value:floatRegistry},React.createElement(HostContext.Provider,{value:nodes},React.createElement("div",{"data-ds-id":"Layout",style:{position:"relative",height:"100%",width:"100%"}},columns.length>0&&React.createElement(ColumnRow,{columns:columns,declared:declared,sizes:sizes,hostFor:hostFor,onResize:(key,size)=>layout[key].resize(size),onCollapse:key=>{"sidebar"===key||"rightPanel"===key?layout[key].close():layout[key].hide()}}),sideOverlay("sidebar","left"),sideOverlay("rightPanel","right"),React.createElement(FloatAnchors,{anchors:floatAnchors,hostFor:hostFor}),children))))}export const Layout=({children,...rest})=>React.createElement(LayoutProvider,rest,React.createElement(LayoutShell,null,children));Layout.Sidebar=Sidebar,Layout.RightPanel=RightPanel,Layout.Content=Content,Layout.Split=Split,Layout.Float=Float,Layout.Provider=LayoutProvider,Layout.Shell=LayoutShell;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import type { LayoutProviderProps } from "./-types";
|
|
3
|
-
/**
|
|
4
|
-
* Owns the state engine + publishes the mobile breakpoint. Mount once, above the
|
|
5
|
-
* router. Pass `store` to replace the default vanilla engine with a
|
|
6
|
-
* zustand/redux-backed one; otherwise a default store is built from `config`.
|
|
7
|
-
* Hydrates from `persistenceKey` at init and saves (debounced) on change.
|
|
8
|
-
*/
|
|
9
|
-
export declare function LayoutProvider({ children, config, store, persistenceKey, storage, mobileBreakpoint, }: LayoutProviderProps): React.ReactElement;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import React,{useEffect,useRef}from"react";import{LayoutStoreProvider,MobileBreakpointProvider}from"./context";import{applyPatch,loadSnapshot,resolveStorage,saveSnapshot}from"./persistence";import{createInitialState}from"./reducer";import{createLayoutStore}from"./store";export function LayoutProvider({children,config,store,persistenceKey,storage,mobileBreakpoint}){let storeRef=useRef(null);if(null===storeRef.current){let initial=createInitialState(config);if(persistenceKey){let snapshot=loadSnapshot(resolveStorage(storage),persistenceKey);snapshot&&(initial=applyPatch(initial,snapshot))}storeRef.current=store??createLayoutStore(initial)}return useEffect(()=>{let timer;if(!persistenceKey)return;let backend=resolveStorage(storage),activeStore=storeRef.current;if(!backend||!activeStore)return;let unsubscribe=activeStore.subscribe(()=>{timer&&clearTimeout(timer),timer=setTimeout(()=>saveSnapshot(backend,persistenceKey,activeStore.getState()),200)});return()=>{timer&&clearTimeout(timer),unsubscribe()}},[persistenceKey,storage]),React.createElement(LayoutStoreProvider,{value:storeRef.current},React.createElement(MobileBreakpointProvider,{value:mobileBreakpoint},children))}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { LayoutState, LayoutStore } from "./-types";
|
|
2
|
-
export declare const LayoutStoreProvider: React.Provider<LayoutStore>;
|
|
3
|
-
/** Get the store from context, or throw if used outside the provider. */
|
|
4
|
-
export declare function useLayoutStore(): LayoutStore;
|
|
5
|
-
export declare const MobileBreakpointProvider: React.Provider<number>;
|
|
6
|
-
export declare function useMobileBreakpoint(): number | undefined;
|
|
7
|
-
/**
|
|
8
|
-
* Subscribe to a slice of layout state via `useSyncExternalStore`. The selector
|
|
9
|
-
* should return a stable reference when nothing relevant changed — the reducer
|
|
10
|
-
* preserves references for untouched positions, so slice selectors are safe.
|
|
11
|
-
*/
|
|
12
|
-
export declare function useLayoutSelector<T>(selector: (state: LayoutState) => T): T;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{createContext,useContext,useSyncExternalStore}from"react";let LayoutStoreContext=createContext(null);export const LayoutStoreProvider=LayoutStoreContext.Provider;export function useLayoutStore(){let store=useContext(LayoutStoreContext);if(!store)throw Error("useLayout must be used within a <LayoutProvider>.");return store}let MobileBreakpointContext=createContext(void 0);export const MobileBreakpointProvider=MobileBreakpointContext.Provider;export function useMobileBreakpoint(){return useContext(MobileBreakpointContext)}export function useLayoutSelector(selector){let store=useLayoutStore(),getSnapshot=()=>selector(store.getState());return useSyncExternalStore(store.subscribe,getSnapshot,getSnapshot)}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export { Layout } from "./Layout";
|
|
2
|
-
export { LayoutProvider } from "./LayoutProvider";
|
|
3
|
-
export { useLayout } from "./useLayout";
|
|
4
|
-
export { useIsMobile } from "./useIsMobile";
|
|
5
|
-
export { createLayoutStore } from "./store";
|
|
6
|
-
export { createInitialState, layoutReducer } from "./reducer";
|
|
7
|
-
export * from "./-types";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{Layout}from"./Layout";export{LayoutProvider}from"./LayoutProvider";export{useLayout}from"./useLayout";export{useIsMobile}from"./useIsMobile";export{createLayoutStore}from"./store";export{createInitialState,layoutReducer}from"./reducer";export*from"./-types";
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { LayoutState, LayoutStatePatch, LayoutStorage } from "./-types";
|
|
2
|
-
export declare function resolveStorage(storage?: LayoutStorage): LayoutStorage | undefined;
|
|
3
|
-
export declare function serializeState(state: LayoutState): LayoutStatePatch;
|
|
4
|
-
export declare function applyPatch(state: LayoutState, patch: LayoutStatePatch): LayoutState;
|
|
5
|
-
export declare function loadSnapshot(storage: LayoutStorage | undefined, key: string): LayoutStatePatch | null;
|
|
6
|
-
export declare function saveSnapshot(storage: LayoutStorage | undefined, key: string, state: LayoutState): void;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function resolveStorage(storage){return storage||("undefined"!=typeof window&&window.localStorage?window.localStorage:void 0)}export function serializeState(state){return{sidebar:{open:state.sidebar.open,variant:state.sidebar.variant,size:state.sidebar.size},rightPanel:{open:state.rightPanel.open,variant:state.rightPanel.variant,size:state.rightPanel.size},content:{size:state.content.size},splitview:{visible:state.splitview.visible,size:state.splitview.size}}}export function applyPatch(state,patch){let next={...state};return Object.keys(patch).forEach(key=>{let incoming=patch[key];incoming&&(next[key]={...next[key],...incoming})}),next}export function loadSnapshot(storage,key){if(!storage)return null;try{let raw=storage.getItem(key);if(!raw)return null;let parsed=JSON.parse(raw);if(!parsed||1!==parsed.v||"object"!=typeof parsed.state)return null;return parsed.state}catch{return null}}export function saveSnapshot(storage,key,state){if(storage)try{let payload={v:1,state:serializeState(state)};storage.setItem(key,JSON.stringify(payload))}catch{}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{COLUMN_ORDER,MAX_VISIBLE_COLUMNS}from"./-constants";function sideMode(slot,isMobile){return slot.open?isMobile?"sheet":"floating"===slot.variant?"floating":"column":"hidden"}export function resolveModes(state,isMobile){let modes={content:"column",splitview:state.splitview.visible?"column":"hidden",sidebar:sideMode(state.sidebar,isMobile),rightPanel:sideMode(state.rightPanel,isMobile)};return COLUMN_ORDER.filter(key=>"column"===modes[key]).length>MAX_VISIBLE_COLUMNS&&"column"===modes.sidebar&&(modes.sidebar="floating"),modes}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { LayoutConfig, LayoutReducer, LayoutState } from "./-types";
|
|
2
|
-
/** Build the initial state from optional config. */
|
|
3
|
-
export declare function createInitialState(config?: LayoutConfig): LayoutState;
|
|
4
|
-
/** Pure reducer. Returns the same reference when nothing changes. */
|
|
5
|
-
export declare const layoutReducer: LayoutReducer;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
function sidePanel(config={}){return{kind:"sidePanel",open:config.defaultOpen??!0,collapsible:config.collapsible??!0,variant:config.variant??"sidebar",size:config.defaultSize}}function column(config={}){return{kind:"column",visible:config.defaultVisible??!0,size:config.defaultSize}}export function createInitialState(config={}){return{sidebar:sidePanel(config.sidebar),rightPanel:sidePanel({defaultOpen:!1,...config.rightPanel}),content:column(config.content),splitview:column({defaultVisible:!1,...config.splitview})}}export const layoutReducer=(state,action)=>{switch(action.type){case"setOpen":{let panel=state[action.panel];if(panel.open===action.open)return state;return{...state,[action.panel]:{...panel,open:action.open}}}case"toggleOpen":{let panel=state[action.panel];return{...state,[action.panel]:{...panel,open:!panel.open}}}case"setVariant":{let panel=state[action.panel];if(panel.variant===action.variant)return state;return{...state,[action.panel]:{...panel,variant:action.variant}}}case"setColumnVisible":{let col=state[action.column];if(col.visible===action.visible)return state;return{...state,[action.column]:{...col,visible:action.visible}}}case"resize":{let slot=state[action.slot];if(slot.size===action.size)return state;return{...state,[action.slot]:{...slot,size:action.size}}}case"hydrate":{let next=state;return Object.keys(action.state).forEach(key=>{let incoming=action.state[key];incoming&&(next={...next,[key]:{...next[key],...incoming}})}),next}default:return state}};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { LayoutState, LayoutStore } from "./-types";
|
|
2
|
-
/**
|
|
3
|
-
* Default, dependency-free `LayoutStore` implementation: a tiny pub/sub wrapper
|
|
4
|
-
* around the pure `layoutReducer`. Skips notifying subscribers when an action is
|
|
5
|
-
* a no-op (reducer returns the same reference).
|
|
6
|
-
*
|
|
7
|
-
* Swap this for a zustand/redux-backed store by implementing the same
|
|
8
|
-
* `LayoutStore` interface — bindings and primitives are unaffected.
|
|
9
|
-
*/
|
|
10
|
-
export declare function createLayoutStore(initial: LayoutState): LayoutStore;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{layoutReducer}from"./reducer";export function createLayoutStore(initial){let state=initial,listeners=new Set;return{getState:()=>state,dispatch:action=>{let next=layoutReducer(state,action);next!==state&&(state=next,listeners.forEach(listener=>listener()))},subscribe:listener=>(listeners.add(listener),()=>{listeners.delete(listener)})}}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Manage a map of published DOM host nodes plus stable per-key ref callbacks.
|
|
3
|
-
* Stable callbacks mean React attaches them only on mount/unmount instead of
|
|
4
|
-
* detach/attach every render (which would loop with setState).
|
|
5
|
-
*/
|
|
6
|
-
export declare function useHostNodes<P extends string>(positions: readonly P[]): [
|
|
7
|
-
Partial<Record<P, HTMLElement | null>>,
|
|
8
|
-
Record<P, (el: HTMLElement | null) => void>
|
|
9
|
-
];
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{useMemo,useState}from"react";export function useHostNodes(positions){let[nodes,setNodes]=useState({});return[nodes,useMemo(()=>{let map={};return positions.forEach(position=>{map[position]=el=>setNodes(prev=>prev[position]===el?prev:{...prev,[position]:el})}),map},[positions])]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{useSyncExternalStore}from"react";import{DEFAULT_MOBILE_BREAKPOINT}from"./-constants";export function useIsMobile(breakpoint=DEFAULT_MOBILE_BREAKPOINT){let query=`(max-width: ${breakpoint}px)`;return useSyncExternalStore(onChange=>{if("undefined"==typeof window||!window.matchMedia)return()=>{};let mql=window.matchMedia(query);return mql.addEventListener("change",onChange),()=>mql.removeEventListener("change",onChange)},()=>"undefined"!=typeof window&&!!window.matchMedia&&window.matchMedia(query).matches,()=>!1)}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { LayoutValue } from "./-types";
|
|
2
|
-
/**
|
|
3
|
-
* The single control hook. Returns `state` plus a typed handle per slot and the
|
|
4
|
-
* current `isMobile` flag. Works from any descendant of `<LayoutProvider>` —
|
|
5
|
-
* remote control without prop drilling.
|
|
6
|
-
*/
|
|
7
|
-
export declare function useLayout(): LayoutValue;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{useLayoutSelector,useLayoutStore,useMobileBreakpoint}from"./context";import{resolveModes}from"./reconcile";import{useIsMobile}from"./useIsMobile";let selectAll=state=>state;function sidePanelHandle(panel,state,dispatch){let slot=state[panel];return{state:slot,isOpen:slot.open,open:()=>dispatch({type:"setOpen",panel,open:!0}),close:()=>dispatch({type:"setOpen",panel,open:!1}),toggle:()=>dispatch({type:"toggleOpen",panel}),resize:size=>dispatch({type:"resize",slot:panel,size}),setVariant:variant=>dispatch({type:"setVariant",panel,variant})}}function columnHandle(column,state,dispatch){let slot=state[column];return{state:slot,isVisible:slot.visible,show:()=>dispatch({type:"setColumnVisible",column,visible:!0}),hide:()=>dispatch({type:"setColumnVisible",column,visible:!1}),toggle:()=>dispatch({type:"setColumnVisible",column,visible:!slot.visible}),resize:size=>dispatch({type:"resize",slot:column,size})}}export function useLayout(){let store=useLayoutStore(),state=useLayoutSelector(selectAll),{dispatch}=store,isMobile=useIsMobile(useMobileBreakpoint());return{state,sidebar:sidePanelHandle("sidebar",state,dispatch),rightPanel:sidePanelHandle("rightPanel",state,dispatch),content:columnHandle("content",state,dispatch),splitview:columnHandle("splitview",state,dispatch),isMobile,modes:resolveModes(state,isMobile)}}
|