@kushagradhawan/kookie-ui 0.1.69 → 0.1.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/_internal/shell-bottom.d.ts +2 -21
- package/dist/cjs/components/_internal/shell-bottom.d.ts.map +1 -1
- package/dist/cjs/components/_internal/shell-bottom.js +1 -1
- package/dist/cjs/components/_internal/shell-bottom.js.map +3 -3
- package/dist/cjs/components/_internal/shell-inspector.d.ts +10 -21
- package/dist/cjs/components/_internal/shell-inspector.d.ts.map +1 -1
- package/dist/cjs/components/_internal/shell-inspector.js +1 -1
- package/dist/cjs/components/_internal/shell-inspector.js.map +3 -3
- package/dist/cjs/components/_internal/shell-prop-helpers.d.ts +7 -0
- package/dist/cjs/components/_internal/shell-prop-helpers.d.ts.map +1 -0
- package/dist/cjs/components/_internal/shell-prop-helpers.js +2 -0
- package/dist/cjs/components/_internal/shell-prop-helpers.js.map +7 -0
- package/dist/cjs/components/_internal/shell-sidebar.d.ts +4 -21
- package/dist/cjs/components/_internal/shell-sidebar.d.ts.map +1 -1
- package/dist/cjs/components/_internal/shell-sidebar.js +1 -1
- package/dist/cjs/components/_internal/shell-sidebar.js.map +3 -3
- package/dist/cjs/components/chatbar.d.ts +12 -3
- package/dist/cjs/components/chatbar.d.ts.map +1 -1
- package/dist/cjs/components/chatbar.js +1 -1
- package/dist/cjs/components/chatbar.js.map +3 -3
- package/dist/cjs/components/schemas/shell.schema.d.ts +70 -70
- package/dist/cjs/components/shell.context.d.ts +1 -0
- package/dist/cjs/components/shell.context.d.ts.map +1 -1
- package/dist/cjs/components/shell.context.js.map +2 -2
- package/dist/cjs/components/shell.d.ts +6 -26
- package/dist/cjs/components/shell.d.ts.map +1 -1
- package/dist/cjs/components/shell.hooks.d.ts +19 -2
- package/dist/cjs/components/shell.hooks.d.ts.map +1 -1
- package/dist/cjs/components/shell.hooks.js +1 -1
- package/dist/cjs/components/shell.hooks.js.map +3 -3
- package/dist/cjs/components/shell.js +1 -1
- package/dist/cjs/components/shell.js.map +3 -3
- package/dist/cjs/components/shell.types.d.ts +21 -0
- package/dist/cjs/components/shell.types.d.ts.map +1 -1
- package/dist/cjs/components/shell.types.js +1 -1
- package/dist/cjs/components/shell.types.js.map +2 -2
- package/dist/esm/components/_internal/shell-bottom.d.ts +2 -21
- package/dist/esm/components/_internal/shell-bottom.d.ts.map +1 -1
- package/dist/esm/components/_internal/shell-bottom.js +1 -1
- package/dist/esm/components/_internal/shell-bottom.js.map +3 -3
- package/dist/esm/components/_internal/shell-inspector.d.ts +10 -21
- package/dist/esm/components/_internal/shell-inspector.d.ts.map +1 -1
- package/dist/esm/components/_internal/shell-inspector.js +1 -1
- package/dist/esm/components/_internal/shell-inspector.js.map +3 -3
- package/dist/esm/components/_internal/shell-prop-helpers.d.ts +7 -0
- package/dist/esm/components/_internal/shell-prop-helpers.d.ts.map +1 -0
- package/dist/esm/components/_internal/shell-prop-helpers.js +2 -0
- package/dist/esm/components/_internal/shell-prop-helpers.js.map +7 -0
- package/dist/esm/components/_internal/shell-sidebar.d.ts +4 -21
- package/dist/esm/components/_internal/shell-sidebar.d.ts.map +1 -1
- package/dist/esm/components/_internal/shell-sidebar.js +1 -1
- package/dist/esm/components/_internal/shell-sidebar.js.map +3 -3
- package/dist/esm/components/chatbar.d.ts +12 -3
- package/dist/esm/components/chatbar.d.ts.map +1 -1
- package/dist/esm/components/chatbar.js +1 -1
- package/dist/esm/components/chatbar.js.map +3 -3
- package/dist/esm/components/schemas/shell.schema.d.ts +70 -70
- package/dist/esm/components/shell.context.d.ts +1 -0
- package/dist/esm/components/shell.context.d.ts.map +1 -1
- package/dist/esm/components/shell.context.js.map +2 -2
- package/dist/esm/components/shell.d.ts +6 -26
- package/dist/esm/components/shell.d.ts.map +1 -1
- package/dist/esm/components/shell.hooks.d.ts +19 -2
- package/dist/esm/components/shell.hooks.d.ts.map +1 -1
- package/dist/esm/components/shell.hooks.js +1 -1
- package/dist/esm/components/shell.hooks.js.map +3 -3
- package/dist/esm/components/shell.js +1 -1
- package/dist/esm/components/shell.js.map +3 -3
- package/dist/esm/components/shell.types.d.ts +21 -0
- package/dist/esm/components/shell.types.d.ts.map +1 -1
- package/dist/esm/components/shell.types.js.map +2 -2
- package/package.json +1 -1
- package/schemas/base-button.json +1 -1
- package/schemas/button.json +1 -1
- package/schemas/icon-button.json +1 -1
- package/schemas/index.json +6 -6
- package/schemas/toggle-button.json +1 -1
- package/schemas/toggle-icon-button.json +1 -1
- package/src/components/_internal/shell-bottom.tsx +305 -321
- package/src/components/_internal/shell-inspector.tsx +310 -320
- package/src/components/_internal/shell-prop-helpers.ts +53 -0
- package/src/components/_internal/shell-sidebar.tsx +370 -384
- package/src/components/chatbar.tsx +22 -6
- package/src/components/shell.context.tsx +1 -0
- package/src/components/shell.hooks.ts +67 -2
- package/src/components/shell.tsx +186 -200
- package/src/components/shell.types.ts +23 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import*as
|
|
1
|
+
import*as t from"react";import be from"classnames";import*as D from"../sheet.js";import{VisuallyHidden as me}from"../visually-hidden.js";import{useShell as G}from"../shell.context.js";import{useResponsivePresentation as Se,useResponsiveInitialState as he}from"../shell.hooks.js";import{PaneResizeContext as ye}from"./shell-resize.js";import{extractPaneDomProps as Me}from"./shell-prop-helpers.js";import{SidebarHandle as H,PaneHandle as ge}from"./shell-handles.js";import"../shell.types.js";const Pe=["className","children","state","defaultState","onStateChange","thinSize","toggleModes","size","defaultSize","onSizeChange","sizeUpdate","sizeUpdateMs","style"],J=t.forwardRef((V,p)=>{const{className:Q,presentation:X={initial:"overlay",md:"fixed"},expandedSize:d=288,minSize:l=200,maxSize:u=400,resizable:z=!1,collapsible:Z=!0,onExpand:O,onCollapse:F,onResize:x,onResizeStart:ee,onResizeEnd:te,snapPoints:ne,snapTolerance:re,collapseThreshold:oe,paneId:v,persistence:C,children:ae,style:ie,thinSize:f=64,toggleModes:R,state:c,defaultState:m,onStateChange:S,size:I,defaultSize:$,onSizeChange:B,sizeUpdate:U,sizeUpdateMs:_=50}=V,se=Me(V,Pe),n=G(),E=Se(X),b=E==="overlay",de=E==="stacked",s=t.useRef(null),le=t.useCallback(e=>{s.current=e,typeof p=="function"?p(e):p&&(p.current=e)},[p]),A=t.Children.toArray(ae),W=A.filter(e=>t.isValidElement(e)&&e.type===H),L=A.filter(e=>!(t.isValidElement(e)&&e.type===H)),h=t.useMemo(()=>{const e=B,r=U,o=_??50;if(!e)return()=>{};if(r==="debounce"){let a=null;return(i,T)=>{a&&clearTimeout(a),a=setTimeout(()=>{e(i,T)},o)}}if(r==="throttle"){let a=0;return(i,T)=>{const Y=Date.now();Y-a>=o&&(a=Y,e(i,T))}}return(a,i)=>e(a,i)},[B,U,_]),ue=t.useId();t.useEffect(()=>(n.setHasSidebar(!0),()=>{n.setHasSidebar(!1)}),[n,ue]);const y=t.useRef(null);t.useEffect(()=>{const e=typeof c<"u";if(y.current===null){y.current=e;return}y.current!==e&&(console.warn("Shell.Sidebar: Switching between controlled and uncontrolled `state` is not supported."),y.current=e)},[c]);const ce=typeof c=="object"&&c!==null,{resolvedDefault:j}=he({controlledValue:c,defaultValue:m,currentValue:n.sidebarMode,setValue:n.setSidebarMode,breakpointReady:n.currentBreakpointReady,controlledIsResponsive:ce,onResponsiveChange:e=>S?.(e,{reason:"responsive"}),onInit:e=>S?.(e,{reason:"init"})}),M=t.useRef(null);t.useEffect(()=>{typeof c>"u"&&(M.current===null?M.current=n.sidebarMode:M.current!==n.sidebarMode&&(M.current=n.sidebarMode,S?.(n.sidebarMode,{reason:"toggle"})))},[n.sidebarMode,c,S]),t.useEffect(()=>{n.sidebarMode==="expanded"?O?.():F?.()},[n.sidebarMode,O,F]);const q=n.sidebarMode!=="collapsed",g=t.useMemo(()=>{if(!v||C)return C;const e=`kookie-ui:shell:sidebar:${v}`;return{load:()=>{if(!(typeof window>"u"))try{const o=window.localStorage.getItem(e);return o?Number(o):void 0}catch{return}},save:o=>{if(!(typeof window>"u"))try{window.localStorage.setItem(e,String(o))}catch{}}}},[v,C]);t.useEffect(()=>{let e=!0;return(async()=>{if(!z||!g?.load||b)return;const r=await g.load();e&&typeof r=="number"&&s.current&&(s.current.style.setProperty("--sidebar-size",`${r}px`),x?.(r))})(),()=>{e=!1}},[z,g,x,b]);const P=G(),N=t.useCallback(()=>{const e=j??(typeof m=="string"?m:void 0)??"expanded";return e==="thin"||e==="expanded"?e:"expanded"},[j,m]);t.useEffect(()=>{if(!P.setSidebarToggleComputer)return;const e=R??"both",r=o=>{if(e==="both")return o==="collapsed"?"thin":o==="thin"?"expanded":"collapsed";const a=N();return o==="collapsed"?a:o===a?"collapsed":a};return P.setSidebarToggleComputer(r),()=>{P.setSidebarToggleComputer?.(o=>o==="collapsed"?"thin":o==="thin"?"expanded":"collapsed")}},[P,R,N]);const K=t.useRef(d),pe=t.useRef("expanded");t.useEffect(()=>{n.sidebarMode!=="collapsed"&&(pe.current=n.sidebarMode,K.current=n.sidebarMode==="thin"?f:d)},[n.sidebarMode,f,d]);const fe=z&&!b&&n.sidebarMode==="expanded"?t.createElement(ye.Provider,{value:{containerRef:s,cssVarName:"--sidebar-size",minSize:l,maxSize:u,defaultSize:d,orientation:"vertical",edge:"end",computeNext:(e,r,o)=>{const a=getComputedStyle(s.current).direction==="rtl",i=e-r;return o+(a?-i:i)},onResize:x,onResizeStart:ee,onResizeEnd:e=>{te?.(e),h(e,{reason:"resize"}),g?.save?.(e)},target:"sidebar",collapsible:Z,snapPoints:ne,snapTolerance:re??8,collapseThreshold:oe,requestCollapse:()=>n.setSidebarMode("collapsed"),requestToggle:()=>n.togglePane("sidebar")}},W.length>0?W.map((e,r)=>t.cloneElement(e,{key:e.key??r})):t.createElement(ge,null)):null,w=t.useCallback(e=>{if(e==null)return;if(typeof e=="number"&&Number.isFinite(e))return e;const r=String(e).trim();if(!r)return;if(r.endsWith("px"))return Number.parseFloat(r);if(r.endsWith("rem")){const a=Number.parseFloat(getComputedStyle(document.documentElement).fontSize||"16")||16;return Number.parseFloat(r)*a}if(r.endsWith("%")){const a=Number.parseFloat(r),i=document.documentElement.clientWidth||window.innerWidth||0;return a/100*i}const o=Number.parseFloat(r);return Number.isFinite(o)?o:void 0},[]);t.useEffect(()=>{if(s.current&&typeof I>"u"&&typeof $<"u"){const e=w($);if(typeof e=="number"&&Number.isFinite(e)){const a=Math.min((typeof u=="number"?u:void 0)??e,Math.max((typeof l=="number"?l:void 0)??e,e));s.current.style.setProperty("--sidebar-size",`${a}px`),h(a,{reason:"init"})}}},[]);const k=I;if(t.useEffect(()=>{if(!s.current||typeof k>"u")return;const e=w(k);if(typeof e=="number"&&Number.isFinite(e)){const a=Math.min((typeof u=="number"?u:void 0)??e,Math.max((typeof l=="number"?l:void 0)??e,e));s.current.style.setProperty("--sidebar-size",`${a}px`),h(a,{reason:"controlled"})}},[k,l,u,w,h]),b){const e=n.sidebarMode!=="collapsed";return t.createElement(D.Root,{open:e,onOpenChange:r=>n.setSidebarMode(r?"expanded":"collapsed")},t.createElement(D.Content,{side:"start",style:{padding:0},width:{initial:`${e?n.sidebarMode==="thin"?f:d:K.current}px`}},t.createElement(me,null,t.createElement(D.Title,null,"Navigation")),L))}return t.createElement("div",{...se,ref:le,className:be("rt-ShellSidebar",Q),"data-mode":n.sidebarMode,"data-peek":n.peekTarget==="sidebar"||void 0,"data-presentation":n.currentBreakpointReady?E:void 0,"data-open":n.currentBreakpointReady&&de&&q||void 0,style:{...ie,"--sidebar-size":`${d}px`,"--sidebar-thin-size":`${f}px`,"--sidebar-min-size":`${l}px`,"--sidebar-max-size":`${u}px`,...n.peekTarget==="sidebar"&&n.sidebarMode==="collapsed"&&!b?(()=>{const e=R??"both",r=n.sidebarMode;let o;if(e==="both")o=r==="collapsed"?"thin":r==="thin"?"expanded":"collapsed";else{const a=N();o=r==="collapsed"?a:"collapsed"}return o==="thin"?{"--peek-sidebar-width":`${f}px`}:{"--peek-sidebar-width":`var(--sidebar-size, ${d}px)`}})():{}}},t.createElement("div",{className:"rt-ShellSidebarContent","data-visible":q||void 0},L),fe)});J.displayName="Shell.Sidebar",J.Handle=H;export{J as Sidebar};
|
|
2
2
|
//# sourceMappingURL=shell-sidebar.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/_internal/shell-sidebar.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from '../sheet.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { useShell } from '../shell.context.js';\nimport { useResponsivePresentation, useResponsiveValue } from '../shell.hooks.js';\nimport { PaneResizeContext } from './shell-resize.js';\nimport { SidebarHandle, PaneHandle } from './shell-handles.js';\nimport type { Breakpoint, PaneMode, PaneSizePersistence, ResponsivePresentation, SidebarMode, Responsive } from '../shell.types.js';\nimport { _BREAKPOINTS } from '../shell.types.js';\n\ninterface PaneProps extends React.ComponentPropsWithoutRef<'div'> {\n presentation?: ResponsivePresentation;\n mode?: PaneMode;\n defaultMode?: any;\n onModeChange?: (mode: PaneMode | SidebarMode) => void;\n expandedSize?: number;\n minSize?: number;\n maxSize?: number;\n resizable?: boolean;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n onResize?: (size: number) => void;\n resizer?: React.ReactNode;\n onResizeStart?: (size: number) => void;\n onResizeEnd?: (size: number) => void;\n snapPoints?: number[];\n snapTolerance?: number;\n collapseThreshold?: number;\n paneId?: string;\n persistence?: PaneSizePersistence;\n}\n\ntype SidebarStateChangeMeta = { reason: 'init' | 'toggle' | 'responsive' };\ntype SidebarControlledProps = { state: Responsive<SidebarMode>; onStateChange?: (state: SidebarMode, meta: SidebarStateChangeMeta) => void; defaultState?: never };\ntype SidebarUncontrolledProps = { defaultState?: SidebarMode | Partial<Record<Breakpoint, SidebarMode>>; onStateChange?: (state: SidebarMode, meta: SidebarStateChangeMeta) => void; state?: never };\ntype SidebarPublicProps = Omit<PaneProps, 'mode' | 'defaultMode' | 'onModeChange'> & {\n // removed legacy mode props\n thinSize?: number;\n toggleModes?: 'both' | 'single';\n // size API (width when expanded)\n size?: number | string;\n defaultSize?: number | string;\n onSizeChange?: (size: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n} & (SidebarControlledProps | SidebarUncontrolledProps);\n\ntype SidebarComponent = React.ForwardRefExoticComponent<SidebarPublicProps & React.RefAttributes<HTMLDivElement>> & { Handle: typeof SidebarHandle };\n\nexport const Sidebar = React.forwardRef<HTMLDivElement, SidebarPublicProps>(\n (\n {\n className,\n presentation = { initial: 'overlay', md: 'fixed' },\n // removed legacy props\n expandedSize = 288,\n minSize = 200,\n maxSize = 400,\n resizable = false,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n thinSize = 64,\n toggleModes,\n // new state props (XOR)\n state,\n defaultState,\n onStateChange,\n ...props\n },\n ref,\n ) => {\n const shell = useShell();\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n // Phase sequencing is now CSS-driven; no JS-managed phase\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === SidebarHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === SidebarHandle));\n\n // Throttled/debounced emitter for onSizeChange\n const onSizeChange = (props as any).onSizeChange;\n const sizeUpdate = (props as any).sizeUpdate;\n const sizeUpdateMs = (props as any).sizeUpdateMs;\n const emitSizeChange = React.useMemo(() => {\n const cb = onSizeChange as undefined | ((s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => void);\n const strategy = sizeUpdate as undefined | 'throttle' | 'debounce';\n const ms = sizeUpdateMs ?? 50;\n if (!cb) return () => {};\n if (strategy === 'debounce') {\n let t: any = null;\n return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => {\n if (t) clearTimeout(t);\n t = setTimeout(() => {\n cb(s, meta);\n }, ms);\n };\n }\n if (strategy === 'throttle') {\n let last = 0;\n return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n cb(s, meta);\n }\n };\n }\n return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => cb(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n\n // Register with shell\n const sidebarId = React.useId();\n React.useEffect(() => {\n shell.setHasSidebar(true);\n return () => {\n shell.setHasSidebar(false);\n };\n }, [shell, sidebarId]);\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof state !== 'undefined' && typeof defaultState !== 'undefined') {\n console.error('Shell.Sidebar: Do not pass both `state` and `defaultState`. Choose one.');\n }\n if (typeof (props as any).size !== 'undefined' && typeof (props as any).defaultSize !== 'undefined') {\n console.error('Shell.Sidebar: Do not pass both `size` and `defaultSize`. Choose one.');\n }\n }\n\n // Warn on mode switch between controlled/uncontrolled\n React.useEffect(() => {\n const isControlled = typeof state !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Sidebar: Switching between controlled and uncontrolled `state` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [state]);\n\n // Resolve responsive controlled state at top level\n const resolvedState = useResponsiveValue(state);\n const resolvedDefaultState = useResponsiveValue(defaultState as any);\n\n // Honor state/defaultState on mount when uncontrolled\n const didInitRef = React.useRef(false);\n React.useEffect(() => {\n if (didInitRef.current) return;\n if (!shell.currentBreakpointReady) return;\n didInitRef.current = true;\n // Controlled state may be responsive; use resolved value\n if (typeof state !== 'undefined' && resolvedState) {\n if (shell.sidebarMode !== resolvedState) shell.setSidebarMode(resolvedState);\n return;\n }\n if (typeof defaultState !== 'undefined') {\n const initialState = (resolvedDefaultState ?? defaultState) as SidebarMode;\n if (shell.sidebarMode !== initialState) {\n shell.setSidebarMode(initialState);\n }\n onStateChange?.(initialState, { reason: 'init' });\n return;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shell.currentBreakpointReady, resolvedDefaultState, resolvedState, state, defaultState]);\n\n // Sync controlled state (responsive-aware)\n React.useEffect(() => {\n if (resolvedState === undefined) return;\n if (shell.sidebarMode !== resolvedState) shell.setSidebarMode(resolvedState);\n }, [shell, resolvedState]);\n\n // Emit mode changes\n const lastNotifyModeRef = React.useRef<SidebarMode | null>(null);\n React.useEffect(() => {\n // notify new API when uncontrolled; skip first run to avoid masking init\n if (typeof state === 'undefined') {\n if (lastNotifyModeRef.current === null) {\n lastNotifyModeRef.current = shell.sidebarMode as SidebarMode;\n } else if (lastNotifyModeRef.current !== shell.sidebarMode) {\n lastNotifyModeRef.current = shell.sidebarMode as SidebarMode;\n onStateChange?.(shell.sidebarMode as SidebarMode, { reason: 'toggle' });\n }\n }\n }, [shell.sidebarMode, state, onStateChange]);\n\n // Emit expand/collapse events\n React.useEffect(() => {\n if (shell.sidebarMode === 'expanded') {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n }, [shell.sidebarMode, onExpand, onCollapse]);\n\n // Option A: thin is width-only; content remains visible whenever not collapsed\n const isContentVisible = shell.sidebarMode !== 'collapsed';\n\n // Default persistence if paneId provided and none supplied (fixed only)\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:sidebar:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n window.localStorage.setItem(key, String(size));\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n React.useEffect(() => {\n let mounted = true;\n (async () => {\n if (!resizable || !persistenceAdapter?.load || isOverlay) return;\n const loaded = await persistenceAdapter.load();\n if (mounted && typeof loaded === 'number' && localRef.current) {\n localRef.current.style.setProperty('--sidebar-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n // Register custom toggle behavior based on toggleModes (both|single)\n const shellForToggle = useShell();\n const resolveDefaultSidebarMode = React.useCallback((): SidebarMode => {\n const resolved = defaultState ?? 'expanded';\n return resolved === 'thin' || resolved === 'expanded' ? resolved : 'expanded';\n }, [defaultState]);\n\n React.useEffect(() => {\n if (!shellForToggle.setSidebarToggleComputer) return;\n const strategy: 'both' | 'single' = toggleModes ?? 'both';\n const compute = (current: SidebarMode): SidebarMode => {\n if (strategy === 'both') {\n if (current === 'collapsed') return 'thin';\n if (current === 'thin') return 'expanded';\n return 'collapsed';\n }\n const target = resolveDefaultSidebarMode();\n if (current === 'collapsed') return target;\n if (current === target) return 'collapsed';\n return target;\n };\n shellForToggle.setSidebarToggleComputer(compute);\n return () => {\n shellForToggle.setSidebarToggleComputer?.((cur) => (cur === 'collapsed' ? 'thin' : cur === 'thin' ? 'expanded' : 'collapsed'));\n };\n }, [shellForToggle, toggleModes, resolveDefaultSidebarMode]);\n\n const lastOverlayWidthRef = React.useRef<number>(expandedSize);\n const lastOverlayModeRef = React.useRef<SidebarMode>('expanded');\n React.useEffect(() => {\n if (shell.sidebarMode !== 'collapsed') {\n lastOverlayModeRef.current = shell.sidebarMode as SidebarMode;\n lastOverlayWidthRef.current = shell.sidebarMode === 'thin' ? thinSize : expandedSize;\n }\n }, [shell.sidebarMode, thinSize, expandedSize]);\n\n // Remove responsive default mode behavior entirely\n\n const handleEl =\n resizable && !isOverlay && shell.sidebarMode === 'expanded' ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--sidebar-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'end',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n return startSize + (isRtl ? -delta : delta);\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'sidebar',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setSidebarMode('collapsed'),\n requestToggle: () => shell.togglePane('sidebar'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n // Strip new API props from DOM\n const { state: _s, defaultState: _ds, onStateChange: _osc, size: _sz, defaultSize: _dsz, onSizeChange: _onsc, sizeUpdate: _szu, sizeUpdateMs: _szums, ...domProps } = props as any;\n\n // Normalize CSS lengths to px\n const normalizeToPx = React.useCallback((value: number | string | undefined): number | undefined => {\n if (value == null) return undefined;\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n const str = String(value).trim();\n if (!str) return undefined;\n if (str.endsWith('px')) return Number.parseFloat(str);\n if (str.endsWith('rem')) {\n const rem = Number.parseFloat(getComputedStyle(document.documentElement).fontSize || '16') || 16;\n return Number.parseFloat(str) * rem;\n }\n if (str.endsWith('%')) {\n const pct = Number.parseFloat(str);\n const base = document.documentElement.clientWidth || window.innerWidth || 0;\n return (pct / 100) * base;\n }\n const n = Number.parseFloat(str);\n return Number.isFinite(n) ? n : undefined;\n }, []);\n\n // Apply defaultSize on mount when uncontrolled\n React.useEffect(() => {\n if (!localRef.current) return;\n const { size, defaultSize } = props as any;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--sidebar-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync\n const controlledSize = (props as any).size;\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof controlledSize === 'undefined') return;\n const px = normalizeToPx(controlledSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--sidebar-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [controlledSize, minSize, maxSize, normalizeToPx, emitSizeChange]);\n\n if (isOverlay) {\n const open = shell.sidebarMode !== 'collapsed';\n return (\n <Sheet.Root open={open} onOpenChange={(o) => shell.setSidebarMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content\n side=\"start\"\n style={{ padding: 0 }}\n width={{\n initial: `${open ? (shell.sidebarMode === 'thin' ? thinSize : expandedSize) : lastOverlayWidthRef.current}px`,\n }}\n >\n <VisuallyHidden>\n <Sheet.Title>Navigation</Sheet.Title>\n </VisuallyHidden>\n {contentChildren}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n return (\n <div\n {...domProps}\n ref={setRef}\n className={classNames('rt-ShellSidebar', className)}\n data-mode={shell.sidebarMode}\n data-peek={shell.peekTarget === 'sidebar' || undefined}\n data-presentation={shell.currentBreakpointReady ? resolvedPresentation : undefined}\n data-open={(shell.currentBreakpointReady && isStacked && isContentVisible) || undefined}\n style={{\n ...style,\n ['--sidebar-size' as any]: `${expandedSize}px`,\n ['--sidebar-thin-size' as any]: `${thinSize}px`,\n ['--sidebar-min-size' as any]: `${minSize}px`,\n ['--sidebar-max-size' as any]: `${maxSize}px`,\n ...(shell.peekTarget === 'sidebar' && shell.sidebarMode === 'collapsed' && !isOverlay\n ? (() => {\n const strategy: 'both' | 'single' = toggleModes ?? 'both';\n const current = shell.sidebarMode as SidebarMode;\n let next: SidebarMode;\n if (strategy === 'both') {\n next = current === 'collapsed' ? 'thin' : current === 'thin' ? 'expanded' : 'collapsed';\n } else {\n const target = resolveDefaultSidebarMode();\n next = current === 'collapsed' ? target : 'collapsed';\n }\n if (next === 'thin') {\n return {\n ['--peek-sidebar-width' as any]: `${thinSize}px`,\n } as React.CSSProperties;\n }\n return {\n ['--peek-sidebar-width' as any]: `var(--sidebar-size, ${expandedSize}px)`,\n } as React.CSSProperties;\n })()\n : {}),\n }}\n >\n <div className=\"rt-ShellSidebarContent\" data-visible={isContentVisible || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n },\n) as SidebarComponent;\n\nSidebar.displayName = 'Shell.Sidebar';\nSidebar.Handle = SidebarHandle;\n"],
|
|
5
|
-
"mappings": "AAAA,UAAYA,MAAW,QACvB,OAAOC,OAAgB,aACvB,UAAYC,MAAW,cACvB,OAAS,kBAAAC,OAAsB,wBAC/B,OAAS,YAAAC,MAAgB,sBACzB,OAAS,6BAAAC,GAA2B,
|
|
6
|
-
"names": ["React", "classNames", "Sheet", "VisuallyHidden", "useShell", "useResponsivePresentation", "
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from '../sheet.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { useShell } from '../shell.context.js';\nimport { useResponsivePresentation, useResponsiveInitialState } from '../shell.hooks.js';\nimport { PaneResizeContext } from './shell-resize.js';\nimport { extractPaneDomProps } from './shell-prop-helpers.js';\nimport { SidebarHandle, PaneHandle } from './shell-handles.js';\nimport type { Breakpoint, PaneMode, PaneSizePersistence, ResponsivePresentation, SidebarMode, Responsive, PaneBaseProps } from '../shell.types.js';\nimport { _BREAKPOINTS } from '../shell.types.js';\n\ntype SidebarPaneProps = PaneBaseProps & {\n mode?: PaneMode;\n defaultMode?: any;\n onModeChange?: (mode: PaneMode | SidebarMode) => void;\n};\n\ntype SidebarStateChangeMeta = { reason: 'init' | 'toggle' | 'responsive' };\ntype SidebarControlledProps = { state: Responsive<SidebarMode>; onStateChange?: (state: SidebarMode, meta: SidebarStateChangeMeta) => void; defaultState?: never };\ntype SidebarUncontrolledProps = { defaultState?: SidebarMode | Partial<Record<Breakpoint, SidebarMode>>; onStateChange?: (state: SidebarMode, meta: SidebarStateChangeMeta) => void; state?: never };\ntype SidebarPublicProps = Omit<SidebarPaneProps, 'mode' | 'defaultMode' | 'onModeChange'> & {\n // removed legacy mode props\n thinSize?: number;\n toggleModes?: 'both' | 'single';\n // size API (width when expanded)\n size?: number | string;\n defaultSize?: number | string;\n onSizeChange?: (size: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n} & (SidebarControlledProps | SidebarUncontrolledProps);\n\ntype SidebarComponent = React.ForwardRefExoticComponent<SidebarPublicProps & React.RefAttributes<HTMLDivElement>> & { Handle: typeof SidebarHandle };\n\nconst SIDEBAR_DOM_PROP_KEYS = [\n 'className',\n 'children',\n 'state',\n 'defaultState',\n 'onStateChange',\n 'thinSize',\n 'toggleModes',\n 'size',\n 'defaultSize',\n 'onSizeChange',\n 'sizeUpdate',\n 'sizeUpdateMs',\n 'style',\n] as const satisfies readonly (keyof SidebarPublicProps)[];\n\nexport const Sidebar = React.forwardRef<HTMLDivElement, SidebarPublicProps>((initialProps, ref) => {\n const {\n className,\n presentation = { initial: 'overlay', md: 'fixed' },\n expandedSize = 288,\n minSize = 200,\n maxSize = 400,\n resizable = false,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n thinSize = 64,\n toggleModes,\n state,\n defaultState,\n onStateChange,\n size,\n defaultSize,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n } = initialProps;\n const sidebarDomProps = extractPaneDomProps(initialProps, SIDEBAR_DOM_PROP_KEYS);\n const shell = useShell();\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n // Phase sequencing is now CSS-driven; no JS-managed phase\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === SidebarHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === SidebarHandle));\n\n // Throttled/debounced emitter for onSizeChange\n const emitSizeChange = React.useMemo(() => {\n const cb = onSizeChange as undefined | ((s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => void);\n const strategy = sizeUpdate as undefined | 'throttle' | 'debounce';\n const ms = sizeUpdateMs ?? 50;\n if (!cb) return () => {};\n if (strategy === 'debounce') {\n let t: any = null;\n return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => {\n if (t) clearTimeout(t);\n t = setTimeout(() => {\n cb(s, meta);\n }, ms);\n };\n }\n if (strategy === 'throttle') {\n let last = 0;\n return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n cb(s, meta);\n }\n };\n }\n return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => cb(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n\n // Register with shell\n const sidebarId = React.useId();\n React.useEffect(() => {\n shell.setHasSidebar(true);\n return () => {\n shell.setHasSidebar(false);\n };\n }, [shell, sidebarId]);\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof state !== 'undefined' && typeof defaultState !== 'undefined') {\n console.error('Shell.Sidebar: Do not pass both `state` and `defaultState`. Choose one.');\n }\n if (typeof size !== 'undefined' && typeof defaultSize !== 'undefined') {\n console.error('Shell.Sidebar: Do not pass both `size` and `defaultSize`. Choose one.');\n }\n }\n\n // Warn on mode switch between controlled/uncontrolled\n React.useEffect(() => {\n const isControlled = typeof state !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Sidebar: Switching between controlled and uncontrolled `state` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [state]);\n\n // Resolve responsive controlled state at top level\n const stateIsResponsive = typeof state === 'object' && state !== null;\n const { resolvedDefault: resolvedSidebarDefault } = useResponsiveInitialState<SidebarMode>({\n controlledValue: state,\n defaultValue: defaultState,\n currentValue: shell.sidebarMode as SidebarMode,\n setValue: shell.setSidebarMode,\n breakpointReady: shell.currentBreakpointReady,\n controlledIsResponsive: stateIsResponsive,\n onResponsiveChange: (next) => onStateChange?.(next, { reason: 'responsive' }),\n onInit: (initial) => onStateChange?.(initial, { reason: 'init' }),\n });\n\n // Emit mode changes\n const lastNotifyModeRef = React.useRef<SidebarMode | null>(null);\n React.useEffect(() => {\n // notify new API when uncontrolled; skip first run to avoid masking init\n if (typeof state === 'undefined') {\n if (lastNotifyModeRef.current === null) {\n lastNotifyModeRef.current = shell.sidebarMode as SidebarMode;\n } else if (lastNotifyModeRef.current !== shell.sidebarMode) {\n lastNotifyModeRef.current = shell.sidebarMode as SidebarMode;\n onStateChange?.(shell.sidebarMode as SidebarMode, { reason: 'toggle' });\n }\n }\n }, [shell.sidebarMode, state, onStateChange]);\n\n // Emit expand/collapse events\n React.useEffect(() => {\n if (shell.sidebarMode === 'expanded') {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n }, [shell.sidebarMode, onExpand, onCollapse]);\n\n // Option A: thin is width-only; content remains visible whenever not collapsed\n const isContentVisible = shell.sidebarMode !== 'collapsed';\n\n // Default persistence if paneId provided and none supplied (fixed only)\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:sidebar:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n try {\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Sidebar: failed to load persisted size', err);\n }\n return undefined;\n }\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, String(size));\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Sidebar: failed to save persisted size', err);\n }\n }\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n React.useEffect(() => {\n let mounted = true;\n (async () => {\n if (!resizable || !persistenceAdapter?.load || isOverlay) return;\n const loaded = await persistenceAdapter.load();\n if (mounted && typeof loaded === 'number' && localRef.current) {\n localRef.current.style.setProperty('--sidebar-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n // Register custom toggle behavior based on toggleModes (both|single)\n const shellForToggle = useShell();\n const resolveDefaultSidebarMode = React.useCallback((): SidebarMode => {\n const resolved = resolvedSidebarDefault ?? (typeof defaultState === 'string' ? defaultState : undefined) ?? 'expanded';\n return resolved === 'thin' || resolved === 'expanded' ? resolved : 'expanded';\n }, [resolvedSidebarDefault, defaultState]);\n\n React.useEffect(() => {\n if (!shellForToggle.setSidebarToggleComputer) return;\n const strategy: 'both' | 'single' = toggleModes ?? 'both';\n const compute = (current: SidebarMode): SidebarMode => {\n if (strategy === 'both') {\n if (current === 'collapsed') return 'thin';\n if (current === 'thin') return 'expanded';\n return 'collapsed';\n }\n const target = resolveDefaultSidebarMode();\n if (current === 'collapsed') return target;\n if (current === target) return 'collapsed';\n return target;\n };\n shellForToggle.setSidebarToggleComputer(compute);\n return () => {\n shellForToggle.setSidebarToggleComputer?.((cur) => (cur === 'collapsed' ? 'thin' : cur === 'thin' ? 'expanded' : 'collapsed'));\n };\n }, [shellForToggle, toggleModes, resolveDefaultSidebarMode]);\n\n const lastOverlayWidthRef = React.useRef<number>(expandedSize);\n const lastOverlayModeRef = React.useRef<SidebarMode>('expanded');\n React.useEffect(() => {\n if (shell.sidebarMode !== 'collapsed') {\n lastOverlayModeRef.current = shell.sidebarMode as SidebarMode;\n lastOverlayWidthRef.current = shell.sidebarMode === 'thin' ? thinSize : expandedSize;\n }\n }, [shell.sidebarMode, thinSize, expandedSize]);\n\n // Remove responsive default mode behavior entirely\n\n const handleEl =\n resizable && !isOverlay && shell.sidebarMode === 'expanded' ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--sidebar-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'end',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n return startSize + (isRtl ? -delta : delta);\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'sidebar',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setSidebarMode('collapsed'),\n requestToggle: () => shell.togglePane('sidebar'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n // Normalize CSS lengths to px\n const normalizeToPx = React.useCallback((value: number | string | undefined): number | undefined => {\n if (value == null) return undefined;\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n const str = String(value).trim();\n if (!str) return undefined;\n if (str.endsWith('px')) return Number.parseFloat(str);\n if (str.endsWith('rem')) {\n const rem = Number.parseFloat(getComputedStyle(document.documentElement).fontSize || '16') || 16;\n return Number.parseFloat(str) * rem;\n }\n if (str.endsWith('%')) {\n const pct = Number.parseFloat(str);\n const base = document.documentElement.clientWidth || window.innerWidth || 0;\n return (pct / 100) * base;\n }\n const n = Number.parseFloat(str);\n return Number.isFinite(n) ? n : undefined;\n }, []);\n\n // Apply defaultSize on mount when uncontrolled\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--sidebar-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync\n const controlledSize = size;\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof controlledSize === 'undefined') return;\n const px = normalizeToPx(controlledSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--sidebar-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [controlledSize, minSize, maxSize, normalizeToPx, emitSizeChange]);\n\n if (isOverlay) {\n const open = shell.sidebarMode !== 'collapsed';\n return (\n <Sheet.Root open={open} onOpenChange={(o) => shell.setSidebarMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content\n side=\"start\"\n style={{ padding: 0 }}\n width={{\n initial: `${open ? (shell.sidebarMode === 'thin' ? thinSize : expandedSize) : lastOverlayWidthRef.current}px`,\n }}\n >\n <VisuallyHidden>\n <Sheet.Title>Navigation</Sheet.Title>\n </VisuallyHidden>\n {contentChildren}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n return (\n <div\n {...sidebarDomProps}\n ref={setRef}\n className={classNames('rt-ShellSidebar', className)}\n data-mode={shell.sidebarMode}\n data-peek={shell.peekTarget === 'sidebar' || undefined}\n data-presentation={shell.currentBreakpointReady ? resolvedPresentation : undefined}\n data-open={(shell.currentBreakpointReady && isStacked && isContentVisible) || undefined}\n style={{\n ...style,\n ['--sidebar-size' as any]: `${expandedSize}px`,\n ['--sidebar-thin-size' as any]: `${thinSize}px`,\n ['--sidebar-min-size' as any]: `${minSize}px`,\n ['--sidebar-max-size' as any]: `${maxSize}px`,\n ...(shell.peekTarget === 'sidebar' && shell.sidebarMode === 'collapsed' && !isOverlay\n ? (() => {\n const strategy: 'both' | 'single' = toggleModes ?? 'both';\n const current = shell.sidebarMode as SidebarMode;\n let next: SidebarMode;\n if (strategy === 'both') {\n next = current === 'collapsed' ? 'thin' : current === 'thin' ? 'expanded' : 'collapsed';\n } else {\n const target = resolveDefaultSidebarMode();\n next = current === 'collapsed' ? target : 'collapsed';\n }\n if (next === 'thin') {\n return {\n ['--peek-sidebar-width' as any]: `${thinSize}px`,\n } as React.CSSProperties;\n }\n return {\n ['--peek-sidebar-width' as any]: `var(--sidebar-size, ${expandedSize}px)`,\n } as React.CSSProperties;\n })()\n : {}),\n }}\n >\n <div className=\"rt-ShellSidebarContent\" data-visible={isContentVisible || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n}) as SidebarComponent;\n\nSidebar.displayName = 'Shell.Sidebar';\nSidebar.Handle = SidebarHandle;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "classNames", "Sheet", "VisuallyHidden", "useShell", "useResponsivePresentation", "useResponsiveInitialState", "PaneResizeContext", "extractPaneDomProps", "SidebarHandle", "PaneHandle", "SIDEBAR_DOM_PROP_KEYS", "Sidebar", "initialProps", "ref", "className", "presentation", "expandedSize", "minSize", "maxSize", "resizable", "collapsible", "onExpand", "onCollapse", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "children", "style", "thinSize", "toggleModes", "state", "defaultState", "onStateChange", "size", "defaultSize", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "sidebarDomProps", "shell", "resolvedPresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "childArray", "handleChildren", "el", "contentChildren", "emitSizeChange", "cb", "strategy", "ms", "t", "s", "meta", "last", "now", "sidebarId", "wasControlledRef", "isControlled", "stateIsResponsive", "resolvedSidebarDefault", "next", "initial", "lastNotifyModeRef", "isContentVisible", "persistenceAdapter", "key", "v", "mounted", "loaded", "shellForToggle", "resolveDefaultSidebarMode", "resolved", "compute", "current", "target", "cur", "lastOverlayWidthRef", "lastOverlayModeRef", "handleEl", "client", "startClient", "startSize", "isRtl", "delta", "i", "normalizeToPx", "value", "str", "rem", "pct", "base", "n", "px", "clamped", "controlledSize", "open", "o"]
|
|
7
7
|
}
|
|
@@ -214,11 +214,20 @@ interface RowProps extends Omit<React.ComponentPropsWithoutRef<'div'>, 'children
|
|
|
214
214
|
declare const Row: React.ForwardRefExoticComponent<RowProps & React.RefAttributes<HTMLDivElement>>;
|
|
215
215
|
declare const RowStart: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
216
216
|
declare const RowEnd: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
217
|
-
|
|
217
|
+
type SendProps = Omit<IconButtonProps, 'aria-label' | 'aria-labelledby'> & {
|
|
218
|
+
/** Optional override for accessible name. Defaults to "Send". */
|
|
219
|
+
'aria-label'?: string;
|
|
220
|
+
'aria-labelledby'?: string;
|
|
218
221
|
asChild?: boolean;
|
|
219
222
|
clearOnSend?: boolean;
|
|
220
|
-
}
|
|
221
|
-
declare const Send: React.ForwardRefExoticComponent<
|
|
223
|
+
};
|
|
224
|
+
declare const Send: React.ForwardRefExoticComponent<Omit<IconButtonProps, "aria-label" | "aria-labelledby"> & {
|
|
225
|
+
/** Optional override for accessible name. Defaults to "Send". */
|
|
226
|
+
'aria-label'?: string;
|
|
227
|
+
'aria-labelledby'?: string;
|
|
228
|
+
asChild?: boolean;
|
|
229
|
+
clearOnSend?: boolean;
|
|
230
|
+
} & React.RefAttributes<HTMLButtonElement>>;
|
|
222
231
|
export { Root, Textarea, InlineStart, InlineEnd, AttachmentsRow, Attachment, AttachTrigger, Row, RowStart, RowEnd, Send };
|
|
223
232
|
export type { RootProps as ChatbarRootProps, TextareaProps as ChatbarTextareaProps, RowProps as ChatbarRowProps, SendProps as ChatbarSendProps, ChatbarAttachment };
|
|
224
233
|
//# sourceMappingURL=chatbar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbar.d.ts","sourceRoot":"","sources":["../../../src/components/chatbar.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"chatbar.d.ts","sourceRoot":"","sources":["../../../src/components/chatbar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import*as e from"react";import S from"classnames";import{IconButton as Oe}from"./icon-button.js";import{CloseIcon as _e,FileTextIcon as Je}from"./icons.js";import{Flex as ce}from"./flex.js";import{ScrollArea as Qe}from"./scroll-area.js";import{Slot as B}from"./slot.js";import{Box as Xe}from"./box.js";import{Text as ve}from"./text.js";import{useDropzone as Ze}from"react-dropzone";const xe=typeof window<"u"?e.useLayoutEffect:e.useEffect,Me=e.createContext(null),W=()=>{const l=e.useContext(Me);if(!l)throw new Error("Chatbar context not found. Wrap parts in <Chatbar.Root>.");return l},Le=e.forwardRef((l,i)=>{const{className:s,style:p,children:m,value:b,defaultValue:A="",onValueChange:h,open:r,defaultOpen:o=!1,onOpenChange:R,expandOn:P="both",minLines:T=1,maxLines:u=6,sendMode:C="whenDirty",disabled:F,readOnly:Y,onSubmit:O,size:H="2",variant:V,color:N,radius:U,panelBackground:M,material:D,width:oe,maxWidth:G,asChild:re,attachments:_,defaultAttachments:ue=[],onAttachmentsChange:K,accept:J,multiple:z=!0,maxAttachments:w,maxFileSize:d,paste:de=!0,pasteAccept:Q,clearOnSubmit:me=!0,onAttachmentReject:$,dropzone:k=!0,apiRef:n,...c}=l,f=D||M,v=b!=null,[L,pe]=e.useState(A),X=v?b:L,I=r!=null,[Z,q]=e.useState(o),ee=I?r:Z,he=e.useRef(null),se=e.useRef(null),fe=e.useRef(!1),te="attachments"in l,[Re,we]=e.useState(ue),j=e.useMemo(()=>te?_??[]:Re,[te,_,Re]),ie=e.useRef(new Set),be=t=>Array.isArray(t)?t:typeof t=="string"?t.split(",").map(a=>a.trim()):[],ne=be(J),Pe=be(Q).length>0?be(Q):ne,Ce=(t,a)=>{if(a.length===0)return!0;const g=t.type.toLowerCase(),E=t.name.toLowerCase();for(const y of a){const x=y.toLowerCase();if(x.includes("/")){const[le,ye]=x.split("/"),[ae,Ge]=g.split("/");if(le==="*"||le===ae&&(ye==="*"||ye===Ge))return!0}else if(x.startsWith(".")&&E.endsWith(x))return!0}return!1},We=t=>{const a=[],g=[],E=typeof w=="number"?Math.max(w-j.length,0):1/0;for(const y of t){if(a.length>=E){g.push({file:y,reason:"count"});continue}if(typeof d=="number"&&y.size>d){g.push({file:y,reason:"size"});continue}if(!Ce(y,ne)){g.push({file:y,reason:"type"});continue}const x=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,le=/\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(y.name),ae=(y.type||"").toLowerCase().startsWith("image/")||le?URL.createObjectURL(y):void 0;ae&&ie.current.add(ae),a.push({id:x,name:y.name,size:y.size,type:y.type,file:y,url:ae,status:"idle"})}return{accepted:a,rejected:g}},ge=t=>{const{accepted:a,rejected:g}=We(t);if(a.length>0){const E=j.concat(a);te||we(E),K?.(E),I||q(!0),R?.(!0)}g.length>0&&$?.(g)},Ve=t=>{const a=x=>Pe.length===0?Ce(x,ne):Ce(x,Pe),g=[],E=[],y=typeof w=="number"?Math.max(w-j.length,0):1/0;for(const x of t){if(g.length>=y){E.push({file:x,reason:"count"});continue}if(typeof d=="number"&&x.size>d){E.push({file:x,reason:"size"});continue}if(!a(x)){E.push({file:x,reason:"type"});continue}g.push(x)}g.length>0&&ge(g),E.length>0&&$?.(E)};e.useEffect(()=>{const t=new Set(j.map(a=>a.url).filter(Boolean));for(const a of Array.from(ie.current))t.has(a)||(URL.revokeObjectURL(a),ie.current.delete(a))},[j]),e.useEffect(()=>{const t=ie.current;return()=>{for(const a of Array.from(t))URL.revokeObjectURL(a);t.clear()}},[]);const Ue=re?B:"div",Ke=e.useCallback(t=>{const a=t.relatedTarget,g=he.current;g&&(a&&g.contains(a)||fe.current||(X?.trim?.()??"").length===0&&j.length===0&&(I||q(!1),R?.(!1)))},[I,R,X,j]),{getRootProps:$e,getInputProps:qe,isDragActive:Ee,open:Te}=Ze({onDrop:(t,a)=>{if(t.length>0&&ge(t),a.length>0&&$){const g=a.map(({file:E,errors:y})=>{const x=y[0]?.code==="file-too-large"?"size":y[0]?.code==="file-invalid-type"?"type":"count";return{file:E,reason:x}});$(g)}},accept:ne.length>0?ne.reduce((t,a)=>(a.includes("/")?t[a]=[]:a.startsWith(".")&&(t[a]=[]),t),{}):void 0,multiple:z,maxSize:d,noClick:!0,noKeyboard:!0,disabled:!k||F});e.useImperativeHandle(n,()=>({focusTextarea:()=>se.current?.focus({preventScroll:!0}),openFilePicker:()=>{fe.current=!0,Te()}}),[Te]);const Se=e.useCallback(t=>{if(!(t instanceof Element))return!1;const a=t;return a.closest(".rt-ChatbarDropOverlay")?!0:!!a.closest('button, [role="button"], a[href], input, textarea, select, [contenteditable], [tabindex]:not([tabindex="-1"])')},[]),Ye=e.useCallback(t=>{F||Se(t.target)||t.pointerType==="mouse"&&t.button!==0||(t.preventDefault(),se.current?.focus({preventScroll:!0}))},[F,Se,se]);return e.createElement(Me.Provider,{value:{open:ee,setOpen:t=>{I||q(t),R?.(t)},isOpenControlled:I,value:X,setValue:t=>{v||pe(t),h?.(t)},isValueControlled:v,size:H,expandOn:P,minLines:T,maxLines:u,sendMode:C,disabled:F,readOnly:Y,onSubmit:O,rootRef:he,textareaRef:se,attachments:j,setAttachments:t=>{te||we(t),K?.(t)},isAttachmentsControlled:te,accept:J,multiple:z,maxAttachments:w,maxFileSize:d,paste:de,pasteAccept:Q,clearOnSubmit:me,onAttachmentReject:$,dropzone:k,appendFiles:ge,appendFilesFromPaste:Ve,fileDialogOpenRef:fe}},e.createElement(Ue,{...c,ref:t=>{typeof i=="function"?i(t):i&&(i.current=t),he.current=t},className:S("rt-ChatbarRoot",`rt-r-size-${H}`,s),style:{position:"relative",width:oe,maxWidth:G,...p},"data-state":ee?"open":"closed","data-disabled":F?"":void 0,"data-readonly":Y?"":void 0,"data-drop-active":k&&Ee?"":void 0,"data-accent-color":N,"data-radius":U,"data-panel-background":f,"data-material":f,"aria-expanded":ee,onBlurCapture:Ke},k&&e.createElement("input",{...qe()}),e.createElement("div",{...k?$e():{},style:{width:"100%",height:"100%"},onPointerDown:Ye},e.createElement(Xe,{className:S("rt-ChatbarBox",`rt-variant-${V??"surface"}`),style:{position:"relative"},"data-accent-color":N,"data-radius":U,"data-panel-background":f,"data-material":f},e.createElement("div",{className:"rt-ChatbarGrid"},m),k&&Ee&&e.createElement("div",{className:"rt-ChatbarDropOverlay"},e.createElement("div",{className:"rt-ChatbarDropContent"},e.createElement(ve,{color:"gray",size:H,weight:"medium"},"Drop files here to attach")))))))});Le.displayName="Chatbar.Root";const Fe=e.forwardRef((l,i)=>{const{className:s,style:p,asChild:m,onFocus:b,onInput:A,onChange:h,onPaste:r,onKeyDown:o,submitOnEnter:R=!1,rows:P,...T}=l,u=W(),{open:C,minLines:F,maxLines:Y,expandOn:O,disabled:H,readOnly:V,setOpen:N,setValue:U,textareaRef:M,value:D,isValueControlled:oe,sendMode:G,paste:re,appendFilesFromPaste:_,size:ue}=u,K=e.useRef(0),J=e.useRef(0),z=e.useRef(0),w=e.useCallback(()=>{const n=M.current;if(!n)return;const c=window.getComputedStyle(n),f=parseFloat(c.lineHeight)||20,v=parseFloat(c.paddingTop)||0,L=parseFloat(c.paddingBottom)||0;K.current=f,J.current=v+L,z.current=Math.ceil(1*f)+v+L},[M]),d=e.useCallback(n=>{const c=M.current;if(!c)return;c.style.height="auto",K.current===0&&w();const f=K.current,v=J.current,L=n??C,pe=L?F:1,X=L?Y:1,I=Math.ceil(pe*f)+v,Z=Math.ceil(X*f)+v,q=Math.max(c.scrollHeight,I),ee=Math.min(q,Z);c.style.height=`${ee}px`,q>Z?(c.style.overflowY="auto",c.style.maxHeight=`${Z}px`):(c.style.overflowY="hidden",c.style.maxHeight="none")},[C,F,Y,M,w]);xe(()=>{d()},[d,D,C]),xe(()=>{if(!(O==="overflow"||O==="both")||C)return;const n=M.current;if(!n)return;n.style.height="auto",z.current===0&&w(),n.scrollHeight>z.current+1&&(N(!0),d(!0),requestAnimationFrame(()=>d(!0)))},[D,O,C,N,M,w,d]),xe(()=>{w(),d()},[w,d,ue]),e.useEffect(()=>{const n=M.current;if(!n||typeof ResizeObserver>"u")return;let c=K.current;const f=new ResizeObserver(()=>{const v=window.getComputedStyle(n),L=parseFloat(v.lineHeight)||20;L!==c&&(c=L,w(),requestAnimationFrame(()=>d()))});return f.observe(n),()=>f.disconnect()},[M,w,d]),e.useEffect(()=>{},[]);const de=e.useCallback(n=>{H||V||((O==="focus"||O==="both")&&!C&&N(!0),b?.(n))},[H,V,O,C,N,b]),Q=e.useCallback(n=>{const c=n.currentTarget,f=c.value;U(f),(O==="overflow"||O==="both")&&!C&&(c.style.height="auto",z.current===0&&w(),c.scrollHeight>z.current+1&&(N(!0),d(!0),requestAnimationFrame(()=>d(!0)))),requestAnimationFrame(()=>d()),h?.(n)},[O,C,N,U,h,d,w]),me=e.useCallback(n=>{if(re){const f=Array.from(n.clipboardData?.items??[]).filter(v=>v.kind==="file").map(v=>v.getAsFile()).filter(v=>!!v);f.length>0&&(n.preventDefault(),_(f))}setTimeout(()=>{C?d():d(!0)},0),r?.(n)},[re,C,d,r,_]),$=e.useCallback(n=>{if(!R){o?.(n);return}if(n.key==="Enter"&&!n.shiftKey&&!n.altKey&&!n.ctrlKey&&!n.metaKey&&!n.nativeEvent.isComposing){if(H||V){o?.(n);return}if(G==="never"){o?.(n);return}const f=D.trim().length>0||u.attachments.length>0;if(G==="whenDirty"&&!f){o?.(n);return}n.preventDefault(),u.onSubmit?.({value:D,attachments:u.attachments}),u.clearOnSubmit&&(oe||U(""),u.setAttachments([]))}o?.(n)},[R,H,V,G,D,oe,U,u,o]),k=m?B:"textarea";return e.createElement("div",{className:S("rt-ChatbarField","rt-ChatbarTextarea",s)},e.createElement(k,{...T,ref:n=>{typeof i=="function"?i(n):i&&(i.current=n),M.current=n},className:"rt-ChatbarInput",value:D,onInput:A,onChange:Q,onFocus:de,onPaste:me,onKeyDown:$,disabled:H,readOnly:V,rows:C?F:1,spellCheck:T.spellCheck??!0,autoCorrect:T.autoCorrect??"on",style:p}))});Fe.displayName="Chatbar.Textarea";const He=e.forwardRef((l,i)=>{const{children:s,asChild:p,style:m,className:b,...A}=l;return W().open?null:e.createElement(p?B:"div",{...A,ref:i,className:S("rt-ChatbarInlineStart",b),style:m},s)});He.displayName="Chatbar.InlineStart";const Ne=e.forwardRef((l,i)=>{const{children:s,asChild:p,style:m,className:b,...A}=l;return W().open?null:e.createElement(p?B:"div",{...A,ref:i,className:S("rt-ChatbarInlineEnd",b),style:m},s)});Ne.displayName="Chatbar.InlineEnd";const De=e.forwardRef((l,i)=>{const{asChild:s,forceMount:p,renderAttachment:m,className:b,style:A,...h}=l,r=W();return!(r.attachments.length>0)&&!p?null:e.createElement(s?B:"div",{...h,ref:i,className:S("rt-ChatbarAttachmentsRow",b),style:A,role:"list","aria-label":h["aria-label"]??"Attachments"},e.createElement(Qe,{className:"rt-ChatbarScrollArea",scrollbars:"horizontal",size:"1"},e.createElement(ce,{align:"center",gap:"2",style:{minWidth:"fit-content"}},r.attachments.map(P=>e.createElement(Ae,{key:P.id,attachment:P,asChild:!!m},m?.(P))))))});De.displayName="Chatbar.AttachmentsRow";const Ae=e.forwardRef((l,i)=>{const{attachment:s,asChild:p,className:m,style:b,children:A,...h}=l,r=W(),o=p?B:"div",R=!!s.url&&s.type.startsWith("image/");return e.createElement(o,{...h,ref:i,className:S("rt-ChatbarAttachment",m),style:b,role:"listitem","data-kind":R?"image":"file",title:s.name},A??e.createElement(ce,{align:"center",gap:"2",pr:R?void 0:"6"},e.createElement("div",{className:"rt-ChatbarAttachmentPreview","aria-hidden":!0},R?e.createElement("img",{className:"rt-ChatbarAttachmentImage",src:s.url,alt:""}):e.createElement(Je,null)),!R&&e.createElement(ce,{direction:"column",gap:"0",style:{minWidth:0}},e.createElement(ve,{size:r.size,weight:"medium",style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},s.name),e.createElement(ve,{size:"1",color:"gray"},Math.ceil(s.size/1024)," KB")),e.createElement(Oe,{className:"rt-ChatbarAttachmentRemove","aria-label":`Remove ${s.name}`,size:"1",variant:"classic",highContrast:!0,color:"gray",onClick:()=>r.setAttachments(r.attachments.filter(P=>P.id!==s.id))},e.createElement(_e,null))))});Ae.displayName="Chatbar.Attachment";const ze=e.forwardRef((l,i)=>{const{asChild:s,accept:p,multiple:m,className:b,style:A,...h}=l,r=W(),o=e.useRef(null),R=s?B:"button",P=p??r.accept,T=(Array.isArray(P)?P:P?.split(",")??[]).join(",");return e.useEffect(()=>{const u=()=>{r.fileDialogOpenRef.current=!1};return window.addEventListener("focus",u),()=>window.removeEventListener("focus",u)},[r.fileDialogOpenRef]),e.createElement(e.Fragment,null,e.createElement(R,{...h,ref:i,className:S("rt-ChatbarAttachTrigger",b),style:A,type:h.type??"button","aria-label":h["aria-label"]??"Add attachments",onPointerDown:u=>{r.fileDialogOpenRef.current=!0,h.onPointerDown?.(u)},onMouseDown:u=>{r.fileDialogOpenRef.current=!0,h.onMouseDown?.(u)},onClick:u=>{r.fileDialogOpenRef.current=!0,o.current&&o.current.click(),h.onClick?.(u)}}),e.createElement("input",{ref:o,type:"file",accept:T,multiple:m??r.multiple,tabIndex:-1,style:{display:"none"},onChange:u=>{const C=Array.from(u.currentTarget.files??[]);C.length>0&&r.appendFiles(C),r.fileDialogOpenRef.current=!1,u.currentTarget.value=""}}))});ze.displayName="Chatbar.AttachTrigger";const ke=e.forwardRef((l,i)=>{const{asChild:s,children:p,className:m,style:b,...A}=l;return W().open?e.createElement(s?B:"div",{...A,ref:i,className:S("rt-ChatbarRow",m),style:b},e.createElement(ce,{align:"center",justify:"between",width:"100%"},p)):null});ke.displayName="Chatbar.Row";const Ie=e.forwardRef((l,i)=>{const{className:s,style:p,...m}=l;return e.createElement("div",{...m,ref:i,className:S("rt-ChatbarRowStart",s),style:p})});Ie.displayName="Chatbar.RowStart";const je=e.forwardRef((l,i)=>{const{className:s,style:p,...m}=l;return e.createElement("div",{...m,ref:i,className:S("rt-ChatbarRowEnd",s),style:p})});je.displayName="Chatbar.RowEnd";const Be=e.forwardRef((l,i)=>{const{asChild:s,clearOnSend:p=!0,disabled:m,children:b,className:A,style:h,...r}=l,o=W(),P=o.value.trim().length>0||o.attachments.length>0,T=o.sendMode==="always"||o.sendMode==="whenDirty"&&P;if(o.sendMode==="never")return null;const u=C=>{o.disabled||o.readOnly||(o.onSubmit?.({value:o.value,attachments:o.attachments}),p&&(o.isValueControlled||o.setValue(""),o.clearOnSubmit&&o.setAttachments([])),r.onClick?.(C))};return e.createElement(Oe,{...r,ref:i,size:o.size,variant:o.open?"solid":"ghost",disabled:m||o.disabled||o.readOnly,className:S("rt-ChatbarSend",A),style:{opacity:T?1:0,pointerEvents:T?"auto":"none",...h},asChild:s,onClick:u,"aria-label":r["aria-label"]??"Send"},b??e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"lucide lucide-arrow-right-icon lucide-arrow-right"},e.createElement("path",{d:"M5 12h14"}),e.createElement("path",{d:"m12 5 7 7-7 7"})))});Be.displayName="Chatbar.Send";export{ze as AttachTrigger,Ae as Attachment,De as AttachmentsRow,Ne as InlineEnd,He as InlineStart,Le as Root,ke as Row,je as RowEnd,Ie as RowStart,Be as Send,Fe as Textarea};
|
|
1
|
+
import*as e from"react";import O from"classnames";import{IconButton as Oe}from"./icon-button.js";import{CloseIcon as _e,FileTextIcon as Je}from"./icons.js";import{Flex as ce}from"./flex.js";import{ScrollArea as Qe}from"./scroll-area.js";import{Slot as W}from"./slot.js";import{Box as Xe}from"./box.js";import{Text as ve}from"./text.js";import{useDropzone as Ze}from"react-dropzone";const xe=typeof window<"u"?e.useLayoutEffect:e.useEffect,Me=e.createContext(null),V=()=>{const l=e.useContext(Me);if(!l)throw new Error("Chatbar context not found. Wrap parts in <Chatbar.Root>.");return l},Le=e.forwardRef((l,s)=>{const{className:r,style:m,children:d,value:f,defaultValue:x="",onValueChange:p,open:i,defaultOpen:A=!1,onOpenChange:R,expandOn:P="both",minLines:S=1,maxLines:a=6,sendMode:C="whenDirty",disabled:M,readOnly:D,onSubmit:T,size:L="2",variant:U,color:N,radius:K,panelBackground:F,material:z,width:oe,maxWidth:G,asChild:re,attachments:_,defaultAttachments:ue=[],onAttachmentsChange:$,accept:J,multiple:k=!0,maxAttachments:w,maxFileSize:u,paste:de=!0,pasteAccept:Q,clearOnSubmit:me=!0,onAttachmentReject:q,dropzone:I=!0,apiRef:n,...c}=l,h=z||F,y=f!=null,[H,pe]=e.useState(x),X=y?f:H,j=i!=null,[Z,Y]=e.useState(A),ee=j?i:Z,he=e.useRef(null),se=e.useRef(null),fe=e.useRef(!1),te="attachments"in l,[Re,we]=e.useState(ue),B=e.useMemo(()=>te?_??[]:Re,[te,_,Re]),ie=e.useRef(new Set),be=t=>Array.isArray(t)?t:typeof t=="string"?t.split(",").map(o=>o.trim()):[],ne=be(J),Pe=be(Q).length>0?be(Q):ne,ge=(t,o)=>{if(o.length===0)return!0;const b=t.type.toLowerCase(),E=t.name.toLowerCase();for(const g of o){const v=g.toLowerCase();if(v.includes("/")){const[le,ye]=v.split("/"),[ae,Ge]=b.split("/");if(le==="*"||le===ae&&(ye==="*"||ye===Ge))return!0}else if(v.startsWith(".")&&E.endsWith(v))return!0}return!1},We=t=>{const o=[],b=[],E=typeof w=="number"?Math.max(w-B.length,0):1/0;for(const g of t){if(o.length>=E){b.push({file:g,reason:"count"});continue}if(typeof u=="number"&&g.size>u){b.push({file:g,reason:"size"});continue}if(!ge(g,ne)){b.push({file:g,reason:"type"});continue}const v=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,le=/\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(g.name),ae=(g.type||"").toLowerCase().startsWith("image/")||le?URL.createObjectURL(g):void 0;ae&&ie.current.add(ae),o.push({id:v,name:g.name,size:g.size,type:g.type,file:g,url:ae,status:"idle"})}return{accepted:o,rejected:b}},Ce=t=>{const{accepted:o,rejected:b}=We(t);if(o.length>0){const E=B.concat(o);te||we(E),$?.(E),j||Y(!0),R?.(!0)}b.length>0&&q?.(b)},Ve=t=>{const o=v=>Pe.length===0?ge(v,ne):ge(v,Pe),b=[],E=[],g=typeof w=="number"?Math.max(w-B.length,0):1/0;for(const v of t){if(b.length>=g){E.push({file:v,reason:"count"});continue}if(typeof u=="number"&&v.size>u){E.push({file:v,reason:"size"});continue}if(!o(v)){E.push({file:v,reason:"type"});continue}b.push(v)}b.length>0&&Ce(b),E.length>0&&q?.(E)};e.useEffect(()=>{const t=new Set(B.map(o=>o.url).filter(Boolean));for(const o of Array.from(ie.current))t.has(o)||(URL.revokeObjectURL(o),ie.current.delete(o))},[B]),e.useEffect(()=>{const t=ie.current;return()=>{for(const o of Array.from(t))URL.revokeObjectURL(o);t.clear()}},[]);const Ue=re?W:"div",Ke=e.useCallback(t=>{const o=t.relatedTarget,b=he.current;b&&(o&&b.contains(o)||fe.current||(X?.trim?.()??"").length===0&&B.length===0&&(j||Y(!1),R?.(!1)))},[j,R,X,B]),{getRootProps:$e,getInputProps:qe,isDragActive:Ee,open:Te}=Ze({onDrop:(t,o)=>{if(t.length>0&&Ce(t),o.length>0&&q){const b=o.map(({file:E,errors:g})=>{const v=g[0]?.code==="file-too-large"?"size":g[0]?.code==="file-invalid-type"?"type":"count";return{file:E,reason:v}});q(b)}},accept:ne.length>0?ne.reduce((t,o)=>(o.includes("/")?t[o]=[]:o.startsWith(".")&&(t[o]=[]),t),{}):void 0,multiple:k,maxSize:u,noClick:!0,noKeyboard:!0,disabled:!I||M});e.useImperativeHandle(n,()=>({focusTextarea:()=>se.current?.focus({preventScroll:!0}),openFilePicker:()=>{fe.current=!0,Te()}}),[Te]);const Se=e.useCallback(t=>{if(!(t instanceof Element))return!1;const o=t;return o.closest(".rt-ChatbarDropOverlay")?!0:!!o.closest('button, [role="button"], a[href], input, textarea, select, [contenteditable], [tabindex]:not([tabindex="-1"])')},[]),Ye=e.useCallback(t=>{M||Se(t.target)||t.pointerType==="mouse"&&t.button!==0||(t.preventDefault(),se.current?.focus({preventScroll:!0}))},[M,Se,se]);return e.createElement(Me.Provider,{value:{open:ee,setOpen:t=>{j||Y(t),R?.(t)},isOpenControlled:j,value:X,setValue:t=>{y||pe(t),p?.(t)},isValueControlled:y,size:L,expandOn:P,minLines:S,maxLines:a,sendMode:C,disabled:M,readOnly:D,onSubmit:T,rootRef:he,textareaRef:se,attachments:B,setAttachments:t=>{te||we(t),$?.(t)},isAttachmentsControlled:te,accept:J,multiple:k,maxAttachments:w,maxFileSize:u,paste:de,pasteAccept:Q,clearOnSubmit:me,onAttachmentReject:q,dropzone:I,appendFiles:Ce,appendFilesFromPaste:Ve,fileDialogOpenRef:fe}},e.createElement(Ue,{...c,ref:t=>{typeof s=="function"?s(t):s&&(s.current=t),he.current=t},className:O("rt-ChatbarRoot",`rt-r-size-${L}`,r),style:{position:"relative",width:oe,maxWidth:G,...m},"data-state":ee?"open":"closed","data-disabled":M?"":void 0,"data-readonly":D?"":void 0,"data-drop-active":I&&Ee?"":void 0,"data-accent-color":N,"data-radius":K,"data-panel-background":h,"data-material":h,"aria-expanded":ee,onBlurCapture:Ke},I&&e.createElement("input",{...qe()}),e.createElement("div",{...I?$e():{},style:{width:"100%",height:"100%"},onPointerDown:Ye},e.createElement(Xe,{className:O("rt-ChatbarBox",`rt-variant-${U??"surface"}`),style:{position:"relative"},"data-accent-color":N,"data-radius":K,"data-panel-background":h,"data-material":h},e.createElement("div",{className:"rt-ChatbarGrid"},d),I&&Ee&&e.createElement("div",{className:"rt-ChatbarDropOverlay"},e.createElement("div",{className:"rt-ChatbarDropContent"},e.createElement(ve,{color:"gray",size:L,weight:"medium"},"Drop files here to attach")))))))});Le.displayName="Chatbar.Root";const Fe=e.forwardRef((l,s)=>{const{className:r,style:m,asChild:d,onFocus:f,onInput:x,onChange:p,onPaste:i,onKeyDown:A,submitOnEnter:R=!1,rows:P,...S}=l,a=V(),{open:C,minLines:M,maxLines:D,expandOn:T,disabled:L,readOnly:U,setOpen:N,setValue:K,textareaRef:F,value:z,isValueControlled:oe,sendMode:G,paste:re,appendFilesFromPaste:_,size:ue}=a,$=e.useRef(0),J=e.useRef(0),k=e.useRef(0),w=e.useCallback(()=>{const n=F.current;if(!n)return;const c=window.getComputedStyle(n),h=parseFloat(c.lineHeight)||20,y=parseFloat(c.paddingTop)||0,H=parseFloat(c.paddingBottom)||0;$.current=h,J.current=y+H,k.current=Math.ceil(1*h)+y+H},[F]),u=e.useCallback(n=>{const c=F.current;if(!c)return;c.style.height="auto",$.current===0&&w();const h=$.current,y=J.current,H=n??C,pe=H?M:1,X=H?D:1,j=Math.ceil(pe*h)+y,Z=Math.ceil(X*h)+y,Y=Math.max(c.scrollHeight,j),ee=Math.min(Y,Z);c.style.height=`${ee}px`,Y>Z?(c.style.overflowY="auto",c.style.maxHeight=`${Z}px`):(c.style.overflowY="hidden",c.style.maxHeight="none")},[C,M,D,F,w]);xe(()=>{u()},[u,z,C]),xe(()=>{if(!(T==="overflow"||T==="both")||C)return;const n=F.current;if(!n)return;n.style.height="auto",k.current===0&&w(),n.scrollHeight>k.current+1&&(N(!0),u(!0),requestAnimationFrame(()=>u(!0)))},[z,T,C,N,F,w,u]),xe(()=>{w(),u()},[w,u,ue]),e.useEffect(()=>{const n=F.current;if(!n||typeof ResizeObserver>"u")return;let c=$.current;const h=new ResizeObserver(()=>{const y=window.getComputedStyle(n),H=parseFloat(y.lineHeight)||20;H!==c&&(c=H,w(),requestAnimationFrame(()=>u()))});return h.observe(n),()=>h.disconnect()},[F,w,u]),e.useEffect(()=>{},[]);const de=e.useCallback(n=>{L||U||((T==="focus"||T==="both")&&!C&&N(!0),f?.(n))},[L,U,T,C,N,f]),Q=e.useCallback(n=>{const c=n.currentTarget,h=c.value;K(h),(T==="overflow"||T==="both")&&!C&&(c.style.height="auto",k.current===0&&w(),c.scrollHeight>k.current+1&&(N(!0),u(!0),requestAnimationFrame(()=>u(!0)))),requestAnimationFrame(()=>u()),p?.(n)},[T,C,N,K,p,u,w]),me=e.useCallback(n=>{if(re){const h=Array.from(n.clipboardData?.items??[]).filter(y=>y.kind==="file").map(y=>y.getAsFile()).filter(y=>!!y);h.length>0&&(n.preventDefault(),_(h))}setTimeout(()=>{C?u():u(!0)},0),i?.(n)},[re,C,u,i,_]),q=e.useCallback(n=>{if(!R){A?.(n);return}if(n.key==="Enter"&&!n.shiftKey&&!n.altKey&&!n.ctrlKey&&!n.metaKey&&!n.nativeEvent.isComposing){if(L||U){A?.(n);return}if(G==="never"){A?.(n);return}const h=z.trim().length>0||a.attachments.length>0;if(G==="whenDirty"&&!h){A?.(n);return}n.preventDefault(),a.onSubmit?.({value:z,attachments:a.attachments}),a.clearOnSubmit&&(oe||K(""),a.setAttachments([]))}A?.(n)},[R,L,U,G,z,oe,K,a,A]),I=d?W:"textarea";return e.createElement("div",{className:O("rt-ChatbarField","rt-ChatbarTextarea",r)},e.createElement(I,{...S,ref:n=>{typeof s=="function"?s(n):s&&(s.current=n),F.current=n},className:"rt-ChatbarInput",value:z,onInput:x,onChange:Q,onFocus:de,onPaste:me,onKeyDown:q,disabled:L,readOnly:U,rows:C?M:1,spellCheck:S.spellCheck??!0,autoCorrect:S.autoCorrect??"on",style:m}))});Fe.displayName="Chatbar.Textarea";const He=e.forwardRef((l,s)=>{const{children:r,asChild:m,style:d,className:f,...x}=l;return V().open?null:e.createElement(m?W:"div",{...x,ref:s,className:O("rt-ChatbarInlineStart",f),style:d},r)});He.displayName="Chatbar.InlineStart";const Ne=e.forwardRef((l,s)=>{const{children:r,asChild:m,style:d,className:f,...x}=l;return V().open?null:e.createElement(m?W:"div",{...x,ref:s,className:O("rt-ChatbarInlineEnd",f),style:d},r)});Ne.displayName="Chatbar.InlineEnd";const De=e.forwardRef((l,s)=>{const{asChild:r,forceMount:m,renderAttachment:d,className:f,style:x,...p}=l,i=V();return!(i.attachments.length>0)&&!m?null:e.createElement(r?W:"div",{...p,ref:s,className:O("rt-ChatbarAttachmentsRow",f),style:x,role:"list","aria-label":p["aria-label"]??"Attachments"},e.createElement(Qe,{className:"rt-ChatbarScrollArea",scrollbars:"horizontal",size:"1"},e.createElement(ce,{align:"center",gap:"2",style:{minWidth:"fit-content"}},i.attachments.map(P=>e.createElement(Ae,{key:P.id,attachment:P,asChild:!!d},d?.(P))))))});De.displayName="Chatbar.AttachmentsRow";const Ae=e.forwardRef((l,s)=>{const{attachment:r,asChild:m,className:d,style:f,children:x,...p}=l,i=V(),A=m?W:"div",R=!!r.url&&r.type.startsWith("image/");return e.createElement(A,{...p,ref:s,className:O("rt-ChatbarAttachment",d),style:f,role:"listitem","data-kind":R?"image":"file",title:r.name},x??e.createElement(ce,{align:"center",gap:"2",pr:R?void 0:"6"},e.createElement("div",{className:"rt-ChatbarAttachmentPreview","aria-hidden":!0},R?e.createElement("img",{className:"rt-ChatbarAttachmentImage",src:r.url,alt:""}):e.createElement(Je,null)),!R&&e.createElement(ce,{direction:"column",gap:"0",style:{minWidth:0}},e.createElement(ve,{size:i.size,weight:"medium",style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},r.name),e.createElement(ve,{size:"1",color:"gray"},Math.ceil(r.size/1024)," KB")),e.createElement(Oe,{className:"rt-ChatbarAttachmentRemove","aria-label":`Remove ${r.name}`,size:"1",variant:"classic",highContrast:!0,color:"gray",onClick:()=>i.setAttachments(i.attachments.filter(P=>P.id!==r.id))},e.createElement(_e,null))))});Ae.displayName="Chatbar.Attachment";const ze=e.forwardRef((l,s)=>{const{asChild:r,accept:m,multiple:d,className:f,style:x,...p}=l,i=V(),A=e.useRef(null),R=r?W:"button",P=m??i.accept,S=(Array.isArray(P)?P:P?.split(",")??[]).join(",");return e.useEffect(()=>{const a=()=>{i.fileDialogOpenRef.current=!1};return window.addEventListener("focus",a),()=>window.removeEventListener("focus",a)},[i.fileDialogOpenRef]),e.createElement(e.Fragment,null,e.createElement(R,{...p,ref:s,className:O("rt-ChatbarAttachTrigger",f),style:x,type:p.type??"button","aria-label":p["aria-label"]??"Add attachments",onPointerDown:a=>{i.fileDialogOpenRef.current=!0,p.onPointerDown?.(a)},onMouseDown:a=>{i.fileDialogOpenRef.current=!0,p.onMouseDown?.(a)},onClick:a=>{i.fileDialogOpenRef.current=!0,A.current&&A.current.click(),p.onClick?.(a)}}),e.createElement("input",{ref:A,type:"file",accept:S,multiple:d??i.multiple,tabIndex:-1,style:{display:"none"},onChange:a=>{const C=Array.from(a.currentTarget.files??[]);C.length>0&&i.appendFiles(C),i.fileDialogOpenRef.current=!1,a.currentTarget.value=""}}))});ze.displayName="Chatbar.AttachTrigger";const ke=e.forwardRef((l,s)=>{const{asChild:r,children:m,className:d,style:f,...x}=l;return V().open?e.createElement(r?W:"div",{...x,ref:s,className:O("rt-ChatbarRow",d),style:f},e.createElement(ce,{align:"center",justify:"between",width:"100%"},m)):null});ke.displayName="Chatbar.Row";const Ie=e.forwardRef((l,s)=>{const{className:r,style:m,...d}=l;return e.createElement("div",{...d,ref:s,className:O("rt-ChatbarRowStart",r),style:m})});Ie.displayName="Chatbar.RowStart";const je=e.forwardRef((l,s)=>{const{className:r,style:m,...d}=l;return e.createElement("div",{...d,ref:s,className:O("rt-ChatbarRowEnd",r),style:m})});je.displayName="Chatbar.RowEnd";const Be=e.forwardRef((l,s)=>{const{asChild:r,clearOnSend:m=!0,disabled:d,children:f,className:x,style:p,size:i,variant:A,"aria-label":R,"aria-labelledby":P,...S}=l,a=V(),M=a.value.trim().length>0||a.attachments.length>0,D=a.sendMode==="always"||a.sendMode==="whenDirty"&&M;if(a.sendMode==="never")return null;const T=L=>{a.disabled||a.readOnly||(a.onSubmit?.({value:a.value,attachments:a.attachments}),m&&(a.isValueControlled||a.setValue(""),a.clearOnSubmit&&a.setAttachments([])),S.onClick?.(L))};return e.createElement(Oe,{...S,ref:s,size:i??a.size,variant:A??(a.open?"solid":"ghost"),disabled:d||a.disabled||a.readOnly,className:O("rt-ChatbarSend",x),style:{opacity:D?1:0,pointerEvents:D?"auto":"none",...p},asChild:r,onClick:T,"aria-label":R??(P?void 0:"Send"),"aria-labelledby":P},f??e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"lucide lucide-arrow-right-icon lucide-arrow-right"},e.createElement("path",{d:"M5 12h14"}),e.createElement("path",{d:"m12 5 7 7-7 7"})))});Be.displayName="Chatbar.Send";export{ze as AttachTrigger,Ae as Attachment,De as AttachmentsRow,Ne as InlineEnd,He as InlineStart,Le as Root,ke as Row,je as RowEnd,Ie as RowStart,Be as Send,Fe as Textarea};
|
|
2
2
|
//# sourceMappingURL=chatbar.js.map
|