merge
10
index.html
|
|
@ -1,10 +1,10 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Vite + Vue</title>
|
||||
<meta charset="utf-8">
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Nom du service</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
|
|
|
|||
10
public/assets/css/panel.css
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
/* CSS VARIABLES */
|
||||
|
||||
:root {
|
||||
|
||||
/* Colors */
|
||||
--color-l-200: 95%;
|
||||
--color-l-300: 85%;
|
||||
--color-l-400: 80%;
|
||||
--color-l-500: 74%;
|
||||
}
|
||||
21
public/content/clients/1_dior/client.txt
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
Title: Dior
|
||||
|
||||
----
|
||||
|
||||
Headline:
|
||||
|
||||
----
|
||||
|
||||
Text:
|
||||
|
||||
----
|
||||
|
||||
Logo: - file://25NN1En7lGeEttZy
|
||||
|
||||
----
|
||||
|
||||
Color: #000
|
||||
|
||||
----
|
||||
|
||||
Uuid: G418qZ4ABsoWFx4i
|
||||
BIN
public/content/clients/1_dior/dior.jpg
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
1
public/content/clients/1_dior/dior.jpg.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
Uuid: 25NN1En7lGeEttZy
|
||||
13
public/content/clients/2_hermes/client.txt
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
Title: Hermes
|
||||
|
||||
----
|
||||
|
||||
Logo: - file://Nj3oUfpMGXwRETWn
|
||||
|
||||
----
|
||||
|
||||
Color: #fb6b22
|
||||
|
||||
----
|
||||
|
||||
Uuid: PweFYnBx27eMZ2mr
|
||||
BIN
public/content/clients/2_hermes/hermes.jpg
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
1
public/content/clients/2_hermes/hermes.jpg.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
Uuid: Nj3oUfpMGXwRETWn
|
||||
5
public/content/clients/clients.txt
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
Title: Clients
|
||||
|
||||
----
|
||||
|
||||
Uuid: TsaoiLb9iQJWZAvX
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
Title: Error
|
||||
Title: Erreur
|
||||
|
||||
----
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
Title: Home
|
||||
Title: Accueil
|
||||
|
||||
----
|
||||
|
||||
|
|
@ -10,7 +10,7 @@ Testtext: test
|
|||
|
||||
----
|
||||
|
||||
Testblocks: [{"content":{"location":"kirby","image":["home/image.png"],"src":"","alt":"","caption":"","link":"","ratio":"","crop":"false"},"id":"ad071a0e-852b-473b-9f6f-46ea4079168e","isHidden":false,"type":"image"}]
|
||||
Testblocks:
|
||||
|
||||
----
|
||||
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 36 KiB |
|
|
@ -0,0 +1,5 @@
|
|||
Uuid: aWouZREvKfW9VWMt
|
||||
|
||||
----
|
||||
|
||||
Template: image
|
||||
|
After Width: | Height: | Size: 29 KiB |
|
|
@ -0,0 +1,5 @@
|
|||
Uuid: T3MXkEhh9mmAGkUH
|
||||
|
||||
----
|
||||
|
||||
Template: image
|
||||
|
After Width: | Height: | Size: 58 KiB |
|
|
@ -0,0 +1,5 @@
|
|||
Uuid: e57fucmyhXX9jJv4
|
||||
|
||||
----
|
||||
|
||||
Template: image
|
||||
|
After Width: | Height: | Size: 53 KiB |
|
|
@ -0,0 +1,5 @@
|
|||
Uuid: aGCNfbFS7FcFJls1
|
||||
|
||||
----
|
||||
|
||||
Template: image
|
||||
|
After Width: | Height: | Size: 92 KiB |
|
|
@ -0,0 +1,5 @@
|
|||
Uuid: qqhD8ABZ7BkkJxd5
|
||||
|
||||
----
|
||||
|
||||
Template: image
|
||||
|
After Width: | Height: | Size: 59 KiB |
|
|
@ -0,0 +1,5 @@
|
|||
Uuid: B3TFeDZKd5d8dxKK
|
||||
|
||||
----
|
||||
|
||||
Template: image
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
Title: Miss Dior Blooming Bouquet
|
||||
|
||||
----
|
||||
|
||||
Client: - page://G418qZ4ABsoWFx4i
|
||||
|
||||
----
|
||||
|
||||
Briefclientpdf:
|
||||
|
||||
----
|
||||
|
||||
Description: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas faucibus mollis interdum. Maecenas faucibus mollis interdum. Maecenas sed diam eget risus varius blandit sit amet non magna. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Integer posuere erat a ante venenatis dapibus posuere velit aliquet.
|
||||
|
||||
----
|
||||
|
||||
Briefclientimages:
|
||||
|
||||
- file://aWouZREvKfW9VWMt
|
||||
- file://qqhD8ABZ7BkkJxd5
|
||||
- file://e57fucmyhXX9jJv4
|
||||
- file://aGCNfbFS7FcFJls1
|
||||
- file://T3MXkEhh9mmAGkUH
|
||||
- file://B3TFeDZKd5d8dxKK
|
||||
|
||||
----
|
||||
|
||||
Pdf:
|
||||
|
||||
----
|
||||
|
||||
Text:
|
||||
|
||||
----
|
||||
|
||||
Uuid: 513oEM4JFuWBt2Bw
|
||||
5
public/content/projects/projects.txt
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
Title: Projets
|
||||
|
||||
----
|
||||
|
||||
Uuid: JgUmDeKdunC06yBi
|
||||
29
public/content/projects/projet-test/project.txt
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
Title: Projet Test
|
||||
|
||||
----
|
||||
|
||||
Client: - page://G418qZ4ABsoWFx4i
|
||||
|
||||
----
|
||||
|
||||
Briefclientpdf:
|
||||
|
||||
----
|
||||
|
||||
Description: Maecenas sed diam eget risus varius blandit sit amet non magna. Curabitur blandit tempus porttitor. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas faucibus mollis interdum.
|
||||
|
||||
----
|
||||
|
||||
Briefclientimages:
|
||||
|
||||
----
|
||||
|
||||
Pdf:
|
||||
|
||||
----
|
||||
|
||||
Text:
|
||||
|
||||
----
|
||||
|
||||
Uuid: Bdho8W2PQkSk1x21
|
||||
|
|
@ -1 +1,5 @@
|
|||
Title: Site Title
|
||||
Title: Nom du service
|
||||
|
||||
----
|
||||
|
||||
Briefclientimagestags: Parachèvements, Forme & design, Matériaux & textures, Coloris & nuances, Bouchon, Bouton poussoir, DA globale
|
||||
15
public/site/blueprints/files/image.yml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
title: Image
|
||||
|
||||
accept:
|
||||
mime: image/*
|
||||
type: image
|
||||
focus: false
|
||||
|
||||
fields:
|
||||
description:
|
||||
type: textarea
|
||||
buttons: false
|
||||
size: small
|
||||
width: 1/2
|
||||
# tags:
|
||||
# type: tags
|
||||
5
public/site/blueprints/files/pdf.yml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
title: PDF
|
||||
|
||||
accept:
|
||||
mime: application/pdf
|
||||
focus: false
|
||||
45
public/site/blueprints/pages/client.yml
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
title: Client
|
||||
|
||||
tabs:
|
||||
projects:
|
||||
label: Projets
|
||||
icon: folder
|
||||
columns:
|
||||
- width: 1/2
|
||||
sections:
|
||||
projectsListed:
|
||||
extends: sections/projects
|
||||
headline: Projets en cours
|
||||
query: page.projectsListed
|
||||
status: unlisted
|
||||
columns:
|
||||
title: true
|
||||
client: false
|
||||
- width: 1/2
|
||||
sections:
|
||||
projectsUnlisted:
|
||||
extends: sections/projects
|
||||
headline: Projets archivés
|
||||
query: page.projectsUnlisted
|
||||
status: unlisted
|
||||
columns:
|
||||
title: true
|
||||
client: false
|
||||
|
||||
brand:
|
||||
label: Brand
|
||||
icon: palette
|
||||
fields:
|
||||
logo:
|
||||
type: files
|
||||
multiple: false
|
||||
layout: cards
|
||||
image:
|
||||
ratio: 1/1
|
||||
back: white
|
||||
width: 1/6
|
||||
color:
|
||||
label: Couleur
|
||||
type: color
|
||||
width: 2/6
|
||||
files: tabs/files
|
||||
21
public/site/blueprints/pages/clients.yml
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
title: Clients
|
||||
|
||||
sections:
|
||||
pages:
|
||||
label: Tous les clients
|
||||
status: all
|
||||
templates: client
|
||||
layout: table
|
||||
columns:
|
||||
title:
|
||||
label: Nom
|
||||
projectsListed:
|
||||
label: En cours
|
||||
value: "{{ page.projectsListed.count }}"
|
||||
width: 1/12
|
||||
projectsUnlisted:
|
||||
label: Archivés
|
||||
value: "{{ page.projectsUnlisted.count }}"
|
||||
width: 1/12
|
||||
image:
|
||||
cover: true
|
||||
|
|
@ -1,7 +1 @@
|
|||
fields:
|
||||
testImages:
|
||||
type: files
|
||||
testText:
|
||||
type: text
|
||||
testBlocks:
|
||||
type: blocks
|
||||
title: Home
|
||||
|
|
|
|||
67
public/site/blueprints/pages/project.yml
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
title: Projet
|
||||
icon: page
|
||||
|
||||
tabs:
|
||||
brief:
|
||||
label: Brief client
|
||||
icon: document
|
||||
columns:
|
||||
- width: 1/2
|
||||
sections:
|
||||
brief:
|
||||
type: fields
|
||||
fields:
|
||||
client:
|
||||
type: pages
|
||||
multiple: false
|
||||
query: site.find("clients").childrenAndDrafts
|
||||
subpages: false
|
||||
image:
|
||||
query: page.logo.toFile
|
||||
layout: cardlets
|
||||
width: 1/2
|
||||
briefClientPdf:
|
||||
label: PDF
|
||||
type: files
|
||||
multiple: false
|
||||
uploads: pdf
|
||||
layout: cardlets
|
||||
width: 1/2
|
||||
- width: 1/2
|
||||
sections:
|
||||
description:
|
||||
type: fields
|
||||
fields:
|
||||
description:
|
||||
type: textarea
|
||||
size: tiny
|
||||
buttons: false
|
||||
maxlength: 700
|
||||
- width: 1/1
|
||||
sections:
|
||||
images:
|
||||
type: fields
|
||||
fields:
|
||||
briefClientImages:
|
||||
label: Images
|
||||
type: files
|
||||
uploads: image
|
||||
layout: cards
|
||||
size: medium
|
||||
# client:
|
||||
# label: Client
|
||||
# icon: account
|
||||
# columns:
|
||||
# - width: 1/1
|
||||
# sections:
|
||||
# client:
|
||||
# type: fields
|
||||
# fields:
|
||||
# client:
|
||||
# type: pages
|
||||
# multiple: false
|
||||
# query: site.find("clients").childrenAndDrafts
|
||||
# subpages: false
|
||||
# layout: cards
|
||||
# size: medium
|
||||
files: tabs/files
|
||||
15
public/site/blueprints/pages/projects.yml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
title: Projets
|
||||
|
||||
sections:
|
||||
drafts:
|
||||
extends: sections/projects
|
||||
headline: Brouillons
|
||||
status: draft
|
||||
listed:
|
||||
extends: sections/projects
|
||||
headline: En cours
|
||||
status: listed
|
||||
unlisted:
|
||||
extends: sections/projects
|
||||
headline: Archivés
|
||||
status: unlisted
|
||||
11
public/site/blueprints/sections/projects.yml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
type: pages
|
||||
headline: Projets
|
||||
template: project
|
||||
layout: table
|
||||
columns:
|
||||
title:
|
||||
label: Titre
|
||||
client: true
|
||||
empty: Pas encore de projet
|
||||
image: false
|
||||
search: true
|
||||
|
|
@ -1,5 +1,41 @@
|
|||
title: Site
|
||||
|
||||
sections:
|
||||
pages:
|
||||
type: pages
|
||||
tabs:
|
||||
dashboard:
|
||||
label: Dashboard
|
||||
icon: dashboard
|
||||
columns:
|
||||
clients:
|
||||
width: 1/2
|
||||
sections:
|
||||
clients:
|
||||
label: Clients
|
||||
type: pages
|
||||
parent: site.find("clients")
|
||||
template: client
|
||||
search: true
|
||||
image:
|
||||
back: white
|
||||
projects:
|
||||
width: 1/2
|
||||
sections:
|
||||
projects:
|
||||
extends: sections/projects
|
||||
headline: Projets récement modifiés
|
||||
parent: site.find("projects")
|
||||
layout: list
|
||||
sortBy: modified desc
|
||||
settings:
|
||||
label: Paramètres
|
||||
icon: cog
|
||||
columns:
|
||||
- width: 1/1
|
||||
sections:
|
||||
settings:
|
||||
label: Paramètres
|
||||
type: fields
|
||||
fields:
|
||||
briefClientImagesTags:
|
||||
label: Tags des images de Brief client
|
||||
help: Ensemble des tags d’images disponibles lors de la création du Brief client
|
||||
type: tags
|
||||
|
|
|
|||
15
public/site/blueprints/tabs/files.yml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
label:
|
||||
en: Files
|
||||
fr: Fichiers
|
||||
icon: images
|
||||
|
||||
columns:
|
||||
- width: 1/1
|
||||
sections:
|
||||
files:
|
||||
label:
|
||||
en: Files
|
||||
fr: Fichiers
|
||||
type: files
|
||||
layout: cards
|
||||
size: small
|
||||
1
public/site/blueprints/users/admin.yml
Normal file
|
|
@ -0,0 +1 @@
|
|||
title: Admin
|
||||
4
public/site/blueprints/users/client.yml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
title: Client
|
||||
permissions:
|
||||
access:
|
||||
panel: false
|
||||
3
public/site/blueprints/users/project-manager.yml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
title:
|
||||
fr: Chef·fe de projet
|
||||
en: Project Manager
|
||||
|
|
@ -7,7 +7,68 @@ return [
|
|||
// Enable api access without SSL. To disable in production.
|
||||
'allowInsecure' => true
|
||||
],
|
||||
'content' => [
|
||||
'uuid' => false
|
||||
'panel' => [
|
||||
'language' => 'fr',
|
||||
'css' => 'assets/css/panel.css',
|
||||
'favicon' => 'assets/favicons/favicon.svg',
|
||||
'menu' => [
|
||||
'site' => [
|
||||
'label' => 'Dashboard',
|
||||
'icon' => 'dashboard',
|
||||
'current' => function (string $current): bool {
|
||||
// the links of all your custom menu entries
|
||||
$links = [
|
||||
'pages/clients',
|
||||
'pages/projects',
|
||||
'pages/notifications',
|
||||
'pages/events'
|
||||
];
|
||||
$path = Kirby\Cms\App::instance()->path();
|
||||
return
|
||||
$current === 'site' &&
|
||||
A::every($links, fn ($link) => Str::contains($path, $link) === false);
|
||||
}
|
||||
],
|
||||
'clients' => [
|
||||
'label' => 'Clients',
|
||||
'icon' => 'account',
|
||||
'link' => 'pages/clients',
|
||||
'current' => function (string $current): bool {
|
||||
$path = Kirby\Cms\App::instance()->path();
|
||||
return Str::contains($path, 'pages/clients');
|
||||
}
|
||||
],
|
||||
'projects' => [
|
||||
'label' => 'Projets',
|
||||
'icon' => 'folder',
|
||||
'link' => 'pages/projects',
|
||||
'current' => function (string $current): bool {
|
||||
$path = Kirby\Cms\App::instance()->path();
|
||||
return Str::contains($path, 'pages/projects');
|
||||
}
|
||||
],
|
||||
'-',
|
||||
'notifications' => [
|
||||
'label' => 'Notifications',
|
||||
'icon' => 'bell',
|
||||
'link' => 'pages/notifications',
|
||||
'current' => function (string $current): bool {
|
||||
$path = Kirby\Cms\App::instance()->path();
|
||||
return Str::contains($path, 'pages/notifications');
|
||||
}
|
||||
],
|
||||
'events' => [
|
||||
'label' => 'Événements',
|
||||
'icon' => 'calendar',
|
||||
'link' => 'pages/events',
|
||||
'current' => function (string $current): bool {
|
||||
$path = Kirby\Cms\App::instance()->path();
|
||||
return Str::contains($path, 'pages/events');
|
||||
}
|
||||
],
|
||||
'-',
|
||||
'users',
|
||||
'system'
|
||||
]
|
||||
]
|
||||
];
|
||||
];
|
||||
|
|
|
|||
18
public/site/models/client.php
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
class ClientPage extends Page {
|
||||
public function projects() {
|
||||
return page('projects')->children()->filterBy('intendedTemplate', 'project')->filterBy(function($project) {
|
||||
return $project->client()->toPage() === $this;
|
||||
});
|
||||
}
|
||||
public function projectsListed() {
|
||||
return page('projects')->children()->listed()->filterBy('intendedTemplate', 'project')->filterBy(function($project) {
|
||||
return $project->client()->toPage() === $this;
|
||||
});
|
||||
}
|
||||
public function projectsUnlisted() {
|
||||
return page('projects')->children()->unlisted()->filterBy('intendedTemplate', 'project')->filterBy(function($project) {
|
||||
return $project->client()->toPage() === $this;
|
||||
});
|
||||
}
|
||||
}
|
||||
31
src/assets/css/index.css
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
@charset "UTF-8";
|
||||
|
||||
@import 'src/0.0.reset.css';
|
||||
@import 'src/0.1.fonts.css';
|
||||
@import 'src/0.2.variables.css';
|
||||
|
||||
/* GLOBAL CSS */
|
||||
@import 'src/1.0.global.css';
|
||||
|
||||
/* COMPOSITIONS */
|
||||
@import 'src/1.1.compositions.auto-grid.css';
|
||||
@import 'src/1.2.compositions.grid.css';
|
||||
@import 'src/1.3.compositions.flex.css';
|
||||
@import 'src/1.4.compositions.with-sidebar.css';
|
||||
|
||||
/* BLOCKS */
|
||||
@import 'src/2.blocks.button.css';
|
||||
@import 'src/2.blocks.card.css';
|
||||
@import 'src/2.blocks.header.css';
|
||||
@import 'src/2.blocks.pill.css';
|
||||
@import 'src/2.blocks.skip-link.css';
|
||||
|
||||
/* UTILITY CLASSES */
|
||||
@import 'src/3.utilities.border.css';
|
||||
@import 'src/3.utilities.flow.css';
|
||||
@import 'src/3.utilities.icons.css';
|
||||
@import 'src/3.utilities.overflow.css';
|
||||
@import 'src/3.utilities.screen-readers.css';
|
||||
@import 'src/3.utilities.size.css';
|
||||
@import 'src/3.utilities.spacing.css';
|
||||
@import 'src/3.utilities.text.css';
|
||||
84
src/assets/css/src/0.0.reset.css
Executable file
|
|
@ -0,0 +1,84 @@
|
|||
/* RESET */
|
||||
/* Modified version of Modern CSS Reset by Piccalilli https://piccalil.li/blog/a-more-modern-css-reset/ */
|
||||
|
||||
|
||||
/* Box sizing rules */
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
/* Prevent font size inflation */
|
||||
html {
|
||||
-moz-text-size-adjust: none;
|
||||
-webkit-text-size-adjust: none;
|
||||
text-size-adjust: none;
|
||||
}
|
||||
|
||||
/* Remove default margin in favour of better control in authored CSS */
|
||||
body, h1, h2, h3, h4, p,
|
||||
figure, blockquote, dl, dd {
|
||||
margin: 0;
|
||||
margin-block-end: 0;
|
||||
}
|
||||
|
||||
/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */
|
||||
ul,
|
||||
ol {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Set core body defaults */
|
||||
body {
|
||||
min-height: 100vh;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
/* Set shorter line heights on headings and interactive elements */
|
||||
h1, h2, h3, h4,
|
||||
button, input, label {
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
/* Balance text wrapping on headings */
|
||||
h1, h2,
|
||||
h3, h4 {
|
||||
text-wrap: balance;
|
||||
}
|
||||
|
||||
/* A elements that don't have a class get default styles */
|
||||
a:not([class]) {
|
||||
text-decoration-skip-ink: auto;
|
||||
color: currentColor;
|
||||
}
|
||||
|
||||
/* Make images easier to work with */
|
||||
img,
|
||||
picture {
|
||||
max-width: 100%;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Inherit fonts for inputs and buttons */
|
||||
input, button,
|
||||
textarea, select {
|
||||
-webkit-appareance: none;
|
||||
appearance: none;
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
background: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
/* Make sure textareas without a rows attribute are not tiny */
|
||||
textarea:not([rows]) {
|
||||
min-height: 10em;
|
||||
}
|
||||
|
||||
/* Anything that has been anchored to should have extra scroll margin */
|
||||
:target {
|
||||
scroll-margin-block: 5ex;
|
||||
}
|
||||
4
src/assets/css/src/0.1.fonts.css
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
/* FONTS */
|
||||
|
||||
/* Font sans */
|
||||
@import url('https://fonts.googleapis.com/css2?family=Vollkorn:wght@400..500&display=swap');
|
||||
81
src/assets/css/src/0.2.variables.css
Executable file
|
|
@ -0,0 +1,81 @@
|
|||
/* CSS VARIABLES */
|
||||
|
||||
:root {
|
||||
|
||||
/* Fonts */
|
||||
--font-sans: "Cera Pro", -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
--font-serif: "Vollkorn", serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
|
||||
/* Colors */
|
||||
--color-white-10: hsla(0, 0%, 100%, .1); /* White 10 */
|
||||
--color-white-100: hsla(0, 0%, 100%, 1); /* White 100 */
|
||||
--color-white: var(--color-white-100); /* White */
|
||||
--color-grey-50: hsla(0, 0%, 95%, 1); /* Light Grey */
|
||||
--color-grey-200: hsla(0, 0%, 85%, 1); /* Grey - 01 */
|
||||
--color-grey-300: hsla(0, 0%, 74%, 1);
|
||||
--color-grey-400: hsla(180, 2%, 62%, 1); /* Grey - 02 */
|
||||
--color-grey-700: hsla(180, 1%, 37%, 1); /* Grey - 03 */
|
||||
--color-black: hsla(0, 0%, 10%, 1); /* Black */
|
||||
--color-primary-10: hsla(177, 100%, 29%, .1); /* Focus 10% */
|
||||
--color-primary-20: hsla(177, 100%, 29%, .2); /* Focus 20% */
|
||||
--color-primary-40: hsla(177, 100%, 29%, .4); /* Focus 40% */
|
||||
--color-primary-70: hsla(177, 100%, 29%, .7); /* Focus 70% */
|
||||
--color-primary-100: hsla(177, 100%, 29%, 1); /* Focus 100% */
|
||||
--color-primary: var(--color-primary-100); /* Focus */
|
||||
--color-brand-100: hsla(347, 84%, 45%, 1); /* Brand 100% */
|
||||
--color-brand: var(--color-brand-100); /* Brand */
|
||||
--color-background: var(--color-white);
|
||||
--color-text: var(--color-black);
|
||||
--color-focus-ring: var(--color-primary-100);
|
||||
--color-disabled: var(--color-grey-400);
|
||||
|
||||
/* Space scale */
|
||||
--space: .275em; /* typographic space */
|
||||
--space-xs: .25rem; /* 4px */
|
||||
--space-sm: .5rem; /* 8px */
|
||||
--space-md: .75rem; /* 12px */
|
||||
--space-lg: 1rem; /* 16px */
|
||||
--space-xl: 1.5rem; /* 24px */
|
||||
--space-2xl: 2rem; /* 32px */
|
||||
|
||||
/* Type scale */
|
||||
--text-xs: .75rem; /* 12px */
|
||||
--text-sm: .875rem; /* 14px */
|
||||
--text-md: 1rem; /* 16px */
|
||||
--text-lg: 1.5rem; /* 24px */
|
||||
|
||||
/* Leading */
|
||||
--leading-none: 1;
|
||||
--leading-sm: 1.25;
|
||||
--leading-md: 1.4285714286; /* 20/14 */
|
||||
--leading-lg: 1.5; /* 24/16 */
|
||||
|
||||
/* Tracking */
|
||||
--tracking-wide: 0.01em;
|
||||
|
||||
/* Layout */
|
||||
--gutter: 32px;
|
||||
--header-height: 3.5rem; /* 56px */
|
||||
--sidebar-width: 22.25rem; /* 356px */
|
||||
--flow-space: 1rem;
|
||||
--auto-grid-placement: auto-fill;
|
||||
--gap: var(--space-lg);
|
||||
|
||||
/* Borders */
|
||||
--rounded-xs: 1px;
|
||||
--rounded-sm: 4px;
|
||||
--rounded-md: 12px;
|
||||
--rounded-lg: 20px;
|
||||
--rounded-full: 9999px;
|
||||
--border-width: 1px;
|
||||
--border-color: var(--color-black);
|
||||
--border: var(--border-width) solid var(--border-color);
|
||||
|
||||
/* Prose */
|
||||
--max-width: 64ch;
|
||||
|
||||
/* Transitions */
|
||||
--timing: 200ms;
|
||||
--easing: ease;
|
||||
|
||||
}
|
||||
262
src/assets/css/src/1.0.global.css
Normal file
|
|
@ -0,0 +1,262 @@
|
|||
/* GLOBAL CSS */
|
||||
|
||||
html {
|
||||
font-size: 100%;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
body {
|
||||
font: var(--text-md)/var(--leading-md) var(--font-sans);
|
||||
letter-spacing: var(--tracking-wide);
|
||||
text-rendering: optimizeSpeed;
|
||||
font-variant-ligatures: common-ligatures;
|
||||
-moz-font-feature-settings: "liga", "clig";
|
||||
-webkit-font-feature-settings: "liga", "clig";
|
||||
font-feature-settings: "liga", "clig";
|
||||
background-color: var(--color-grey-50);
|
||||
color: var(--color-text, black);
|
||||
padding: 2rem var(--gutter);
|
||||
}
|
||||
|
||||
/* If an element is [hidden] it needs to be max priority */
|
||||
.hidden, [hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
|
||||
/* Disabled state */
|
||||
.disabled, [disabled] {
|
||||
opacity: var(--alpha);
|
||||
}
|
||||
|
||||
/* Placeholder */
|
||||
::placeholder {
|
||||
font: inherit;
|
||||
color: rgba(0, 0, 0, .54);
|
||||
}
|
||||
|
||||
|
||||
/* Main */
|
||||
main {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
|
||||
/* Headings */
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-size: var(--text-md);
|
||||
font-weight: 400;
|
||||
text-wrap: balance;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
h1 > a,
|
||||
h2 > a,
|
||||
h3 > a,
|
||||
h4 > a,
|
||||
h5 > a,
|
||||
h6 > a {
|
||||
text-decoration: none;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
*:not(.sr-only) + h2,
|
||||
*:not(.sr-only) + h3 {
|
||||
margin-top: var(--space-xs);
|
||||
}
|
||||
|
||||
|
||||
/* General typesetting */
|
||||
|
||||
p {
|
||||
max-width: 40em;
|
||||
}
|
||||
|
||||
|
||||
/* Lists */
|
||||
|
||||
ul:not([class]),
|
||||
ol:not([class]) {
|
||||
list-style: none;
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
|
||||
/* Blockquotes */
|
||||
|
||||
blockquote {
|
||||
padding-left: 0;
|
||||
}
|
||||
blockquote > * {
|
||||
padding-left: var(--space-md);
|
||||
}
|
||||
|
||||
|
||||
/* Separators */
|
||||
|
||||
hr {
|
||||
border: none;
|
||||
border-top: var(--border);
|
||||
margin-inline: 0;
|
||||
}
|
||||
|
||||
hr,
|
||||
hr + * {
|
||||
--flow-space: var(--space-xs);
|
||||
}
|
||||
|
||||
/* Sub and sup */
|
||||
sub,
|
||||
sup {
|
||||
font-size: 0.75em;
|
||||
}
|
||||
|
||||
sub {
|
||||
vertical-align: sub;
|
||||
}
|
||||
|
||||
sup {
|
||||
vertical-align: middle;
|
||||
position: relative;
|
||||
top: -1ex;
|
||||
}
|
||||
|
||||
|
||||
/* Details */
|
||||
|
||||
summary {
|
||||
-webkit-appearance: none;
|
||||
list-style: none;
|
||||
cursor: pointer;
|
||||
width: fit-content;
|
||||
display: flex;
|
||||
-webkit-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
summary::-webkit-details-marker,
|
||||
summary::marker {
|
||||
display: none;
|
||||
content: "";
|
||||
}
|
||||
summary::before {
|
||||
content: '+';
|
||||
margin-right: var(--space);
|
||||
}
|
||||
summary + p {
|
||||
margin-top: 0;
|
||||
}
|
||||
summary + .gallery,
|
||||
summary + figure {
|
||||
margin-top: .5em;
|
||||
}
|
||||
details > *:last-child {
|
||||
margin-bottom: var(--space-xs);
|
||||
}
|
||||
details[open] > summary::before {
|
||||
content: '−';
|
||||
}
|
||||
|
||||
|
||||
/* Media */
|
||||
|
||||
figure {
|
||||
width: fit-content;
|
||||
height: fit-content;
|
||||
}
|
||||
figcaption {
|
||||
font-size: var(--text-md);
|
||||
margin: .16666667em 0;
|
||||
position: relative;
|
||||
}
|
||||
figcaption::before {
|
||||
float: right;
|
||||
margin-left: var(--gap);
|
||||
}
|
||||
figure + p {
|
||||
margin-top: var(--space-xs);
|
||||
}
|
||||
|
||||
video {
|
||||
background-color: var(--color-gray);
|
||||
max-width: 100%;
|
||||
border-radius: var(--rounded-md);
|
||||
}
|
||||
|
||||
/* Selects images that are likely to have a transparent BG and applies a */
|
||||
/* theme-driven mask to them */
|
||||
img[src$='.svg'],
|
||||
img[src$='.png'] {
|
||||
background-color: transparent;
|
||||
}
|
||||
img {
|
||||
object-fit: cover;
|
||||
background-size: cover;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
[data-ratio="auto"] img {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/* Links */
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:visited {
|
||||
color: currentColor;
|
||||
}
|
||||
a:hover {
|
||||
color: currentColor;
|
||||
}
|
||||
|
||||
a.link-full::after {
|
||||
content: '';
|
||||
display: block;
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
z-index: 1;
|
||||
transition: outline var(--timing) var(--easing);
|
||||
}
|
||||
a.link-full:focus-visible {
|
||||
outline-width: 0;
|
||||
}
|
||||
a.link-full:focus-visible::after {
|
||||
outline: none;
|
||||
outline-offset: 2px;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
|
||||
/* Form, Input, Buttons */
|
||||
|
||||
form {
|
||||
display: flex;
|
||||
gap: var(--space-xs);
|
||||
}
|
||||
input {
|
||||
font: inherit;
|
||||
max-height: 1.125rem; /* 18px */
|
||||
}
|
||||
[type="search"]::-webkit-search-cancel-button,
|
||||
[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
}
|
||||
button {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* General interactive states */
|
||||
|
||||
:focus-visible {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* High contrast selection style */
|
||||
::selection {
|
||||
background: var(--color-grey);
|
||||
}
|
||||
13
src/assets/css/src/1.1.compositions.auto-grid.css
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
/* AUTO-GRID COMPOSITION */
|
||||
|
||||
.auto-grid {
|
||||
--column-gap: var(--gap);
|
||||
--row-gap: var(--gap);
|
||||
display: grid;
|
||||
grid-template-columns: repeat(
|
||||
var(--auto-grid-placement, auto-fill),
|
||||
minmax(var(--min, 50%), 1fr)
|
||||
);
|
||||
grid-gap: var(--row-gap) var(--column-gap);
|
||||
gap: var(--row-gap) var(--column-gap);
|
||||
}
|
||||
55
src/assets/css/src/1.2.compositions.grid.css
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
/* LAYOUT GRID */
|
||||
|
||||
.grid {
|
||||
--gap: var(--gutter);
|
||||
--column-gap: var(--gap);
|
||||
--row-gap: var(--gap);
|
||||
display: -ms-grid;
|
||||
display: grid;
|
||||
grid-gap: var(--column-gap) var(--row-gap);
|
||||
gap: var(--column-gap) var(--row-gap);
|
||||
grid-template-columns: 1fr;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.grid > .column {
|
||||
margin-bottom: var(--gap);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: var(--justify-content, flex-start);
|
||||
align-items: var(--align-items, baseline);
|
||||
}
|
||||
|
||||
@media (min-width: 35rem) { /* >= 560px */
|
||||
|
||||
.grid {
|
||||
-ms-grid-columns: repeat(6, 1fr);
|
||||
grid-template-columns: repeat(6, 1fr);
|
||||
}
|
||||
|
||||
.grid > .column {
|
||||
-ms-grid-column: span 6;
|
||||
grid-column: span 6;
|
||||
}
|
||||
|
||||
.grid > .column[style*="--columns:3"] {
|
||||
-ms-grid-column: span 3;
|
||||
grid-column: span 3;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media (min-width: 67.5rem) { /* >= 1080px */
|
||||
|
||||
.grid {
|
||||
-ms-grid-columns: repeat(12, 1fr);
|
||||
grid-template-columns: repeat(12, 1fr);
|
||||
}
|
||||
|
||||
.grid > .column {
|
||||
-ms-grid-column: span var(--columns);
|
||||
grid-column: span var(--columns);
|
||||
}
|
||||
|
||||
}
|
||||
11
src/assets/css/src/1.3.compositions.flex.css
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/* FLEX COMPOSITION */
|
||||
|
||||
.flex {
|
||||
display: flex;
|
||||
flex-direction: var(--direction, row);
|
||||
flex-wrap: var(--wrap, wrap);
|
||||
align-items: var(--items, center);
|
||||
justify-content: var(--justify, flex-start);
|
||||
column-gap: var(--column-gap, var(--gutter, var(--space-sm)));
|
||||
row-gap: var(--row-gap, var(--gutter, var(--space-sm)));
|
||||
}
|
||||
18
src/assets/css/src/1.4.compositions.with-sidebar.css
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
/* SIDEBAR COMPOSITION */
|
||||
|
||||
.with-sidebar {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-2xl);
|
||||
}
|
||||
|
||||
.with-sidebar > :first-child {
|
||||
flex-basis: var(--sidebar-width);
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.with-sidebar > :last-child {
|
||||
flex-basis: 0;
|
||||
flex-grow: 999;
|
||||
min-inline-size: 50%;
|
||||
}
|
||||
48
src/assets/css/src/2.blocks.button.css
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
/* BUTTON BLOCK */
|
||||
|
||||
.btn {
|
||||
--background: var(--color-primary-100);
|
||||
--color: var(--color-white);
|
||||
display: inline-flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: var(--space-md) var(--space-lg);
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
font-size: var(--text-sm);
|
||||
line-height: var(--leading-md);
|
||||
font-weight: 500;
|
||||
border-radius: var(--rounded-md);
|
||||
cursor: pointer;
|
||||
background-color: var(--background, var(--color-primary-100));
|
||||
color: var(--color, var(--color-white));
|
||||
}
|
||||
|
||||
.btn--secondary {
|
||||
--background: var(--color-primary-10);
|
||||
--color: var(--color-primary-100);
|
||||
}
|
||||
.btn--black {
|
||||
--background: var(--color-black);
|
||||
--color: var(--color-white);
|
||||
}
|
||||
.btn--white {
|
||||
--background: var(--color-white);
|
||||
--color: var(--color-grey-700);
|
||||
}
|
||||
.btn--white-10 {
|
||||
--background: var(--color-white-10);
|
||||
--color: var(--color-white);
|
||||
}
|
||||
|
||||
@media (hover: hover) {
|
||||
|
||||
}
|
||||
|
||||
.btn:focus-visible {
|
||||
|
||||
}
|
||||
|
||||
.btn:active {
|
||||
|
||||
}
|
||||
29
src/assets/css/src/2.blocks.card.css
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
/* CARD BLOCK */
|
||||
|
||||
.card {
|
||||
--padding: clamp(1.5rem, 0.5rem + 5vw, 5rem);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
padding: var(--padding);
|
||||
}
|
||||
|
||||
.card header {
|
||||
display: flex;
|
||||
flex-direction: column-reverse;
|
||||
}
|
||||
|
||||
.card__title > a {
|
||||
font: inherit;
|
||||
color: currentColor;
|
||||
}
|
||||
|
||||
.card__date {
|
||||
position: absolute;
|
||||
bottom: var(--padding);
|
||||
right: var(--padding);
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
background-color: var(--color-background-hover);
|
||||
}
|
||||
11
src/assets/css/src/2.blocks.header.css
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/* HEADER BLOCK */
|
||||
|
||||
.header {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
min-height: var(--header-height);
|
||||
padding: 0 var(--gutter);
|
||||
margin-bottom: var(--space-xl);
|
||||
}
|
||||
|
||||
27
src/assets/css/src/2.blocks.pill.css
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
/* PILL BLOCK */
|
||||
|
||||
.pill {
|
||||
display: inline-flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: var(--space-sm);
|
||||
padding: var(--space-xs) var(--space-md);
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
font-size: var(--text-sm);
|
||||
font-weight: 500;
|
||||
border-radius: var(--rounded-full);
|
||||
background-color: var(--background, var(--color-primary-100));
|
||||
color: var(--color, var(--color-white));
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
.pill--secondary {
|
||||
--background: var(--color-primary-10);
|
||||
--color: var(--color-primary-100);
|
||||
}
|
||||
|
||||
.pill[data-icon] {
|
||||
padding: var(--space-sm) var(--space-lg);
|
||||
}
|
||||
|
||||
34
src/assets/css/src/2.blocks.skip-link.css
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
/* SKIP-LINK BLOCK */
|
||||
|
||||
/* The skip link is visually hidden when it is not focused. */
|
||||
/* It exists so when a user hits tab on load, they can quickly */
|
||||
/* skip to the main content of the site—avoiding navigation etc */
|
||||
.skip-link {
|
||||
z-index: 9999;
|
||||
display: inline-block;
|
||||
width: max-content;
|
||||
max-width: 10rem;
|
||||
right: var(--gutter);
|
||||
width: auto;
|
||||
line-height: 1;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.skip-link:focus,
|
||||
.skip-link:focus-visible {
|
||||
background: var(--color-text);
|
||||
color: var(--color-background) !important;
|
||||
}
|
||||
|
||||
.skip-link:not(:focus) {
|
||||
/* @extend .visually-hidden */
|
||||
border: 0;
|
||||
clip-path: polygon(0% 0%, 0% 0%, 0% 0%, 0% 0%);
|
||||
height: 0;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
17
src/assets/css/src/3.utilities.border.css
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/* BORDER UTILITY */
|
||||
|
||||
/* Borders */
|
||||
|
||||
.border-t { border-top: var(--border) }
|
||||
.border-b { border-bottom: var(--border) }
|
||||
.border-l { border-left: var(--border) }
|
||||
.border-r { border-right: var(--border) }
|
||||
.border { border: var(--border) }
|
||||
|
||||
/* Border radius */
|
||||
|
||||
.rounded-xs { border-radius: var(--rounded-xs) }
|
||||
.rounded-sm { border-radius: var(--rounded-sm) }
|
||||
.rounded-md { border-radius: var(--rounded-md) }
|
||||
.rounded-lg { border-radius: var(--rounded-lg) }
|
||||
.rounded-full { border-radius: var(--rounded-gull) }
|
||||
6
src/assets/css/src/3.utilities.flow.css
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
/* FLOW UTILITY */
|
||||
/* Info: https://web.dev/design-system/css-utilities/#flow */
|
||||
|
||||
.flow > * + * {
|
||||
margin-top: var(--flow-space);
|
||||
}
|
||||
43
src/assets/css/src/3.utilities.icons.css
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
/* ICONS UTILITY */
|
||||
|
||||
:root {
|
||||
--icon-circle: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='50%' cy='50%' r='8' stroke='currentColor' stroke-width='1.25'/%3E%3C/svg%3E%0A");
|
||||
--icon-point: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='50%' cy='50%' r='4' fill='currentColor'/%3E%3C/svg%3E%0A");
|
||||
--icon-point-active: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='50%' cy='50%' r='4' fill='currentColor'/%3E%3Ccircle cx='50%' cy='50%' r='8' fill='currentColor' opacity='0.2'/%3E%3C/svg%3E%0A");
|
||||
--icon-home: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1.875 10L10 1.875L18.125 10M4.375 11.875V18.125H15.625V11.875' stroke='currentColor' stroke-width='1.25' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
|
||||
--icon-calendar: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3.125 4.375C2.79348 4.375 2.47554 4.5067 2.24112 4.74112C2.0067 4.97554 1.875 5.29348 1.875 5.625V16.875C1.875 17.2065 2.0067 17.5245 2.24112 17.7589C2.47554 17.9933 2.79348 18.125 3.125 18.125H16.875C17.2065 18.125 17.5245 17.9933 17.7589 17.7589C17.9933 17.5245 18.125 17.2065 18.125 16.875V5.625C18.125 5.29348 17.9933 4.97554 17.7589 4.74112C17.5245 4.5067 17.2065 4.375 16.875 4.375H14.375M1.875 9.375H18.125M5.625 1.875V6.875M14.375 1.875V6.875M5.625 4.375H11.875' stroke='currentColor' stroke-width='1.25' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
|
||||
--icon-check: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1.875 11.9375L5.2875 16.325C5.40265 16.4746 5.5502 16.5962 5.71906 16.6806C5.88792 16.7651 6.07372 16.8101 6.2625 16.8125C6.44824 16.8146 6.63213 16.7754 6.80078 16.6975C6.96944 16.6197 7.11863 16.5052 7.2375 16.3625L18.125 3.1875' stroke='currentColor' stroke-width='1.25' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
|
||||
--icon-check-3: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1.875 11.9375L5.2875 16.325C5.40265 16.4746 5.5502 16.5962 5.71906 16.6806C5.88792 16.7651 6.07372 16.8101 6.2625 16.8125C6.44824 16.8146 6.63213 16.7754 6.80078 16.6975C6.96944 16.6197 7.11863 16.5052 7.2375 16.3625L18.125 3.1875' stroke='currentColor' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
|
||||
--icon-user: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4.6625 16.125C5.2203 15.2094 6.00426 14.4527 6.93901 13.9276C7.87376 13.4025 8.92787 13.1267 10 13.1267C11.0721 13.1267 12.1262 13.4025 13.061 13.9276C13.9957 14.4527 14.7797 15.2094 15.3375 16.125M13.125 8.125C13.125 9.85089 11.7259 11.25 10 11.25C8.27411 11.25 6.875 9.85089 6.875 8.125C6.875 6.39911 8.27411 5 10 5C11.7259 5 13.125 6.39911 13.125 8.125ZM18.125 10C18.125 14.4873 14.4873 18.125 10 18.125C5.51269 18.125 1.875 14.4873 1.875 10C1.875 5.51269 5.51269 1.875 10 1.875C14.4873 1.875 18.125 5.51269 18.125 10Z' stroke='currentColor' stroke-width='1.25' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
|
||||
--icon-megaphone: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.85 14.4624C11.7448 15.3307 11.3125 16.1262 10.6412 16.687C9.96999 17.2477 9.11024 17.5315 8.23708 17.4805C7.36393 17.4295 6.54305 17.0476 5.94162 16.4125C5.34019 15.7775 5.00346 14.937 5 14.0624V12.0749M17.3 16.3374L2.7125 11.2499C2.47448 11.1669 2.26713 11.0138 2.11767 10.8108C1.96821 10.6078 1.88362 10.3644 1.875 10.1124V8.74991C1.87603 8.49151 1.95711 8.23979 2.10709 8.02937C2.25707 7.81895 2.46858 7.66018 2.7125 7.57491L17.3 2.49991C17.3937 2.46828 17.4935 2.45931 17.5913 2.47374C17.6891 2.48817 17.782 2.5256 17.8626 2.58294C17.9431 2.64028 18.0089 2.7159 18.0545 2.8036C18.1001 2.89129 18.1243 2.98856 18.125 3.08741V15.7499C18.1243 15.8488 18.1001 15.946 18.0545 16.0337C18.0089 16.1214 17.9431 16.197 17.8626 16.2544C17.782 16.3117 17.6891 16.3491 17.5913 16.3636C17.4935 16.378 17.3937 16.369 17.3 16.3374Z' stroke='currentColor' stroke-width='1.25' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
|
||||
--icon-inspiration: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10.0004 2.26245V4.13745M15.0004 4.04995L13.6754 5.38745M17.8504 7.92495H15.9754M5.00039 4.04995L6.32539 5.38745M2.15039 7.92495H4.02539M14.3754 11.25C14.3783 10.4699 14.1726 9.70317 13.7796 9.02932C13.3865 8.35547 12.8205 7.79897 12.14 7.41746C11.4596 7.03595 10.6895 6.84332 9.90957 6.85952C9.12964 6.87572 8.36823 7.10016 7.70421 7.50959C7.04019 7.91903 6.49773 8.49856 6.13301 9.18815C5.7683 9.87774 5.5946 10.6523 5.6299 11.4316C5.66521 12.2109 5.90825 12.9666 6.33383 13.6204C6.75942 14.2741 7.35207 14.8022 8.05039 15.15V17.3C8.05365 17.4271 8.10645 17.5479 8.19752 17.6366C8.28859 17.7254 8.41073 17.775 8.53789 17.775H11.4629C11.59 17.775 11.7122 17.7254 11.8033 17.6366C11.8943 17.5479 11.9471 17.4271 11.9504 17.3V15.1125C12.6707 14.7539 13.2782 14.2036 13.706 13.5222C14.1338 12.8407 14.3654 12.0545 14.3754 11.25Z' stroke='currentColor' stroke-width='1.25' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
|
||||
}
|
||||
|
||||
[data-icon] {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
[data-icon]::before {
|
||||
content: "";
|
||||
display: inline-block;
|
||||
width: var(--icon-size, 1.25rem);
|
||||
height: var(--icon-size, 1.25rem);
|
||||
background: var(--icon-color, currentColor);
|
||||
mask-repeat: no-repeat;
|
||||
mask-position: center;
|
||||
mask-size: var(--icon-size, 1.25rem);
|
||||
mask-image: var(--icon, var(--icon-circle));
|
||||
}
|
||||
|
||||
[data-icon="home"] {
|
||||
--icon: var(--icon-home)
|
||||
}
|
||||
[data-icon="calendar"] {
|
||||
--icon: var(--icon-calendar)
|
||||
}
|
||||
[data-icon="megaphone"] {
|
||||
--icon: var(--icon-megaphone)
|
||||
}
|
||||
[data-icon="inspiration"] {
|
||||
--icon: var(--icon-inspiration)
|
||||
}
|
||||
5
src/assets/css/src/3.utilities.overflow.css
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
/* OVERFLOW UTILITY */
|
||||
|
||||
.overflow-y-hidden {
|
||||
overflow-y: hidden !important;
|
||||
}
|
||||
13
src/assets/css/src/3.utilities.screen-readers.css
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
/* SCREEN READERS */
|
||||
|
||||
.sr-only {
|
||||
border: 0;
|
||||
clip-path: polygon(0% 0%, 0% 0%, 0% 0%, 0% 0%);
|
||||
height: 0;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
12
src/assets/css/src/3.utilities.size.css
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/* SIZE UTILITY */
|
||||
|
||||
.h-full {
|
||||
height: 100%;
|
||||
}
|
||||
.min-h-screen {
|
||||
min-height: 100vh;
|
||||
min-height: 100dvh;
|
||||
}
|
||||
.w-full {
|
||||
width: 100%;
|
||||
}
|
||||
84
src/assets/css/src/3.utilities.spacing.css
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
/* SPACING UTILITY */
|
||||
|
||||
/* Margins */
|
||||
|
||||
.m-0 { margin: 0 }
|
||||
|
||||
.mb-0 { margin-bottom: 0 }
|
||||
.mb-xs { margin-bottom: var(--space-xs) }
|
||||
.mb-sm { margin-bottom: var(--space-sm) }
|
||||
.mb-md { margin-bottom: var(--space-md) }
|
||||
.mb-lg { margin-bottom: var(--space-lg) }
|
||||
.mb-xl { margin-bottom: var(--space-xl) }
|
||||
.mb-2xl { margin-bottom: var(--space-2xl) }
|
||||
|
||||
.ml-auto { margin-left: auto }
|
||||
.ml-xs { margin-left: var(--space-xs) }
|
||||
.ml-sm { margin-left: var(--space-sm) }
|
||||
.ml-md { margin-left: var(--space-md) }
|
||||
.ml-lg { margin-left: var(--space-lg) }
|
||||
.ml-xl { margin-left: var(--space-xl) }
|
||||
|
||||
.mr-auto { margin-right: auto }
|
||||
.mr-xs { margin-right: var(--space-xs) }
|
||||
.mr-sm { margin-right: var(--space-sm) }
|
||||
.mr-md { margin-right: var(--space-md) }
|
||||
.mr-lg { margin-right: var(--space-lg) }
|
||||
.mr-xl { margin-right: var(--space-xl) }
|
||||
|
||||
.-mt-px { margin-top: -1px }
|
||||
.mt-0 { margin-top: 0 }
|
||||
.mt-xs { margin-top: var(--space-xs) }
|
||||
.mt-sm { margin-top: var(--space-sm) }
|
||||
.mt-md { margin-top: var(--space-md) }
|
||||
.mt-lg { margin-top: var(--space-lg) }
|
||||
.mt-xl { margin-top: var(--space-xl) }
|
||||
.mt-2xl { margin-top: var(--space-2xl) }
|
||||
|
||||
.mx-px { margin-left: 1px ; margin-right: 1px }
|
||||
.mx-xs { margin-left: var(--space-xs) ; margin-right: var(--space-xs) }
|
||||
.mx-sm { margin-left: var(--space-sm) ; margin-right: var(--space-sm) }
|
||||
.mx-md { margin-left: var(--space-md) ; margin-right: var(--space-md) }
|
||||
.mx-lg { margin-left: var(--space-lg) ; margin-right: var(--space-lg) }
|
||||
.mx-xl { margin-left: var(--space-xl) ; margin-right: var(--space-xl) }
|
||||
.mx-2xl { margin-left: var(--space-2xl); margin-right: var(--space-2xl) }
|
||||
|
||||
.my-xs { margin-top: var(--space-xs) ; margin-bottom: var(--space-xs) }
|
||||
.my-sm { margin-top: var(--space-sm) ; margin-bottom: var(--space-sm) }
|
||||
.my-md { margin-top: var(--space-md) ; margin-bottom: var(--space-md) }
|
||||
.my-lg { margin-top: var(--space-lg) ; margin-bottom: var(--space-lg) }
|
||||
.my-xl { margin-top: var(--space-xl) ; margin-bottom: var(--space-xl) }
|
||||
.my-2xl { margin-top: var(--space-2xl); margin-bottom: var(--space-2xl) }
|
||||
|
||||
|
||||
/* Padding */
|
||||
|
||||
.pl-0 { padding-left: 0 }
|
||||
|
||||
.pt-xs { padding-top: var(--space-xs) }
|
||||
.pt-sm { padding-top: var(--space-sm) }
|
||||
.pt-md { padding-top: var(--space-md) }
|
||||
.pt-lg { padding-top: var(--space-lg) }
|
||||
.pt-xl { padding-top: var(--space-xl) }
|
||||
.pt-2xl { padding-top: var(--space-2xl) }
|
||||
|
||||
.pb-xs { padding-bottom: var(--space-xs) }
|
||||
.pb-sm { padding-bottom: var(--space-sm) }
|
||||
.pb-md { padding-bottom: var(--space-md) }
|
||||
.pb-lg { padding-bottom: var(--space-lg) }
|
||||
.pb-xl { padding-bottom: var(--space-xl) }
|
||||
.pb-2xl { padding-bottom: var(--space-2xl) }
|
||||
|
||||
.px-xs { padding-left: var(--space-xs) ; padding-right: var(--space-xs) }
|
||||
.px-sm { padding-left: var(--space-sm) ; padding-right: var(--space-sm) }
|
||||
.px-md { padding-left: var(--space-md) ; padding-right: var(--space-md) }
|
||||
.px-lg { padding-left: var(--space-lg) ; padding-right: var(--space-lg) }
|
||||
.px-xl { padding-left: var(--space-xl) ; padding-right: var(--space-xl) }
|
||||
.px-2xl { padding-left: var(--space-2xl); padding-right: var(--space-2xl) }
|
||||
|
||||
.py-xs { padding-top: var(--space-xs) ; padding-bottom: var(--space-xs) }
|
||||
.py-sm { padding-top: var(--space-sm) ; padding-bottom: var(--space-sm) }
|
||||
.py-md { padding-top: var(--space-md) ; padding-bottom: var(--space-md) }
|
||||
.py-lg { padding-top: var(--space-lg) ; padding-bottom: var(--space-lg) }
|
||||
.py-xl { padding-top: var(--space-xl) ; padding-bottom: var(--space-xl) }
|
||||
.py-2xl { padding-top: var(--space-2xl); padding-bottom: var(--space-2xl) }
|
||||
92
src/assets/css/src/3.utilities.text.css
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
/* TEXT UTILITY */
|
||||
|
||||
/* Font family */
|
||||
|
||||
.font-serif {
|
||||
font-family: var(--font-serif);
|
||||
font-optical-sizing: auto;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
/* Fonts weights */
|
||||
|
||||
.font-normal {
|
||||
font-weight: 400;
|
||||
}
|
||||
.font-medium {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
|
||||
/* Font sizes */
|
||||
|
||||
.text-sm {
|
||||
font-size: var(--text-sm); /* 14px */
|
||||
line-height: 1.4285714286; /* 20px */
|
||||
}
|
||||
.text-md {
|
||||
font-size: var(--text-md); /* 16px */
|
||||
line-height: 1.5; /* 24px */
|
||||
}
|
||||
.text-lg {
|
||||
font-size: var(--text-lg); /* 24px */
|
||||
line-height: 1.5; /* 36px */
|
||||
}
|
||||
|
||||
|
||||
/* Case */
|
||||
|
||||
.uppercase {
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
line-height: 1.333;
|
||||
letter-spacing: 0.3rem;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
|
||||
/* Text align */
|
||||
|
||||
.text-right { text-align: right }
|
||||
.text-center { text-align: center }
|
||||
|
||||
|
||||
|
||||
/* Text colors */
|
||||
|
||||
.text-white {
|
||||
color: var(--color-white);
|
||||
}
|
||||
.text-grey-200 {
|
||||
color: var(--color-grey-200);
|
||||
}
|
||||
.text-grey-400 {
|
||||
color: var(--color-grey-400);
|
||||
}
|
||||
.text-grey-700 {
|
||||
color: var(--color-grey-700);
|
||||
}
|
||||
.text-background {
|
||||
color: var(--color-background);
|
||||
}
|
||||
.text-transparent {
|
||||
color: transparent;
|
||||
}
|
||||
.text-brand-100 {
|
||||
color: var(--color-brand-100);
|
||||
}
|
||||
|
||||
|
||||
/* User select */
|
||||
|
||||
.select-none {
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
|
||||
/* Underline */
|
||||
|
||||
.underline {
|
||||
text-decoration: underline;
|
||||
}
|
||||
114
src/components/Menu.vue
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
<template>
|
||||
<button @click="toggleExpand()" class="btn btn--white | rounded-lg" aria-controls="menu" :aria-expanded="isExpanded">
|
||||
<svg aria-labelledby="menu-toggle" class="icon" width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<title id="menu-toggle">{{ isExpanded ? 'Masquer le menu' : 'Afficher le menu' }}</title>
|
||||
<path d="M10.6751 2.625L3.00007 10.3125C2.94028 10.3686 2.89263 10.4364 2.86005 10.5116C2.82748 10.5869 2.81067 10.668 2.81067 10.75C2.81067 10.832 2.82748 10.9131 2.86005 10.9884C2.89263 11.0636 2.94028 11.1314 3.00007 11.1875L10.6751 18.875M17.1876 2.625L9.50007 10.3125C9.38555 10.4293 9.32141 10.5864 9.32141 10.75C9.32141 10.9136 9.38555 11.0707 9.50007 11.1875L17.1876 18.875" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
</button>
|
||||
<aside v-if="isExpanded" id="menu" class="flex | rounded-lg">
|
||||
<header class="flex">
|
||||
<h2>Nom du service</h2>
|
||||
</header>
|
||||
<nav>
|
||||
<ul class="flex">
|
||||
<li data-icon="home">
|
||||
<a aria-current="page">Home</a>
|
||||
</li>
|
||||
<li data-icon="megaphone" data-count="4">
|
||||
<a>Notifications</a>
|
||||
</li>
|
||||
<li data-icon="calendar">
|
||||
<a>Réunions</a>
|
||||
<span class="pill pill--secondary">Dans 2h</span>
|
||||
</li>
|
||||
<li data-icon="inspiration">
|
||||
<a>Inspirations</a>
|
||||
<span class="pill pill--secondary">Nouveauté</span>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</aside>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
button[aria-controls="menu"] {
|
||||
position: fixed;
|
||||
z-index: 10;
|
||||
top: 48px;
|
||||
}
|
||||
button[aria-controls="menu"][aria-expanded="true"] {
|
||||
padding: 10px;
|
||||
left: calc(var(--sidebar-width) - var(--space-xl));
|
||||
}
|
||||
button[aria-controls="menu"][aria-expanded="false"] {
|
||||
top: var(--gutter);
|
||||
padding: 18px;
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
/* Menu */
|
||||
|
||||
#menu {
|
||||
--flow-space: var(--space-2xl);
|
||||
--direction: column;
|
||||
--items: flex-start;
|
||||
width: var(--sidebar-width);
|
||||
padding: var(--gap);
|
||||
background: var(--color-background);
|
||||
}
|
||||
|
||||
#menu header {
|
||||
--justify: center;
|
||||
padding-left: var(--gap);
|
||||
height: 40px;
|
||||
font-family: var(--font-serif);
|
||||
font-size: var(--text-lg);
|
||||
}
|
||||
|
||||
#menu nav {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#menu ul {
|
||||
--direction: column;
|
||||
--items: flex-start;
|
||||
--row-gap: var(--space-xs);
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#menu li {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
min-height: 2.5rem; /* 40px */
|
||||
max-height: 2.75rem; /* 44px */
|
||||
padding: 0 var(--space-lg);
|
||||
gap: var(--space-md);
|
||||
}
|
||||
|
||||
#menu li[data-count]::after {
|
||||
content: attr(data-count);
|
||||
display: inline-block;
|
||||
color: var(--color-primary);
|
||||
font-size: var(--text-sm);
|
||||
font-weight: 500;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
#menu li .pill {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
#menu .active {
|
||||
background-color: var(--color-grey-50);
|
||||
}
|
||||
</style>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue';
|
||||
const isExpanded = ref(true);
|
||||
function toggleExpand() {
|
||||
isExpanded.value = !isExpanded.value;
|
||||
}
|
||||
</script>
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
import { createApp } from "vue";
|
||||
import "./assets/css/style.css";
|
||||
import "./assets/css/index.css";
|
||||
import App from "./App.vue";
|
||||
import { createPinia } from "pinia";
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,298 @@
|
|||
<template>
|
||||
<h1>{{ data.content.title }}</h1>
|
||||
<h1 class="sr-only">{{ data.content.title }}</h1>
|
||||
<div class="with-sidebar">
|
||||
<Menu />
|
||||
<!-- TODO: convert to TabList.vue component -->
|
||||
<main>
|
||||
<h2 id="tabslist" class="sr-only">Projets</h2>
|
||||
<header role="tablist" aria-labelledby="tablist">
|
||||
<!-- Tab.vue -->
|
||||
<button
|
||||
id="projets-en-cours-label"
|
||||
type="button"
|
||||
role="tab"
|
||||
aria-selected="true"
|
||||
aria-controls="projets-en-cours"
|
||||
>
|
||||
<!--
|
||||
id="{ tab.slug }-label"
|
||||
aria-selected="true | false"
|
||||
aria-controls="{ tab.slug }"
|
||||
-->
|
||||
<span class="label">Projets en cours</span>
|
||||
<!-- tab.label -->
|
||||
<span class="count">3</span>
|
||||
<!-- tab.items.count -->
|
||||
</button>
|
||||
<button
|
||||
id="projet-archives-label"
|
||||
type="button"
|
||||
role="tab"
|
||||
aria-selected="false"
|
||||
aria-controls="projets-archives"
|
||||
tabindex="-1"
|
||||
>
|
||||
<!-- remove tabindex="-1" attribute if aria-selected="true" -->
|
||||
<span class="label">Projets archivés</span>
|
||||
<span class="count">8</span>
|
||||
</button>
|
||||
</header>
|
||||
<!-- TabPanel.vue -->
|
||||
<section
|
||||
id="projets-en-cours"
|
||||
role="tabpanel"
|
||||
tabindex="0"
|
||||
aria-labelledby="projets-en-cours-label"
|
||||
class="flow"
|
||||
>
|
||||
<!-- TODO: convert to ProjectItem.vue component -->
|
||||
<article class="project-item | flex | rounded-lg | px-2xl py-2xl">
|
||||
<hgroup>
|
||||
<h3>Miss Dior Blooming Bouquet</h3>
|
||||
<p>
|
||||
Dernière mise à jour le
|
||||
<time datetime="2024-06-12">12 juin 2024</time>
|
||||
</p>
|
||||
</hgroup>
|
||||
<img src="" alt="Logo" class="project-logo | rounded-sm" />
|
||||
<ol class="project-steps" data-steps="1">
|
||||
<li class="project-step" data-status="in-progress">
|
||||
<span class="pill" data-icon="search">Votre Brief</span>
|
||||
</li>
|
||||
</ol>
|
||||
</article>
|
||||
<article class="project-item | flex | rounded-lg | px-2xl py-2xl">
|
||||
<hgroup>
|
||||
<h3>Miss Dior Blooming Bouquet</h3>
|
||||
<p>
|
||||
Dernière mise à jour le
|
||||
<time datetime="2024-06-12">12 juin 2024</time>
|
||||
</p>
|
||||
</hgroup>
|
||||
<img src="" alt="Logo" class="project-logo | rounded-sm" />
|
||||
<ol class="project-steps" data-steps="3">
|
||||
<li class="project-step" data-status="done">
|
||||
<span class="pill" data-icon="search">Votre Brief</span>
|
||||
</li>
|
||||
<li class="project-step" data-status="in-progress">
|
||||
<span class="pill" data-icon="palette">Brief Enrichi</span>
|
||||
</li>
|
||||
<li class="project-step" data-status="uncompleted">
|
||||
<span class="pill" data-icon="3d">Rendu 360°</span>
|
||||
</li>
|
||||
</ol>
|
||||
</article>
|
||||
</section>
|
||||
<section
|
||||
id="projets-archives"
|
||||
role="tabpanel"
|
||||
tabindex="0"
|
||||
aria-labelledby="projet-archives-label"
|
||||
hidden
|
||||
>
|
||||
<!-- remove hidden attribute if aria-selected="true" -->
|
||||
<div>Tab 2 content</div>
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import Btn from "../components/Btn.vue";
|
||||
|
||||
<style scoped>
|
||||
/* TABS */
|
||||
|
||||
[role="tablist"] {
|
||||
width: fit-content;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
justify-content: center;
|
||||
margin: 0 auto var(--space-md);
|
||||
border-radius: var(--rounded-full);
|
||||
min-height: 60px;
|
||||
}
|
||||
|
||||
[role="tab"] {
|
||||
--tab-height: 2.5rem;
|
||||
--tab-py: var(--space-md);
|
||||
--tab-px: var(--space-lg);
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
font-size: var(--text-md);
|
||||
border-radius: var(--rounded-full);
|
||||
background-color: var(--background, var(--color-background));
|
||||
color: var(--color, var(--color-text));
|
||||
z-index: 2;
|
||||
padding: var(--tab-py) var(--tab-px);
|
||||
margin: 0;
|
||||
cursor: pointer;
|
||||
gap: var(--space-lg);
|
||||
height: var(--tab-height);
|
||||
}
|
||||
[role="tab"]:focus,
|
||||
[role="tab"]:hover {
|
||||
}
|
||||
[role="tab"] .label {
|
||||
flex-grow: 1;
|
||||
font-family: var(--font-serif);
|
||||
}
|
||||
[role="tab"] .count {
|
||||
font-size: var(--text-sm);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
[role="tab"][aria-selected="true"] {
|
||||
--background: var(--color-background);
|
||||
z-index: 10;
|
||||
}
|
||||
[role="tab"][aria-selected="false"] {
|
||||
--background: var(--color-grey-200);
|
||||
--color: var(--color-grey-700);
|
||||
}
|
||||
|
||||
[role="tab"][aria-selected="true"] + [aria-selected="false"]::before {
|
||||
content: "";
|
||||
display: inline-block;
|
||||
height: var(--tab-height);
|
||||
width: calc(var(--tab-px) * 2);
|
||||
position: absolute;
|
||||
left: calc(var(--tab-px) * -1);
|
||||
background-color: var(--color-grey-200);
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
[role="tabpanel"] {
|
||||
width: 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/* PROJECT ITEM */
|
||||
|
||||
.project-item {
|
||||
--wrap: no-wrap;
|
||||
background: var(--color-background);
|
||||
}
|
||||
|
||||
.project-item hgroup {
|
||||
flex: 1 1 0%;
|
||||
}
|
||||
.project-item h3 {
|
||||
font-family: var(--font-serif);
|
||||
font-size: var(--text-lg);
|
||||
margin-bottom: var(--space-sm);
|
||||
}
|
||||
.project-item p {
|
||||
font-size: var(--text-sm);
|
||||
line-height: var(--leading-sm);
|
||||
}
|
||||
|
||||
.project-logo {
|
||||
order: -1;
|
||||
background: var(--color-grey-50);
|
||||
color: var(--color-grey-400);
|
||||
text-align: center;
|
||||
line-height: 4.5rem;
|
||||
width: 4.5rem;
|
||||
height: 4.5rem;
|
||||
}
|
||||
|
||||
.project-steps {
|
||||
--color: var(--color-primary-100);
|
||||
flex: 1 1 0%;
|
||||
display: flex;
|
||||
gap: var(--space-lg);
|
||||
margin-top: -2.75rem;
|
||||
position: relative;
|
||||
}
|
||||
.project-steps[data-steps="1"]::after {
|
||||
content: "étapes à venir";
|
||||
font-size: var(--text-sm);
|
||||
font-weight: 500;
|
||||
width: 8rem;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
color: var(--color-grey-700);
|
||||
background: var(--color-background);
|
||||
bottom: -2rem;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -0.2em);
|
||||
}
|
||||
|
||||
.project-step {
|
||||
--color: var(--color-white);
|
||||
position: relative;
|
||||
flex: 1 1 0%;
|
||||
text-align: center;
|
||||
}
|
||||
.project-step:last-child {
|
||||
text-align: right;
|
||||
}
|
||||
.project-step:only-child,
|
||||
.project-step:first-child {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.project-step[data-status="in-progress"]:only-child::before,
|
||||
.project-step[data-status="in-progress"]:only-child::after {
|
||||
content: "";
|
||||
display: inline-block;
|
||||
height: 1.25rem;
|
||||
position: absolute;
|
||||
right: 3.75rem;
|
||||
bottom: -2rem;
|
||||
}
|
||||
.project-step[data-status="in-progress"]:only-child::before {
|
||||
height: 1rem;
|
||||
color: red;
|
||||
background-repeat: repeat;
|
||||
background-position: left center;
|
||||
background-image: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='50%' cy='50%' r='4' opacity='0.15' fill='black'/%3E%3C/svg%3E%0A");
|
||||
background-size: 0.75rem;
|
||||
left: 5.5rem;
|
||||
right: 5.5rem;
|
||||
bottom: -1.875rem;
|
||||
}
|
||||
.project-step[data-status="in-progress"]:only-child::after {
|
||||
--icon-size: 1.25rem;
|
||||
width: var(--icon-size);
|
||||
background: var(--color-grey-300);
|
||||
mask-repeat: no-repeat;
|
||||
mask-position: center;
|
||||
mask-size: var(--icon-size);
|
||||
mask-image: var(--icon-point);
|
||||
right: 3.75rem;
|
||||
bottom: -2rem;
|
||||
}
|
||||
|
||||
.project-step .pill::after {
|
||||
content: "";
|
||||
display: inline-block;
|
||||
width: var(--icon-size, 1.25rem);
|
||||
height: var(--icon-size, 1.25rem);
|
||||
background-color: var(--icon-color, var(--color-primary-100));
|
||||
mask-repeat: no-repeat;
|
||||
mask-position: center;
|
||||
mask-size: var(--size, 1.25rem);
|
||||
mask-image: var(--icon, var(--icon-point));
|
||||
position: absolute;
|
||||
bottom: -2rem;
|
||||
}
|
||||
.project-step[data-status="done"] > .pill,
|
||||
.project-step[data-status="uncompleted"] > .pill {
|
||||
--background: transparent;
|
||||
}
|
||||
.project-step[data-status="done"] .pill::after {
|
||||
mask-image: var(--icon-check-3);
|
||||
}
|
||||
.project-step[data-status="in-progress"] .pill::after {
|
||||
mask-image: var(--icon-point-active);
|
||||
}
|
||||
.project-step[data-status="uncompleted"] .pill::after {
|
||||
--icon-color: var(--color-grey-300);
|
||||
}
|
||||
</style>
|
||||
|
||||
<script setup>
|
||||
import Menu from "../components/Menu.vue";
|
||||
const { data } = defineProps({
|
||||
data: Object,
|
||||
});
|
||||
|
|
|
|||