mirror of https://github.com/sveltejs/svelte
parent
d1676a9efa
commit
37480a9331
@ -0,0 +1,41 @@
|
|||||||
|
<script>
|
||||||
|
import Folder from './Folder.svelte';
|
||||||
|
|
||||||
|
let root = [
|
||||||
|
{
|
||||||
|
type: 'folder',
|
||||||
|
name: 'Important work stuff',
|
||||||
|
files: [
|
||||||
|
{ type: 'file', name: 'quarterly-results.xlsx' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'folder',
|
||||||
|
name: 'Animal GIFs',
|
||||||
|
files: [
|
||||||
|
{
|
||||||
|
type: 'folder',
|
||||||
|
name: 'Dogs',
|
||||||
|
files: [
|
||||||
|
{ type: 'file', name: 'treadmill.gif' },
|
||||||
|
{ type: 'file', name: 'rope-jumping.gif' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'folder',
|
||||||
|
name: 'Goats',
|
||||||
|
files: [
|
||||||
|
{ type: 'file', name: 'parkour.gif' },
|
||||||
|
{ type: 'file', name: 'rampage.gif' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ type: 'file', name: 'cat-roomba.gif' },
|
||||||
|
{ type: 'file', name: 'duck-shuffle.gif' },
|
||||||
|
{ type: 'file', name: 'monkey-on-a-pig.gif' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ type: 'file', name: 'TODO.md' }
|
||||||
|
];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Folder name="Home" files={root} expanded/>
|
@ -0,0 +1,14 @@
|
|||||||
|
<script>
|
||||||
|
export let name;
|
||||||
|
$: type = name.slice(name.lastIndexOf('.') + 1);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
span {
|
||||||
|
padding: 0 0 0 1.5em;
|
||||||
|
background: 0 0.1em no-repeat;
|
||||||
|
background-size: 1em 1em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<span style="background-image: url(tutorial/icons/{type}.svg)">{name}</span>
|
@ -0,0 +1,52 @@
|
|||||||
|
<script>
|
||||||
|
import File from './File.svelte';
|
||||||
|
|
||||||
|
export let expanded = false;
|
||||||
|
export let name;
|
||||||
|
export let files;
|
||||||
|
|
||||||
|
function toggle() {
|
||||||
|
expanded = !expanded;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
span {
|
||||||
|
padding: 0 0 0 1.5em;
|
||||||
|
background: url(tutorial/icons/folder.svg) 0 0.1em no-repeat;
|
||||||
|
background-size: 1em 1em;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.expanded {
|
||||||
|
background-image: url(tutorial/icons/folder-open.svg);
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
padding: 0.2em 0 0 0.5em;
|
||||||
|
margin: 0 0 0 0.5em;
|
||||||
|
list-style: none;
|
||||||
|
border-left: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding: 0.2em 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<span class:expanded on:click={toggle}>{name}</span>
|
||||||
|
|
||||||
|
{#if expanded}
|
||||||
|
<ul>
|
||||||
|
{#each files as file}
|
||||||
|
<li>
|
||||||
|
{#if file.type === 'folder'}
|
||||||
|
<!-- show folder -->
|
||||||
|
{:else}
|
||||||
|
<File {...file}/>
|
||||||
|
{/if}
|
||||||
|
</li>
|
||||||
|
{/each}
|
||||||
|
</ul>
|
||||||
|
{/if}
|
@ -0,0 +1,41 @@
|
|||||||
|
<script>
|
||||||
|
import Folder from './Folder.svelte';
|
||||||
|
|
||||||
|
let root = [
|
||||||
|
{
|
||||||
|
type: 'folder',
|
||||||
|
name: 'Important work stuff',
|
||||||
|
files: [
|
||||||
|
{ type: 'file', name: 'quarterly-results.xlsx' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'folder',
|
||||||
|
name: 'Animal GIFs',
|
||||||
|
files: [
|
||||||
|
{
|
||||||
|
type: 'folder',
|
||||||
|
name: 'Dogs',
|
||||||
|
files: [
|
||||||
|
{ type: 'file', name: 'treadmill.gif' },
|
||||||
|
{ type: 'file', name: 'rope-jumping.gif' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'folder',
|
||||||
|
name: 'Goats',
|
||||||
|
files: [
|
||||||
|
{ type: 'file', name: 'parkour.gif' },
|
||||||
|
{ type: 'file', name: 'rampage.gif' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ type: 'file', name: 'cat-roomba.gif' },
|
||||||
|
{ type: 'file', name: 'duck-shuffle.gif' },
|
||||||
|
{ type: 'file', name: 'monkey-on-a-pig.gif' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ type: 'file', name: 'TODO.md' }
|
||||||
|
];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Folder name="Home" files={root} expanded/>
|
@ -0,0 +1,14 @@
|
|||||||
|
<script>
|
||||||
|
export let name;
|
||||||
|
$: type = name.slice(name.lastIndexOf('.') + 1);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
span {
|
||||||
|
padding: 0 0 0 1.5em;
|
||||||
|
background: 0 0.1em no-repeat;
|
||||||
|
background-size: 1em 1em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<span style="background-image: url(tutorial/icons/{type}.svg)">{name}</span>
|
@ -0,0 +1,52 @@
|
|||||||
|
<script>
|
||||||
|
import File from './File.svelte';
|
||||||
|
|
||||||
|
export let expanded = false;
|
||||||
|
export let name;
|
||||||
|
export let files;
|
||||||
|
|
||||||
|
function toggle() {
|
||||||
|
expanded = !expanded;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
span {
|
||||||
|
padding: 0 0 0 1.5em;
|
||||||
|
background: url(tutorial/icons/folder.svg) 0 0.1em no-repeat;
|
||||||
|
background-size: 1em 1em;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.expanded {
|
||||||
|
background-image: url(tutorial/icons/folder-open.svg);
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
padding: 0.2em 0 0 0.5em;
|
||||||
|
margin: 0 0 0 0.5em;
|
||||||
|
list-style: none;
|
||||||
|
border-left: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding: 0.2em 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<span class:expanded on:click={toggle}>{name}</span>
|
||||||
|
|
||||||
|
{#if expanded}
|
||||||
|
<ul>
|
||||||
|
{#each files as file}
|
||||||
|
<li>
|
||||||
|
{#if file.type === 'folder'}
|
||||||
|
<svelte:self {...file}/>
|
||||||
|
{:else}
|
||||||
|
<File {...file}/>
|
||||||
|
{/if}
|
||||||
|
</li>
|
||||||
|
{/each}
|
||||||
|
</ul>
|
||||||
|
{/if}
|
@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
title: <svelte:self>
|
||||||
|
---
|
||||||
|
|
||||||
|
Svelte provides a variety of built-in elements. The first, `<svelte:self>`, allows a component to contain itself recursively.
|
||||||
|
|
||||||
|
It's useful for things like this folder tree view, where folders can contain *other* folders. In `Folder.svelte` we want to be able to do this...
|
||||||
|
|
||||||
|
```html
|
||||||
|
{#if file.type === 'folder'}
|
||||||
|
<Folder {...file}/>
|
||||||
|
{:else}
|
||||||
|
<File {...file}/>
|
||||||
|
{/if}
|
||||||
|
```
|
||||||
|
|
||||||
|
...but that's impossible, because a file can't import itself. Instead, we use `<svelte:self>`:
|
||||||
|
|
||||||
|
```html
|
||||||
|
{#if file.type === 'folder'}
|
||||||
|
<svelte:self {...file}/>
|
||||||
|
{:else}
|
||||||
|
<File {...file}/>
|
||||||
|
{/if}
|
||||||
|
```
|
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"title": "Special elements"
|
||||||
|
}
|
After Width: | Height: | Size: 303 B |
After Width: | Height: | Size: 260 B |
After Width: | Height: | Size: 354 B |
After Width: | Height: | Size: 262 B |
After Width: | Height: | Size: 292 B |
Loading…
Reference in new issue