From 4e9518f59eeb55c8fe06e9d3240c80d91032009f Mon Sep 17 00:00:00 2001 From: rlazarini <remi.lazarini@cea.fr> Date: Tue, 17 Sep 2024 10:09:41 +0200 Subject: [PATCH] [Ivette] add animation on sidePanel + rename --- .../frame/{sidePanel.tsx => panel.tsx} | 61 ++++----- ivette/src/dome/renderer/frame/style.css | 121 ++++++++++-------- 2 files changed, 88 insertions(+), 94 deletions(-) rename ivette/src/dome/renderer/frame/{sidePanel.tsx => panel.tsx} (73%) diff --git a/ivette/src/dome/renderer/frame/sidePanel.tsx b/ivette/src/dome/renderer/frame/panel.tsx similarity index 73% rename from ivette/src/dome/renderer/frame/sidePanel.tsx rename to ivette/src/dome/renderer/frame/panel.tsx index ef314ca6167..b1851a3e9f5 100644 --- a/ivette/src/dome/renderer/frame/sidePanel.tsx +++ b/ivette/src/dome/renderer/frame/panel.tsx @@ -21,26 +21,15 @@ /* ************************************************************************ */ /** - This package allow us to add a side panel inside the elements. - - The main element is SidePanel. - This component needs two chidren : - ``` - <SidePANEL> - <PanelContent /> - <A /> - </SidePanel> - ``` - "A" is the content that needs a sidePanel, - the first child is the panel content. - - This package provide some components to creating the side panel content : + This package allows us to add a panel inside positioned elements. + + It provides some components to create the panel content: * ListElement * Text * Actions @packageDocumentation - @module dome/frame/sidePanel + @module dome/frame/Panel */ import { Label } from 'dome/controls/labels'; @@ -49,40 +38,34 @@ import { classes } from 'dome/misc/utils'; /* --------------------------------------------------------------------------*/ -/* --- SidePanel Container */ +/* --- Panel Container */ /* --------------------------------------------------------------------------*/ -interface SidePanelProps { +interface PanelProps { className?: string; show?: boolean; position?: 'left' | 'right' - children: [JSX.Element, JSX.Element]; + children: JSX.Element[]; } -export const SidePanel = (props: SidePanelProps): JSX.Element => { +export const Panel = (props: PanelProps): JSX.Element => { const { show = true, className, position } = props; - const classContainer = 'dome-sidepanel-container'; const classNames = classes( - classContainer, - position === 'left' ? classContainer+'-left' : classContainer+'-right', + 'dome-xPanel', + position === 'left' ? 'dome-xPanel-left' : 'dome-xPanel-right', + show ? 'dome-xPanel-open' : 'dome-xPanel-close', className, ); - const [A, panelContent] = props.children; return ( - <div className='dome-sidepanel'> - { show && - <div className={classNames}> - {panelContent} - </div> - } - {A} + <div className={classNames}> + {props.children} </div> ); }; /* --------------------------------------------------------------------------*/ -/* --- SidePanel List */ +/* --- Panel List */ /* --------------------------------------------------------------------------*/ export interface ElementProps { label: string; @@ -94,17 +77,17 @@ const Element = (props: ElementProps): JSX.Element => { const { label, onClickName, content } = props; const nameClasse = classes( - 'dome-sidepanel-element-name', + 'dome-xPanel-element-name', onClickName && "action" ); return ( - <div className='dome-sidepanel-element'> + <div className='dome-xPanel-element'> <div className={nameClasse} onClick={() => { if(onClickName) onClickName(); }} >{label}</div> - <div className='dome-sidepanel-element-content'> + <div className='dome-xPanel-element-content'> {content} </div> </div> @@ -117,7 +100,7 @@ interface ListElementProps { export function ListElement(props: ListElementProps): JSX.Element { return ( - <div className='dome-sidepanel-list'> + <div className='dome-xPanel-list'> { props.list.map((elt, k) => <Element key={k} {...elt} @@ -128,7 +111,7 @@ export function ListElement(props: ListElementProps): JSX.Element { } /* --------------------------------------------------------------------------*/ -/* --- SidePanel Text */ +/* --- Panel Text */ /* --------------------------------------------------------------------------*/ interface TextProps { label: string; @@ -137,7 +120,7 @@ interface TextProps { export function Text(props: TextProps): JSX.Element { return ( - <div className='dome-sidepanel-text'> + <div className='dome-xPanel-text'> <Label> {props.label} </Label> @@ -147,7 +130,7 @@ export function Text(props: TextProps): JSX.Element { } /* --------------------------------------------------------------------------*/ -/* --- SidePanel Button */ +/* ---Panel Button */ /* --------------------------------------------------------------------------*/ interface ActionsProps { children: React.ReactNode; @@ -155,7 +138,7 @@ interface ActionsProps { export function Actions(props: ActionsProps): JSX.Element { return ( - <div className='dome-sidepanel-actions'> + <div className='dome-xPanel-actions'> {props.children} </div> ); diff --git a/ivette/src/dome/renderer/frame/style.css b/ivette/src/dome/renderer/frame/style.css index 0c28dc4ee8c..448cd5618b3 100644 --- a/ivette/src/dome/renderer/frame/style.css +++ b/ivette/src/dome/renderer/frame/style.css @@ -591,72 +591,83 @@ input:checked + .dome-xSwitch-slider:before { /* -------------------------------------------------------------------------- */ /* --- Side Panel --- */ /* -------------------------------------------------------------------------- */ -.dome-sidepanel { - position: relative; - width: 100%; - height: 100%; +.dome-xPanel { + position: absolute; + top:0; + max-width: 350px; + max-height: 100%; + overflow-y: scroll; + z-index: 50; + background-color: var(--background-interaction); + padding: 10px 5px; + transition: transform .5s ease-in-out, opacity .5s; + + &::-webkit-scrollbar { display: none; } + + &.dome-xPanel-open { + transform: translateX(0px); + opacity: 1; + } - .dome-sidepanel-container { - position: absolute; - top:0; - max-width: 350px; - max-height: 100%; - overflow-y: scroll; - z-index: 50; - background-color: var(--background-interaction); - padding: 10px 5px; + &.dome-xPanel-left { + border-radius: 0 20px 20px 0; - &::-webkit-scrollbar { display: none; } + &.dome-xPanel-close { + transform: translateX(-350px); + opacity: 0; + } + } - &.dome-sidepanel-container-left { - border-radius: 0 20px 20px 0; - } - &.dome-sidepanel-container-right { - right: 0; - border-radius: 20px 0 0 20px; - } + &.dome-xPanel-right { + right: 0; + border-radius: 20px 0 0 20px; - .dome-sidepanel-text { - color: var(--text); - padding-bottom: 3px; - } + &.dome-xPanel-close { + transform: translateX(350px); + opacity: 0; + } + } - .dome-sidepanel-actions { - display: flex; + .dome-xPanel-text { + color: var(--text); + padding-bottom: 3px; + } + + .dome-xPanel-actions { + display: flex; + + button:hover, + button:hover label { + cursor: pointer; + } + } + + .dome-xPanel-list { + .dome-xPanel-element { + margin:5px; + background-color: var(--background); + overflow-x: hidden; + border-radius: 0 10px 0 10px; + + .dome-xPanel-element-name { + background-color: var(--background-profound); + font-weight: bold; + width: 100%; + padding: 5px 10px; - button:hover, - button:hover label { + &.action:hover { cursor: pointer; + background-color: var(--background-profound-hover); } } - .dome-sidepanel-list { - .dome-sidepanel-element { - margin:5px; - background-color: var(--background); - overflow-x: hidden; - border-radius: 0 10px 0 10px; - - .dome-sidepanel-element-name { - background-color: var(--background-profound); - font-weight: bold; - width: 100%; - padding: 5px 10px; - - &.action:hover { - cursor: pointer; - background-color: var(--background-profound-hover); - } - } - - .dome-sidepanel-element-content { - padding: 4px; - - &:has(*){ - padding: 10px; - } - } + .dome-xPanel-element-content { + padding: 4px; + + &:has(*){ + padding: 10px; } } } } +} -- GitLab