refactor(ui-docs): clearer examples for layout section component
This commit is contained in:
parent
e450303f83
commit
ae8ed94d5b
|
@ -9,7 +9,7 @@ import Toggle from '~/components/ui/Toggle.vue'
|
||||||
import Spacer from '~/components/ui/layout/Spacer.vue'
|
import Spacer from '~/components/ui/layout/Spacer.vue'
|
||||||
import Button from '~/components/ui/Button.vue'
|
import Button from '~/components/ui/Button.vue'
|
||||||
import Activity from '~/components/ui/Activity.vue'
|
import Activity from '~/components/ui/Activity.vue'
|
||||||
import LayoutSection from '~/components/ui/layout/Section.vue'
|
import Section from '~/components/ui/layout/Section.vue'
|
||||||
|
|
||||||
const alignLeft = ref(false)
|
const alignLeft = ref(false)
|
||||||
|
|
||||||
|
@ -108,13 +108,19 @@ const user: User = {
|
||||||
|
|
||||||
# Layout section
|
# Layout section
|
||||||
|
|
||||||
## Alignment
|
Sections divide the page vertically. Choose an appropriate heading level for each section: `h1` or `h2` or `h3`.
|
||||||
|
|
||||||
|
```vue-html
|
||||||
|
<Section h3="My title" />
|
||||||
|
```
|
||||||
|
|
||||||
|
### Align the section to the page
|
||||||
|
|
||||||
```vue-html
|
```vue-html
|
||||||
<Section alignLeft />
|
<Section alignLeft />
|
||||||
```
|
```
|
||||||
|
|
||||||
## Item width
|
### Make the section header align with the section contents
|
||||||
|
|
||||||
Do you want to align the header to tiny, small or medium items?
|
Do you want to align the header to tiny, small or medium items?
|
||||||
|
|
||||||
|
@ -122,29 +128,28 @@ Do you want to align the header to tiny, small or medium items?
|
||||||
<Section medium-items />
|
<Section medium-items />
|
||||||
```
|
```
|
||||||
|
|
||||||
## Heading
|
### Provide an action
|
||||||
|
|
||||||
`h1` or `h2` or `h3` `="title"`
|
The link or button will be shown on the right side of the header.
|
||||||
|
|
||||||
```vue-html
|
```vue-html
|
||||||
<Section h3="My title" />
|
<Section h3="With a link" :action="{ text:'My library', to:'/' }" />
|
||||||
|
|
||||||
|
<Section h3="With a button" :action="{ text:'Say hello!', onClick:()=>console.log('Hello') }" />
|
||||||
```
|
```
|
||||||
|
|
||||||
## Action
|
<Section h3="With a link" :action="{ text:'My library', to:'/' }" />
|
||||||
|
<Section h3="With a button" :action="{ text:'Say hello!', onClick:()=>console.log('Hello') }" />
|
||||||
|
|
||||||
Will be shown on the right side of the header
|
You can add props to the Link or Button, for example to make them `primary` or add an icon:
|
||||||
|
|
||||||
### (a) Add a link:
|
```vue-html{1}
|
||||||
|
<Section solid primary icon="bi-star"
|
||||||
```vue-html
|
h3="Do it!" :action="{ text:'Say hello!', onClick:()=>console.log('Hello') }" />
|
||||||
<Section :action="{ text:'more...', to:'/' }" />
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### (b) Or a button:
|
<Section solid primary icon="bi-star"
|
||||||
|
h3="Do it!" :action="{ text:'Say hello!', onClick:()=>console.log('Hello') }" />
|
||||||
```vue-html
|
|
||||||
<Section :action="{ text:'more...', onClick:'loadMore' }" />
|
|
||||||
```
|
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
|
@ -153,24 +158,17 @@ Will be shown on the right side of the header
|
||||||
<Toggle v-model="alignLeft" label="Left-align the layout"/>
|
<Toggle v-model="alignLeft" label="Left-align the layout"/>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|
||||||
---
|
<Section :alignLeft="alignLeft" small-items h3="Cards (small items)" :action="{ text:'more...', to:'/' }">
|
||||||
|
|
||||||
<div class="preview" style="margin: 0 -40px; padding: 0 25px;">
|
|
||||||
|
|
||||||
<LayoutSection :alignLeft="alignLeft" small-items h3="Cards (small items)" :action="{ text:'more...', to:'/' }">
|
|
||||||
<Card small title="Relatively Long Album Name">
|
<Card small title="Relatively Long Album Name">
|
||||||
Artist Name
|
Artist Name
|
||||||
13 tracks
|
|
||||||
</Card>
|
</Card>
|
||||||
<Card small title="Relatively Long Album Name">
|
<Card small title="Relatively Long Album Name">
|
||||||
Artist Name
|
Artist Name
|
||||||
13 tracks
|
|
||||||
</Card>
|
</Card>
|
||||||
<Card small title="Relatively Long Album Name">
|
<Card small title="Relatively Long Album Name">
|
||||||
Artist Name
|
Artist Name
|
||||||
13 tracks
|
|
||||||
</Card>
|
</Card>
|
||||||
</LayoutSection>
|
</Section>
|
||||||
|
|
||||||
<LayoutSection
|
<LayoutSection
|
||||||
:alignLeft="alignLeft"
|
:alignLeft="alignLeft"
|
||||||
|
@ -182,8 +180,6 @@ Will be shown on the right side of the header
|
||||||
<Activity :track="track" :user="user" />
|
<Activity :track="track" :user="user" />
|
||||||
<Activity :track="track" :user="user" />
|
<Activity :track="track" :user="user" />
|
||||||
</LayoutSection>
|
</LayoutSection>
|
||||||
|
|
||||||
</div>
|
|
||||||
```
|
```
|
||||||
|
|
||||||
<Layout flex>
|
<Layout flex>
|
||||||
|
@ -194,25 +190,31 @@ Will be shown on the right side of the header
|
||||||
|
|
||||||
<div class="preview" style="margin: 0 -40px; padding: 0 25px;">
|
<div class="preview" style="margin: 0 -40px; padding: 0 25px;">
|
||||||
|
|
||||||
<LayoutSection :alignLeft="alignLeft" small-items h3="Cards (small items)" :action="{ text:'more...', to:'/' }">
|
<Section :alignLeft="alignLeft" small-items h3="Cards (small items)" :action="{ text:'Go to library', to:'/' }">
|
||||||
<Card small title="Relatively Long Album Name">
|
<Card small title="Relatively Long Album Name">
|
||||||
Artist Name
|
Artist Name
|
||||||
13 tracks
|
|
||||||
</Card>
|
</Card>
|
||||||
<Card small title="Relatively Long Album Name">
|
<Card small title="Relatively Long Album Name">
|
||||||
Artist Name
|
Artist Name
|
||||||
13 tracks
|
|
||||||
</Card>
|
</Card>
|
||||||
<Card small title="Relatively Long Album Name">
|
<Card small title="Relatively Long Album Name">
|
||||||
Artist Name
|
Artist Name
|
||||||
13 tracks
|
|
||||||
</Card>
|
</Card>
|
||||||
</LayoutSection>
|
</Section>
|
||||||
|
|
||||||
<LayoutSection :alignLeft="alignLeft" medium-items h3="Activities (medium items)" :action="{ text:'more...', to:'/' }">
|
<Section :alignLeft="alignLeft" medium-items h3="Activities (medium items)" :action="{ text:'Delete selected items', onClick:()=>console.log('Deleted :-)') }">
|
||||||
<Activity :track="track" :user="user" />
|
<Activity :track="track" :user="user" />
|
||||||
<Activity :track="track" :user="user" />
|
<Activity :track="track" :user="user" />
|
||||||
<Activity :track="track" :user="user" />
|
<Activity :track="track" :user="user" />
|
||||||
</LayoutSection>
|
</Section>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
## Responsivity
|
||||||
|
|
||||||
|
- Cards and Activities snap to the grid columns. They have intrinsic widths, expressed in the number of columns they span. For Card, it is 3 and for Activity, it is 4.
|
||||||
|
- On a typical laptop screen, you will have 4 albums or 3 activities side-by-side. On a typical mobile screen, you will have 1 medium card or 2 small ones in a row.
|
||||||
|
- The remaining space is evenly distributed.
|
||||||
|
- Title rows align with the content below them.
|
||||||
|
|
||||||
|
Resize the window to observe how the items move.
|
||||||
|
|
|
@ -9,100 +9,13 @@ import Toggle from '~/components/ui/Toggle.vue'
|
||||||
import Spacer from '~/components/ui/layout/Spacer.vue'
|
import Spacer from '~/components/ui/layout/Spacer.vue'
|
||||||
import Button from '~/components/ui/Button.vue'
|
import Button from '~/components/ui/Button.vue'
|
||||||
import Activity from '~/components/ui/Activity.vue'
|
import Activity from '~/components/ui/Activity.vue'
|
||||||
|
import Section from '~/components/ui/layout/Section.vue'
|
||||||
|
|
||||||
const alignLeft = ref(false)
|
const alignLeft = ref(false)
|
||||||
|
|
||||||
const attributes = computed(() => ({
|
const attributes = computed(() => ({
|
||||||
style: alignLeft.value ? 'justify-content: start' : ''
|
style: alignLeft.value ? 'justify-content: start' : ''
|
||||||
}))
|
}))
|
||||||
|
|
||||||
const track: Track = {
|
|
||||||
id: 0,
|
|
||||||
fid: "",
|
|
||||||
|
|
||||||
title: 'Some lovely track',
|
|
||||||
description: {
|
|
||||||
content_type: 'text/markdown',
|
|
||||||
text: `**New:** Music for the eyes!`
|
|
||||||
},
|
|
||||||
cover: {
|
|
||||||
uuid: "",
|
|
||||||
urls: {
|
|
||||||
original: 'https://images.unsplash.com/photo-1524650359799-842906ca1c06?ixlib=rb-1.2.1&dl=te-nguyen-Wt7XT1R6sjU-unsplash.jpg&w=640&q=80&fm=jpg&crop=entropy&cs=tinysrgb',
|
|
||||||
medium_square_crop: 'https://images.unsplash.com/photo-1524650359799-842906ca1c06?ixlib=rb-1.2.1&dl=te-nguyen-Wt7XT1R6sjU-unsplash.jpg&w=640&q=80&fm=jpg&crop=entropy&cs=tinysrgb',
|
|
||||||
large_square_crop: 'https://images.unsplash.com/photo-1524650359799-842906ca1c06?ixlib=rb-1.2.1&dl=te-nguyen-Wt7XT1R6sjU-unsplash.jpg&w=640&q=80&fm=jpg&crop=entropy&cs=tinysrgb'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
tags: ["example"],
|
|
||||||
uploads: [],
|
|
||||||
downloads_count: 1927549377,
|
|
||||||
artist_credit: [{
|
|
||||||
artist: {
|
|
||||||
id: 0,
|
|
||||||
fid: "",
|
|
||||||
|
|
||||||
name: "The Artist",
|
|
||||||
description: {
|
|
||||||
content_type: 'text/markdown',
|
|
||||||
text: `I'm a musician based on the internet.
|
|
||||||
|
|
||||||
Find all my music on [Funkwhale](https://funkwhale.audio)!`},
|
|
||||||
tags: [],
|
|
||||||
|
|
||||||
content_category: 'music',
|
|
||||||
albums: [],
|
|
||||||
tracks_count: 1,
|
|
||||||
attributed_to: {
|
|
||||||
id: 0,
|
|
||||||
summary: "",
|
|
||||||
preferred_username: "User12345",
|
|
||||||
full_username: "User12345",
|
|
||||||
is_local: false,
|
|
||||||
domain: "myDomain.io"
|
|
||||||
},
|
|
||||||
is_local: false,
|
|
||||||
is_playable: true
|
|
||||||
},
|
|
||||||
credit: "",
|
|
||||||
joinphrase: " and ",
|
|
||||||
index: 22
|
|
||||||
}],
|
|
||||||
disc_number: 7,
|
|
||||||
|
|
||||||
listen_url: "https://funkwhale.audio",
|
|
||||||
creation_date: "12345",
|
|
||||||
attributed_to: {
|
|
||||||
id: 0,
|
|
||||||
summary: "",
|
|
||||||
preferred_username: "User12345",
|
|
||||||
full_username: "User12345",
|
|
||||||
is_local: false,
|
|
||||||
domain: "myDomain.io"
|
|
||||||
},
|
|
||||||
|
|
||||||
is_playable: true,
|
|
||||||
is_local: false
|
|
||||||
}
|
|
||||||
|
|
||||||
const user: User = {
|
|
||||||
id: 12,
|
|
||||||
avatar: {
|
|
||||||
uuid: "",
|
|
||||||
urls: {
|
|
||||||
original: 'https://images.unsplash.com/photo-1524650359799-842906ca1c06?ixlib=rb-1.2.1&dl=te-nguyen-Wt7XT1R6sjU-unsplash.jpg&w=640&q=80&fm=jpg&crop=entropy&cs=tinysrgb',
|
|
||||||
medium_square_crop: 'https://images.unsplash.com/photo-1524650359799-842906ca1c06?ixlib=rb-1.2.1&dl=te-nguyen-Wt7XT1R6sjU-unsplash.jpg&w=640&q=80&fm=jpg&crop=entropy&cs=tinysrgb',
|
|
||||||
large_square_crop: 'https://images.unsplash.com/photo-1524650359799-842906ca1c06?ixlib=rb-1.2.1&dl=te-nguyen-Wt7XT1R6sjU-unsplash.jpg&w=640&q=80&fm=jpg&crop=entropy&cs=tinysrgb'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
email: "user12345@example.org",
|
|
||||||
summary: { text: "Hi! I'm Example from The Internet.", content_type: "text" },
|
|
||||||
username: "user12345",
|
|
||||||
full_username: "user12345",
|
|
||||||
instance_support_message_display_date: "?",
|
|
||||||
funkwhale_support_message_display_date: "?",
|
|
||||||
is_superuser: true,
|
|
||||||
privacy_level: "everyone"
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
# Designing Pages
|
# Designing Pages
|
||||||
|
@ -111,110 +24,17 @@ const user: User = {
|
||||||
|
|
||||||
The page grid consists of 46px wide tracks, separated by 32px wide gaps. [See examples on design.funkwhale.audio](https://design.funkwhale.audio/#/workspace/582e7be1-0cc7-11ed-87a1-ae44a720651d/e3a00150-0f5e-11ed-adb9-fff9e854a67c?page-id=e7a90671-0f5e-11ed-adb9-fff9e854a67c)
|
The page grid consists of 46px wide tracks, separated by 32px wide gaps. [See examples on design.funkwhale.audio](https://design.funkwhale.audio/#/workspace/582e7be1-0cc7-11ed-87a1-ae44a720651d/e3a00150-0f5e-11ed-adb9-fff9e854a67c?page-id=e7a90671-0f5e-11ed-adb9-fff9e854a67c)
|
||||||
|
|
||||||
### Responsivity
|
## Page sections
|
||||||
|
|
||||||
- Cards and Activities snap to the grid columns. They have intrinsic widths, expressed in the number of columns they span. For Card, it is 3 and for Activity, it is 4.
|
Use the [Layout Section component](/components/ui/layout/section) to structure the page into separate sections, each with a heading. Make sure the heading level hierarchy makes sense.
|
||||||
- On a typical laptop screen, you will have 4 albums or 3 activities side-by-side. On a typical mobile screen, you will have 1 medium card or 2 small ones in a row.
|
|
||||||
- The remaining space is evenly distributed.
|
|
||||||
- Title rows align with the content below them.
|
|
||||||
|
|
||||||
Resize the window to observe how the items move.
|
<Section :alignLeft="alignLeft" small-items h3="My albums" :action="{ text:'Go to library', to:'/' }">
|
||||||
|
<Card small solid yellow title="Album 1" />
|
||||||
|
<Card small solid green title="Album 2" />
|
||||||
|
<Card small solid blue title="Album 3" />
|
||||||
|
</Section>
|
||||||
|
|
||||||
<Layout flex>
|
Sections and their contentsare automatically aligned to the default grid.
|
||||||
<Toggle v-model="alignLeft" label="Left-align the layout"/>
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<div class="preview" style="margin: 0 -40px; padding: 0 25px;">
|
|
||||||
<Layout
|
|
||||||
grid="auto / repeat(auto-fit, calc(46px * 3 + 32px * 2))"
|
|
||||||
v-bind="attributes"
|
|
||||||
>
|
|
||||||
<!-- The title row's width is a multiple of 3 rows -->
|
|
||||||
<Layout flex no-gap
|
|
||||||
style="grid-column: 1 / -1; align-self: baseline;"
|
|
||||||
>
|
|
||||||
<!-- Set distance between baseline and previous row -->
|
|
||||||
<Spacer v
|
|
||||||
:size="64"
|
|
||||||
style="outline:1px solid red; align-self: baseline;"
|
|
||||||
/>
|
|
||||||
<!-- Flexible row content -->
|
|
||||||
<!-- Note that the `h3` uses its padding to create the 24px bottom gap -->
|
|
||||||
<h3 style="align-self: baseline; padding:0 0 24px 10px; margin:0;">
|
|
||||||
Albums
|
|
||||||
</h3>
|
|
||||||
<Spacer grow />
|
|
||||||
<Button ghost thin auto align-self="baseline"
|
|
||||||
style="grid-column:-1;"
|
|
||||||
>
|
|
||||||
Show all
|
|
||||||
</Button>
|
|
||||||
</Layout>
|
|
||||||
</Layout>
|
|
||||||
<Layout solid default
|
|
||||||
style="position:relative;"
|
|
||||||
grid="auto / repeat(auto-fit, 46px)"
|
|
||||||
v-bind="attributes"
|
|
||||||
>
|
|
||||||
<Card small title="Relatively Long Album Name">
|
|
||||||
Artist Name
|
|
||||||
13 tracks
|
|
||||||
</Card>
|
|
||||||
<Card small title="Relatively Long Album Name">
|
|
||||||
Artist Name
|
|
||||||
13 tracks
|
|
||||||
</Card>
|
|
||||||
<Card small title="Relatively Long Album Name">
|
|
||||||
Artist Name
|
|
||||||
13 tracks
|
|
||||||
</Card>
|
|
||||||
<Card small title="Relatively Long Album Name">
|
|
||||||
Artist Name
|
|
||||||
13 tracks
|
|
||||||
</Card>
|
|
||||||
<Card small title="Relatively Long Album Name">
|
|
||||||
Artist Name
|
|
||||||
13 tracks
|
|
||||||
</Card>
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
<Layout
|
|
||||||
grid="auto / repeat(auto-fit, calc(46px * 4 + 32px * 3))"
|
|
||||||
v-bind="attributes"
|
|
||||||
>
|
|
||||||
<Layout flex no-gap
|
|
||||||
style="grid-column: 1 / -1; align-self: baseline;"
|
|
||||||
>
|
|
||||||
<!-- Set distance between baseline and previous row -->
|
|
||||||
<Spacer v
|
|
||||||
:size="64"
|
|
||||||
style="outline:1px solid red; align-self: baseline;"
|
|
||||||
/>
|
|
||||||
<!-- Flexible row content -->
|
|
||||||
<!-- Note that the `h3` uses its padding to create the 24px bottom gap -->
|
|
||||||
<h3 style="align-self: baseline; padding:0 0 24px 10px; margin:0;">
|
|
||||||
Tracks
|
|
||||||
</h3>
|
|
||||||
<Spacer grow />
|
|
||||||
<Button ghost thin auto align-self="baseline"
|
|
||||||
style="grid-column:-1;"
|
|
||||||
>
|
|
||||||
Show all
|
|
||||||
</Button>
|
|
||||||
</Layout>
|
|
||||||
</Layout>
|
|
||||||
<Layout solid default
|
|
||||||
style="position:relative;"
|
|
||||||
grid="auto / repeat(auto-fit, 46px)"
|
|
||||||
v-bind="attributes"
|
|
||||||
>
|
|
||||||
<Activity :track="track" :user="user" />
|
|
||||||
<Activity :track="track" :user="user" />
|
|
||||||
<Activity :track="track" :user="user" />
|
|
||||||
</Layout>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
## Navigation
|
## Navigation
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue