✨ add floating button to open files tab
This commit is contained in:
parent
34be0e700d
commit
81ad78ba79
7 changed files with 77 additions and 12 deletions
|
@ -16,6 +16,10 @@ import More from '../images/more.svg';
|
|||
import Code from '../images/code.svg';
|
||||
import Terminal from '../images/terminal.svg';
|
||||
|
||||
import CircleTerminal from '../images/circle-terminal.svg';
|
||||
import CircleFolder from '../images/circle-folder.svg';
|
||||
import CircleInfo from '../images/circle-info.svg';
|
||||
|
||||
|
||||
// HOC that adds the right web accessibility props
|
||||
// https://www.scottohara.me/blog/2019/05/22/contextual-images-svgs-and-a11y.html
|
||||
|
@ -81,3 +85,7 @@ export const PlayIcon = withLabel(Play);
|
|||
export const MoreIcon = withLabel(More);
|
||||
export const TerminalIcon = withLabel(Terminal);
|
||||
export const CodeIcon = withLabel(Code);
|
||||
|
||||
export const CircleTerminalIcon = withLabel(CircleTerminal);
|
||||
export const CircleFolderIcon = withLabel(CircleFolder);
|
||||
export const CircleInfoIcon = withLabel(CircleInfo);
|
||||
|
|
40
client/components/mobile/FloatingNav.jsx
Normal file
40
client/components/mobile/FloatingNav.jsx
Normal file
|
@ -0,0 +1,40 @@
|
|||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import styled from 'styled-components';
|
||||
import { remSize } from '../../theme';
|
||||
import Button from '../../common/Button';
|
||||
import IconButton from './IconButton';
|
||||
|
||||
const FloatingContainer = styled.div`
|
||||
position: absolute;
|
||||
right: ${remSize(16)};
|
||||
top: ${remSize(80)};
|
||||
|
||||
text-align: right;
|
||||
z-index: 3;
|
||||
`;
|
||||
|
||||
const FloatingNav = ({ items }) => (
|
||||
<FloatingContainer>
|
||||
{ items.map(({ icon, onPress }) =>
|
||||
(
|
||||
<IconButton
|
||||
onClick={onPress}
|
||||
icon={icon}
|
||||
/>
|
||||
))}
|
||||
</FloatingContainer>
|
||||
);
|
||||
|
||||
FloatingNav.propTypes = {
|
||||
items: PropTypes.arrayOf(PropTypes.shape({
|
||||
icon: PropTypes.element,
|
||||
onPress: PropTypes.func
|
||||
}))
|
||||
};
|
||||
|
||||
FloatingNav.defaultProps = {
|
||||
items: []
|
||||
};
|
||||
|
||||
export default FloatingNav;
|
5
client/images/circle-folder.svg
Normal file
5
client/images/circle-folder.svg
Normal file
|
@ -0,0 +1,5 @@
|
|||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="16" cy="16" r="16" fill="#333333"/>
|
||||
<path d="M25.144 12.0961V22.4321C25.144 22.8801 24.792 23.2321 24.344 23.2321H7.768C7.32 23.2321 7 22.8801 7 22.4321V12.0961C7 11.2321 7.704 10.5281 8.568 10.5281H23.576C24.44 10.5281 25.144 11.2321 25.144 12.0961Z" fill="#F0F0F0"/>
|
||||
<path d="M9.24023 9.6C9.24023 9.6 9.24023 8 10.5842 8H15.1282C16.4402 8 16.4402 9.6 16.4402 9.6H9.24023Z" fill="#F0F0F0"/>
|
||||
</svg>
|
After Width: | Height: | Size: 507 B |
4
client/images/circle-info.svg
Normal file
4
client/images/circle-info.svg
Normal file
|
@ -0,0 +1,4 @@
|
|||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="16" cy="16" r="16" fill="#333333"/>
|
||||
<path d="M16 7C11.0154 7 7 11.0154 7 16C7 20.95 11.0154 25 16 25C20.95 25 25 20.95 25 16C25 11.0154 20.95 7 16 7ZM17.3846 21.5038H14.6846V13.7154H17.3846V21.5038ZM16 12.9538C15.1 12.9538 14.4077 12.2615 14.4077 11.3615C14.4077 10.4962 15.1 9.80385 16 9.80385C16.9 9.80385 17.5923 10.4962 17.5923 11.3615C17.5923 12.2615 16.9 12.9538 16 12.9538Z" fill="#F0F0F0"/>
|
||||
</svg>
|
After Width: | Height: | Size: 514 B |
6
client/images/circle-terminal.svg
Normal file
6
client/images/circle-terminal.svg
Normal file
|
@ -0,0 +1,6 @@
|
|||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="16" cy="16" r="16" fill="#333333"/>
|
||||
<rect x="5" y="8" width="22" height="16" rx="2" fill="#F0F0F0"/>
|
||||
<path d="M24 21H14V20H24V21Z" fill="#333333"/>
|
||||
<path d="M10.4081 16.0231L8.3676 18.0637C8.27757 18.1537 8.15754 18.1537 8.06752 18.0637C7.97749 17.9736 7.97749 17.8536 8.06752 17.7636L9.95802 15.8731L8.06752 13.9826C7.97749 13.8926 7.97749 13.7725 8.06752 13.6675C8.15754 13.5775 8.27757 13.5775 8.3676 13.6675L10.4081 15.723C10.4532 15.753 10.4832 15.8131 10.4832 15.8731C10.4832 15.9181 10.4532 15.9781 10.4081 16.0231Z" fill="#333333"/>
|
||||
</svg>
|
After Width: | Height: | Size: 656 B |
|
@ -34,7 +34,9 @@ class App extends React.Component {
|
|||
render() {
|
||||
return (
|
||||
<div className="app">
|
||||
<div style={{ display: 'none' }}>
|
||||
{this.state.isMounted && !window.devToolsExtension && getConfig('NODE_ENV') === 'development' && <DevTools />}
|
||||
</div>
|
||||
{this.props.children}
|
||||
</div>
|
||||
);
|
||||
|
|
|
@ -20,7 +20,7 @@ import { getHTMLFile } from '../reducers/files';
|
|||
|
||||
// Local Imports
|
||||
import Editor from '../components/Editor';
|
||||
import { PlayIcon, MoreIcon } from '../../../common/icons';
|
||||
import { PlayIcon, MoreIcon, CircleFolderIcon } from '../../../common/icons';
|
||||
|
||||
import IconButton from '../../../components/mobile/IconButton';
|
||||
import Header from '../../../components/mobile/Header';
|
||||
|
@ -30,12 +30,12 @@ import IDEWrapper from '../../../components/mobile/IDEWrapper';
|
|||
import MobileExplorer from '../../../components/mobile/Explorer';
|
||||
import Console from '../components/Console';
|
||||
import { remSize } from '../../../theme';
|
||||
// import OverlayManager from '../../../components/OverlayManager';
|
||||
|
||||
import ActionStrip from '../../../components/mobile/ActionStrip';
|
||||
import useAsModal from '../../../components/useAsModal';
|
||||
import { PreferencesIcon } from '../../../common/icons';
|
||||
import Dropdown from '../../../components/Dropdown';
|
||||
import Sidebar from '../../../components/mobile/Sidebar';
|
||||
import FloatingNav from '../../../components/mobile/FloatingNav';
|
||||
|
||||
|
||||
const getRootFile = files => files && files.filter(file => file.name === 'root')[0];
|
||||
|
@ -65,7 +65,7 @@ const NavItem = styled.li`
|
|||
position: relative;
|
||||
`;
|
||||
|
||||
const getNatOptions = (username = undefined) =>
|
||||
const getNavOptions = (username = undefined) =>
|
||||
(username
|
||||
? [
|
||||
{ icon: PreferencesIcon, title: 'Preferences', href: '/mobile/preferences', },
|
||||
|
@ -112,14 +112,18 @@ const MobileIDEView = (props) => {
|
|||
|
||||
// Screen Modals
|
||||
const [toggleNavDropdown, NavDropDown] = useAsModal(<Dropdown
|
||||
items={getNatOptions(username)}
|
||||
items={getNavOptions(username)}
|
||||
align="right"
|
||||
/>);
|
||||
|
||||
|
||||
const [toggleExplorer, Explorer] = useAsModal(<MobileExplorer id={getRootFileID(files)} canEdit={false} />, true);
|
||||
|
||||
// toggle sidebar starting opened
|
||||
useEffect(toggleExplorer, []);
|
||||
// useEffect(toggleExplorer, []);
|
||||
|
||||
const floatingNavOptions =
|
||||
[{ icon: CircleFolderIcon, onPress: toggleExplorer }];
|
||||
|
||||
return (
|
||||
<Screen fullscreen>
|
||||
|
@ -129,11 +133,6 @@ const MobileIDEView = (props) => {
|
|||
subtitle={selectedFile.name}
|
||||
>
|
||||
<NavItem>
|
||||
<IconButton
|
||||
onClick={toggleExplorer}
|
||||
icon={MoreIcon}
|
||||
aria-label="Options"
|
||||
/>
|
||||
<IconButton
|
||||
onClick={toggleNavDropdown}
|
||||
icon={MoreIcon}
|
||||
|
@ -180,6 +179,7 @@ const MobileIDEView = (props) => {
|
|||
provideController={setTmController}
|
||||
setUnsavedChanges={setUnsavedChanges}
|
||||
/>
|
||||
<FloatingNav items={floatingNavOptions} />
|
||||
</IDEWrapper>
|
||||
|
||||
<Footer>
|
||||
|
|
Loading…
Reference in a new issue