From 9812db5cd6753853e17d3a43d5cdbeee80c44ed7 Mon Sep 17 00:00:00 2001 From: Frank Johnson Date: Sat, 11 Sep 2021 04:34:13 -0400 Subject: [PATCH] got working toggle tabs! I don't like HeadlessUI's Tabs, they don't appear to support programmatic opening --- .../src/components/IdeHeader/IdeHeader.tsx | 15 ++- .../src/components/IdeSideBar/IdeSideBar.tsx | 104 ++++++++++++------ .../src/components/IdeWrapper/IdeWrapper.tsx | 18 +-- app/web/src/index.css | 23 ++++ 4 files changed, 110 insertions(+), 50 deletions(-) diff --git a/app/web/src/components/IdeHeader/IdeHeader.tsx b/app/web/src/components/IdeHeader/IdeHeader.tsx index 62822db..cee2c50 100644 --- a/app/web/src/components/IdeHeader/IdeHeader.tsx +++ b/app/web/src/components/IdeHeader/IdeHeader.tsx @@ -65,8 +65,13 @@ const IdeHeader = ({ return (
- {_projectId ? ( -
+
+
+ + + +
+ {_projectId && <> -
- ) : ( -
- )} + } +
{canEdit && !projectTitle && ( {

Some Files!

}, + panel:

Some Files!

, }, { name: 'GitHub', icon: 'github', disabled: false, - panel: () => {

Le GitHub Integration™️

}, + panel:

Le GitHub Integration™️

, }, { name: 'Visibility', @@ -40,42 +40,74 @@ const sidebarBottomConfig : SidebarConfigType[] = [ }, ] -const IdeSideBar = () => { +const combinedConfig = [ + ...sidebarTopConfig, + ...sidebarBottomConfig, +] + +function TabToggle({ item, className = "", active, onChange, onClick }) { return ( -
-
- - - -
- - -
- { sidebarTopConfig.map(topItem => ( - - - + + ) +} + +const IdeSideBar = () => { + const [selectedTab, setSelectedTab] = useState("") + const [lastOpen, setLastOpen] = useState("") + + function onTabClick(name) { + return function() { + if (selectedTab === name) { + setLastOpen(selectedTab) + setSelectedTab("") + } else if (selectedTab === "" && lastOpen === name) { + setSelectedTab(name) + } + } + } + + return ( +
+
+
+ { sidebarTopConfig.map((topItem, i) => ( + setSelectedTab(topItem.name) } + onClick={ onTabClick(topItem.name) } + /> ))} -
-
- { sidebarBottomConfig.map(bottomItem => ( - - - +
+
+ { sidebarBottomConfig.map((bottomItem, i) => ( + setSelectedTab(bottomItem.name) } + onClick={ onTabClick(bottomItem.name) } + /> ))} -
- - - { ([...sidebarTopConfig, ...sidebarBottomConfig]).map(item => item.panel && ( - { item.panel } - )) } - - -
+
+ + { combinedConfig.find(item => item.name === selectedTab)?.panel && ( +
+ { combinedConfig.find(item => item.name === selectedTab).panel } +
+ ) } + ) } diff --git a/app/web/src/components/IdeWrapper/IdeWrapper.tsx b/app/web/src/components/IdeWrapper/IdeWrapper.tsx index aceab38..e7f2af7 100644 --- a/app/web/src/components/IdeWrapper/IdeWrapper.tsx +++ b/app/web/src/components/IdeWrapper/IdeWrapper.tsx @@ -24,15 +24,17 @@ const IdeWrapper = ({ cadPackage }: Props) => { useIdeInit(cadPackage, project?.code || state?.code) return ( -
-
- -
-
- +
+
+ +
+
+ +
) diff --git a/app/web/src/index.css b/app/web/src/index.css index 0b8ef1d..0e17ea0 100644 --- a/app/web/src/index.css +++ b/app/web/src/index.css @@ -17,6 +17,29 @@ body { font-family: 'Fira Sans', ui-sans-serif, system-ui, -apple-system, system-ui, "Segoe UI", "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; } + + /* https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/ */ + .visually-hidden { + clip: rect(0 0 0 0); + clip-path: inset(50%); + height: 1px; + overflow: hidden; + position: absolute; + white-space: nowrap; + width: 1px; + } +} + +@layer components { + .tabToggle { + @apply text-ch-gray-300 p-3 mb-3 flex justify-center; + } + .tabToggle.active { + @apply bg-ch-pink-800 text-ch-pink-300 bg-opacity-30; + } + .tabToggle.disabled { + @apply text-ch-gray-550 cursor-not-allowed; + } }