A practical guide for using CSS grid for build a page layout, including a sticky header and footer, a panel with scrollable areas and a tabs module.
Read the guide at: http://bit.ly/2xIdHu0
<div class="page"> | |
<!--Sidebar--> | |
<div class="sidebar"> | |
<div class="panel"> | |
<div class="panel-header ">Project</div> | |
<!--Tree--> | |
<div class="panel-body"> | |
<ul class="tree-group"> | |
<li class="tree-item tree-item--chevron-down"> | |
<span class="tree-item-label tree-item-label--repo">vintage-shop</span> | |
<ul class="tree-group"> | |
<li class="tree-item tree-item--chevron-right"> | |
<span class="tree-item-label tree-item-label--file-directory">git</span> | |
</li> | |
<li class="tree-item tree-item--chevron-right"> | |
<span class="tree-item-label tree-item-label--file-directory">dist</span> | |
</li> | |
<li class="tree-item tree-item--chevron-right"> | |
<span class="tree-item-label tree-item-label--file-directory">node_modules</span> | |
</li> | |
<li class="tree-item tree-item--chevron-right"> | |
<span class="tree-item-label tree-item-label--file-directory">src</span> | |
</li> | |
<li class="tree-item"> | |
<span class="tree-item-label tree-item-label--file-text">.editconfig</span> | |
</li> | |
<li class="tree-item"> | |
<span class="tree-item-label tree-item-label--file-text">build.js</span> | |
</li> | |
<li class="tree-item"> | |
<span class="tree-item-label tree-item-label--file-text">development.html</span> | |
</li> | |
<li class="tree-item"> | |
<span class="tree-item-label tree-item-label--file-text">LICENSE</span> | |
</li> | |
<li class="tree-item"> | |
<span class="tree-item-label tree-item-label--file-text">package-lock.json</span> | |
</li> | |
<li class="tree-item"> | |
<span class="tree-item-label tree-item-label--file-text">production.html</span> | |
</li> | |
<li class="tree-item"> | |
<span class="tree-item-label tree-item-label--file-book">README.md</span> | |
</li> | |
<li class="tree-item"> | |
<span class="tree-item-label tree-item-label--file-text">test.html</span> | |
</li> | |
</ul> | |
</li> | |
</ul> | |
</div> | |
</div> | |
</div><!--Sidebar ends--> | |
<div class="editor"> | |
<!--Editor 1 --> | |
<div class="panel"> | |
<div class="panel-header"> | |
<div class="tabs"> | |
<div class="tab-item">scafolding.less</div> | |
<div class="tab-item tab-item--selected">styles.less</div> | |
<div class="tab-item">cart-item.stash</div> | |
</div> | |
</div> | |
<div class="panel-body"> | |
<ol class="editor-container"> | |
<li class="editor-line"></li> | |
<li class="editor-line"><span class="editor-content">Hey there!</span></li> | |
<li class="editor-line"></li> | |
</ol> | |
</div> | |
</div> | |
<!--Editor 2 --> | |
<div class="panel window-2"> | |
<div class="panel-header"> | |
<div class="tabs"> | |
<div class="tab-item tab-item--selected">styles.less</div> | |
</div> | |
</div> | |
<div class="panel-body"> | |
<ol class="editor-container"> | |
<li class="editor-line"></li> | |
<li class="editor-line"><span class="editor-content">Hey there!</span></li> | |
<li class="editor-line"></li> | |
</ol> | |
</div> | |
</div> | |
</div><!--Editor ends--> | |
<!--Footer--> | |
<div class="footer"> | |
<div class="footer-file-info"> | |
<span class="file-info-source">src/styles.less</span> | |
<span class="file-info-location">2:5</span> | |
</div> | |
<div class="footer-controls"> | |
<a href="">LF</a> | |
<a href="">UTF-8</a> | |
<a href="">Less</a> | |
<a href=""><span class="icon-git-branch"></span>master</a> | |
<a href="">⬇︎ 5 ⬆︎</a> | |
<a href=""><span class="icon-diff"></span>1 file</a> | |
<a href=""><span class="icon-squirrel"></span></a> | |
</div> | |
</div> | |
</div><!--Grid structure ends--> | |
<!-- Control Bar for demo purposes--> | |
<div class="control-bar"> | |
<button id="window-1">Close Tabs to the Right</button> | |
<button id="window-2">Split Right</button> | |
</div> |
$( "#window-2" ).click(function (){ | |
$( ".editor" ).addClass( "editor--2-windows-layout" ); | |
$( "#window-1" ).show(); | |
$( "#window-2" ).hide(); | |
}); | |
$( "#window-1" ).click(function (){ | |
$( ".editor" ).removeClass( "editor--2-windows-layout" ); | |
$( "#window-2" ).show(); | |
$( "#window-1" ).hide(); | |
}); |
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> |
/** Read the guide at: http://bit.ly/2xIdHu0 **/ | |
/** Variables & Mixins **/ | |
@bar-height: 30px; | |
.ellipsis { | |
overflow: hidden; | |
text-overflow: ellipsis; | |
white-space: nowrap; | |
} | |
/** Scafolding --------------------**/ | |
body { | |
margin: 0; | |
} | |
.page { | |
display: grid; | |
grid-template-rows: auto @bar-height; | |
grid-template-columns: 300px 1fr; | |
height: 100vh; | |
} | |
/** Panel Module **/ | |
.panel { | |
display: grid; | |
grid-template-rows: @bar-height auto; | |
height: calc(~"100vh -" @bar-height); | |
} | |
.panel-body { | |
overflow: auto; | |
} | |
/** Tabs Module **/ | |
.tabs { | |
display: grid; | |
grid-template-columns: repeat(3, 1fr); | |
height: 100%; | |
} | |
.tab-item { | |
.ellipsis; | |
text-align: center; | |
padding: 6px; | |
} | |
/** Editor **/ | |
.editor { | |
display: grid; | |
.window-2 { | |
display: none; | |
} | |
&.editor--2-windows-layout { | |
grid-template-columns: 1fr 1fr; | |
.window-2 { | |
display: grid; | |
} | |
} | |
} | |
/** Footer **/ | |
.footer { | |
display: grid; | |
grid-template-columns: 1fr auto; | |
grid-column-start: 1; | |
grid-column-end: 3; | |
} | |
.footer-file-info { | |
.ellipsis; | |
} | |
.footer-controls { | |
display: flex; | |
height: 100%; | |
justify-content: flex-end; | |
a { | |
height: 100%; | |
display: flex; | |
align-items: center; | |
} | |
} | |
/** Theme --------------------- **/ | |
/** Icons | |
* From https://octicons.github.com/ | |
**/ | |
@font-face { | |
font-family: 'octicons'; | |
src: url("data:application/x-font-ttf;charset=utf-8;base64,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") format('truetype'); | |
font-weight: normal; | |
font-style: normal; | |
} | |
[class^="icon-"], [class*=" icon-"] { | |
font-family: 'octicons' !important; | |
speak: none; | |
font-style: normal; | |
font-weight: normal; | |
font-variant: normal; | |
text-transform: none; | |
line-height: 1; | |
-webkit-font-smoothing: antialiased; | |
-moz-osx-font-smoothing: grayscale; | |
} | |
.icon-squirrel:before { | |
content: "\e900"; | |
} | |
.icon-repo:before { | |
content: "\e901"; | |
} | |
.icon-git-branch:before { | |
content: "\e902"; | |
} | |
.icon-diff:before { | |
content: "\e905"; | |
} | |
/** Variables **/ | |
@gray-dark: #2c313a; | |
@gray-base: #5c6370; | |
@gray-light: #c5cad3; | |
@gray-lighter: #d7dae0; | |
@gray-lightest: #dcdfe4; | |
@blue: #1f96ff; | |
@border-default: 1px solid @gray-light; | |
/** Styles **/ | |
body { | |
background-color: @gray-lighter; | |
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; | |
font-size: 0.8rem; | |
color: @gray-dark; | |
} | |
.sidebar { | |
border-right: @border-default; | |
.tree-group { | |
padding: 0; | |
margin: 0; | |
} | |
.tree-item { | |
padding: 5px 0 5px 25px; | |
list-style: none; | |
position: relative; | |
&:before { | |
font-family: 'octicons' !important; | |
position: absolute; | |
left: 10px; | |
} | |
&.tree-item--chevron-down:before { | |
content: "\e907"; | |
} | |
&.tree-item--chevron-right:before { | |
content: "\e908"; | |
} | |
} | |
.tree-item-label { | |
display: flex; | |
&:before { | |
font-family: 'octicons' !important; | |
font-size: 17px; | |
margin-right: 10px; | |
} | |
&.tree-item-label--repo:before { | |
content: "\e901"; | |
} | |
&.tree-item-label--file-directory:before { | |
content: "\e903"; | |
} | |
&.tree-item-label--file-text:before { | |
content: "\e904"; | |
} | |
&.tree-item-label--file-book:before { | |
content: "\e906"; | |
} | |
} | |
.panel-header { | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
} | |
} | |
.editor { | |
.tab-item { | |
border-right: @border-default; | |
border-bottom: @border-default; | |
color: @gray-base; | |
&.tab-item--selected { | |
background-color: @gray-dark; | |
color: @gray-lightest; | |
border-color: @gray-dark; | |
} | |
} | |
.panel-body { | |
background-color: @gray-dark; | |
color: @gray-lightest; | |
font-family: "Courier New"; | |
font-size: 1rem; | |
.editor-container { | |
padding-left: 45px; | |
margin-top: 0; | |
} | |
.editor-line { | |
color: @gray-base; | |
} | |
.editor-content { | |
color: @gray-light; | |
} | |
} | |
.window-2 { | |
border-left: 1px solid @gray-light; | |
} | |
} | |
.footer { | |
align-items: center; | |
border-top: @border-default; | |
} | |
.footer-file-info { | |
.file-info-source { | |
padding: 0 10px; | |
} | |
} | |
.footer-controls { | |
a { | |
padding: 0 10px; | |
color: initial; | |
text-decoration: none; | |
[class*="icon-"] { | |
font-size: 15px; | |
margin-right: 5px; | |
} | |
&:hover { | |
background-color: @gray-light; | |
} | |
.icon-squirrel { | |
color: @blue; | |
} | |
} | |
} | |
/** Control Bar for demo purposes **/ | |
.control-bar { | |
position: fixed; | |
bottom: 50px; | |
right: 20px; | |
} | |
#window-1 { | |
display: none; | |
} | |
A practical guide for using CSS grid for build a page layout, including a sticky header and footer, a panel with scrollable areas and a tabs module.
Read the guide at: http://bit.ly/2xIdHu0