mirror of
https://github.com/phuoc-ng/csslayout.git
synced 2025-08-08 07:07:15 +02:00
feat: Folder structure
This commit is contained in:
28
contents/_includes/patterns/folder-structure.njk
Normal file
28
contents/_includes/patterns/folder-structure.njk
Normal file
@@ -0,0 +1,28 @@
|
||||
<div class="folder-structure">
|
||||
<ul>
|
||||
<li>
|
||||
{% square %}
|
||||
<ul>
|
||||
<li>
|
||||
{% square %}
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
{% square %}
|
||||
<ul>
|
||||
<li>
|
||||
{% square %}
|
||||
<ul>
|
||||
<li>
|
||||
{% square %}
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
{% square %}
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
99
contents/folder-structure.md
Normal file
99
contents/folder-structure.md
Normal file
@@ -0,0 +1,99 @@
|
||||
---
|
||||
layout: layouts/post.njk
|
||||
title: Folder structure
|
||||
description: Create a folder structure with CSS
|
||||
keywords: css folder structure, css folder tree
|
||||
---
|
||||
|
||||
## HTML
|
||||
|
||||
```html
|
||||
<div class="folder-structure">
|
||||
<ul>
|
||||
<li>
|
||||
<!-- Content -->
|
||||
...
|
||||
|
||||
<!-- Sub items -->
|
||||
<ul>
|
||||
<li>
|
||||
<!-- Content -->
|
||||
...
|
||||
|
||||
<!-- Sub items -->
|
||||
<ul>
|
||||
<li>...</li>
|
||||
<li>...</li>
|
||||
...
|
||||
</ul>
|
||||
</li>
|
||||
<li>...</li>
|
||||
...
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<!-- Repeat other items -->
|
||||
...
|
||||
</ul>
|
||||
</div>
|
||||
```
|
||||
|
||||
## CSS
|
||||
|
||||
```css
|
||||
:root {
|
||||
--folder-structure-item-height: 0.5rem;
|
||||
--folder-structure-item-margin-left: 2.25rem;
|
||||
--folder-structure-item-padding-top: 0.5rem;
|
||||
}
|
||||
|
||||
.folder-structure ul {
|
||||
/* Reset */
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.folder-structure li {
|
||||
padding: var(--folder-structure-item-padding-top) 0rem 0rem 0rem;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.folder-structure li::before {
|
||||
border-left: 1px solid #d1d5db;
|
||||
content: '';
|
||||
|
||||
/* Position */
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
transform: translate(calc(-1 * var(--folder-structure-item-margin-left)), 0);
|
||||
|
||||
/* Size */
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.folder-structure li::after {
|
||||
border-bottom: 1px solid #d1d5db;
|
||||
content: '';
|
||||
|
||||
/* Position */
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: calc(var(--folder-structure-item-padding-top) + var(--folder-structure-item-height) / 2);
|
||||
transform: translate(-100%, 0);
|
||||
|
||||
/* Size */
|
||||
width: var(--folder-structure-item-margin-left);
|
||||
}
|
||||
|
||||
/* Remove the border from the last item */
|
||||
.folder-structure li:last-child::before {
|
||||
height: calc(
|
||||
var(--folder-structure-item-padding-top) + var(--folder-structure-item-height) / 2
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
{% demo %}
|
||||
{% include "patterns/folder-structure.njk" %}
|
||||
{% enddemo %}
|
@@ -151,6 +151,12 @@ eleventyExcludeFromCollections: true
|
||||
<div class="pattern__title">Fixed at side</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="pattern__item">
|
||||
<a class="pattern__link" href="/folder-structure/">
|
||||
<div class="pattern__cover">{% include "patterns/folder-structure.njk" %}</div>
|
||||
<div class="pattern__title">Folder structure</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="pattern__item">
|
||||
<a class="pattern__link" href="/full-background/">
|
||||
<div class="pattern__cover">{% include "patterns/full-background.njk" %}</div>
|
||||
|
@@ -1,171 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import Head from 'next/head';
|
||||
import { Spacer } from '@1milligram/design';
|
||||
|
||||
import { RelatedPatterns } from '../../components/RelatedPatterns';
|
||||
import { Pattern } from '../../constants/Pattern';
|
||||
import { PatternLayout } from '../../layouts/PatternLayout';
|
||||
import BrowserFrame from '../../placeholders/BrowserFrame';
|
||||
import Square from '../../placeholders/Square';
|
||||
|
||||
const Details: React.FC<{}> = () => {
|
||||
return (
|
||||
<PatternLayout pattern={Pattern.FolderStructure}>
|
||||
<Head>
|
||||
<meta name="description" content="Create a folder structure with CSS" />
|
||||
<meta name="og:description" content="Create a folder structure with CSS" />
|
||||
<meta name="twitter:description" content="Create a folder structure with CSS" />
|
||||
<meta name="keywords" content="css folder structure, css folder tree" />
|
||||
</Head>
|
||||
<BrowserFrame
|
||||
html={`
|
||||
<div class="folder-structure">
|
||||
<ul>
|
||||
<li>
|
||||
<!-- Content -->
|
||||
...
|
||||
|
||||
<!-- Sub items -->
|
||||
<ul>
|
||||
<li>
|
||||
<!-- Content -->
|
||||
...
|
||||
|
||||
<!-- Sub items -->
|
||||
<ul>
|
||||
<li>...</li>
|
||||
<li>...</li>
|
||||
...
|
||||
</ul>
|
||||
</li>
|
||||
<li>...</li>
|
||||
...
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<!-- Repeat other items -->
|
||||
...
|
||||
</ul>
|
||||
</div>
|
||||
`}
|
||||
css={`
|
||||
:root {
|
||||
--folder-structure-item-height: 1rem;
|
||||
--folder-structure-item-margin-left: 2rem;
|
||||
--folder-structure-item-padding-top: 1rem;
|
||||
}
|
||||
|
||||
.folder-structure ul {
|
||||
/* Reset */
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.folder-structure li {
|
||||
padding: var(--folder-structure-item-padding-top) 0rem 0rem 0rem;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.folder-structure li::before {
|
||||
border-left: 1px solid rgba(0, 0, 0, 0.3);
|
||||
content: '';
|
||||
|
||||
/* Position */
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
transform: translate(calc(-1 * var(--folder-structure-item-margin-left)), 0);
|
||||
|
||||
/* Size */
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.folder-structure li::after {
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.3);
|
||||
content: '';
|
||||
|
||||
/* Position */
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: calc(var(--folder-structure-item-padding-top) + var(--folder-structure-item-height) / 2);
|
||||
transform: translate(-100%, 0);
|
||||
|
||||
/* Size */
|
||||
width: var(--folder-structure-item-margin-left);
|
||||
}
|
||||
|
||||
/* Remove the border from the last item */
|
||||
.folder-structure li:last-child::before {
|
||||
height: calc(
|
||||
var(--folder-structure-item-padding-top) + var(--folder-structure-item-height) / 2
|
||||
);
|
||||
}
|
||||
`}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
alignItems: 'center',
|
||||
display: 'flex',
|
||||
height: '100%',
|
||||
justifyContent: 'center',
|
||||
padding: '0.5rem',
|
||||
}}
|
||||
>
|
||||
<div className="folder-structure">
|
||||
<ul>
|
||||
<li>
|
||||
<Square size="1rem" />
|
||||
<ul>
|
||||
<li>
|
||||
<Square size="1rem" />
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<Square size="1rem" />
|
||||
<ul>
|
||||
<li>
|
||||
<Square size="1rem" />
|
||||
<ul>
|
||||
<li>
|
||||
<Square size="1rem" />
|
||||
</li>
|
||||
<li>
|
||||
<Square size="1rem" />
|
||||
</li>
|
||||
<li>
|
||||
<Square size="1rem" />
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<Square size="1rem" />
|
||||
</li>
|
||||
<li>
|
||||
<Square size="1rem" />
|
||||
<ul>
|
||||
<li>
|
||||
<Square size="1rem" />
|
||||
</li>
|
||||
<li>
|
||||
<Square size="1rem" />
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<Square size="1rem" />
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</BrowserFrame>
|
||||
|
||||
<Spacer size="extraLarge" />
|
||||
<RelatedPatterns patterns={[Pattern.TreeDiagram]} />
|
||||
</PatternLayout>
|
||||
);
|
||||
};
|
||||
|
||||
export default Details;
|
@@ -1,125 +0,0 @@
|
||||
import * as React from 'react';
|
||||
|
||||
import Frame from '../../placeholders/Frame';
|
||||
import Square from '../../placeholders/Square';
|
||||
|
||||
const Cover: React.FC<{}> = () => {
|
||||
return (
|
||||
<Frame>
|
||||
<div
|
||||
style={{
|
||||
alignItems: 'center',
|
||||
display: 'flex',
|
||||
height: '100%',
|
||||
justifyContent: 'center',
|
||||
padding: '0.5rem',
|
||||
}}
|
||||
>
|
||||
<div>
|
||||
<div
|
||||
style={{
|
||||
padding: '0rem 0rem 0rem 1rem',
|
||||
position: 'relative',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
borderLeft: '1px solid rgba(0, 0, 0, 0.3)',
|
||||
height: '100%',
|
||||
left: 0,
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
}}
|
||||
/>
|
||||
<div
|
||||
style={{
|
||||
borderBottom: '1px solid rgba(0, 0, 0, 0.3)',
|
||||
left: 0,
|
||||
position: 'absolute',
|
||||
top: '0.5rem',
|
||||
width: '1rem',
|
||||
}}
|
||||
/>
|
||||
<div
|
||||
style={{
|
||||
backgroundColor: 'rgba(0, 0, 0, 0.3)',
|
||||
borderRadius: '0.25rem',
|
||||
height: '1rem',
|
||||
width: '1rem',
|
||||
}}
|
||||
/>
|
||||
<div
|
||||
style={{
|
||||
marginLeft: '0.5rem',
|
||||
padding: '0rem 0rem 0rem 1rem',
|
||||
position: 'relative',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
borderLeft: '1px solid rgba(0, 0, 0, 0.3)',
|
||||
height: '50%',
|
||||
left: 0,
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
}}
|
||||
/>
|
||||
<div
|
||||
style={{
|
||||
borderBottom: '1px solid rgba(0, 0, 0, 0.3)',
|
||||
left: 0,
|
||||
position: 'absolute',
|
||||
top: '0.5rem',
|
||||
width: '1rem',
|
||||
}}
|
||||
/>
|
||||
<div
|
||||
style={{
|
||||
backgroundColor: 'rgba(0, 0, 0, 0.3)',
|
||||
borderRadius: '0.25rem',
|
||||
height: '1rem',
|
||||
width: '1rem',
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
padding: '0rem 0rem 0rem 1rem',
|
||||
position: 'relative',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
borderLeft: '1px solid rgba(0, 0, 0, 0.3)',
|
||||
height: '50%',
|
||||
left: 0,
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
}}
|
||||
/>
|
||||
<div
|
||||
style={{
|
||||
borderBottom: '1px solid rgba(0, 0, 0, 0.3)',
|
||||
left: 0,
|
||||
position: 'absolute',
|
||||
top: '0.5rem',
|
||||
width: '1rem',
|
||||
}}
|
||||
/>
|
||||
<div
|
||||
style={{
|
||||
backgroundColor: 'rgba(0, 0, 0, 0.3)',
|
||||
borderRadius: '0.25rem',
|
||||
height: '1rem',
|
||||
width: '1rem',
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Frame>
|
||||
);
|
||||
};
|
||||
|
||||
export default Cover;
|
@@ -61,19 +61,19 @@
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
ol {
|
||||
> ol {
|
||||
counter-reset: ol-step-counter;
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
ol li {
|
||||
> ol li {
|
||||
counter-increment: ol-step-counter;
|
||||
padding-bottom: 0.25rem;
|
||||
padding-left: 2rem;
|
||||
}
|
||||
ol li::before {
|
||||
> ol li::before {
|
||||
background-color: #e5e7eb;
|
||||
border-radius: 50%;
|
||||
content: counter(ol-step-counter);
|
||||
@@ -113,7 +113,7 @@
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
ul {
|
||||
> ul {
|
||||
margin: 0;
|
||||
padding: 0 0 0 1.5rem;
|
||||
}
|
||||
|
@@ -34,6 +34,7 @@
|
||||
@import './patterns/feature-list';
|
||||
@import './patterns/fixed-at-corner';
|
||||
@import './patterns/fixed-at-side';
|
||||
@import './patterns/folder-structure';
|
||||
@import './patterns/full-background';
|
||||
@import './patterns/initial-avatar';
|
||||
@import './patterns/inverted-corners';
|
||||
|
51
styles/patterns/_folder-structure.scss
Normal file
51
styles/patterns/_folder-structure.scss
Normal file
@@ -0,0 +1,51 @@
|
||||
:root {
|
||||
--folder-structure-item-height: 0.5rem;
|
||||
--folder-structure-item-margin-left: 2.25rem;
|
||||
--folder-structure-item-padding-top: 0.5rem;
|
||||
}
|
||||
|
||||
.folder-structure ul {
|
||||
/* Reset */
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.folder-structure li {
|
||||
padding: var(--folder-structure-item-padding-top) 0rem 0rem 0rem;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.folder-structure li::before {
|
||||
border-left: 1px solid #d1d5db;
|
||||
content: '';
|
||||
|
||||
/* Position */
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
transform: translate(calc(-1 * var(--folder-structure-item-margin-left)), 0);
|
||||
|
||||
/* Size */
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.folder-structure li::after {
|
||||
border-bottom: 1px solid #d1d5db;
|
||||
content: '';
|
||||
|
||||
/* Position */
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: calc(var(--folder-structure-item-padding-top) + var(--folder-structure-item-height) / 2);
|
||||
transform: translate(-100%, 0);
|
||||
|
||||
/* Size */
|
||||
width: var(--folder-structure-item-margin-left);
|
||||
}
|
||||
|
||||
/* Remove the border from the last item */
|
||||
.folder-structure li:last-child::before {
|
||||
height: calc(
|
||||
var(--folder-structure-item-padding-top) + var(--folder-structure-item-height) / 2
|
||||
);
|
||||
}
|
Reference in New Issue
Block a user