@vuu-ui/vuu-shell 0.5.20 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var ge=Object.create;var E=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var xe=Object.getPrototypeOf,Ce=Object.prototype.hasOwnProperty;var Se=(t,e)=>{for(var o in e)E(t,o,{get:e[o],enumerable:!0})},z=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ye(e))!Ce.call(t,n)&&n!==o&&E(t,n,{get:()=>e[n],enumerable:!(r=ve(e,n))||r.enumerable});return t};var F=(t,e,o)=>(o=t!=null?ge(xe(t)):{},z(e||!t||!t.__esModule?E(o,"default",{value:t,enumerable:!0}):o,t)),Pe=t=>z(E({},"__esModule",{value:!0}),t);var Ue={};Se(Ue,{Feature:()=>A,LoginPanel:()=>we,Shell:()=>De,ShellContextProvider:()=>O,getAuthDetailsFromCookies:()=>be,logout:()=>B,redirectToLogin:()=>Z,useShellContext:()=>Re});module.exports=Pe(Ue);var H=F(require("react")),K=require("@vuu-ui/vuu-layout");var _=F(require("react")),S=require("react/jsx-runtime"),M=class extends _.default.Component{constructor(e){super(e),this.state={errorMessage:null}}static getDerivedStateFromError(e){return{errorMessage:e.message}}componentDidCatch(e,o){console.log(e,o)}render(){return this.state.errorMessage?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)("h1",{children:"Something went wrong."}),(0,S.jsx)("p",{children:this.state.errorMessage})]}):this.props.children}};var G=require("react/jsx-runtime"),q=()=>(0,G.jsx)("div",{className:"hwLoader",children:"loading"});var W=async t=>{let e=new CSSStyleSheet;return fetch(t).then(o=>o.text()).then(o=>e.replace(o))};var N=require("react/jsx-runtime");function Le({url:t,css:e,params:o,...r}){e&&W(e).then(s=>{document.adoptedStyleSheets=[...document.adoptedStyleSheets,s]});let n=H.default.lazy(()=>import(t));return(0,N.jsx)(M,{children:(0,N.jsx)(H.Suspense,{fallback:(0,N.jsx)(q,{}),children:(0,N.jsx)(n,{...r,...o})})})}var A=H.default.memo(Le);A.displayName="Feature";(0,K.registerComponent)("Feature",A,"view");var I=require("react"),X=require("@salt-ds/core"),b=require("@heswell/salt-lab");var g=require("react/jsx-runtime"),Q="vuuLoginPanel",we=({onSubmit:t})=>{let[e,o]=(0,I.useState)(""),[r,n]=(0,I.useState)(""),s=()=>{t(e,r)},a=(l,c)=>{o(c)},m=(l,c)=>{n(c)},i=e.trim()!==""&&r.trim()!=="";return(0,g.jsxs)("div",{className:Q,children:[(0,g.jsx)(b.FormField,{label:"Username",style:{width:200},children:(0,g.jsx)(b.Input,{value:e,id:"text-username",onChange:a})}),(0,g.jsx)(b.FormField,{label:"Password",style:{width:200},children:(0,g.jsx)(b.Input,{type:"password",value:r,id:"text-password",onChange:m})}),(0,g.jsx)(X.Button,{className:`${Q}-login`,disabled:!i,onClick:s,variant:"cta",children:"Login"})]})};var Y=t=>{var e;return(e=document.cookie.split("; ").find(o=>o.startsWith(`${t}=`)))==null?void 0:e.split("=")[1]},be=()=>{let t=Y("vuu-username"),e=Y("vuu-auth-token");return[t,e]},Z=(t="/login.html")=>{window.location.href=t},B=t=>{document.cookie="vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",document.cookie="vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",Z(t)};var ce=require("@vuu-ui/vuu-data"),d=require("react");var v=require("react"),ke=(t,e)=>{let[o,r]=(0,v.useState)(e),n=i=>{r(i)},s=(0,v.useCallback)(async(i="latest")=>{fetch(`api/vui/${t.username}/${i}`,{}).then(l=>l.ok?l.json():e).then(n).catch(()=>{n(e)})},[e,t.username]);(0,v.useEffect)(()=>{s()},[s]);let a=(0,v.useCallback)(i=>{fetch(`api/vui/${t.username}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then(l=>l.ok?l.json():e)},[e,t]),m=(0,v.useCallback)(i=>{s(i)},[s]);return[o,a,m]},j=ke;var D=require("react"),T=require("react/jsx-runtime"),Ne={},V=(0,D.createContext)(Ne),He=({children:t,context:e,inheritedContext:o})=>{let r={...o,...e};return(0,T.jsx)(V.Provider,{value:r,children:t})},O=({children:t,value:e})=>(0,T.jsx)(V.Consumer,{children:o=>(0,T.jsx)(He,{context:e,inheritedContext:o,children:t})}),Re=()=>(0,D.useContext)(V);var pe=F(require("classnames")),u=require("@vuu-ui/vuu-layout");var L=require("react"),se=require("@salt-ds/core"),ae=require("@heswell/salt-lab"),ie=require("@salt-ds/icons");var f=require("react"),te=require("@vuu-ui/vuu-utils");var ee=async t=>await fetch(`api/vui/${t.username}`,{}).then(o=>o.ok?o.json():null).catch(()=>{console.log("error getting history")});var oe=require("@salt-ds/icons"),re=require("@salt-ds/core"),U=require("@heswell/salt-lab");var y=require("react/jsx-runtime"),Ee=({lastUpdate:t},{lastUpdate:e})=>e===t?0:e<t?-1:1,Me=t=>(0,y.jsx)(U.ListItem,{...t}),ne=(0,f.forwardRef)(function({loginUrl:e,onNavigate:o,user:r,layoutId:n="latest"},s){let[a,m]=(0,f.useState)([]);(0,f.useEffect)(()=>{async function x(){let C=await ee(r);console.log({history:C});let k=C.filter(w=>w.id!=="latest").sort(Ee).map(({id:w,lastUpdate:R})=>({lastUpdate:R,id:w,label:`Saved at ${(0,te.formatDate)(new Date(R),"kk:mm:ss")}`}));console.log({sortedHistory:k}),m(k)}x()},[r]);let i=(0,f.useCallback)((x,C)=>{C&&o(C.id)},[o]),l=(0,f.useCallback)(()=>{B(e)},[e]),c=a.length===0?[]:n==="latest"?a[0]:a.find(x=>x.id===n);return console.log({selected:c}),(0,y.jsxs)("div",{className:"vuuUserPanel",ref:s,children:[(0,y.jsx)(U.List,{ListItem:Me,className:"vuuUserPanel-history",onSelect:i,selected:c,source:a}),(0,y.jsx)("div",{className:"vuuUserPanel-buttonBar",children:(0,y.jsxs)(re.Button,{"aria-label":"logout",onClick:l,children:[(0,y.jsx)(oe.ExportIcon,{})," Logout"]})})]})});var P=require("react/jsx-runtime"),le=({layoutId:t,loginUrl:e,onNavigate:o,user:r})=>{let[n,s]=(0,L.useState)(!1),a=(0,L.useRef)(!1),m=(0,L.useRef)(null),i=(0,L.useCallback)(()=>{s(c=>a.current=!c),requestAnimationFrame(()=>{a.current||requestAnimationFrame(()=>{m.current.focus()})})},[]);return(0,P.jsx)("div",{className:"vuuUserProfile",children:(0,P.jsxs)(ae.DropdownBase,{placement:"bottom-end",onCancel:i,children:[(0,P.jsx)(se.Button,{ref:m,variant:"secondary",children:(0,P.jsx)(ie.UserSolidIcon,{})}),(0,P.jsx)(ne,{layoutId:t,loginUrl:e,onNavigate:c=>{s(!1),o(c)},user:r})]})})};var $=require("react/jsx-runtime"),ue=({layoutId:t,loginUrl:e,onNavigate:o,user:r,...n})=>(0,$.jsx)("header",{className:"hwAppHeader",...n,children:(0,$.jsx)(le,{layoutId:t,loginUrl:e,onNavigate:o,user:r})});var p=require("react/jsx-runtime"),Te={type:"View",props:{style:{height:"calc(100% - 6px)"}},children:[{props:{className:"vuuShell-warningPlaceholder"},type:"Placeholder"}]},De=({children:t,className:e,defaultLayout:o=Te,leftSidePanel:r,loginUrl:n,serverUrl:s,user:a,...m})=>{let i=(0,d.useRef)(null),[l,c]=(0,d.useState)(!1),x=(0,d.useRef)("latest"),[C,k,w]=j(a,o),R=(0,d.useCallback)(h=>{k(h)},[k]),me=h=>{var J;let fe=h.target;(J=i.current)!=null&&J.contains(fe)||c(!l)},de=(0,d.useCallback)(h=>{x.current=h,w(h)},[w]);(0,d.useEffect)(()=>{s&&a.token&&(0,ce.connectToServer)(s,a.token)},[s,a.token]);let he=()=>{let h=[];return r&&h.push((0,p.jsx)(u.Drawer,{onClick:me,open:l,position:"left",inline:!0,peekaboo:!0,sizeOpen:200,toggleButton:"end",children:(0,p.jsx)(u.View,{className:"vuuShell-palette",id:"vw-app-palette",ref:i,style:{height:"100%"},children:r},"app-palette")},"left-panel")),h};return(0,p.jsxs)(O,{value:void 0,children:[(0,p.jsx)(u.LayoutProvider,{layout:C,onLayoutChange:R,children:(0,p.jsx)(u.DraggableLayout,{className:(0,pe.default)("vuuShell",e),...m,children:(0,p.jsxs)(u.FlexboxLayout,{className:"App",style:{flexDirection:"column",height:"100%",width:"100%"},children:[(0,p.jsx)(ue,{layoutId:x.current,loginUrl:n,user:a,onNavigate:de}),(0,p.jsx)(u.Chest,{style:{flex:1},children:he().concat((0,p.jsx)(u.DraggableLayout,{dropTarget:!0,style:{width:"100%",height:"100%"}},"main-content"))})]})})}),t]})};
1
+ "use strict";var ke=Object.create;var U=Object.defineProperty;var He=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,De=Object.prototype.hasOwnProperty;var Ue=(t,e)=>{for(var o in e)U(t,o,{get:e[o],enumerable:!0})},W=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ee(e))!De.call(t,n)&&n!==o&&U(t,n,{get:()=>e[n],enumerable:!(r=He(e,n))||r.enumerable});return t};var N=(t,e,o)=>(o=t!=null?ke(Re(t)):{},W(e||!t||!t.__esModule?U(o,"default",{value:t,enumerable:!0}):o,t)),Be=t=>W(U({},"__esModule",{value:!0}),t);var Qe={};Ue(Qe,{Feature:()=>O,LoginPanel:()=>Ae,Shell:()=>Ke,ShellContextProvider:()=>J,ThemeSwitch:()=>_,getAuthDetailsFromCookies:()=>Ie,logout:()=>$,redirectToLogin:()=>oe,useShellContext:()=>Ge});module.exports=Be(Qe);var H=N(require("react")),Z=require("@vuu-ui/vuu-layout");var K=N(require("react")),S=require("react/jsx-runtime"),B=class extends K.default.Component{constructor(e){super(e),this.state={errorMessage:null}}static getDerivedStateFromError(e){return{errorMessage:e.message}}componentDidCatch(e,o){console.log(e,o)}render(){return this.state.errorMessage?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)("h1",{children:"Something went wrong."}),(0,S.jsx)("p",{children:this.state.errorMessage})]}):this.props.children}};var X=require("react/jsx-runtime"),Q=()=>(0,X.jsx)("div",{className:"hwLoader",children:"loading"});var Y=async t=>{let e=new CSSStyleSheet;return fetch(t).then(o=>o.text()).then(o=>e.replace(o))};var k=require("react/jsx-runtime");function Fe({url:t,css:e,params:o,...r}){e&&Y(e).then(a=>{document.adoptedStyleSheets=[...document.adoptedStyleSheets,a]});let n=H.default.lazy(()=>import(t));return(0,k.jsx)(B,{children:(0,k.jsx)(H.Suspense,{fallback:(0,k.jsx)(Q,{}),children:(0,k.jsx)(n,{...r,...o})})})}var O=H.default.memo(Fe);O.displayName="Feature";(0,Z.registerComponent)("Feature",O,"view");var V=require("react"),ee=require("@salt-ds/core"),L=require("@heswell/salt-lab");var v=require("react/jsx-runtime"),j="vuuLoginPanel",Ae=({onSubmit:t})=>{let[e,o]=(0,V.useState)(""),[r,n]=(0,V.useState)(""),a=()=>{t(e,r)},s=(l,m)=>{o(m)},c=(l,m)=>{n(m)},i=e.trim()!==""&&r.trim()!=="";return(0,v.jsxs)("div",{className:j,children:[(0,v.jsx)(L.FormField,{label:"Username",style:{width:200},children:(0,v.jsx)(L.Input,{value:e,id:"text-username",onChange:s})}),(0,v.jsx)(L.FormField,{label:"Password",style:{width:200},children:(0,v.jsx)(L.Input,{type:"password",value:r,id:"text-password",onChange:c})}),(0,v.jsx)(ee.Button,{className:`${j}-login`,disabled:!i,onClick:a,variant:"cta",children:"Login"})]})};var te=t=>{var e;return(e=document.cookie.split("; ").find(o=>o.startsWith(`${t}=`)))==null?void 0:e.split("=")[1]},Ie=()=>{let t=te("vuu-username"),e=te("vuu-auth-token");return[t,e]},oe=(t="/login.html")=>{window.location.href=t},$=t=>{document.cookie="vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",document.cookie="vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",oe(t)};var Ce=require("@vuu-ui/vuu-data"),u=require("react");var y=require("react"),Oe=(t,e)=>{let[o,r]=(0,y.useState)(e),n=i=>{r(i)},a=(0,y.useCallback)(async(i="latest")=>{fetch(`api/vui/${t.username}/${i}`,{}).then(l=>l.ok?l.json():e).then(n).catch(()=>{n(e)})},[e,t.username]);(0,y.useEffect)(()=>{a()},[a]);let s=(0,y.useCallback)(i=>{fetch(`api/vui/${t.username}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then(l=>l.ok?l.json():e)},[e,t]),c=(0,y.useCallback)(i=>{a(i)},[a]);return[o,s,c]},re=Oe;var A=require("react"),F=require("react/jsx-runtime"),Ve={},G=(0,A.createContext)(Ve),$e=({children:t,context:e,inheritedContext:o})=>{let r={...o,...e};return(0,F.jsx)(G.Provider,{value:r,children:t})},J=({children:t,value:e})=>(0,F.jsx)(G.Consumer,{children:o=>(0,F.jsx)($e,{context:e,inheritedContext:o,children:t})}),Ge=()=>(0,A.useContext)(G);var Se=N(require("classnames")),p=require("@vuu-ui/vuu-layout");var xe=require("react");var T=require("react"),me=require("@salt-ds/core"),ce=require("@heswell/salt-lab"),ue=require("@salt-ds/icons");var x=require("react"),se=require("@vuu-ui/vuu-utils");var ne=async t=>await fetch(`api/vui/${t.username}`,{}).then(o=>o.ok?o.json():null).catch(()=>{console.log("error getting history")});var ae=require("@salt-ds/icons"),ie=require("@salt-ds/core"),I=require("@heswell/salt-lab");var C=require("react/jsx-runtime"),Je=({lastUpdate:t},{lastUpdate:e})=>e===t?0:e<t?-1:1,_e=t=>(0,C.jsx)(I.ListItem,{...t}),le=(0,x.forwardRef)(function({loginUrl:e,onNavigate:o,user:r,layoutId:n="latest"},a){let[s,c]=(0,x.useState)([]);(0,x.useEffect)(()=>{async function f(){let g=await ne(r);console.log({history:g});let w=g.filter(M=>M.id!=="latest").sort(Je).map(({id:M,lastUpdate:b})=>({lastUpdate:b,id:M,label:`Saved at ${(0,se.formatDate)(new Date(b),"kk:mm:ss")}`}));console.log({sortedHistory:w}),c(w)}f()},[r]);let i=(0,x.useCallback)((f,g)=>{g&&o(g.id)},[o]),l=(0,x.useCallback)(()=>{$(e)},[e]),m=s.length===0?[]:n==="latest"?s[0]:s.find(f=>f.id===n);return console.log({selected:m}),(0,C.jsxs)("div",{className:"vuuUserPanel",ref:a,children:[(0,C.jsx)(I.List,{ListItem:_e,className:"vuuUserPanel-history",onSelect:i,selected:m,source:s}),(0,C.jsx)("div",{className:"vuuUserPanel-buttonBar",children:(0,C.jsxs)(ie.Button,{"aria-label":"logout",onClick:l,children:[(0,C.jsx)(ae.ExportIcon,{})," Logout"]})})]})});var P=require("react/jsx-runtime"),pe=({layoutId:t,loginUrl:e,onNavigate:o,user:r})=>{let[n,a]=(0,T.useState)(!1),s=(0,T.useRef)(!1),c=(0,T.useRef)(null),i=(0,T.useCallback)(()=>{a(m=>s.current=!m),requestAnimationFrame(()=>{s.current||requestAnimationFrame(()=>{c.current.focus()})})},[]);return(0,P.jsxs)(ce.DropdownBase,{className:"vuuUserProfile",placement:"bottom-end",onCancel:i,children:[(0,P.jsx)(me.Button,{ref:c,variant:"secondary",children:(0,P.jsx)(ue.UserSolidIcon,{})}),(0,P.jsx)(le,{layoutId:t,loginUrl:e,onNavigate:m=>{a(!1),o(m)},user:r})]})};var E=require("@heswell/salt-lab"),he=N(require("classnames")),ge=require("@salt-ds/core"),fe=require("react");var R=require("react/jsx-runtime"),ze="vuuThemeSwitch",de=["light","dark"],_=({className:t,defaultMode:e,mode:o,onChange:r,...n})=>{let[a,s]=(0,ge.useControlled)({controlled:o,default:e!=null?e:"light",name:"ThemeSwitch",state:"mode"}),c=de.indexOf(a),i=(0,fe.useCallback)((m,f)=>{let g=de[f];s(g),r(g)},[r,s]),l=(0,he.default)(ze,t);return(0,R.jsxs)(E.ToggleButtonGroup,{className:l,...n,onChange:i,selectedIndex:c,children:[(0,R.jsx)(E.ToggleButton,{"aria-label":"alert",tooltipText:"Light Theme","data-icon":"light"}),(0,R.jsx)(E.ToggleButton,{"aria-label":"home",tooltipText:"Dark Theme","data-icon":"dark"})]})};var ve=N(require("classnames"));var D=require("react/jsx-runtime"),qe="vuuAppHeader",ye=({className:t,layoutId:e,loginUrl:o,onNavigate:r,onSwitchTheme:n,themeMode:a="light",user:s,...c})=>{let i=(0,ve.default)(qe,t,"salt-density-medium"),l=(0,xe.useCallback)(m=>n==null?void 0:n(m),[n]);return(0,D.jsxs)("header",{className:i,...c,children:[(0,D.jsx)(_,{defaultMode:a,onChange:l}),(0,D.jsx)(pe,{layoutId:e,loginUrl:o,onNavigate:r,user:s})]})};var h=require("react/jsx-runtime"),We={type:"View",props:{style:{height:"calc(100% - 6px)"}},children:[{props:{className:"vuuShell-warningPlaceholder"},type:"Placeholder"}]},Ke=({children:t,className:e,defaultLayout:o=We,leftSidePanel:r,loginUrl:n,serverUrl:a,user:s,...c})=>{let i=(0,u.useRef)(null),[l]=(0,u.useState)("high"),m=(0,u.useRef)(null),[f,g]=(0,u.useState)(!1),w=(0,u.useRef)("latest"),[M,b,z]=re(s,o),Te=(0,u.useCallback)(d=>{b(d)},[b]),Le=(0,u.useCallback)(d=>{i.current&&(i.current.dataset.mode=d)},[]),Pe=d=>{var q;let Ne=d.target;(q=m.current)!=null&&q.contains(Ne)||g(!f)},we=(0,u.useCallback)(d=>{w.current=d,z(d)},[z]);(0,u.useEffect)(()=>{a&&s.token&&(0,Ce.connectToServer)(a,s.token)},[a,s.token]);let Me=()=>{let d=[];return r&&d.push((0,h.jsx)(p.Drawer,{onClick:Pe,open:f,position:"left",inline:!0,peekaboo:!0,sizeOpen:200,toggleButton:"end",children:(0,h.jsx)(p.View,{className:"vuuShell-palette",id:"vw-app-palette",ref:m,style:{height:"100%"},children:r},"app-palette")},"left-panel")),d},be=(0,Se.default)("vuuShell",e,"salt-theme",`salt-density-${l}`);return(0,h.jsxs)(J,{value:void 0,children:[(0,h.jsx)(p.LayoutProvider,{layout:M,onLayoutChange:Te,children:(0,h.jsx)(p.DraggableLayout,{className:be,"data-mode":"light",ref:i,...c,children:(0,h.jsxs)(p.FlexboxLayout,{className:"App",style:{flexDirection:"column",height:"100%",width:"100%"},children:[(0,h.jsx)(ye,{layoutId:w.current,loginUrl:n,user:s,onNavigate:we,onSwitchTheme:Le}),(0,h.jsx)(p.Chest,{style:{flex:1},children:Me().concat((0,h.jsx)(p.DraggableLayout,{dropTarget:!0,style:{width:"100%",height:"100%"}},"main-content"))})]})})}),t]})};
2
2
  //# sourceMappingURL=index.js.map
package/cjs/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../packages/vuu-shell/src/index.ts", "../../../packages/vuu-shell/src/feature/Feature.tsx", "../../../packages/vuu-shell/src/feature/ErrorBoundary.jsx", "../../../packages/vuu-shell/src/feature/Loader.tsx", "../../../packages/vuu-shell/src/feature/css-module-loader.ts", "../../../packages/vuu-shell/src/login/LoginPanel.tsx", "../../../packages/vuu-shell/src/login/login-utils.ts", "../../../packages/vuu-shell/src/shell.tsx", "../../../packages/vuu-shell/src/use-layout-config.js", "../../../packages/vuu-shell/src/ShellContextProvider.tsx", "../../../packages/vuu-shell/src/user-profile/UserProfile.tsx", "../../../packages/vuu-shell/src/user-profile/UserPanel.tsx", "../../../packages/vuu-shell/src/get-layout-history.js", "../../../packages/vuu-shell/src/app-header/AppHeader.tsx"],
4
- "sourcesContent": ["export * from \"./feature\";\nexport * from \"./login\";\nexport * from \"./shell\";\nexport * from \"./shellTypes\";\nexport * from \"./ShellContextProvider\";\n", "import React, { Suspense } from \"react\";\nimport { registerComponent } from \"@vuu-ui/vuu-layout\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\nimport { Loader } from \"./Loader\";\nimport { importCSS } from \"./css-module-loader\";\n\nexport interface FeatureProps<Params extends object | undefined = undefined> {\n height?: number;\n url: string;\n css?: string;\n width?: number;\n params: Params;\n}\n\n// const RawFeature = <Params extends object | undefined>({\nfunction RawFeature<Params extends object | undefined>({\n url,\n css,\n params,\n ...props\n}: FeatureProps<Params>) {\n if (css) {\n // import(/* @vite-ignore */ css, { assert: { type: \"css\" } }).then(\n // (cssModule) => {\n // document.adoptedStyleSheets = [\n // ...document.adoptedStyleSheets,\n // cssModule.default,\n // ];\n // }\n // );\n // Polyfill until vite build supports import assertions\n // Note: already fully supported in esbuild, so vite dev\n importCSS(css).then((styleSheet) => {\n document.adoptedStyleSheets = [\n ...document.adoptedStyleSheets,\n styleSheet,\n ];\n });\n }\n const LazyFeature = React.lazy(() => import(/* @vite-ignore */ url));\n return (\n <ErrorBoundary>\n <Suspense fallback={<Loader />}>\n <LazyFeature {...props} {...params} />\n </Suspense>\n </ErrorBoundary>\n );\n}\n\nexport const Feature = React.memo(RawFeature);\nFeature.displayName = \"Feature\";\nregisterComponent(\"Feature\", Feature, \"view\");\n", "import React from 'react';\n// TODO\nexport class ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { errorMessage: null };\n }\n\n static getDerivedStateFromError(error) {\n // Update state so the next render will show the fallback UI.\n return { errorMessage: error.message };\n }\n\n componentDidCatch(error, errorInfo) {\n // You can also log the error to an error reporting service\n console.log(error, errorInfo);\n }\n\n render() {\n if (this.state.errorMessage) {\n return (\n <>\n <h1>Something went wrong.</h1>\n <p>{this.state.errorMessage}</p>\n </>\n );\n }\n\n return this.props.children;\n }\n}\n", "// TODO\nexport const Loader = () => <div className=\"hwLoader\">loading</div>;\n", "export const importCSS = async (path: string) => {\n const container = new CSSStyleSheet();\n return fetch(path)\n .then((x) => x.text())\n .then((x) => container.replace(x));\n};\n", "import { ChangeEvent, HTMLAttributes, useState } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { FormField, Input } from \"@heswell/salt-lab\";\n\nimport \"./LoginPanel.css\";\n\nconst classBase = \"vuuLoginPanel\";\n\nexport interface LoginPanelProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\"> {\n onSubmit: (username: string, password: string) => void;\n}\n\nexport const LoginPanel = ({ onSubmit }: LoginPanelProps) => {\n const [username, setUserName] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n\n const login = () => {\n onSubmit(username, password);\n };\n\n const handleUsername = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setUserName(value);\n };\n\n const handlePassword = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setPassword(value);\n };\n\n const dataIsValid = username.trim() !== \"\" && password.trim() !== \"\";\n\n return (\n <div className={classBase}>\n <FormField label=\"Username\" style={{ width: 200 }}>\n <Input value={username} id=\"text-username\" onChange={handleUsername} />\n </FormField>\n\n <FormField label=\"Password\" style={{ width: 200 }}>\n <Input\n type=\"password\"\n value={password}\n id=\"text-password\"\n onChange={handlePassword}\n />\n </FormField>\n\n <Button\n className={`${classBase}-login`}\n disabled={!dataIsValid}\n onClick={login}\n variant=\"cta\"\n >\n Login\n </Button>\n </div>\n );\n};\n", "const getCookieValue = (name: string) =>\n document.cookie\n .split(\"; \")\n .find((row) => row.startsWith(`${name}=`))\n ?.split(\"=\")[1];\n\nexport const getAuthDetailsFromCookies = () => {\n const username = getCookieValue(\"vuu-username\");\n const token = getCookieValue(\"vuu-auth-token\");\n return [username, token];\n};\n\nexport const redirectToLogin = (loginUrl = \"/login.html\") => {\n window.location.href = loginUrl;\n};\n\nexport const logout = (loginUrl?: string) => {\n document.cookie = \"vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie = \"vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n redirectToLogin(loginUrl);\n};\n", "import { connectToServer } from \"@vuu-ui/vuu-data\";\nimport {\n HTMLAttributes,\n MouseEvent,\n ReactElement,\n ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport useLayoutConfig from \"./use-layout-config\";\nimport { ShellContextProvider } from \"./ShellContextProvider\";\nimport cx from \"classnames\";\n\nimport {\n Chest,\n DraggableLayout,\n Drawer,\n FlexboxLayout as Flexbox,\n LayoutProvider,\n View,\n} from \"@vuu-ui/vuu-layout\";\n\nimport { AppHeader } from \"./app-header\";\n// import { AppPalette } from \"./app-palette\";\n\nimport { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport \"./shell.css\";\n\nexport type VuuUser = {\n username: string;\n token: string;\n};\n\nconst warningLayout = {\n type: \"View\",\n props: {\n style: { height: \"calc(100% - 6px)\" },\n },\n children: [\n {\n props: {\n className: \"vuuShell-warningPlaceholder\",\n },\n type: \"Placeholder\",\n },\n ],\n};\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n defaultLayout?: LayoutJSON;\n leftSidePanel?: ReactElement;\n loginUrl?: string;\n // paletteConfig: any;\n serverUrl?: string;\n user: VuuUser;\n}\n\nexport const Shell = ({\n children,\n className,\n defaultLayout = warningLayout,\n leftSidePanel,\n loginUrl,\n serverUrl,\n user,\n ...htmlAttributes\n}: ShellProps) => {\n const paletteView = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const layoutId = useRef(\"latest\");\n\n const [layout, setLayoutConfig, loadLayoutById] = useLayoutConfig(\n user,\n defaultLayout\n );\n\n const handleLayoutChange = useCallback(\n (layout) => {\n setLayoutConfig(layout);\n },\n [setLayoutConfig]\n );\n\n const handleDrawerClick = (e: MouseEvent<HTMLElement>) => {\n const target = e.target as HTMLElement;\n if (!paletteView.current?.contains(target)) {\n setOpen(!open);\n }\n };\n\n const handleNavigate = useCallback(\n (id) => {\n layoutId.current = id;\n loadLayoutById(id);\n },\n [loadLayoutById]\n );\n\n useEffect(() => {\n if (serverUrl && user.token) {\n connectToServer(serverUrl, user.token);\n }\n }, [serverUrl, user.token]);\n\n const getDrawers = () => {\n const drawers: ReactElement[] = [];\n if (leftSidePanel) {\n drawers.push(\n <Drawer\n key=\"left-panel\"\n onClick={handleDrawerClick}\n open={open}\n position=\"left\"\n inline\n peekaboo\n sizeOpen={200}\n toggleButton=\"end\"\n >\n <View\n className=\"vuuShell-palette\"\n id=\"vw-app-palette\"\n key=\"app-palette\"\n ref={paletteView}\n style={{ height: \"100%\" }}\n >\n {leftSidePanel}\n </View>\n </Drawer>\n );\n }\n\n return drawers;\n };\n\n return (\n // ShellContext TBD\n <ShellContextProvider value={undefined}>\n <LayoutProvider layout={layout} onLayoutChange={handleLayoutChange}>\n <DraggableLayout\n className={cx(\"vuuShell\", className)}\n {...htmlAttributes}\n >\n <Flexbox\n className=\"App\"\n style={{ flexDirection: \"column\", height: \"100%\", width: \"100%\" }}\n >\n <AppHeader\n layoutId={layoutId.current}\n loginUrl={loginUrl}\n user={user}\n onNavigate={handleNavigate}\n />\n <Chest style={{ flex: 1 }}>\n {getDrawers().concat(\n <DraggableLayout\n dropTarget\n key=\"main-content\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n </Chest>\n </Flexbox>\n </DraggableLayout>\n </LayoutProvider>\n {children}\n </ShellContextProvider>\n );\n};\n", "import { useCallback, useEffect, useState } from \"react\";\n\nconst useLayoutConfig = (user, defaultLayout) => {\n const [layout, _setLayout] = useState(defaultLayout);\n\n const setLayout = (layout) => {\n _setLayout(layout);\n };\n\n const load = useCallback(\n async (id = \"latest\") => {\n fetch(`api/vui/${user.username}/${id}`, {})\n .then((response) => {\n return response.ok ? response.json() : defaultLayout;\n })\n .then(setLayout)\n .catch(() => {\n // TODO we should set a layout with a warning here\n setLayout(defaultLayout);\n });\n },\n [defaultLayout, user.username]\n );\n\n useEffect(() => {\n load();\n }, [load]);\n\n const saveData = useCallback(\n (data) => {\n fetch(`api/vui/${user.username}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }).then((response) => {\n return response.ok ? response.json() : defaultLayout;\n });\n // .then((data) => console.log(data));\n },\n [defaultLayout, user]\n );\n\n const loadLayoutById = useCallback(\n (id) => {\n load(id);\n },\n [load]\n );\n\n return [layout, saveData, loadLayoutById];\n};\n\nexport default useLayoutConfig;\n", "import { MenuRpcResponse } from \"@vuu-ui/vuu-data\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { createContext, ReactElement, ReactNode, useContext } from \"react\";\n\nexport interface ShellContextProps {\n getDefaultColumnConfig?: (\n tableName: string,\n columnName: string\n ) => Partial<ColumnDescriptor>;\n handleRpcResponse?: (response?: MenuRpcResponse) => void;\n}\n\nconst defaultConfig = {};\n\nconst ShellContext = createContext<ShellContextProps>(defaultConfig);\n\nexport interface ShellProviderProps {\n children: ReactNode;\n value: ShellContextProps;\n}\n\nconst Provider = ({\n children,\n context,\n inheritedContext,\n}: {\n children: ReactNode;\n context?: ShellContextProps;\n inheritedContext?: ShellContextProps;\n}) => {\n // TODO functions provided at multiple levels must be merged\n const mergedContext = {\n ...inheritedContext,\n ...context,\n };\n return (\n <ShellContext.Provider value={mergedContext}>\n {children}\n </ShellContext.Provider>\n );\n};\n\nexport const ShellContextProvider = ({\n children,\n value,\n}: ShellProviderProps): ReactElement => {\n return (\n <ShellContext.Consumer>\n {(context) => (\n <Provider context={value} inheritedContext={context}>\n {children}\n </Provider>\n )}\n </ShellContext.Consumer>\n );\n};\n\nexport const useShellContext = () => {\n return useContext(ShellContext);\n};\n", "import React, { useCallback, useRef, useState } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { DropdownBase } from \"@heswell/salt-lab\";\nimport { UserSolidIcon } from \"@salt-ds/icons\";\nimport { UserPanel } from \"./UserPanel\";\n\nimport \"./UserProfile.css\";\n\nexport const UserProfile = ({ layoutId, loginUrl, onNavigate, user }) => {\n const [open, setOpen] = useState(false);\n const openRef = useRef(false);\n const buttonRef = useRef(null);\n\n const toggle = useCallback(() => {\n setOpen((isOpen) => {\n return (openRef.current = !isOpen);\n });\n requestAnimationFrame(() => {\n if (!openRef.current) {\n requestAnimationFrame(() => {\n buttonRef.current.focus();\n });\n }\n });\n }, []);\n\n const handleNavigate = (id) => {\n setOpen(false);\n onNavigate(id);\n };\n\n return (\n <div className=\"vuuUserProfile\">\n <DropdownBase placement=\"bottom-end\" onCancel={toggle}>\n <Button ref={buttonRef} variant=\"secondary\">\n <UserSolidIcon />\n </Button>\n <UserPanel\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={handleNavigate}\n user={user}\n />\n </DropdownBase>\n </div>\n );\n};\n", "import React, { forwardRef, useCallback, useEffect, useState } from \"react\";\nimport { formatDate } from \"@vuu-ui/vuu-utils\";\nimport { logout } from \"../login\";\nimport { getLayoutHistory } from \"../get-layout-history\";\nimport { ExportIcon } from \"@salt-ds/icons\";\nimport { Button } from \"@salt-ds/core\";\nimport { List, ListItem } from \"@heswell/salt-lab\";\n\nimport \"./UserPanel.css\";\n\nconst byLastUpdate = ({ lastUpdate: l1 }, { lastUpdate: l2 }) => {\n return l2 === l1 ? 0 : l2 < l1 ? -1 : 1;\n};\n\nconst HistoryListItem = (props) => {\n return <ListItem {...props} />;\n};\n\nexport const UserPanel = forwardRef(function UserPanel(\n { loginUrl, onNavigate, user, layoutId = \"latest\" },\n forwardedRef\n) {\n const [history, setHistory] = useState([]);\n\n useEffect(() => {\n async function getHistory() {\n const history = await getLayoutHistory(user);\n console.log({ history });\n const sortedHistory = history\n .filter((item) => item.id !== \"latest\")\n .sort(byLastUpdate)\n .map(({ id, lastUpdate }) => ({\n lastUpdate,\n id,\n label: `Saved at ${formatDate(new Date(lastUpdate), \"kk:mm:ss\")}`,\n }));\n console.log({ sortedHistory });\n setHistory(sortedHistory);\n }\n\n getHistory();\n }, [user]);\n\n const handleHisorySelected = useCallback(\n (evt, selected) => {\n if (selected) {\n onNavigate(selected.id);\n }\n },\n [onNavigate]\n );\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const selected =\n history.length === 0\n ? []\n : layoutId === \"latest\"\n ? history[0]\n : history.find((i) => i.id === layoutId);\n console.log({ selected });\n\n return (\n <div className=\"vuuUserPanel\" ref={forwardedRef}>\n <List\n ListItem={HistoryListItem}\n className=\"vuuUserPanel-history\"\n onSelect={handleHisorySelected}\n selected={selected}\n source={history}\n />\n <div className=\"vuuUserPanel-buttonBar\">\n <Button aria-label=\"logout\" onClick={handleLogout}>\n <ExportIcon /> Logout\n </Button>\n </div>\n </div>\n );\n});\n", "export const getLayoutHistory = async (user) => {\n const history = await fetch(`api/vui/${user.username}`, {})\n .then((response) => {\n return response.ok ? response.json() : null;\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n console.log(`error getting history`);\n });\n\n return history;\n};\n", "import { HTMLAttributes } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { UserProfile } from \"../user-profile\";\nimport \"./AppHeader.css\";\n\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n}\n\nexport const AppHeader = ({\n layoutId,\n loginUrl,\n onNavigate,\n user,\n ...htmlAttributes\n}: AppHeaderProps) => {\n return (\n <header className=\"hwAppHeader\" {...htmlAttributes}>\n {/* <ToggleButton onChange={toggleColorScheme}>\n theme\n </ToggleButton> */}\n <UserProfile\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={onNavigate}\n user={user}\n />\n </header>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["src_exports", "__export", "Feature", "LoginPanel", "Shell", "ShellContextProvider", "getAuthDetailsFromCookies", "logout", "redirectToLogin", "useShellContext", "__toCommonJS", "import_react", "import_vuu_layout", "import_react", "import_jsx_runtime", "ErrorBoundary", "React", "props", "error", "errorInfo", "import_jsx_runtime", "Loader", "importCSS", "path", "container", "x", "import_jsx_runtime", "RawFeature", "url", "css", "params", "props", "importCSS", "styleSheet", "LazyFeature", "React", "ErrorBoundary", "Loader", "Feature", "import_react", "import_core", "import_salt_lab", "import_jsx_runtime", "classBase", "LoginPanel", "onSubmit", "username", "setUserName", "password", "setPassword", "login", "handleUsername", "_event", "value", "handlePassword", "dataIsValid", "getCookieValue", "name", "_a", "row", "getAuthDetailsFromCookies", "username", "token", "redirectToLogin", "loginUrl", "logout", "import_vuu_data", "import_react", "import_react", "useLayoutConfig", "user", "defaultLayout", "layout", "_setLayout", "setLayout", "load", "id", "response", "saveData", "data", "loadLayoutById", "use_layout_config_default", "import_react", "import_jsx_runtime", "defaultConfig", "ShellContext", "Provider", "children", "context", "inheritedContext", "mergedContext", "ShellContextProvider", "value", "useShellContext", "import_classnames", "import_vuu_layout", "import_react", "import_core", "import_salt_lab", "import_icons", "import_react", "import_vuu_utils", "getLayoutHistory", "user", "response", "import_icons", "import_core", "import_salt_lab", "import_jsx_runtime", "byLastUpdate", "l1", "l2", "HistoryListItem", "props", "UserPanel", "loginUrl", "onNavigate", "user", "layoutId", "forwardedRef", "history", "setHistory", "getHistory", "getLayoutHistory", "sortedHistory", "item", "id", "lastUpdate", "handleHisorySelected", "evt", "selected", "handleLogout", "logout", "i", "import_jsx_runtime", "UserProfile", "layoutId", "loginUrl", "onNavigate", "user", "open", "setOpen", "openRef", "buttonRef", "toggle", "isOpen", "UserPanel", "id", "import_jsx_runtime", "AppHeader", "layoutId", "loginUrl", "onNavigate", "user", "htmlAttributes", "UserProfile", "import_jsx_runtime", "warningLayout", "Shell", "children", "className", "defaultLayout", "leftSidePanel", "loginUrl", "serverUrl", "user", "htmlAttributes", "paletteView", "open", "setOpen", "layoutId", "layout", "setLayoutConfig", "loadLayoutById", "use_layout_config_default", "handleLayoutChange", "handleDrawerClick", "e", "_a", "target", "handleNavigate", "id", "getDrawers", "drawers", "ShellContextProvider", "cx", "Flexbox", "AppHeader"]
3
+ "sources": ["../../../packages/vuu-shell/src/index.ts", "../../../packages/vuu-shell/src/feature/Feature.tsx", "../../../packages/vuu-shell/src/feature/ErrorBoundary.jsx", "../../../packages/vuu-shell/src/feature/Loader.tsx", "../../../packages/vuu-shell/src/feature/css-module-loader.ts", "../../../packages/vuu-shell/src/login/LoginPanel.tsx", "../../../packages/vuu-shell/src/login/login-utils.ts", "../../../packages/vuu-shell/src/shell.tsx", "../../../packages/vuu-shell/src/use-layout-config.js", "../../../packages/vuu-shell/src/ShellContextProvider.tsx", "../../../packages/vuu-shell/src/app-header/AppHeader.tsx", "../../../packages/vuu-shell/src/user-profile/UserProfile.tsx", "../../../packages/vuu-shell/src/user-profile/UserPanel.tsx", "../../../packages/vuu-shell/src/get-layout-history.js", "../../../packages/vuu-shell/src/theme-switch/ThemeSwitch.tsx"],
4
+ "sourcesContent": ["export * from \"./feature\";\nexport * from \"./login\";\nexport * from \"./shell\";\nexport * from \"./shellTypes\";\nexport * from \"./ShellContextProvider\";\nexport * from \"./theme-switch\";\n", "import React, { Suspense } from \"react\";\nimport { registerComponent } from \"@vuu-ui/vuu-layout\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\nimport { Loader } from \"./Loader\";\nimport { importCSS } from \"./css-module-loader\";\n\nexport interface FeatureProps<Params extends object | undefined = undefined> {\n height?: number;\n url: string;\n css?: string;\n width?: number;\n params: Params;\n}\n\n// const RawFeature = <Params extends object | undefined>({\nfunction RawFeature<Params extends object | undefined>({\n url,\n css,\n params,\n ...props\n}: FeatureProps<Params>) {\n if (css) {\n // import(/* @vite-ignore */ css, { assert: { type: \"css\" } }).then(\n // (cssModule) => {\n // document.adoptedStyleSheets = [\n // ...document.adoptedStyleSheets,\n // cssModule.default,\n // ];\n // }\n // );\n // Polyfill until vite build supports import assertions\n // Note: already fully supported in esbuild, so vite dev\n importCSS(css).then((styleSheet) => {\n document.adoptedStyleSheets = [\n ...document.adoptedStyleSheets,\n styleSheet,\n ];\n });\n }\n const LazyFeature = React.lazy(() => import(/* @vite-ignore */ url));\n return (\n <ErrorBoundary>\n <Suspense fallback={<Loader />}>\n <LazyFeature {...props} {...params} />\n </Suspense>\n </ErrorBoundary>\n );\n}\n\nexport const Feature = React.memo(RawFeature);\nFeature.displayName = \"Feature\";\nregisterComponent(\"Feature\", Feature, \"view\");\n", "import React from 'react';\n// TODO\nexport class ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { errorMessage: null };\n }\n\n static getDerivedStateFromError(error) {\n // Update state so the next render will show the fallback UI.\n return { errorMessage: error.message };\n }\n\n componentDidCatch(error, errorInfo) {\n // You can also log the error to an error reporting service\n console.log(error, errorInfo);\n }\n\n render() {\n if (this.state.errorMessage) {\n return (\n <>\n <h1>Something went wrong.</h1>\n <p>{this.state.errorMessage}</p>\n </>\n );\n }\n\n return this.props.children;\n }\n}\n", "// TODO\nexport const Loader = () => <div className=\"hwLoader\">loading</div>;\n", "export const importCSS = async (path: string) => {\n const container = new CSSStyleSheet();\n return fetch(path)\n .then((x) => x.text())\n .then((x) => container.replace(x));\n};\n", "import { ChangeEvent, HTMLAttributes, useState } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { FormField, Input } from \"@heswell/salt-lab\";\n\nimport \"./LoginPanel.css\";\n\nconst classBase = \"vuuLoginPanel\";\n\nexport interface LoginPanelProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\"> {\n onSubmit: (username: string, password: string) => void;\n}\n\nexport const LoginPanel = ({ onSubmit }: LoginPanelProps) => {\n const [username, setUserName] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n\n const login = () => {\n onSubmit(username, password);\n };\n\n const handleUsername = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setUserName(value);\n };\n\n const handlePassword = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setPassword(value);\n };\n\n const dataIsValid = username.trim() !== \"\" && password.trim() !== \"\";\n\n return (\n <div className={classBase}>\n <FormField label=\"Username\" style={{ width: 200 }}>\n <Input value={username} id=\"text-username\" onChange={handleUsername} />\n </FormField>\n\n <FormField label=\"Password\" style={{ width: 200 }}>\n <Input\n type=\"password\"\n value={password}\n id=\"text-password\"\n onChange={handlePassword}\n />\n </FormField>\n\n <Button\n className={`${classBase}-login`}\n disabled={!dataIsValid}\n onClick={login}\n variant=\"cta\"\n >\n Login\n </Button>\n </div>\n );\n};\n", "const getCookieValue = (name: string) =>\n document.cookie\n .split(\"; \")\n .find((row) => row.startsWith(`${name}=`))\n ?.split(\"=\")[1];\n\nexport const getAuthDetailsFromCookies = () => {\n const username = getCookieValue(\"vuu-username\");\n const token = getCookieValue(\"vuu-auth-token\");\n return [username, token];\n};\n\nexport const redirectToLogin = (loginUrl = \"/login.html\") => {\n window.location.href = loginUrl;\n};\n\nexport const logout = (loginUrl?: string) => {\n document.cookie = \"vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie = \"vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n redirectToLogin(loginUrl);\n};\n", "import { connectToServer } from \"@vuu-ui/vuu-data\";\nimport {\n HTMLAttributes,\n MouseEvent,\n ReactElement,\n ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport useLayoutConfig from \"./use-layout-config\";\nimport { ShellContextProvider } from \"./ShellContextProvider\";\nimport cx from \"classnames\";\n\nimport {\n Chest,\n DraggableLayout,\n Drawer,\n FlexboxLayout as Flexbox,\n LayoutProvider,\n View,\n} from \"@vuu-ui/vuu-layout\";\n\nimport { AppHeader } from \"./app-header\";\n// import { AppPalette } from \"./app-palette\";\n\nimport { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport \"./shell.css\";\nimport { ThemeMode } from \"./theme-switch\";\n\nexport type VuuUser = {\n username: string;\n token: string;\n};\n\nconst warningLayout = {\n type: \"View\",\n props: {\n style: { height: \"calc(100% - 6px)\" },\n },\n children: [\n {\n props: {\n className: \"vuuShell-warningPlaceholder\",\n },\n type: \"Placeholder\",\n },\n ],\n};\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n defaultLayout?: LayoutJSON;\n leftSidePanel?: ReactElement;\n loginUrl?: string;\n // paletteConfig: any;\n serverUrl?: string;\n user: VuuUser;\n}\n\nexport const Shell = ({\n children,\n className: classNameProp,\n defaultLayout = warningLayout,\n leftSidePanel,\n loginUrl,\n serverUrl,\n user,\n ...htmlAttributes\n}: ShellProps) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const [density] = useState<\"high\" | \"medium\" | \"low\" | \"touch\">(\"high\");\n const paletteView = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const layoutId = useRef(\"latest\");\n\n const [layout, setLayoutConfig, loadLayoutById] = useLayoutConfig(\n user,\n defaultLayout\n );\n\n const handleLayoutChange = useCallback(\n (layout) => {\n setLayoutConfig(layout);\n },\n [setLayoutConfig]\n );\n\n const handleSwitchTheme = useCallback((mode: ThemeMode) => {\n if (rootRef.current) {\n rootRef.current.dataset.mode = mode;\n }\n }, []);\n\n const handleDrawerClick = (e: MouseEvent<HTMLElement>) => {\n const target = e.target as HTMLElement;\n if (!paletteView.current?.contains(target)) {\n setOpen(!open);\n }\n };\n\n const handleNavigate = useCallback(\n (id) => {\n layoutId.current = id;\n loadLayoutById(id);\n },\n [loadLayoutById]\n );\n\n useEffect(() => {\n if (serverUrl && user.token) {\n connectToServer(serverUrl, user.token);\n }\n }, [serverUrl, user.token]);\n\n const getDrawers = () => {\n const drawers: ReactElement[] = [];\n if (leftSidePanel) {\n drawers.push(\n <Drawer\n key=\"left-panel\"\n onClick={handleDrawerClick}\n open={open}\n position=\"left\"\n inline\n peekaboo\n sizeOpen={200}\n toggleButton=\"end\"\n >\n <View\n className=\"vuuShell-palette\"\n id=\"vw-app-palette\"\n key=\"app-palette\"\n ref={paletteView}\n style={{ height: \"100%\" }}\n >\n {leftSidePanel}\n </View>\n </Drawer>\n );\n }\n\n return drawers;\n };\n\n const className = cx(\n \"vuuShell\",\n classNameProp,\n \"salt-theme\",\n `salt-density-${density}`\n );\n\n return (\n // ShellContext TBD\n <ShellContextProvider value={undefined}>\n <LayoutProvider layout={layout} onLayoutChange={handleLayoutChange}>\n <DraggableLayout\n className={className}\n data-mode=\"light\"\n ref={rootRef}\n {...htmlAttributes}\n >\n <Flexbox\n className=\"App\"\n style={{ flexDirection: \"column\", height: \"100%\", width: \"100%\" }}\n >\n <AppHeader\n layoutId={layoutId.current}\n loginUrl={loginUrl}\n user={user}\n onNavigate={handleNavigate}\n onSwitchTheme={handleSwitchTheme}\n />\n <Chest style={{ flex: 1 }}>\n {getDrawers().concat(\n <DraggableLayout\n dropTarget\n key=\"main-content\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n </Chest>\n </Flexbox>\n </DraggableLayout>\n </LayoutProvider>\n {children}\n </ShellContextProvider>\n );\n};\n", "import { useCallback, useEffect, useState } from \"react\";\n\nconst useLayoutConfig = (user, defaultLayout) => {\n const [layout, _setLayout] = useState(defaultLayout);\n\n const setLayout = (layout) => {\n _setLayout(layout);\n };\n\n const load = useCallback(\n async (id = \"latest\") => {\n fetch(`api/vui/${user.username}/${id}`, {})\n .then((response) => {\n return response.ok ? response.json() : defaultLayout;\n })\n .then(setLayout)\n .catch(() => {\n // TODO we should set a layout with a warning here\n setLayout(defaultLayout);\n });\n },\n [defaultLayout, user.username]\n );\n\n useEffect(() => {\n load();\n }, [load]);\n\n const saveData = useCallback(\n (data) => {\n fetch(`api/vui/${user.username}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }).then((response) => {\n return response.ok ? response.json() : defaultLayout;\n });\n // .then((data) => console.log(data));\n },\n [defaultLayout, user]\n );\n\n const loadLayoutById = useCallback(\n (id) => {\n load(id);\n },\n [load]\n );\n\n return [layout, saveData, loadLayoutById];\n};\n\nexport default useLayoutConfig;\n", "import { MenuRpcResponse } from \"@vuu-ui/vuu-data\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { createContext, ReactElement, ReactNode, useContext } from \"react\";\n\nexport interface ShellContextProps {\n getDefaultColumnConfig?: (\n tableName: string,\n columnName: string\n ) => Partial<ColumnDescriptor>;\n handleRpcResponse?: (response?: MenuRpcResponse) => void;\n}\n\nconst defaultConfig = {};\n\nconst ShellContext = createContext<ShellContextProps>(defaultConfig);\n\nexport interface ShellProviderProps {\n children: ReactNode;\n value: ShellContextProps;\n}\n\nconst Provider = ({\n children,\n context,\n inheritedContext,\n}: {\n children: ReactNode;\n context?: ShellContextProps;\n inheritedContext?: ShellContextProps;\n}) => {\n // TODO functions provided at multiple levels must be merged\n const mergedContext = {\n ...inheritedContext,\n ...context,\n };\n return (\n <ShellContext.Provider value={mergedContext}>\n {children}\n </ShellContext.Provider>\n );\n};\n\nexport const ShellContextProvider = ({\n children,\n value,\n}: ShellProviderProps): ReactElement => {\n return (\n <ShellContext.Consumer>\n {(context) => (\n <Provider context={value} inheritedContext={context}>\n {children}\n </Provider>\n )}\n </ShellContext.Consumer>\n );\n};\n\nexport const useShellContext = () => {\n return useContext(ShellContext);\n};\n", "import { HTMLAttributes, useCallback } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { UserProfile } from \"../user-profile\";\nimport { ThemeMode, ThemeSwitch } from \"../theme-switch\";\nimport cx from \"classnames\";\n\nimport \"./AppHeader.css\";\n\nconst classBase = \"vuuAppHeader\";\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n onSwitchTheme?: (mode: ThemeMode) => void;\n themeMode?: ThemeMode;\n user: VuuUser;\n}\n\nexport const AppHeader = ({\n className: classNameProp,\n layoutId,\n loginUrl,\n onNavigate,\n onSwitchTheme,\n themeMode = \"light\",\n user,\n ...htmlAttributes\n}: AppHeaderProps) => {\n const className = cx(classBase, classNameProp, \"salt-density-medium\");\n const handleSwitchTheme = useCallback(\n (mode: ThemeMode) => onSwitchTheme?.(mode),\n [onSwitchTheme]\n );\n return (\n <header className={className} {...htmlAttributes}>\n <ThemeSwitch defaultMode={themeMode} onChange={handleSwitchTheme} />\n <UserProfile\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={onNavigate}\n user={user}\n />\n </header>\n );\n};\n", "import React, { useCallback, useRef, useState } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { DropdownBase } from \"@heswell/salt-lab\";\nimport { UserSolidIcon } from \"@salt-ds/icons\";\nimport { UserPanel } from \"./UserPanel\";\n\nimport \"./UserProfile.css\";\n\nexport const UserProfile = ({ layoutId, loginUrl, onNavigate, user }) => {\n const [open, setOpen] = useState(false);\n const openRef = useRef(false);\n const buttonRef = useRef(null);\n\n const toggle = useCallback(() => {\n setOpen((isOpen) => {\n return (openRef.current = !isOpen);\n });\n requestAnimationFrame(() => {\n if (!openRef.current) {\n requestAnimationFrame(() => {\n buttonRef.current.focus();\n });\n }\n });\n }, []);\n\n const handleNavigate = (id) => {\n setOpen(false);\n onNavigate(id);\n };\n\n return (\n <DropdownBase\n className=\"vuuUserProfile\"\n placement=\"bottom-end\"\n onCancel={toggle}\n >\n <Button ref={buttonRef} variant=\"secondary\">\n <UserSolidIcon />\n </Button>\n <UserPanel\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={handleNavigate}\n user={user}\n />\n </DropdownBase>\n );\n};\n", "import React, { forwardRef, useCallback, useEffect, useState } from \"react\";\nimport { formatDate } from \"@vuu-ui/vuu-utils\";\nimport { logout } from \"../login\";\nimport { getLayoutHistory } from \"../get-layout-history\";\nimport { ExportIcon } from \"@salt-ds/icons\";\nimport { Button } from \"@salt-ds/core\";\nimport { List, ListItem } from \"@heswell/salt-lab\";\n\nimport \"./UserPanel.css\";\n\nconst byLastUpdate = ({ lastUpdate: l1 }, { lastUpdate: l2 }) => {\n return l2 === l1 ? 0 : l2 < l1 ? -1 : 1;\n};\n\nconst HistoryListItem = (props) => {\n return <ListItem {...props} />;\n};\n\nexport const UserPanel = forwardRef(function UserPanel(\n { loginUrl, onNavigate, user, layoutId = \"latest\" },\n forwardedRef\n) {\n const [history, setHistory] = useState([]);\n\n useEffect(() => {\n async function getHistory() {\n const history = await getLayoutHistory(user);\n console.log({ history });\n const sortedHistory = history\n .filter((item) => item.id !== \"latest\")\n .sort(byLastUpdate)\n .map(({ id, lastUpdate }) => ({\n lastUpdate,\n id,\n label: `Saved at ${formatDate(new Date(lastUpdate), \"kk:mm:ss\")}`,\n }));\n console.log({ sortedHistory });\n setHistory(sortedHistory);\n }\n\n getHistory();\n }, [user]);\n\n const handleHisorySelected = useCallback(\n (evt, selected) => {\n if (selected) {\n onNavigate(selected.id);\n }\n },\n [onNavigate]\n );\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const selected =\n history.length === 0\n ? []\n : layoutId === \"latest\"\n ? history[0]\n : history.find((i) => i.id === layoutId);\n console.log({ selected });\n\n return (\n <div className=\"vuuUserPanel\" ref={forwardedRef}>\n <List\n ListItem={HistoryListItem}\n className=\"vuuUserPanel-history\"\n onSelect={handleHisorySelected}\n selected={selected}\n source={history}\n />\n <div className=\"vuuUserPanel-buttonBar\">\n <Button aria-label=\"logout\" onClick={handleLogout}>\n <ExportIcon /> Logout\n </Button>\n </div>\n </div>\n );\n});\n", "export const getLayoutHistory = async (user) => {\n const history = await fetch(`api/vui/${user.username}`, {})\n .then((response) => {\n return response.ok ? response.json() : null;\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n console.log(`error getting history`);\n });\n\n return history;\n};\n", "import {\n ToggleButton,\n ToggleButtonGroup,\n ToggleButtonGroupChangeEventHandler,\n} from \"@heswell/salt-lab\";\nimport cx from \"classnames\";\nimport { useControlled } from \"@salt-ds/core\";\nimport { HTMLAttributes, useCallback } from \"react\";\n\nimport \"./ThemeSwitch.css\";\n\nconst classBase = \"vuuThemeSwitch\";\n\nexport type ThemeMode = \"light\" | \"dark\";\n\nexport interface ThemeSwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultMode?: ThemeMode;\n mode?: ThemeMode;\n onChange: (mode: ThemeMode) => void;\n}\n\nconst modes: ThemeMode[] = [\"light\", \"dark\"];\n\nexport const ThemeSwitch = ({\n className: classNameProp,\n defaultMode: defaultModeProp,\n mode: modeProp,\n onChange,\n ...htmlAttributes\n}: ThemeSwitchProps) => {\n const [mode, setMode] = useControlled<ThemeMode>({\n controlled: modeProp,\n default: defaultModeProp ?? \"light\",\n name: \"ThemeSwitch\",\n state: \"mode\",\n });\n\n const selectedIndex = modes.indexOf(mode);\n\n const handleChangeSecondary: ToggleButtonGroupChangeEventHandler =\n useCallback(\n (_evt, index) => {\n const mode = modes[index];\n setMode(mode);\n onChange(mode);\n },\n [onChange, setMode]\n );\n const className = cx(classBase, classNameProp);\n return (\n <ToggleButtonGroup\n className={className}\n {...htmlAttributes}\n onChange={handleChangeSecondary}\n selectedIndex={selectedIndex}\n >\n <ToggleButton\n aria-label=\"alert\"\n tooltipText=\"Light Theme\"\n data-icon=\"light\"\n />\n <ToggleButton\n aria-label=\"home\"\n tooltipText=\"Dark Theme\"\n data-icon=\"dark\"\n />\n </ToggleButtonGroup>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["src_exports", "__export", "Feature", "LoginPanel", "Shell", "ShellContextProvider", "ThemeSwitch", "getAuthDetailsFromCookies", "logout", "redirectToLogin", "useShellContext", "__toCommonJS", "import_react", "import_vuu_layout", "import_react", "import_jsx_runtime", "ErrorBoundary", "React", "props", "error", "errorInfo", "import_jsx_runtime", "Loader", "importCSS", "path", "container", "x", "import_jsx_runtime", "RawFeature", "url", "css", "params", "props", "importCSS", "styleSheet", "LazyFeature", "React", "ErrorBoundary", "Loader", "Feature", "import_react", "import_core", "import_salt_lab", "import_jsx_runtime", "classBase", "LoginPanel", "onSubmit", "username", "setUserName", "password", "setPassword", "login", "handleUsername", "_event", "value", "handlePassword", "dataIsValid", "getCookieValue", "name", "_a", "row", "getAuthDetailsFromCookies", "username", "token", "redirectToLogin", "loginUrl", "logout", "import_vuu_data", "import_react", "import_react", "useLayoutConfig", "user", "defaultLayout", "layout", "_setLayout", "setLayout", "load", "id", "response", "saveData", "data", "loadLayoutById", "use_layout_config_default", "import_react", "import_jsx_runtime", "defaultConfig", "ShellContext", "Provider", "children", "context", "inheritedContext", "mergedContext", "ShellContextProvider", "value", "useShellContext", "import_classnames", "import_vuu_layout", "import_react", "import_react", "import_core", "import_salt_lab", "import_icons", "import_react", "import_vuu_utils", "getLayoutHistory", "user", "response", "import_icons", "import_core", "import_salt_lab", "import_jsx_runtime", "byLastUpdate", "l1", "l2", "HistoryListItem", "props", "UserPanel", "loginUrl", "onNavigate", "user", "layoutId", "forwardedRef", "history", "setHistory", "getHistory", "getLayoutHistory", "sortedHistory", "item", "id", "lastUpdate", "handleHisorySelected", "evt", "selected", "handleLogout", "logout", "i", "import_jsx_runtime", "UserProfile", "layoutId", "loginUrl", "onNavigate", "user", "open", "setOpen", "openRef", "buttonRef", "toggle", "isOpen", "UserPanel", "id", "import_salt_lab", "import_classnames", "import_core", "import_react", "import_jsx_runtime", "classBase", "modes", "ThemeSwitch", "classNameProp", "defaultModeProp", "modeProp", "onChange", "htmlAttributes", "mode", "setMode", "selectedIndex", "handleChangeSecondary", "_evt", "index", "className", "cx", "import_classnames", "import_jsx_runtime", "classBase", "AppHeader", "classNameProp", "layoutId", "loginUrl", "onNavigate", "onSwitchTheme", "themeMode", "user", "htmlAttributes", "className", "cx", "handleSwitchTheme", "mode", "ThemeSwitch", "UserProfile", "import_jsx_runtime", "warningLayout", "Shell", "children", "classNameProp", "defaultLayout", "leftSidePanel", "loginUrl", "serverUrl", "user", "htmlAttributes", "rootRef", "density", "paletteView", "open", "setOpen", "layoutId", "layout", "setLayoutConfig", "loadLayoutById", "use_layout_config_default", "handleLayoutChange", "handleSwitchTheme", "mode", "handleDrawerClick", "e", "_a", "target", "handleNavigate", "id", "getDrawers", "drawers", "className", "cx", "ShellContextProvider", "Flexbox", "AppHeader"]
7
7
  }
package/esm/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import E,{Suspense as ae}from"react";import{registerComponent as ie}from"@vuu-ui/vuu-layout";import oe from"react";import{Fragment as re,jsx as N,jsxs as ne}from"react/jsx-runtime";var x=class extends oe.Component{constructor(e){super(e),this.state={errorMessage:null}}static getDerivedStateFromError(e){return{errorMessage:e.message}}componentDidCatch(e,o){console.log(e,o)}render(){return this.state.errorMessage?ne(re,{children:[N("h1",{children:"Something went wrong."}),N("p",{children:this.state.errorMessage})]}):this.props.children}};import{jsx as se}from"react/jsx-runtime";var H=()=>se("div",{className:"hwLoader",children:"loading"});var R=async t=>{let e=new CSSStyleSheet;return fetch(t).then(o=>o.text()).then(o=>e.replace(o))};import{jsx as C}from"react/jsx-runtime";function le({url:t,css:e,params:o,...r}){e&&R(e).then(n=>{document.adoptedStyleSheets=[...document.adoptedStyleSheets,n]});let i=E.lazy(()=>import(t));return C(x,{children:C(ae,{fallback:C(H,{}),children:C(i,{...r,...o})})})}var M=E.memo(le);M.displayName="Feature";ie("Feature",M,"view");import{useState as T}from"react";import{Button as ue}from"@salt-ds/core";import{FormField as D,Input as U}from"@heswell/salt-lab";import{jsx as v,jsxs as ce}from"react/jsx-runtime";var F="vuuLoginPanel",ht=({onSubmit:t})=>{let[e,o]=T(""),[r,i]=T(""),n=()=>{t(e,r)},s=(l,u)=>{o(u)},c=(l,u)=>{i(u)},a=e.trim()!==""&&r.trim()!=="";return ce("div",{className:F,children:[v(D,{label:"Username",style:{width:200},children:v(U,{value:e,id:"text-username",onChange:s})}),v(D,{label:"Password",style:{width:200},children:v(U,{type:"password",value:r,id:"text-password",onChange:c})}),v(ue,{className:`${F}-login`,disabled:!a,onClick:n,variant:"cta",children:"Login"})]})};var A=t=>{var e;return(e=document.cookie.split("; ").find(o=>o.startsWith(`${t}=`)))==null?void 0:e.split("=")[1]},vt=()=>{let t=A("vuu-username"),e=A("vuu-auth-token");return[t,e]},pe=(t="/login.html")=>{window.location.href=t},I=t=>{document.cookie="vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",document.cookie="vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",pe(t)};import{connectToServer as Fe}from"@vuu-ui/vuu-data";import{useCallback as K,useEffect as Ae,useRef as Q,useState as Ie}from"react";import{useCallback as L,useEffect as me,useState as de}from"react";var he=(t,e)=>{let[o,r]=de(e),i=a=>{r(a)},n=L(async(a="latest")=>{fetch(`api/vui/${t.username}/${a}`,{}).then(l=>l.ok?l.json():e).then(i).catch(()=>{i(e)})},[e,t.username]);me(()=>{n()},[n]);let s=L(a=>{fetch(`api/vui/${t.username}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}).then(l=>l.ok?l.json():e)},[e,t]),c=L(a=>{n(a)},[n]);return[o,s,c]},B=he;import{createContext as fe,useContext as ge}from"react";import{jsx as w}from"react/jsx-runtime";var ve={},b=fe(ve),ye=({children:t,context:e,inheritedContext:o})=>{let r={...o,...e};return w(b.Provider,{value:r,children:t})},V=({children:t,value:e})=>w(b.Consumer,{children:o=>w(ye,{context:e,inheritedContext:o,children:t})}),Nt=()=>ge(b);import Be from"classnames";import{Chest as Ve,DraggableLayout as X,Drawer as Oe,FlexboxLayout as $e,LayoutProvider as Je,View as ze}from"@vuu-ui/vuu-layout";import{useCallback as Re,useRef as _,useState as Ee}from"react";import{Button as Me}from"@salt-ds/core";import{DropdownBase as Te}from"@heswell/salt-lab";import{UserSolidIcon as De}from"@salt-ds/icons";import{forwardRef as xe,useCallback as $,useEffect as Ce,useState as Se}from"react";import{formatDate as Pe}from"@vuu-ui/vuu-utils";var O=async t=>await fetch(`api/vui/${t.username}`,{}).then(o=>o.ok?o.json():null).catch(()=>{console.log("error getting history")});import{ExportIcon as Le}from"@salt-ds/icons";import{Button as we}from"@salt-ds/core";import{List as be,ListItem as ke}from"@heswell/salt-lab";import{jsx as S,jsxs as J}from"react/jsx-runtime";var Ne=({lastUpdate:t},{lastUpdate:e})=>e===t?0:e<t?-1:1,He=t=>S(ke,{...t}),z=xe(function({loginUrl:e,onNavigate:o,user:r,layoutId:i="latest"},n){let[s,c]=Se([]);Ce(()=>{async function m(){let d=await O(r);console.log({history:d});let g=d.filter(f=>f.id!=="latest").sort(Ne).map(({id:f,lastUpdate:y})=>({lastUpdate:y,id:f,label:`Saved at ${Pe(new Date(y),"kk:mm:ss")}`}));console.log({sortedHistory:g}),c(g)}m()},[r]);let a=$((m,d)=>{d&&o(d.id)},[o]),l=$(()=>{I(e)},[e]),u=s.length===0?[]:i==="latest"?s[0]:s.find(m=>m.id===i);return console.log({selected:u}),J("div",{className:"vuuUserPanel",ref:n,children:[S(be,{ListItem:He,className:"vuuUserPanel-history",onSelect:a,selected:u,source:s}),S("div",{className:"vuuUserPanel-buttonBar",children:J(we,{"aria-label":"logout",onClick:l,children:[S(Le,{})," Logout"]})})]})});import{jsx as P,jsxs as Ue}from"react/jsx-runtime";var q=({layoutId:t,loginUrl:e,onNavigate:o,user:r})=>{let[i,n]=Ee(!1),s=_(!1),c=_(null),a=Re(()=>{n(u=>s.current=!u),requestAnimationFrame(()=>{s.current||requestAnimationFrame(()=>{c.current.focus()})})},[]);return P("div",{className:"vuuUserProfile",children:Ue(Te,{placement:"bottom-end",onCancel:a,children:[P(Me,{ref:c,variant:"secondary",children:P(De,{})}),P(z,{layoutId:t,loginUrl:e,onNavigate:u=>{n(!1),o(u)},user:r})]})})};import{jsx as G}from"react/jsx-runtime";var W=({layoutId:t,loginUrl:e,onNavigate:o,user:r,...i})=>G("header",{className:"hwAppHeader",...i,children:G(q,{layoutId:t,loginUrl:e,onNavigate:o,user:r})});import{jsx as h,jsxs as Y}from"react/jsx-runtime";var _e={type:"View",props:{style:{height:"calc(100% - 6px)"}},children:[{props:{className:"vuuShell-warningPlaceholder"},type:"Placeholder"}]},ko=({children:t,className:e,defaultLayout:o=_e,leftSidePanel:r,loginUrl:i,serverUrl:n,user:s,...c})=>{let a=Q(null),[l,u]=Ie(!1),m=Q("latest"),[d,g,f]=B(s,o),y=K(p=>{g(p)},[g]),Z=p=>{var k;let te=p.target;(k=a.current)!=null&&k.contains(te)||u(!l)},j=K(p=>{m.current=p,f(p)},[f]);Ae(()=>{n&&s.token&&Fe(n,s.token)},[n,s.token]);let ee=()=>{let p=[];return r&&p.push(h(Oe,{onClick:Z,open:l,position:"left",inline:!0,peekaboo:!0,sizeOpen:200,toggleButton:"end",children:h(ze,{className:"vuuShell-palette",id:"vw-app-palette",ref:a,style:{height:"100%"},children:r},"app-palette")},"left-panel")),p};return Y(V,{value:void 0,children:[h(Je,{layout:d,onLayoutChange:y,children:h(X,{className:Be("vuuShell",e),...c,children:Y($e,{className:"App",style:{flexDirection:"column",height:"100%",width:"100%"},children:[h(W,{layoutId:m.current,loginUrl:i,user:s,onNavigate:j}),h(Ve,{style:{flex:1},children:ee().concat(h(X,{dropTarget:!0,style:{width:"100%",height:"100%"}},"main-content"))})]})})}),t]})};export{M as Feature,ht as LoginPanel,ko as Shell,V as ShellContextProvider,vt as getAuthDetailsFromCookies,I as logout,pe as redirectToLogin,Nt as useShellContext};
1
+ import D,{Suspense as ge}from"react";import{registerComponent as fe}from"@vuu-ui/vuu-layout";import ue from"react";import{Fragment as pe,jsx as H,jsxs as de}from"react/jsx-runtime";var y=class extends ue.Component{constructor(e){super(e),this.state={errorMessage:null}}static getDerivedStateFromError(e){return{errorMessage:e.message}}componentDidCatch(e,o){console.log(e,o)}render(){return this.state.errorMessage?de(pe,{children:[H("h1",{children:"Something went wrong."}),H("p",{children:this.state.errorMessage})]}):this.props.children}};import{jsx as he}from"react/jsx-runtime";var E=()=>he("div",{className:"hwLoader",children:"loading"});var R=async t=>{let e=new CSSStyleSheet;return fetch(t).then(o=>o.text()).then(o=>e.replace(o))};import{jsx as C}from"react/jsx-runtime";function xe({url:t,css:e,params:o,...r}){e&&R(e).then(s=>{document.adoptedStyleSheets=[...document.adoptedStyleSheets,s]});let i=D.lazy(()=>import(t));return C(y,{children:C(ge,{fallback:C(E,{}),children:C(i,{...r,...o})})})}var U=D.memo(xe);U.displayName="Feature";fe("Feature",U,"view");import{useState as B}from"react";import{Button as ve}from"@salt-ds/core";import{FormField as F,Input as A}from"@heswell/salt-lab";import{jsx as v,jsxs as ye}from"react/jsx-runtime";var I="vuuLoginPanel",Rt=({onSubmit:t})=>{let[e,o]=B(""),[r,i]=B(""),s=()=>{t(e,r)},n=(l,m)=>{o(m)},c=(l,m)=>{i(m)},a=e.trim()!==""&&r.trim()!=="";return ye("div",{className:I,children:[v(F,{label:"Username",style:{width:200},children:v(A,{value:e,id:"text-username",onChange:n})}),v(F,{label:"Password",style:{width:200},children:v(A,{type:"password",value:r,id:"text-password",onChange:c})}),v(ve,{className:`${I}-login`,disabled:!a,onClick:s,variant:"cta",children:"Login"})]})};var O=t=>{var e;return(e=document.cookie.split("; ").find(o=>o.startsWith(`${t}=`)))==null?void 0:e.split("=")[1]},Bt=()=>{let t=O("vuu-username"),e=O("vuu-auth-token");return[t,e]},Ce=(t="/login.html")=>{window.location.href=t},V=t=>{document.cookie="vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",document.cookie="vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",Ce(t)};import{connectToServer as et}from"@vuu-ui/vuu-data";import{useCallback as M,useEffect as tt,useRef as b,useState as te}from"react";import{useCallback as T,useEffect as Se,useState as Te}from"react";var Le=(t,e)=>{let[o,r]=Te(e),i=a=>{r(a)},s=T(async(a="latest")=>{fetch(`api/vui/${t.username}/${a}`,{}).then(l=>l.ok?l.json():e).then(i).catch(()=>{i(e)})},[e,t.username]);Se(()=>{s()},[s]);let n=T(a=>{fetch(`api/vui/${t.username}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}).then(l=>l.ok?l.json():e)},[e,t]),c=T(a=>{s(a)},[s]);return[o,n,c]},$=Le;import{createContext as Pe,useContext as we}from"react";import{jsx as L}from"react/jsx-runtime";var Me={},P=Pe(Me),be=({children:t,context:e,inheritedContext:o})=>{let r={...o,...e};return L(P.Provider,{value:r,children:t})},G=({children:t,value:e})=>L(P.Consumer,{children:o=>L(be,{context:e,inheritedContext:o,children:t})}),zt=()=>we(P);import ot from"classnames";import{Chest as rt,DraggableLayout as oe,Drawer as nt,FlexboxLayout as st,LayoutProvider as at,View as it}from"@vuu-ui/vuu-layout";import{useCallback as Xe}from"react";import{useCallback as Ie,useRef as W,useState as Oe}from"react";import{Button as Ve}from"@salt-ds/core";import{DropdownBase as $e}from"@heswell/salt-lab";import{UserSolidIcon as Ge}from"@salt-ds/icons";import{forwardRef as Ne,useCallback as _,useEffect as ke,useState as He}from"react";import{formatDate as Ee}from"@vuu-ui/vuu-utils";var J=async t=>await fetch(`api/vui/${t.username}`,{}).then(o=>o.ok?o.json():null).catch(()=>{console.log("error getting history")});import{ExportIcon as Re}from"@salt-ds/icons";import{Button as De}from"@salt-ds/core";import{List as Ue,ListItem as Be}from"@heswell/salt-lab";import{jsx as S,jsxs as z}from"react/jsx-runtime";var Fe=({lastUpdate:t},{lastUpdate:e})=>e===t?0:e<t?-1:1,Ae=t=>S(Be,{...t}),q=Ne(function({loginUrl:e,onNavigate:o,user:r,layoutId:i="latest"},s){let[n,c]=He([]);ke(()=>{async function d(){let p=await J(r);console.log({history:p});let g=p.filter(f=>f.id!=="latest").sort(Fe).map(({id:f,lastUpdate:x})=>({lastUpdate:x,id:f,label:`Saved at ${Ee(new Date(x),"kk:mm:ss")}`}));console.log({sortedHistory:g}),c(g)}d()},[r]);let a=_((d,p)=>{p&&o(p.id)},[o]),l=_(()=>{V(e)},[e]),m=n.length===0?[]:i==="latest"?n[0]:n.find(d=>d.id===i);return console.log({selected:m}),z("div",{className:"vuuUserPanel",ref:s,children:[S(Ue,{ListItem:Ae,className:"vuuUserPanel-history",onSelect:a,selected:m,source:n}),S("div",{className:"vuuUserPanel-buttonBar",children:z(De,{"aria-label":"logout",onClick:l,children:[S(Re,{})," Logout"]})})]})});import{jsx as w,jsxs as Je}from"react/jsx-runtime";var K=({layoutId:t,loginUrl:e,onNavigate:o,user:r})=>{let[i,s]=Oe(!1),n=W(!1),c=W(null),a=Ie(()=>{s(m=>n.current=!m),requestAnimationFrame(()=>{n.current||requestAnimationFrame(()=>{c.current.focus()})})},[]);return Je($e,{className:"vuuUserProfile",placement:"bottom-end",onCancel:a,children:[w(Ve,{ref:c,variant:"secondary",children:w(Ge,{})}),w(q,{layoutId:t,loginUrl:e,onNavigate:m=>{s(!1),o(m)},user:r})]})};import{ToggleButton as Q,ToggleButtonGroup as _e}from"@heswell/salt-lab";import ze from"classnames";import{useControlled as qe}from"@salt-ds/core";import{useCallback as We}from"react";import{jsx as Y,jsxs as Qe}from"react/jsx-runtime";var Ke="vuuThemeSwitch",X=["light","dark"],Z=({className:t,defaultMode:e,mode:o,onChange:r,...i})=>{let[s,n]=qe({controlled:o,default:e!=null?e:"light",name:"ThemeSwitch",state:"mode"}),c=X.indexOf(s),a=We((m,d)=>{let p=X[d];n(p),r(p)},[r,n]),l=ze(Ke,t);return Qe(_e,{className:l,...i,onChange:a,selectedIndex:c,children:[Y(Q,{"aria-label":"alert",tooltipText:"Light Theme","data-icon":"light"}),Y(Q,{"aria-label":"home",tooltipText:"Dark Theme","data-icon":"dark"})]})};import Ye from"classnames";import{jsx as j,jsxs as je}from"react/jsx-runtime";var Ze="vuuAppHeader",ee=({className:t,layoutId:e,loginUrl:o,onNavigate:r,onSwitchTheme:i,themeMode:s="light",user:n,...c})=>{let a=Ye(Ze,t,"salt-density-medium"),l=Xe(m=>i==null?void 0:i(m),[i]);return je("header",{className:a,...c,children:[j(Z,{defaultMode:s,onChange:l}),j(K,{layoutId:e,loginUrl:o,onNavigate:r,user:n})]})};import{jsx as h,jsxs as re}from"react/jsx-runtime";var lt={type:"View",props:{style:{height:"calc(100% - 6px)"}},children:[{props:{className:"vuuShell-warningPlaceholder"},type:"Placeholder"}]},lr=({children:t,className:e,defaultLayout:o=lt,leftSidePanel:r,loginUrl:i,serverUrl:s,user:n,...c})=>{let a=b(null),[l]=te("high"),m=b(null),[d,p]=te(!1),g=b("latest"),[f,x,N]=$(n,o),ne=M(u=>{x(u)},[x]),se=M(u=>{a.current&&(a.current.dataset.mode=u)},[]),ae=u=>{var k;let ce=u.target;(k=m.current)!=null&&k.contains(ce)||p(!d)},ie=M(u=>{g.current=u,N(u)},[N]);tt(()=>{s&&n.token&&et(s,n.token)},[s,n.token]);let le=()=>{let u=[];return r&&u.push(h(nt,{onClick:ae,open:d,position:"left",inline:!0,peekaboo:!0,sizeOpen:200,toggleButton:"end",children:h(it,{className:"vuuShell-palette",id:"vw-app-palette",ref:m,style:{height:"100%"},children:r},"app-palette")},"left-panel")),u},me=ot("vuuShell",e,"salt-theme",`salt-density-${l}`);return re(G,{value:void 0,children:[h(at,{layout:f,onLayoutChange:ne,children:h(oe,{className:me,"data-mode":"light",ref:a,...c,children:re(st,{className:"App",style:{flexDirection:"column",height:"100%",width:"100%"},children:[h(ee,{layoutId:g.current,loginUrl:i,user:n,onNavigate:ie,onSwitchTheme:se}),h(rt,{style:{flex:1},children:le().concat(h(oe,{dropTarget:!0,style:{width:"100%",height:"100%"}},"main-content"))})]})})}),t]})};export{U as Feature,Rt as LoginPanel,lr as Shell,G as ShellContextProvider,Z as ThemeSwitch,Bt as getAuthDetailsFromCookies,V as logout,Ce as redirectToLogin,zt as useShellContext};
2
2
  //# sourceMappingURL=index.js.map
package/esm/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../packages/vuu-shell/src/feature/Feature.tsx", "../../../packages/vuu-shell/src/feature/ErrorBoundary.jsx", "../../../packages/vuu-shell/src/feature/Loader.tsx", "../../../packages/vuu-shell/src/feature/css-module-loader.ts", "../../../packages/vuu-shell/src/login/LoginPanel.tsx", "../../../packages/vuu-shell/src/login/login-utils.ts", "../../../packages/vuu-shell/src/shell.tsx", "../../../packages/vuu-shell/src/use-layout-config.js", "../../../packages/vuu-shell/src/ShellContextProvider.tsx", "../../../packages/vuu-shell/src/user-profile/UserProfile.tsx", "../../../packages/vuu-shell/src/user-profile/UserPanel.tsx", "../../../packages/vuu-shell/src/get-layout-history.js", "../../../packages/vuu-shell/src/app-header/AppHeader.tsx"],
4
- "sourcesContent": ["import React, { Suspense } from \"react\";\nimport { registerComponent } from \"@vuu-ui/vuu-layout\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\nimport { Loader } from \"./Loader\";\nimport { importCSS } from \"./css-module-loader\";\n\nexport interface FeatureProps<Params extends object | undefined = undefined> {\n height?: number;\n url: string;\n css?: string;\n width?: number;\n params: Params;\n}\n\n// const RawFeature = <Params extends object | undefined>({\nfunction RawFeature<Params extends object | undefined>({\n url,\n css,\n params,\n ...props\n}: FeatureProps<Params>) {\n if (css) {\n // import(/* @vite-ignore */ css, { assert: { type: \"css\" } }).then(\n // (cssModule) => {\n // document.adoptedStyleSheets = [\n // ...document.adoptedStyleSheets,\n // cssModule.default,\n // ];\n // }\n // );\n // Polyfill until vite build supports import assertions\n // Note: already fully supported in esbuild, so vite dev\n importCSS(css).then((styleSheet) => {\n document.adoptedStyleSheets = [\n ...document.adoptedStyleSheets,\n styleSheet,\n ];\n });\n }\n const LazyFeature = React.lazy(() => import(/* @vite-ignore */ url));\n return (\n <ErrorBoundary>\n <Suspense fallback={<Loader />}>\n <LazyFeature {...props} {...params} />\n </Suspense>\n </ErrorBoundary>\n );\n}\n\nexport const Feature = React.memo(RawFeature);\nFeature.displayName = \"Feature\";\nregisterComponent(\"Feature\", Feature, \"view\");\n", "import React from 'react';\n// TODO\nexport class ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { errorMessage: null };\n }\n\n static getDerivedStateFromError(error) {\n // Update state so the next render will show the fallback UI.\n return { errorMessage: error.message };\n }\n\n componentDidCatch(error, errorInfo) {\n // You can also log the error to an error reporting service\n console.log(error, errorInfo);\n }\n\n render() {\n if (this.state.errorMessage) {\n return (\n <>\n <h1>Something went wrong.</h1>\n <p>{this.state.errorMessage}</p>\n </>\n );\n }\n\n return this.props.children;\n }\n}\n", "// TODO\nexport const Loader = () => <div className=\"hwLoader\">loading</div>;\n", "export const importCSS = async (path: string) => {\n const container = new CSSStyleSheet();\n return fetch(path)\n .then((x) => x.text())\n .then((x) => container.replace(x));\n};\n", "import { ChangeEvent, HTMLAttributes, useState } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { FormField, Input } from \"@heswell/salt-lab\";\n\nimport \"./LoginPanel.css\";\n\nconst classBase = \"vuuLoginPanel\";\n\nexport interface LoginPanelProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\"> {\n onSubmit: (username: string, password: string) => void;\n}\n\nexport const LoginPanel = ({ onSubmit }: LoginPanelProps) => {\n const [username, setUserName] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n\n const login = () => {\n onSubmit(username, password);\n };\n\n const handleUsername = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setUserName(value);\n };\n\n const handlePassword = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setPassword(value);\n };\n\n const dataIsValid = username.trim() !== \"\" && password.trim() !== \"\";\n\n return (\n <div className={classBase}>\n <FormField label=\"Username\" style={{ width: 200 }}>\n <Input value={username} id=\"text-username\" onChange={handleUsername} />\n </FormField>\n\n <FormField label=\"Password\" style={{ width: 200 }}>\n <Input\n type=\"password\"\n value={password}\n id=\"text-password\"\n onChange={handlePassword}\n />\n </FormField>\n\n <Button\n className={`${classBase}-login`}\n disabled={!dataIsValid}\n onClick={login}\n variant=\"cta\"\n >\n Login\n </Button>\n </div>\n );\n};\n", "const getCookieValue = (name: string) =>\n document.cookie\n .split(\"; \")\n .find((row) => row.startsWith(`${name}=`))\n ?.split(\"=\")[1];\n\nexport const getAuthDetailsFromCookies = () => {\n const username = getCookieValue(\"vuu-username\");\n const token = getCookieValue(\"vuu-auth-token\");\n return [username, token];\n};\n\nexport const redirectToLogin = (loginUrl = \"/login.html\") => {\n window.location.href = loginUrl;\n};\n\nexport const logout = (loginUrl?: string) => {\n document.cookie = \"vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie = \"vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n redirectToLogin(loginUrl);\n};\n", "import { connectToServer } from \"@vuu-ui/vuu-data\";\nimport {\n HTMLAttributes,\n MouseEvent,\n ReactElement,\n ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport useLayoutConfig from \"./use-layout-config\";\nimport { ShellContextProvider } from \"./ShellContextProvider\";\nimport cx from \"classnames\";\n\nimport {\n Chest,\n DraggableLayout,\n Drawer,\n FlexboxLayout as Flexbox,\n LayoutProvider,\n View,\n} from \"@vuu-ui/vuu-layout\";\n\nimport { AppHeader } from \"./app-header\";\n// import { AppPalette } from \"./app-palette\";\n\nimport { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport \"./shell.css\";\n\nexport type VuuUser = {\n username: string;\n token: string;\n};\n\nconst warningLayout = {\n type: \"View\",\n props: {\n style: { height: \"calc(100% - 6px)\" },\n },\n children: [\n {\n props: {\n className: \"vuuShell-warningPlaceholder\",\n },\n type: \"Placeholder\",\n },\n ],\n};\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n defaultLayout?: LayoutJSON;\n leftSidePanel?: ReactElement;\n loginUrl?: string;\n // paletteConfig: any;\n serverUrl?: string;\n user: VuuUser;\n}\n\nexport const Shell = ({\n children,\n className,\n defaultLayout = warningLayout,\n leftSidePanel,\n loginUrl,\n serverUrl,\n user,\n ...htmlAttributes\n}: ShellProps) => {\n const paletteView = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const layoutId = useRef(\"latest\");\n\n const [layout, setLayoutConfig, loadLayoutById] = useLayoutConfig(\n user,\n defaultLayout\n );\n\n const handleLayoutChange = useCallback(\n (layout) => {\n setLayoutConfig(layout);\n },\n [setLayoutConfig]\n );\n\n const handleDrawerClick = (e: MouseEvent<HTMLElement>) => {\n const target = e.target as HTMLElement;\n if (!paletteView.current?.contains(target)) {\n setOpen(!open);\n }\n };\n\n const handleNavigate = useCallback(\n (id) => {\n layoutId.current = id;\n loadLayoutById(id);\n },\n [loadLayoutById]\n );\n\n useEffect(() => {\n if (serverUrl && user.token) {\n connectToServer(serverUrl, user.token);\n }\n }, [serverUrl, user.token]);\n\n const getDrawers = () => {\n const drawers: ReactElement[] = [];\n if (leftSidePanel) {\n drawers.push(\n <Drawer\n key=\"left-panel\"\n onClick={handleDrawerClick}\n open={open}\n position=\"left\"\n inline\n peekaboo\n sizeOpen={200}\n toggleButton=\"end\"\n >\n <View\n className=\"vuuShell-palette\"\n id=\"vw-app-palette\"\n key=\"app-palette\"\n ref={paletteView}\n style={{ height: \"100%\" }}\n >\n {leftSidePanel}\n </View>\n </Drawer>\n );\n }\n\n return drawers;\n };\n\n return (\n // ShellContext TBD\n <ShellContextProvider value={undefined}>\n <LayoutProvider layout={layout} onLayoutChange={handleLayoutChange}>\n <DraggableLayout\n className={cx(\"vuuShell\", className)}\n {...htmlAttributes}\n >\n <Flexbox\n className=\"App\"\n style={{ flexDirection: \"column\", height: \"100%\", width: \"100%\" }}\n >\n <AppHeader\n layoutId={layoutId.current}\n loginUrl={loginUrl}\n user={user}\n onNavigate={handleNavigate}\n />\n <Chest style={{ flex: 1 }}>\n {getDrawers().concat(\n <DraggableLayout\n dropTarget\n key=\"main-content\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n </Chest>\n </Flexbox>\n </DraggableLayout>\n </LayoutProvider>\n {children}\n </ShellContextProvider>\n );\n};\n", "import { useCallback, useEffect, useState } from \"react\";\n\nconst useLayoutConfig = (user, defaultLayout) => {\n const [layout, _setLayout] = useState(defaultLayout);\n\n const setLayout = (layout) => {\n _setLayout(layout);\n };\n\n const load = useCallback(\n async (id = \"latest\") => {\n fetch(`api/vui/${user.username}/${id}`, {})\n .then((response) => {\n return response.ok ? response.json() : defaultLayout;\n })\n .then(setLayout)\n .catch(() => {\n // TODO we should set a layout with a warning here\n setLayout(defaultLayout);\n });\n },\n [defaultLayout, user.username]\n );\n\n useEffect(() => {\n load();\n }, [load]);\n\n const saveData = useCallback(\n (data) => {\n fetch(`api/vui/${user.username}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }).then((response) => {\n return response.ok ? response.json() : defaultLayout;\n });\n // .then((data) => console.log(data));\n },\n [defaultLayout, user]\n );\n\n const loadLayoutById = useCallback(\n (id) => {\n load(id);\n },\n [load]\n );\n\n return [layout, saveData, loadLayoutById];\n};\n\nexport default useLayoutConfig;\n", "import { MenuRpcResponse } from \"@vuu-ui/vuu-data\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { createContext, ReactElement, ReactNode, useContext } from \"react\";\n\nexport interface ShellContextProps {\n getDefaultColumnConfig?: (\n tableName: string,\n columnName: string\n ) => Partial<ColumnDescriptor>;\n handleRpcResponse?: (response?: MenuRpcResponse) => void;\n}\n\nconst defaultConfig = {};\n\nconst ShellContext = createContext<ShellContextProps>(defaultConfig);\n\nexport interface ShellProviderProps {\n children: ReactNode;\n value: ShellContextProps;\n}\n\nconst Provider = ({\n children,\n context,\n inheritedContext,\n}: {\n children: ReactNode;\n context?: ShellContextProps;\n inheritedContext?: ShellContextProps;\n}) => {\n // TODO functions provided at multiple levels must be merged\n const mergedContext = {\n ...inheritedContext,\n ...context,\n };\n return (\n <ShellContext.Provider value={mergedContext}>\n {children}\n </ShellContext.Provider>\n );\n};\n\nexport const ShellContextProvider = ({\n children,\n value,\n}: ShellProviderProps): ReactElement => {\n return (\n <ShellContext.Consumer>\n {(context) => (\n <Provider context={value} inheritedContext={context}>\n {children}\n </Provider>\n )}\n </ShellContext.Consumer>\n );\n};\n\nexport const useShellContext = () => {\n return useContext(ShellContext);\n};\n", "import React, { useCallback, useRef, useState } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { DropdownBase } from \"@heswell/salt-lab\";\nimport { UserSolidIcon } from \"@salt-ds/icons\";\nimport { UserPanel } from \"./UserPanel\";\n\nimport \"./UserProfile.css\";\n\nexport const UserProfile = ({ layoutId, loginUrl, onNavigate, user }) => {\n const [open, setOpen] = useState(false);\n const openRef = useRef(false);\n const buttonRef = useRef(null);\n\n const toggle = useCallback(() => {\n setOpen((isOpen) => {\n return (openRef.current = !isOpen);\n });\n requestAnimationFrame(() => {\n if (!openRef.current) {\n requestAnimationFrame(() => {\n buttonRef.current.focus();\n });\n }\n });\n }, []);\n\n const handleNavigate = (id) => {\n setOpen(false);\n onNavigate(id);\n };\n\n return (\n <div className=\"vuuUserProfile\">\n <DropdownBase placement=\"bottom-end\" onCancel={toggle}>\n <Button ref={buttonRef} variant=\"secondary\">\n <UserSolidIcon />\n </Button>\n <UserPanel\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={handleNavigate}\n user={user}\n />\n </DropdownBase>\n </div>\n );\n};\n", "import React, { forwardRef, useCallback, useEffect, useState } from \"react\";\nimport { formatDate } from \"@vuu-ui/vuu-utils\";\nimport { logout } from \"../login\";\nimport { getLayoutHistory } from \"../get-layout-history\";\nimport { ExportIcon } from \"@salt-ds/icons\";\nimport { Button } from \"@salt-ds/core\";\nimport { List, ListItem } from \"@heswell/salt-lab\";\n\nimport \"./UserPanel.css\";\n\nconst byLastUpdate = ({ lastUpdate: l1 }, { lastUpdate: l2 }) => {\n return l2 === l1 ? 0 : l2 < l1 ? -1 : 1;\n};\n\nconst HistoryListItem = (props) => {\n return <ListItem {...props} />;\n};\n\nexport const UserPanel = forwardRef(function UserPanel(\n { loginUrl, onNavigate, user, layoutId = \"latest\" },\n forwardedRef\n) {\n const [history, setHistory] = useState([]);\n\n useEffect(() => {\n async function getHistory() {\n const history = await getLayoutHistory(user);\n console.log({ history });\n const sortedHistory = history\n .filter((item) => item.id !== \"latest\")\n .sort(byLastUpdate)\n .map(({ id, lastUpdate }) => ({\n lastUpdate,\n id,\n label: `Saved at ${formatDate(new Date(lastUpdate), \"kk:mm:ss\")}`,\n }));\n console.log({ sortedHistory });\n setHistory(sortedHistory);\n }\n\n getHistory();\n }, [user]);\n\n const handleHisorySelected = useCallback(\n (evt, selected) => {\n if (selected) {\n onNavigate(selected.id);\n }\n },\n [onNavigate]\n );\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const selected =\n history.length === 0\n ? []\n : layoutId === \"latest\"\n ? history[0]\n : history.find((i) => i.id === layoutId);\n console.log({ selected });\n\n return (\n <div className=\"vuuUserPanel\" ref={forwardedRef}>\n <List\n ListItem={HistoryListItem}\n className=\"vuuUserPanel-history\"\n onSelect={handleHisorySelected}\n selected={selected}\n source={history}\n />\n <div className=\"vuuUserPanel-buttonBar\">\n <Button aria-label=\"logout\" onClick={handleLogout}>\n <ExportIcon /> Logout\n </Button>\n </div>\n </div>\n );\n});\n", "export const getLayoutHistory = async (user) => {\n const history = await fetch(`api/vui/${user.username}`, {})\n .then((response) => {\n return response.ok ? response.json() : null;\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n console.log(`error getting history`);\n });\n\n return history;\n};\n", "import { HTMLAttributes } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { UserProfile } from \"../user-profile\";\nimport \"./AppHeader.css\";\n\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n}\n\nexport const AppHeader = ({\n layoutId,\n loginUrl,\n onNavigate,\n user,\n ...htmlAttributes\n}: AppHeaderProps) => {\n return (\n <header className=\"hwAppHeader\" {...htmlAttributes}>\n {/* <ToggleButton onChange={toggleColorScheme}>\n theme\n </ToggleButton> */}\n <UserProfile\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={onNavigate}\n user={user}\n />\n </header>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["React", "Suspense", "registerComponent", "React", "Fragment", "jsx", "jsxs", "ErrorBoundary", "props", "error", "errorInfo", "jsx", "Loader", "importCSS", "path", "container", "x", "jsx", "RawFeature", "url", "css", "params", "props", "importCSS", "styleSheet", "LazyFeature", "React", "ErrorBoundary", "Suspense", "Loader", "Feature", "registerComponent", "useState", "Button", "FormField", "Input", "jsx", "jsxs", "classBase", "LoginPanel", "onSubmit", "username", "setUserName", "useState", "password", "setPassword", "login", "handleUsername", "_event", "value", "handlePassword", "dataIsValid", "FormField", "Input", "Button", "getCookieValue", "name", "_a", "row", "getAuthDetailsFromCookies", "username", "token", "redirectToLogin", "loginUrl", "logout", "connectToServer", "useCallback", "useEffect", "useRef", "useState", "useCallback", "useEffect", "useState", "useLayoutConfig", "user", "defaultLayout", "layout", "_setLayout", "setLayout", "load", "id", "response", "saveData", "data", "loadLayoutById", "use_layout_config_default", "createContext", "useContext", "jsx", "defaultConfig", "ShellContext", "Provider", "children", "context", "inheritedContext", "mergedContext", "ShellContextProvider", "value", "useShellContext", "cx", "Chest", "DraggableLayout", "Drawer", "Flexbox", "LayoutProvider", "View", "useCallback", "useRef", "useState", "Button", "DropdownBase", "UserSolidIcon", "forwardRef", "useCallback", "useEffect", "useState", "formatDate", "getLayoutHistory", "user", "response", "ExportIcon", "Button", "List", "ListItem", "jsx", "jsxs", "byLastUpdate", "l1", "l2", "HistoryListItem", "props", "ListItem", "UserPanel", "forwardRef", "loginUrl", "onNavigate", "user", "layoutId", "forwardedRef", "history", "setHistory", "useState", "useEffect", "getHistory", "getLayoutHistory", "sortedHistory", "item", "id", "lastUpdate", "formatDate", "handleHisorySelected", "useCallback", "evt", "selected", "handleLogout", "logout", "i", "List", "Button", "ExportIcon", "jsx", "jsxs", "UserProfile", "layoutId", "loginUrl", "onNavigate", "user", "open", "setOpen", "useState", "openRef", "useRef", "buttonRef", "toggle", "useCallback", "isOpen", "DropdownBase", "Button", "UserSolidIcon", "UserPanel", "id", "jsx", "AppHeader", "layoutId", "loginUrl", "onNavigate", "user", "htmlAttributes", "UserProfile", "jsx", "jsxs", "warningLayout", "Shell", "children", "className", "defaultLayout", "leftSidePanel", "loginUrl", "serverUrl", "user", "htmlAttributes", "paletteView", "useRef", "open", "setOpen", "useState", "layoutId", "layout", "setLayoutConfig", "loadLayoutById", "use_layout_config_default", "handleLayoutChange", "useCallback", "handleDrawerClick", "e", "_a", "target", "handleNavigate", "id", "useEffect", "connectToServer", "getDrawers", "drawers", "Drawer", "View", "ShellContextProvider", "LayoutProvider", "DraggableLayout", "cx", "Flexbox", "AppHeader", "Chest"]
3
+ "sources": ["../../../packages/vuu-shell/src/feature/Feature.tsx", "../../../packages/vuu-shell/src/feature/ErrorBoundary.jsx", "../../../packages/vuu-shell/src/feature/Loader.tsx", "../../../packages/vuu-shell/src/feature/css-module-loader.ts", "../../../packages/vuu-shell/src/login/LoginPanel.tsx", "../../../packages/vuu-shell/src/login/login-utils.ts", "../../../packages/vuu-shell/src/shell.tsx", "../../../packages/vuu-shell/src/use-layout-config.js", "../../../packages/vuu-shell/src/ShellContextProvider.tsx", "../../../packages/vuu-shell/src/app-header/AppHeader.tsx", "../../../packages/vuu-shell/src/user-profile/UserProfile.tsx", "../../../packages/vuu-shell/src/user-profile/UserPanel.tsx", "../../../packages/vuu-shell/src/get-layout-history.js", "../../../packages/vuu-shell/src/theme-switch/ThemeSwitch.tsx"],
4
+ "sourcesContent": ["import React, { Suspense } from \"react\";\nimport { registerComponent } from \"@vuu-ui/vuu-layout\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\nimport { Loader } from \"./Loader\";\nimport { importCSS } from \"./css-module-loader\";\n\nexport interface FeatureProps<Params extends object | undefined = undefined> {\n height?: number;\n url: string;\n css?: string;\n width?: number;\n params: Params;\n}\n\n// const RawFeature = <Params extends object | undefined>({\nfunction RawFeature<Params extends object | undefined>({\n url,\n css,\n params,\n ...props\n}: FeatureProps<Params>) {\n if (css) {\n // import(/* @vite-ignore */ css, { assert: { type: \"css\" } }).then(\n // (cssModule) => {\n // document.adoptedStyleSheets = [\n // ...document.adoptedStyleSheets,\n // cssModule.default,\n // ];\n // }\n // );\n // Polyfill until vite build supports import assertions\n // Note: already fully supported in esbuild, so vite dev\n importCSS(css).then((styleSheet) => {\n document.adoptedStyleSheets = [\n ...document.adoptedStyleSheets,\n styleSheet,\n ];\n });\n }\n const LazyFeature = React.lazy(() => import(/* @vite-ignore */ url));\n return (\n <ErrorBoundary>\n <Suspense fallback={<Loader />}>\n <LazyFeature {...props} {...params} />\n </Suspense>\n </ErrorBoundary>\n );\n}\n\nexport const Feature = React.memo(RawFeature);\nFeature.displayName = \"Feature\";\nregisterComponent(\"Feature\", Feature, \"view\");\n", "import React from 'react';\n// TODO\nexport class ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { errorMessage: null };\n }\n\n static getDerivedStateFromError(error) {\n // Update state so the next render will show the fallback UI.\n return { errorMessage: error.message };\n }\n\n componentDidCatch(error, errorInfo) {\n // You can also log the error to an error reporting service\n console.log(error, errorInfo);\n }\n\n render() {\n if (this.state.errorMessage) {\n return (\n <>\n <h1>Something went wrong.</h1>\n <p>{this.state.errorMessage}</p>\n </>\n );\n }\n\n return this.props.children;\n }\n}\n", "// TODO\nexport const Loader = () => <div className=\"hwLoader\">loading</div>;\n", "export const importCSS = async (path: string) => {\n const container = new CSSStyleSheet();\n return fetch(path)\n .then((x) => x.text())\n .then((x) => container.replace(x));\n};\n", "import { ChangeEvent, HTMLAttributes, useState } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { FormField, Input } from \"@heswell/salt-lab\";\n\nimport \"./LoginPanel.css\";\n\nconst classBase = \"vuuLoginPanel\";\n\nexport interface LoginPanelProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\"> {\n onSubmit: (username: string, password: string) => void;\n}\n\nexport const LoginPanel = ({ onSubmit }: LoginPanelProps) => {\n const [username, setUserName] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n\n const login = () => {\n onSubmit(username, password);\n };\n\n const handleUsername = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setUserName(value);\n };\n\n const handlePassword = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setPassword(value);\n };\n\n const dataIsValid = username.trim() !== \"\" && password.trim() !== \"\";\n\n return (\n <div className={classBase}>\n <FormField label=\"Username\" style={{ width: 200 }}>\n <Input value={username} id=\"text-username\" onChange={handleUsername} />\n </FormField>\n\n <FormField label=\"Password\" style={{ width: 200 }}>\n <Input\n type=\"password\"\n value={password}\n id=\"text-password\"\n onChange={handlePassword}\n />\n </FormField>\n\n <Button\n className={`${classBase}-login`}\n disabled={!dataIsValid}\n onClick={login}\n variant=\"cta\"\n >\n Login\n </Button>\n </div>\n );\n};\n", "const getCookieValue = (name: string) =>\n document.cookie\n .split(\"; \")\n .find((row) => row.startsWith(`${name}=`))\n ?.split(\"=\")[1];\n\nexport const getAuthDetailsFromCookies = () => {\n const username = getCookieValue(\"vuu-username\");\n const token = getCookieValue(\"vuu-auth-token\");\n return [username, token];\n};\n\nexport const redirectToLogin = (loginUrl = \"/login.html\") => {\n window.location.href = loginUrl;\n};\n\nexport const logout = (loginUrl?: string) => {\n document.cookie = \"vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie = \"vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n redirectToLogin(loginUrl);\n};\n", "import { connectToServer } from \"@vuu-ui/vuu-data\";\nimport {\n HTMLAttributes,\n MouseEvent,\n ReactElement,\n ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport useLayoutConfig from \"./use-layout-config\";\nimport { ShellContextProvider } from \"./ShellContextProvider\";\nimport cx from \"classnames\";\n\nimport {\n Chest,\n DraggableLayout,\n Drawer,\n FlexboxLayout as Flexbox,\n LayoutProvider,\n View,\n} from \"@vuu-ui/vuu-layout\";\n\nimport { AppHeader } from \"./app-header\";\n// import { AppPalette } from \"./app-palette\";\n\nimport { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport \"./shell.css\";\nimport { ThemeMode } from \"./theme-switch\";\n\nexport type VuuUser = {\n username: string;\n token: string;\n};\n\nconst warningLayout = {\n type: \"View\",\n props: {\n style: { height: \"calc(100% - 6px)\" },\n },\n children: [\n {\n props: {\n className: \"vuuShell-warningPlaceholder\",\n },\n type: \"Placeholder\",\n },\n ],\n};\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n defaultLayout?: LayoutJSON;\n leftSidePanel?: ReactElement;\n loginUrl?: string;\n // paletteConfig: any;\n serverUrl?: string;\n user: VuuUser;\n}\n\nexport const Shell = ({\n children,\n className: classNameProp,\n defaultLayout = warningLayout,\n leftSidePanel,\n loginUrl,\n serverUrl,\n user,\n ...htmlAttributes\n}: ShellProps) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const [density] = useState<\"high\" | \"medium\" | \"low\" | \"touch\">(\"high\");\n const paletteView = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const layoutId = useRef(\"latest\");\n\n const [layout, setLayoutConfig, loadLayoutById] = useLayoutConfig(\n user,\n defaultLayout\n );\n\n const handleLayoutChange = useCallback(\n (layout) => {\n setLayoutConfig(layout);\n },\n [setLayoutConfig]\n );\n\n const handleSwitchTheme = useCallback((mode: ThemeMode) => {\n if (rootRef.current) {\n rootRef.current.dataset.mode = mode;\n }\n }, []);\n\n const handleDrawerClick = (e: MouseEvent<HTMLElement>) => {\n const target = e.target as HTMLElement;\n if (!paletteView.current?.contains(target)) {\n setOpen(!open);\n }\n };\n\n const handleNavigate = useCallback(\n (id) => {\n layoutId.current = id;\n loadLayoutById(id);\n },\n [loadLayoutById]\n );\n\n useEffect(() => {\n if (serverUrl && user.token) {\n connectToServer(serverUrl, user.token);\n }\n }, [serverUrl, user.token]);\n\n const getDrawers = () => {\n const drawers: ReactElement[] = [];\n if (leftSidePanel) {\n drawers.push(\n <Drawer\n key=\"left-panel\"\n onClick={handleDrawerClick}\n open={open}\n position=\"left\"\n inline\n peekaboo\n sizeOpen={200}\n toggleButton=\"end\"\n >\n <View\n className=\"vuuShell-palette\"\n id=\"vw-app-palette\"\n key=\"app-palette\"\n ref={paletteView}\n style={{ height: \"100%\" }}\n >\n {leftSidePanel}\n </View>\n </Drawer>\n );\n }\n\n return drawers;\n };\n\n const className = cx(\n \"vuuShell\",\n classNameProp,\n \"salt-theme\",\n `salt-density-${density}`\n );\n\n return (\n // ShellContext TBD\n <ShellContextProvider value={undefined}>\n <LayoutProvider layout={layout} onLayoutChange={handleLayoutChange}>\n <DraggableLayout\n className={className}\n data-mode=\"light\"\n ref={rootRef}\n {...htmlAttributes}\n >\n <Flexbox\n className=\"App\"\n style={{ flexDirection: \"column\", height: \"100%\", width: \"100%\" }}\n >\n <AppHeader\n layoutId={layoutId.current}\n loginUrl={loginUrl}\n user={user}\n onNavigate={handleNavigate}\n onSwitchTheme={handleSwitchTheme}\n />\n <Chest style={{ flex: 1 }}>\n {getDrawers().concat(\n <DraggableLayout\n dropTarget\n key=\"main-content\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n </Chest>\n </Flexbox>\n </DraggableLayout>\n </LayoutProvider>\n {children}\n </ShellContextProvider>\n );\n};\n", "import { useCallback, useEffect, useState } from \"react\";\n\nconst useLayoutConfig = (user, defaultLayout) => {\n const [layout, _setLayout] = useState(defaultLayout);\n\n const setLayout = (layout) => {\n _setLayout(layout);\n };\n\n const load = useCallback(\n async (id = \"latest\") => {\n fetch(`api/vui/${user.username}/${id}`, {})\n .then((response) => {\n return response.ok ? response.json() : defaultLayout;\n })\n .then(setLayout)\n .catch(() => {\n // TODO we should set a layout with a warning here\n setLayout(defaultLayout);\n });\n },\n [defaultLayout, user.username]\n );\n\n useEffect(() => {\n load();\n }, [load]);\n\n const saveData = useCallback(\n (data) => {\n fetch(`api/vui/${user.username}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }).then((response) => {\n return response.ok ? response.json() : defaultLayout;\n });\n // .then((data) => console.log(data));\n },\n [defaultLayout, user]\n );\n\n const loadLayoutById = useCallback(\n (id) => {\n load(id);\n },\n [load]\n );\n\n return [layout, saveData, loadLayoutById];\n};\n\nexport default useLayoutConfig;\n", "import { MenuRpcResponse } from \"@vuu-ui/vuu-data\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { createContext, ReactElement, ReactNode, useContext } from \"react\";\n\nexport interface ShellContextProps {\n getDefaultColumnConfig?: (\n tableName: string,\n columnName: string\n ) => Partial<ColumnDescriptor>;\n handleRpcResponse?: (response?: MenuRpcResponse) => void;\n}\n\nconst defaultConfig = {};\n\nconst ShellContext = createContext<ShellContextProps>(defaultConfig);\n\nexport interface ShellProviderProps {\n children: ReactNode;\n value: ShellContextProps;\n}\n\nconst Provider = ({\n children,\n context,\n inheritedContext,\n}: {\n children: ReactNode;\n context?: ShellContextProps;\n inheritedContext?: ShellContextProps;\n}) => {\n // TODO functions provided at multiple levels must be merged\n const mergedContext = {\n ...inheritedContext,\n ...context,\n };\n return (\n <ShellContext.Provider value={mergedContext}>\n {children}\n </ShellContext.Provider>\n );\n};\n\nexport const ShellContextProvider = ({\n children,\n value,\n}: ShellProviderProps): ReactElement => {\n return (\n <ShellContext.Consumer>\n {(context) => (\n <Provider context={value} inheritedContext={context}>\n {children}\n </Provider>\n )}\n </ShellContext.Consumer>\n );\n};\n\nexport const useShellContext = () => {\n return useContext(ShellContext);\n};\n", "import { HTMLAttributes, useCallback } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { UserProfile } from \"../user-profile\";\nimport { ThemeMode, ThemeSwitch } from \"../theme-switch\";\nimport cx from \"classnames\";\n\nimport \"./AppHeader.css\";\n\nconst classBase = \"vuuAppHeader\";\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n onSwitchTheme?: (mode: ThemeMode) => void;\n themeMode?: ThemeMode;\n user: VuuUser;\n}\n\nexport const AppHeader = ({\n className: classNameProp,\n layoutId,\n loginUrl,\n onNavigate,\n onSwitchTheme,\n themeMode = \"light\",\n user,\n ...htmlAttributes\n}: AppHeaderProps) => {\n const className = cx(classBase, classNameProp, \"salt-density-medium\");\n const handleSwitchTheme = useCallback(\n (mode: ThemeMode) => onSwitchTheme?.(mode),\n [onSwitchTheme]\n );\n return (\n <header className={className} {...htmlAttributes}>\n <ThemeSwitch defaultMode={themeMode} onChange={handleSwitchTheme} />\n <UserProfile\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={onNavigate}\n user={user}\n />\n </header>\n );\n};\n", "import React, { useCallback, useRef, useState } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { DropdownBase } from \"@heswell/salt-lab\";\nimport { UserSolidIcon } from \"@salt-ds/icons\";\nimport { UserPanel } from \"./UserPanel\";\n\nimport \"./UserProfile.css\";\n\nexport const UserProfile = ({ layoutId, loginUrl, onNavigate, user }) => {\n const [open, setOpen] = useState(false);\n const openRef = useRef(false);\n const buttonRef = useRef(null);\n\n const toggle = useCallback(() => {\n setOpen((isOpen) => {\n return (openRef.current = !isOpen);\n });\n requestAnimationFrame(() => {\n if (!openRef.current) {\n requestAnimationFrame(() => {\n buttonRef.current.focus();\n });\n }\n });\n }, []);\n\n const handleNavigate = (id) => {\n setOpen(false);\n onNavigate(id);\n };\n\n return (\n <DropdownBase\n className=\"vuuUserProfile\"\n placement=\"bottom-end\"\n onCancel={toggle}\n >\n <Button ref={buttonRef} variant=\"secondary\">\n <UserSolidIcon />\n </Button>\n <UserPanel\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={handleNavigate}\n user={user}\n />\n </DropdownBase>\n );\n};\n", "import React, { forwardRef, useCallback, useEffect, useState } from \"react\";\nimport { formatDate } from \"@vuu-ui/vuu-utils\";\nimport { logout } from \"../login\";\nimport { getLayoutHistory } from \"../get-layout-history\";\nimport { ExportIcon } from \"@salt-ds/icons\";\nimport { Button } from \"@salt-ds/core\";\nimport { List, ListItem } from \"@heswell/salt-lab\";\n\nimport \"./UserPanel.css\";\n\nconst byLastUpdate = ({ lastUpdate: l1 }, { lastUpdate: l2 }) => {\n return l2 === l1 ? 0 : l2 < l1 ? -1 : 1;\n};\n\nconst HistoryListItem = (props) => {\n return <ListItem {...props} />;\n};\n\nexport const UserPanel = forwardRef(function UserPanel(\n { loginUrl, onNavigate, user, layoutId = \"latest\" },\n forwardedRef\n) {\n const [history, setHistory] = useState([]);\n\n useEffect(() => {\n async function getHistory() {\n const history = await getLayoutHistory(user);\n console.log({ history });\n const sortedHistory = history\n .filter((item) => item.id !== \"latest\")\n .sort(byLastUpdate)\n .map(({ id, lastUpdate }) => ({\n lastUpdate,\n id,\n label: `Saved at ${formatDate(new Date(lastUpdate), \"kk:mm:ss\")}`,\n }));\n console.log({ sortedHistory });\n setHistory(sortedHistory);\n }\n\n getHistory();\n }, [user]);\n\n const handleHisorySelected = useCallback(\n (evt, selected) => {\n if (selected) {\n onNavigate(selected.id);\n }\n },\n [onNavigate]\n );\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const selected =\n history.length === 0\n ? []\n : layoutId === \"latest\"\n ? history[0]\n : history.find((i) => i.id === layoutId);\n console.log({ selected });\n\n return (\n <div className=\"vuuUserPanel\" ref={forwardedRef}>\n <List\n ListItem={HistoryListItem}\n className=\"vuuUserPanel-history\"\n onSelect={handleHisorySelected}\n selected={selected}\n source={history}\n />\n <div className=\"vuuUserPanel-buttonBar\">\n <Button aria-label=\"logout\" onClick={handleLogout}>\n <ExportIcon /> Logout\n </Button>\n </div>\n </div>\n );\n});\n", "export const getLayoutHistory = async (user) => {\n const history = await fetch(`api/vui/${user.username}`, {})\n .then((response) => {\n return response.ok ? response.json() : null;\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n console.log(`error getting history`);\n });\n\n return history;\n};\n", "import {\n ToggleButton,\n ToggleButtonGroup,\n ToggleButtonGroupChangeEventHandler,\n} from \"@heswell/salt-lab\";\nimport cx from \"classnames\";\nimport { useControlled } from \"@salt-ds/core\";\nimport { HTMLAttributes, useCallback } from \"react\";\n\nimport \"./ThemeSwitch.css\";\n\nconst classBase = \"vuuThemeSwitch\";\n\nexport type ThemeMode = \"light\" | \"dark\";\n\nexport interface ThemeSwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultMode?: ThemeMode;\n mode?: ThemeMode;\n onChange: (mode: ThemeMode) => void;\n}\n\nconst modes: ThemeMode[] = [\"light\", \"dark\"];\n\nexport const ThemeSwitch = ({\n className: classNameProp,\n defaultMode: defaultModeProp,\n mode: modeProp,\n onChange,\n ...htmlAttributes\n}: ThemeSwitchProps) => {\n const [mode, setMode] = useControlled<ThemeMode>({\n controlled: modeProp,\n default: defaultModeProp ?? \"light\",\n name: \"ThemeSwitch\",\n state: \"mode\",\n });\n\n const selectedIndex = modes.indexOf(mode);\n\n const handleChangeSecondary: ToggleButtonGroupChangeEventHandler =\n useCallback(\n (_evt, index) => {\n const mode = modes[index];\n setMode(mode);\n onChange(mode);\n },\n [onChange, setMode]\n );\n const className = cx(classBase, classNameProp);\n return (\n <ToggleButtonGroup\n className={className}\n {...htmlAttributes}\n onChange={handleChangeSecondary}\n selectedIndex={selectedIndex}\n >\n <ToggleButton\n aria-label=\"alert\"\n tooltipText=\"Light Theme\"\n data-icon=\"light\"\n />\n <ToggleButton\n aria-label=\"home\"\n tooltipText=\"Dark Theme\"\n data-icon=\"dark\"\n />\n </ToggleButtonGroup>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "Suspense", "registerComponent", "React", "Fragment", "jsx", "jsxs", "ErrorBoundary", "props", "error", "errorInfo", "jsx", "Loader", "importCSS", "path", "container", "x", "jsx", "RawFeature", "url", "css", "params", "props", "importCSS", "styleSheet", "LazyFeature", "React", "ErrorBoundary", "Suspense", "Loader", "Feature", "registerComponent", "useState", "Button", "FormField", "Input", "jsx", "jsxs", "classBase", "LoginPanel", "onSubmit", "username", "setUserName", "useState", "password", "setPassword", "login", "handleUsername", "_event", "value", "handlePassword", "dataIsValid", "FormField", "Input", "Button", "getCookieValue", "name", "_a", "row", "getAuthDetailsFromCookies", "username", "token", "redirectToLogin", "loginUrl", "logout", "connectToServer", "useCallback", "useEffect", "useRef", "useState", "useCallback", "useEffect", "useState", "useLayoutConfig", "user", "defaultLayout", "layout", "_setLayout", "setLayout", "load", "id", "response", "saveData", "data", "loadLayoutById", "use_layout_config_default", "createContext", "useContext", "jsx", "defaultConfig", "ShellContext", "Provider", "children", "context", "inheritedContext", "mergedContext", "ShellContextProvider", "value", "useShellContext", "cx", "Chest", "DraggableLayout", "Drawer", "Flexbox", "LayoutProvider", "View", "useCallback", "useCallback", "useRef", "useState", "Button", "DropdownBase", "UserSolidIcon", "forwardRef", "useCallback", "useEffect", "useState", "formatDate", "getLayoutHistory", "user", "response", "ExportIcon", "Button", "List", "ListItem", "jsx", "jsxs", "byLastUpdate", "l1", "l2", "HistoryListItem", "props", "ListItem", "UserPanel", "forwardRef", "loginUrl", "onNavigate", "user", "layoutId", "forwardedRef", "history", "setHistory", "useState", "useEffect", "getHistory", "getLayoutHistory", "sortedHistory", "item", "id", "lastUpdate", "formatDate", "handleHisorySelected", "useCallback", "evt", "selected", "handleLogout", "logout", "i", "List", "Button", "ExportIcon", "jsx", "jsxs", "UserProfile", "layoutId", "loginUrl", "onNavigate", "user", "open", "setOpen", "useState", "openRef", "useRef", "buttonRef", "toggle", "useCallback", "isOpen", "DropdownBase", "Button", "UserSolidIcon", "UserPanel", "id", "ToggleButton", "ToggleButtonGroup", "cx", "useControlled", "useCallback", "jsx", "jsxs", "classBase", "modes", "ThemeSwitch", "classNameProp", "defaultModeProp", "modeProp", "onChange", "htmlAttributes", "mode", "setMode", "useControlled", "selectedIndex", "handleChangeSecondary", "useCallback", "_evt", "index", "className", "cx", "ToggleButtonGroup", "ToggleButton", "cx", "jsx", "jsxs", "classBase", "AppHeader", "classNameProp", "layoutId", "loginUrl", "onNavigate", "onSwitchTheme", "themeMode", "user", "htmlAttributes", "className", "cx", "handleSwitchTheme", "useCallback", "mode", "ThemeSwitch", "UserProfile", "jsx", "jsxs", "warningLayout", "Shell", "children", "classNameProp", "defaultLayout", "leftSidePanel", "loginUrl", "serverUrl", "user", "htmlAttributes", "rootRef", "useRef", "density", "useState", "paletteView", "open", "setOpen", "layoutId", "layout", "setLayoutConfig", "loadLayoutById", "use_layout_config_default", "handleLayoutChange", "useCallback", "handleSwitchTheme", "mode", "handleDrawerClick", "e", "_a", "target", "handleNavigate", "id", "useEffect", "connectToServer", "getDrawers", "drawers", "Drawer", "View", "className", "cx", "ShellContextProvider", "LayoutProvider", "DraggableLayout", "Flexbox", "AppHeader", "Chest"]
7
7
  }
package/index.css CHANGED
@@ -1,2 +1,2 @@
1
- .vuuLoginPanel{--hwTextInput-border: solid 1px #ccc;--hwTextInput-height: 28px;--hwTextInput-padding: 0 12px;--hwTextInput-width: 100%;--login-row-height: 60px;align-content:center;align-items:center;border:solid 1px lightgray;display:flex;flex-direction:column;gap:24px;justify-content:center;justify-items:center;margin:0 auto;padding:48px 48px 24px;width:fit-content}.vuuLoginPanel-login{grid-column:2/3;align-self:end;justify-self:end}.vuuUserPanel{background-color:#fff;display:flex;flex-direction:column;max-height:400px;padding:12px}vuuUserPanel-history{flex:1 1 auto}.vuuUserPanel-buttonBar{--saltButton-width: 100%;align-items:flex-end;border-top:1px solid var(--surface3);display:flex;flex:0 0 32px;justify-content:flex-start}.btn-logout{--hwButton-icon-left: 12px;--hwButton-padding: 0 6px 0 24px;padding-left:24px}.vuuUserProfile{--svg-icon: var(--svg-user)}.hwAppHeader{justify-content:flex-end;display:flex;height:40px;border-bottom:solid 1px #ccc}.vuuShell{background-color:var(--salt-container-primary-background, ivory);height:var(--vuuShell-height, 100vh);width:var(--vuuShell-width, 100vw)}.vuuShell-palette{--vuuView-border: none;--vuuView-margin: 0}.vuuShell-warningPlaceholder{background-color:var(--salt-container-background-high);height:100%}
1
+ .vuuLoginPanel{--hwTextInput-border: solid 1px #ccc;--hwTextInput-height: 28px;--hwTextInput-padding: 0 12px;--hwTextInput-width: 100%;--login-row-height: 60px;align-content:center;align-items:center;border:solid 1px lightgray;display:flex;flex-direction:column;gap:24px;justify-content:center;justify-items:center;margin:0 auto;padding:48px 48px 24px;width:fit-content}.vuuLoginPanel-login{grid-column:2/3;align-self:end;justify-self:end}.vuuUserPanel{background-color:#fff;display:flex;flex-direction:column;max-height:400px;padding:12px}vuuUserPanel-history{flex:1 1 auto}.vuuUserPanel-buttonBar{--saltButton-width: 100%;align-items:flex-end;border-top:1px solid var(--surface3);display:flex;flex:0 0 32px;justify-content:flex-start}.btn-logout{--hwButton-icon-left: 12px;--hwButton-padding: 0 6px 0 24px;padding-left:24px}.vuuUserProfile{--svg-icon: var(--svg-user)}.vuuThemeSwitch{--saltButton-minWidth: 22px}.vuuThemeSwitch{--svg-light: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><path d="M24 31q2.9 0 4.95-2.05Q31 26.9 31 24q0-2.9-2.05-4.95Q26.9 17 24 17q-2.9 0-4.95 2.05Q17 21.1 17 24q0 2.9 2.05 4.95Q21.1 31 24 31Zm0 3q-4.15 0-7.075-2.925T14 24q0-4.15 2.925-7.075T24 14q4.15 0 7.075 2.925T34 24q0 4.15-2.925 7.075T24 34ZM3.5 25.5q-.65 0-1.075-.425Q2 24.65 2 24q0-.65.425-1.075Q2.85 22.5 3.5 22.5h5q.65 0 1.075.425Q10 23.35 10 24q0 .65-.425 1.075-.425.425-1.075.425Zm36 0q-.65 0-1.075-.425Q38 24.65 38 24q0-.65.425-1.075.425-.425 1.075-.425h5q.65 0 1.075.425Q46 23.35 46 24q0 .65-.425 1.075-.425.425-1.075.425ZM24 10q-.65 0-1.075-.425Q22.5 9.15 22.5 8.5v-5q0-.65.425-1.075Q23.35 2 24 2q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 10 24 10Zm0 36q-.65 0-1.075-.425-.425-.425-.425-1.075v-5q0-.65.425-1.075Q23.35 38 24 38q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 46 24 46ZM12 14.1l-2.85-2.8q-.45-.45-.425-1.075.025-.625.425-1.075.45-.45 1.075-.45t1.075.45L14.1 12q.4.45.4 1.05 0 .6-.4 1-.4.45-1.025.45-.625 0-1.075-.4Zm24.7 24.75L33.9 36q-.4-.45-.4-1.075t.45-1.025q.4-.45 1-.45t1.05.45l2.85 2.8q.45.45.425 1.075-.025.625-.425 1.075-.45.45-1.075.45t-1.075-.45ZM33.9 14.1q-.45-.45-.45-1.05 0-.6.45-1.05l2.8-2.85q.45-.45 1.075-.425.625.025 1.075.425.45.45.45 1.075t-.45 1.075L36 14.1q-.4.4-1.025.4-.625 0-1.075-.4ZM9.15 38.85q-.45-.45-.45-1.075t.45-1.075L12 33.9q.45-.45 1.05-.45.6 0 1.05.45.45.45.45 1.05 0 .6-.45 1.05l-2.8 2.85q-.45.45-1.075.425-.625-.025-1.075-.425ZM24 24Z"/></svg>');--svg-dark: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><path d="M24 42q-7.5 0-12.75-5.25T6 24q0-7.5 5.25-12.75T24 6q.4 0 .85.025.45.025 1.15.075-1.8 1.6-2.8 3.95-1 2.35-1 4.95 0 4.5 3.15 7.65Q28.5 25.8 33 25.8q2.6 0 4.95-.925T41.9 22.3q.05.6.075.975Q42 23.65 42 24q0 7.5-5.25 12.75T24 42Zm0-3q5.45 0 9.5-3.375t5.05-7.925q-1.25.55-2.675.825Q34.45 28.8 33 28.8q-5.75 0-9.775-4.025T19.2 15q0-1.2.25-2.575.25-1.375.9-3.125-4.9 1.35-8.125 5.475Q9 18.9 9 24q0 6.25 4.375 10.625T24 39Zm-.2-14.85Z"/></svg>')}.vuuThemeSwitch [data-icon=light]{--vuu-icon-size: 18px;--vuu-icon-svg: var(--svg-light)}.vuuThemeSwitch [data-icon=dark]{--vuu-icon-size: 18px;--vuu-icon-svg: var(--svg-dark)}.vuuAppHeader{align-items:center;border-bottom:solid 1px var(--salt-container-secondary-borderColor);display:flex;height:40px;justify-content:flex-end}.vuuShell{background-color:var(--salt-container-primary-background, ivory);height:var(--vuuShell-height, 100vh);width:var(--vuuShell-width, 100vw)}.vuuShell-palette{--vuuView-border: none;--vuuView-margin: 0}.vuuShell-warningPlaceholder{background-color:var(--salt-container-background-high);height:100%}
2
2
  /*# sourceMappingURL=index.css.map */
package/index.css.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../packages/vuu-shell/src/login/LoginPanel.css", "../../../packages/vuu-shell/src/user-profile/UserPanel.css", "../../../packages/vuu-shell/src/user-profile/UserProfile.css", "../../../packages/vuu-shell/src/app-header/AppHeader.css", "../../../packages/vuu-shell/src/shell.css"],
4
- "sourcesContent": [".vuuLoginPanel {\n --hwTextInput-border: solid 1px #ccc;\n --hwTextInput-height: 28px;\n --hwTextInput-padding: 0 12px;\n --hwTextInput-width: 100%;\n --login-row-height: 60px;\n align-content: center;\n align-items: center;\n border: solid 1px lightgray;\n display: flex;\n flex-direction: column;\n gap: 24px;\n justify-content: center;\n justify-items: center;\n margin: 0 auto;\n padding: 48px 48px 24px 48px;\n width: fit-content;\n}\n\n.vuuLoginPanel-login {\n grid-column: 2/3;\n align-self: end;\n justify-self: end;\n}\n", ".vuuUserPanel {\n background-color: white;\n display: flex;\n flex-direction: column;\n max-height: 400px;\n padding: 12px;\n}\n\nvuuUserPanel-history {\n flex: 1 1 auto;\n}\n\n.vuuUserPanel-buttonBar {\n --saltButton-width: 100%;\n align-items: flex-end;\n border-top: 1px solid var(--surface3);\n display: flex;\n flex: 0 0 32px;\n justify-content: flex-start;\n}\n\n.btn-logout {\n --hwButton-icon-left: 12px;\n --hwButton-padding: 0 6px 0 24px;\n padding-left: 24px;\n}\n", ".vuuUserProfile {\n --svg-icon: var(--svg-user);\n}\n", ".hwAppHeader {\n justify-content: flex-end;\n display: flex;\n height: 40px;\n border-bottom: solid 1px #ccc;\n}\n", ".vuuShell {\n background-color: var(--salt-container-primary-background, ivory);\n height: var(--vuuShell-height, 100vh);\n width: var(--vuuShell-width, 100vw);\n}\n\n.vuuShell-palette {\n --vuuView-border: none;\n --vuuView-margin: 0;\n}\n\n.vuuShell-warningPlaceholder {\n background-color: var(--salt-container-background-high);\n height: 100%;\n}\n"],
5
- "mappings": "AAAA,eACE,qCACA,2BACA,8BACA,0BACA,yBACA,qBACA,mBACA,2BACA,aACA,sBACA,SACA,uBACA,qBAbF,qCAgBE,kBAGF,qBACE,gBACA,eACA,iBCtBF,cACE,sBACA,aACA,sBACA,iBAJF,aAQA,qBACE,cAGF,wBACE,yBACA,qBACA,qCACA,aACA,cACA,2BAGF,YACE,2BACA,iCACA,kBCxBF,gBACE,4BCDF,aACE,yBACA,aACA,YACA,6BCJF,UACE,iEACA,qCACA,mCAGF,kBACE,uBACA,oBAGF,6BACE,uDACA",
3
+ "sources": ["../../../packages/vuu-shell/src/login/LoginPanel.css", "../../../packages/vuu-shell/src/user-profile/UserPanel.css", "../../../packages/vuu-shell/src/user-profile/UserProfile.css", "../../../packages/vuu-shell/src/theme-switch/ThemeSwitch.css", "../../../packages/vuu-shell/src/app-header/AppHeader.css", "../../../packages/vuu-shell/src/shell.css"],
4
+ "sourcesContent": [".vuuLoginPanel {\n --hwTextInput-border: solid 1px #ccc;\n --hwTextInput-height: 28px;\n --hwTextInput-padding: 0 12px;\n --hwTextInput-width: 100%;\n --login-row-height: 60px;\n align-content: center;\n align-items: center;\n border: solid 1px lightgray;\n display: flex;\n flex-direction: column;\n gap: 24px;\n justify-content: center;\n justify-items: center;\n margin: 0 auto;\n padding: 48px 48px 24px 48px;\n width: fit-content;\n}\n\n.vuuLoginPanel-login {\n grid-column: 2/3;\n align-self: end;\n justify-self: end;\n}\n", ".vuuUserPanel {\n background-color: white;\n display: flex;\n flex-direction: column;\n max-height: 400px;\n padding: 12px;\n}\n\nvuuUserPanel-history {\n flex: 1 1 auto;\n}\n\n.vuuUserPanel-buttonBar {\n --saltButton-width: 100%;\n align-items: flex-end;\n border-top: 1px solid var(--surface3);\n display: flex;\n flex: 0 0 32px;\n justify-content: flex-start;\n}\n\n.btn-logout {\n --hwButton-icon-left: 12px;\n --hwButton-padding: 0 6px 0 24px;\n padding-left: 24px;\n}\n", ".vuuUserProfile {\n --svg-icon: var(--svg-user);\n}\n", ".vuuThemeSwitch {\n --saltButton-minWidth: 22px;\n}\n\n.vuuThemeSwitch {\n --svg-light: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><path d=\"M24 31q2.9 0 4.95-2.05Q31 26.9 31 24q0-2.9-2.05-4.95Q26.9 17 24 17q-2.9 0-4.95 2.05Q17 21.1 17 24q0 2.9 2.05 4.95Q21.1 31 24 31Zm0 3q-4.15 0-7.075-2.925T14 24q0-4.15 2.925-7.075T24 14q4.15 0 7.075 2.925T34 24q0 4.15-2.925 7.075T24 34ZM3.5 25.5q-.65 0-1.075-.425Q2 24.65 2 24q0-.65.425-1.075Q2.85 22.5 3.5 22.5h5q.65 0 1.075.425Q10 23.35 10 24q0 .65-.425 1.075-.425.425-1.075.425Zm36 0q-.65 0-1.075-.425Q38 24.65 38 24q0-.65.425-1.075.425-.425 1.075-.425h5q.65 0 1.075.425Q46 23.35 46 24q0 .65-.425 1.075-.425.425-1.075.425ZM24 10q-.65 0-1.075-.425Q22.5 9.15 22.5 8.5v-5q0-.65.425-1.075Q23.35 2 24 2q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 10 24 10Zm0 36q-.65 0-1.075-.425-.425-.425-.425-1.075v-5q0-.65.425-1.075Q23.35 38 24 38q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 46 24 46ZM12 14.1l-2.85-2.8q-.45-.45-.425-1.075.025-.625.425-1.075.45-.45 1.075-.45t1.075.45L14.1 12q.4.45.4 1.05 0 .6-.4 1-.4.45-1.025.45-.625 0-1.075-.4Zm24.7 24.75L33.9 36q-.4-.45-.4-1.075t.45-1.025q.4-.45 1-.45t1.05.45l2.85 2.8q.45.45.425 1.075-.025.625-.425 1.075-.45.45-1.075.45t-1.075-.45ZM33.9 14.1q-.45-.45-.45-1.05 0-.6.45-1.05l2.8-2.85q.45-.45 1.075-.425.625.025 1.075.425.45.45.45 1.075t-.45 1.075L36 14.1q-.4.4-1.025.4-.625 0-1.075-.4ZM9.15 38.85q-.45-.45-.45-1.075t.45-1.075L12 33.9q.45-.45 1.05-.45.6 0 1.05.45.45.45.45 1.05 0 .6-.45 1.05l-2.8 2.85q-.45.45-1.075.425-.625-.025-1.075-.425ZM24 24Z\"/></svg>');\n --svg-dark: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><path d=\"M24 42q-7.5 0-12.75-5.25T6 24q0-7.5 5.25-12.75T24 6q.4 0 .85.025.45.025 1.15.075-1.8 1.6-2.8 3.95-1 2.35-1 4.95 0 4.5 3.15 7.65Q28.5 25.8 33 25.8q2.6 0 4.95-.925T41.9 22.3q.05.6.075.975Q42 23.65 42 24q0 7.5-5.25 12.75T24 42Zm0-3q5.45 0 9.5-3.375t5.05-7.925q-1.25.55-2.675.825Q34.45 28.8 33 28.8q-5.75 0-9.775-4.025T19.2 15q0-1.2.25-2.575.25-1.375.9-3.125-4.9 1.35-8.125 5.475Q9 18.9 9 24q0 6.25 4.375 10.625T24 39Zm-.2-14.85Z\"/></svg>');\n}\n\n.vuuThemeSwitch [data-icon='light'] {\n --vuu-icon-size: 18px;\n --vuu-icon-svg: var(--svg-light);\n}\n.vuuThemeSwitch [data-icon='dark'] {\n --vuu-icon-size: 18px;\n --vuu-icon-svg: var(--svg-dark);\n}\n", ".vuuAppHeader {\n align-items: center;\n border-bottom: solid 1px var(--salt-container-secondary-borderColor);\n display: flex;\n height: 40px;\n justify-content: flex-end;\n}\n", ".vuuShell {\n background-color: var(--salt-container-primary-background, ivory);\n height: var(--vuuShell-height, 100vh);\n width: var(--vuuShell-width, 100vw);\n}\n\n.vuuShell-palette {\n --vuuView-border: none;\n --vuuView-margin: 0;\n}\n\n.vuuShell-warningPlaceholder {\n background-color: var(--salt-container-background-high);\n height: 100%;\n}\n"],
5
+ "mappings": "AAAA,eACE,qCACA,2BACA,8BACA,0BACA,yBACA,qBACA,mBACA,2BACA,aACA,sBACA,SACA,uBACA,qBAbF,qCAgBE,kBAGF,qBACE,gBACA,eACA,iBCtBF,cACE,sBACA,aACA,sBACA,iBAJF,aAQA,qBACE,cAGF,wBACE,yBACA,qBACA,qCACA,aACA,cACA,2BAGF,YACE,2BACA,iCACA,kBCxBF,gBACE,4BCDF,gBACI,4BAGJ,gBACI,kgDACA,miBAGJ,kCACI,sBACA,iCAEJ,iCACI,sBACA,gCCfJ,cACE,mBACA,oEACA,aACA,YACA,yBCLF,UACE,iEACA,qCACA,mCAGF,kBACE,uBACA,oBAGF,6BACE,uDACA",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@vuu-ui/vuu-shell",
3
- "version": "0.5.20",
3
+ "version": "0.6.0",
4
4
  "description": "VUU UI Shell",
5
5
  "author": "heswell",
6
6
  "license": "Apache-2.0",
7
7
  "peerDependencies": {
8
8
  "@salt-ds/core": "1.0.0",
9
9
  "@salt-ds/icons": "1.0.0",
10
- "@heswell/salt-lab": "1.0.0-alpha.0",
11
- "@vuu-ui/vuu-data": "0.5.20",
12
- "@vuu-ui/vuu-layout": "0.5.20",
13
- "@vuu-ui/vuu-utils": "0.5.20",
10
+ "@heswell/salt-lab": "1.0.0-alpha.0-vuu.1",
11
+ "@vuu-ui/vuu-data": "0.6.0",
12
+ "@vuu-ui/vuu-layout": "0.6.0",
13
+ "@vuu-ui/vuu-utils": "0.6.0",
14
14
  "classnames": "^2.2.6",
15
15
  "react": "^17.0.2",
16
16
  "react-dom": "^17.0.2"