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