initial commit
This commit is contained in:
commit
c7c8fc4e67
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
node_modules
|
||||||
|
.DS_Store
|
||||||
|
dist
|
||||||
|
*.local
|
||||||
|
.vite-inspect
|
||||||
|
.remote-assets
|
||||||
|
.idea/
|
||||||
|
components.d.ts
|
3
.prettierignore
Normal file
3
.prettierignore
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Ignore artifacts:
|
||||||
|
build
|
||||||
|
coverage
|
21
.prettierrc.json
Normal file
21
.prettierrc.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"arrowParens": "always",
|
||||||
|
"bracketSameLine": false,
|
||||||
|
"bracketSpacing": true,
|
||||||
|
"embeddedLanguageFormatting": "auto",
|
||||||
|
"endOfLine": "lf",
|
||||||
|
"htmlWhitespaceSensitivity": "css",
|
||||||
|
"insertPragma": false,
|
||||||
|
"jsxSingleQuote": true,
|
||||||
|
"printWidth": 80,
|
||||||
|
"proseWrap": "preserve",
|
||||||
|
"quoteProps": "as-needed",
|
||||||
|
"requirePragma": false,
|
||||||
|
"semi": false,
|
||||||
|
"singleAttributePerLine": false,
|
||||||
|
"singleQuote": true,
|
||||||
|
"tabWidth": 2,
|
||||||
|
"trailingComma": "none",
|
||||||
|
"useTabs": false,
|
||||||
|
"vueIndentScriptAndStyle": false
|
||||||
|
}
|
3
.vscode/extensions.json
vendored
Normal file
3
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"recommendations": ["antfu.slidev"]
|
||||||
|
}
|
11
.vscode/settings.json
vendored
Normal file
11
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
|
"editor.fontSize": 16,
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"slidev.force-enabled": true,
|
||||||
|
"slidev.include": ["**/slides.md", "example.md"],
|
||||||
|
"[markdown]": {
|
||||||
|
"editor.defaultFormatter": "antfu.slidev"
|
||||||
|
},
|
||||||
|
"prettier.configPath": ".prettierrc.json"
|
||||||
|
}
|
50
README.md
Normal file
50
README.md
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# slidev-theme-narduin
|
||||||
|
|
||||||
|
[![NPM version](https://img.shields.io/npm/v/slidev-theme-narduin?color=3AB9D4&label=)](https://www.npmjs.com/package/slidev-theme-narduin)
|
||||||
|
|
||||||
|
A (...) theme for [Slidev](https://github.com/slidevjs/slidev).
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Learn more about how to write a theme:
|
||||||
|
https://sli.dev/guide/write-theme.html
|
||||||
|
--->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
run `npm run dev` to check out the slides for more details of how to start writing a theme
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Put some screenshots here to demonstrate your theme
|
||||||
|
|
||||||
|
Live demo: [...]
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
Add the following frontmatter to your `slides.md`. Start Slidev then it will prompt you to install the theme automatically.
|
||||||
|
|
||||||
|
<pre><code>---
|
||||||
|
theme: <b>narduin</b>
|
||||||
|
---</code></pre>
|
||||||
|
|
||||||
|
Learn more about [how to use a theme](https://sli.dev/guide/theme-addon#use-theme).
|
||||||
|
|
||||||
|
## Layouts
|
||||||
|
|
||||||
|
This theme provides the following layouts:
|
||||||
|
|
||||||
|
> TODO:
|
||||||
|
|
||||||
|
## Components
|
||||||
|
|
||||||
|
This theme provides the following components:
|
||||||
|
|
||||||
|
> TODO:
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
- `npm install`
|
||||||
|
- `npm run dev` to start theme preview of `example.md`
|
||||||
|
- Edit the `example.md` and style to see the changes
|
||||||
|
- `npm run export` to generate the preview PDF
|
||||||
|
- `npm run screenshot` to generate the preview PNG
|
0
components/.gitkeep
Normal file
0
components/.gitkeep
Normal file
574
example.md
Normal file
574
example.md
Normal file
@ -0,0 +1,574 @@
|
|||||||
|
---
|
||||||
|
author: Nicolas Arduin
|
||||||
|
download: true
|
||||||
|
exportFilename: intriduction-accessibilite-numerique
|
||||||
|
lineNumbers: true
|
||||||
|
remoteAssets: true
|
||||||
|
htmlAttrs:
|
||||||
|
dir: ltr
|
||||||
|
lang: fr
|
||||||
|
theme: ./
|
||||||
|
# some information about your slides (markdown enabled)
|
||||||
|
title: Introduction à l'accessibilité numérique
|
||||||
|
info: |
|
||||||
|
## Commencer avec l'accessibilité
|
||||||
|
Pourquoi, pour qui et comment ?
|
||||||
|
|
||||||
|
Learn more at [Sli.dev](https://sli.dev)
|
||||||
|
# https://sli.dev/features/drawing
|
||||||
|
drawings:
|
||||||
|
persist: false
|
||||||
|
# slide transition: https://sli.dev/guide/animations.html#slide-transitions
|
||||||
|
transition: fade-out
|
||||||
|
# enable MDC Syntax: https://sli.dev/features/mdc
|
||||||
|
mdc: true
|
||||||
|
# make slide text selectable
|
||||||
|
selectable: true
|
||||||
|
# take snapshot for each slide in the overview
|
||||||
|
overviewSnapshots: true
|
||||||
|
hideInToc: true
|
||||||
|
layout: intro
|
||||||
|
---
|
||||||
|
|
||||||
|
# Introduction à <span class="highlight">l'accessibilité numérique</span>
|
||||||
|
|
||||||
|
<div class="abs-br m-6">
|
||||||
|
<a href="https://www.nardu.in" rel="noreferer noopener">Nico,</a> Décembre 2024.<br>licence : <a href="https://creativecommons.org/licenses/by-nc/4.0/" rel="noreferer noopener">CC BY-NC</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The last comment block of each slide will be treated as slide notes. It will be visible and editable in Presenter Mode along with the slide. [Read more in the docs](https://sli.dev/guide/syntax.html#notes)
|
||||||
|
-->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
hideInToc: true
|
||||||
|
layout: bullets
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Sommaire
|
||||||
|
|
||||||
|
<Toc maxDepth="1"></Toc>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
layout: title-image
|
||||||
|
image: https://cover.sli.dev
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# l'Accessibilité Numérique
|
||||||
|
|
||||||
|
Pourquoi, pour qui, comment ?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
layout: quote
|
||||||
|
level: 2
|
||||||
|
hideInToc: true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> ## “ La force du Web réside dans son universalité. L'accès de tous, quel que soit le handicap, en est un aspect essentiel. ”
|
||||||
|
|
||||||
|
Tim Berners-Lee, Directeur du W3C et inventeur du World Wide Web
|
||||||
|
|
||||||
|
<!-- Accès universel (accessible) dès la création de l'outil -->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
layout: fact
|
||||||
|
hideInToc: true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 1 personne sur 5 est handicapée
|
||||||
|
|
||||||
|
La majorité des handicaps sont invisibles.
|
||||||
|
|
||||||
|
<!-- certains sont temporaires, certains arrivent avec l'âge -->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
layout: quote
|
||||||
|
hideInToc: true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# “ L’accessibilité numérique est un droit fondamental. C’est la possibilité pour toutes et tous d’utiliser les outils informatiques, quelle que soit leur façon d’y accéder. ”
|
||||||
|
|
||||||
|
Access 42
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## hideInToc: true
|
||||||
|
|
||||||
|
## L'accessibilité du Web englobe tous les handicaps qui affectent l'accès au Web, notamment :
|
||||||
|
|
||||||
|
- auditifs
|
||||||
|
- cognitifs
|
||||||
|
- neurologiques
|
||||||
|
- physiques
|
||||||
|
- psychologiques
|
||||||
|
- oraux
|
||||||
|
- visuels
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## layout: center
|
||||||
|
|
||||||
|
# Exemples de technologies d'assistance
|
||||||
|
|
||||||
|
<div grid="~ cols-2 gap-4">
|
||||||
|
<Youtube id="nw6-eDJXWzY" />
|
||||||
|
<Youtube id="N9Q8oF0Lx2M" />
|
||||||
|
<Youtube id="SlxIEPEC_Qc" />
|
||||||
|
<Youtube id="LHUyDhutx80" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Bonnes pratiques en bref
|
||||||
|
|
||||||
|
- [HTML sémantique](https://developer.mozilla.org/fr/docs/Glossary/Semantics)
|
||||||
|
- structure du contenu ([titres](https://developer.mozilla.org/fr/docs/Web/HTML/Element/Heading_Elements))
|
||||||
|
- contrastes des couleurs ([outil](https://coolors.co/contrast-checker))
|
||||||
|
- taille et unités des polices
|
||||||
|
- formulaire
|
||||||
|
- intitulés
|
||||||
|
- aide à la saisie
|
||||||
|
- messages d’erreur
|
||||||
|
- animations/mouvement (carousel, vidéo, scroll, etc.)
|
||||||
|
- écrire simplement et clairement ([FALC](https://www.culture.gouv.fr/Thematiques/developpement-culturel/Culture-et-handicap/Facile-a-lire-et-a-comprendre-FALC-une-methode-utile))
|
||||||
|
- simplifier l'interface utilisateur
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Éléments sémantiques
|
||||||
|
|
||||||
|
````md magic-move {lines: true}
|
||||||
|
```html
|
||||||
|
<body>
|
||||||
|
<div class="header">
|
||||||
|
<div class="nav">
|
||||||
|
<a href="#">Accueil</a>
|
||||||
|
<a href="#">À propos</a>
|
||||||
|
<a href="#">Contact</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="main">
|
||||||
|
<h1>Titre de la page</h1>
|
||||||
|
<h2>Titre de la section</h2>
|
||||||
|
<p>Contenu de la page</p>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<p>Pied de page</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
```
|
||||||
|
|
||||||
|
```html
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<nav>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#">Accueil</a></li>
|
||||||
|
<li><a href="#">À propos</a></li>
|
||||||
|
<li><a href="#">Contact</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<h1>Titre de la page</h1>
|
||||||
|
<section>
|
||||||
|
<h2>Titre de la section</h2>
|
||||||
|
<p>Contenu de la page</p>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
<footer>
|
||||||
|
<p>Pied de page</p>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
```
|
||||||
|
````
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## layout: two-cols-header
|
||||||
|
|
||||||
|
## Structure du contenu
|
||||||
|
|
||||||
|
::left::
|
||||||
|
|
||||||
|
```md {all|2|3|4|none}{lines: false}
|
||||||
|
Erroné
|
||||||
|
└── h1 Titre principal
|
||||||
|
├── h2 Titre secondaire
|
||||||
|
├── h4 Titre niveau 4
|
||||||
|
│ └── h5 Titre niveau 5
|
||||||
|
├── h2 Titre secondaire
|
||||||
|
│ ├── h2 Titre secondaire
|
||||||
|
│ ├── h3 Titre tertiaire
|
||||||
|
│ │ ├── h4 Titre niveau 4
|
||||||
|
│ │ │ └── h6 Titre niveau 6
|
||||||
|
│ └── h3 Titre tertiaire
|
||||||
|
└── h1 Titre principal
|
||||||
|
```
|
||||||
|
|
||||||
|
::right::
|
||||||
|
|
||||||
|
```md {none|all}{lines: false}
|
||||||
|
Correct
|
||||||
|
└── h1 Titre principal
|
||||||
|
├── h2 Titre secondaire
|
||||||
|
├── h2 Titre secondaire
|
||||||
|
│ └── h3 Titre tertiaire
|
||||||
|
├── h2 Titre secondaire
|
||||||
|
│ ├── h3 Titre tertiaire
|
||||||
|
│ ├── h3 Titre tertiaire
|
||||||
|
│ │ ├── h4 Titre niveau 4
|
||||||
|
│ │ │ └── h5 Titre niveau 5
|
||||||
|
│ └── h3 Titre tertiaire
|
||||||
|
└── h2 Titre secondaire
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- [HeadingsMap](https://addons.mozilla.org/fr/firefox/addon/headingsmap/) -->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
layout: center
|
||||||
|
hideInToc: true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# les Formulaires
|
||||||
|
|
||||||
|
C'est si simple de faire n'importe quoi 🤪
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## layout: two-cols
|
||||||
|
|
||||||
|
<div class="form">
|
||||||
|
<h2>Mauvais exemple :</h2>
|
||||||
|
<form class="nul">
|
||||||
|
<input type="text" placeholder="nom*">
|
||||||
|
<input type="text" placeholder="email*">
|
||||||
|
<button>Envoyer</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
::right::
|
||||||
|
|
||||||
|
<div class="form">
|
||||||
|
<h2>Bon exemple :</h2>
|
||||||
|
<form class="cool">
|
||||||
|
<div v-click role="group" aria-labelledby="error-summary-title">
|
||||||
|
<h3 id="error-summary-title" tabindex="-1">
|
||||||
|
Il y a 2 erreurs de saisie dans le formulaire.
|
||||||
|
</h3>
|
||||||
|
<ol>
|
||||||
|
<li class="error">
|
||||||
|
<a href="#input-name">Veuillez renseigner un nom.</a>
|
||||||
|
</li>
|
||||||
|
<li class="error">
|
||||||
|
<a href="#input-email">L'email renseigné n'est pas valide.</a>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
<label for="name">Nom (obligatorie)</label>
|
||||||
|
<input id="name" type="text" required>
|
||||||
|
<label for="email">Email (obligatoire)</label>
|
||||||
|
<input id="email" type="email" aria-describedby="email-description" required>
|
||||||
|
<p id="email-description">Format attendu: nom@email.fr</p>
|
||||||
|
<button>Envoyer</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="absolute bottom-10">
|
||||||
|
<a href="https://briefs.video/videos/what-happened-to-text-inputs/" rel="noreferer noopener">Qu'est-il arrivé au champ texte ? <small>Vidéo en anglais.</small></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
layout: image-right
|
||||||
|
image: https://cover.sli.dev
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Code
|
||||||
|
|
||||||
|
Use code snippets and get the highlighting directly, and even types hover!
|
||||||
|
|
||||||
|
```ts {all|5|7|7-8|10|all} twoslash
|
||||||
|
// TwoSlash enables TypeScript hover information
|
||||||
|
// and errors in markdown code blocks
|
||||||
|
// More at https://shiki.style/packages/twoslash
|
||||||
|
|
||||||
|
import { computed, ref } from 'vue'
|
||||||
|
|
||||||
|
const count = ref(0)
|
||||||
|
const doubled = computed(() => count.value * 2)
|
||||||
|
|
||||||
|
doubled.value = 2
|
||||||
|
```
|
||||||
|
|
||||||
|
<arrow v-click="[4, 5]" x1="350" y1="310" x2="195" y2="334" color="#953" width="2" arrowSize="1" />
|
||||||
|
|
||||||
|
<!-- This allow you to embed external code blocks -->
|
||||||
|
|
||||||
|
<!-- Footer -->
|
||||||
|
|
||||||
|
[Learn more](https://sli.dev/features/line-highlighting)
|
||||||
|
|
||||||
|
<!-- Inline style -->
|
||||||
|
<style>
|
||||||
|
.footnotes-sep {
|
||||||
|
@apply mt-5 opacity-10;
|
||||||
|
}
|
||||||
|
.footnotes {
|
||||||
|
@apply text-sm opacity-75;
|
||||||
|
}
|
||||||
|
.footnote-backref {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Notes can also sync with clicks
|
||||||
|
|
||||||
|
[click] This will be highlighted after the first click
|
||||||
|
|
||||||
|
[click] Highlighted with `count = ref(0)`
|
||||||
|
|
||||||
|
[click:3] Last click (skip two clicks)
|
||||||
|
-->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## level: 2
|
||||||
|
|
||||||
|
# Shiki Magic Move
|
||||||
|
|
||||||
|
Powered by [shiki-magic-move](https://shiki-magic-move.netlify.app/), Slidev supports animations across multiple code snippets.
|
||||||
|
|
||||||
|
Add multiple code blocks and wrap them with <code>````md magic-move</code> (four backticks) to enable the magic move. For example:
|
||||||
|
|
||||||
|
````md magic-move {lines: true}
|
||||||
|
```ts {*|2|*}
|
||||||
|
// step 1
|
||||||
|
const author = reactive({
|
||||||
|
name: 'John Doe',
|
||||||
|
books: [
|
||||||
|
'Vue 2 - Advanced Guide',
|
||||||
|
'Vue 3 - Basic Guide',
|
||||||
|
'Vue 4 - The Mystery'
|
||||||
|
]
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
```ts {*|1-2|3-4|3-4,8}
|
||||||
|
// step 2
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
author: {
|
||||||
|
name: 'John Doe',
|
||||||
|
books: [
|
||||||
|
'Vue 2 - Advanced Guide',
|
||||||
|
'Vue 3 - Basic Guide',
|
||||||
|
'Vue 4 - The Mystery'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```ts
|
||||||
|
// step 3
|
||||||
|
export default {
|
||||||
|
data: () => ({
|
||||||
|
author: {
|
||||||
|
name: 'John Doe',
|
||||||
|
books: [
|
||||||
|
'Vue 2 - Advanced Guide',
|
||||||
|
'Vue 3 - Basic Guide',
|
||||||
|
'Vue 4 - The Mystery'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Non-code blocks are ignored.
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<!-- step 4 -->
|
||||||
|
<script setup>
|
||||||
|
const author = {
|
||||||
|
name: 'John Doe',
|
||||||
|
books: [
|
||||||
|
'Vue 2 - Advanced Guide',
|
||||||
|
'Vue 3 - Basic Guide',
|
||||||
|
'Vue 4 - The Mystery'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
````
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Components
|
||||||
|
|
||||||
|
<div grid="~ cols-2 gap-4">
|
||||||
|
<div>
|
||||||
|
|
||||||
|
You can use Vue components directly inside your slides.
|
||||||
|
|
||||||
|
We have provided a few built-in components like `<Tweet/>` and `<Youtube/>` that you can use directly. And adding your custom components is also super easy.
|
||||||
|
|
||||||
|
```html
|
||||||
|
<Counter :count="10" />
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- ./components/Counter.vue -->
|
||||||
|
<Counter :count="10" m="t-4" />
|
||||||
|
|
||||||
|
Check out [the guides](https://sli.dev/builtin/components.html) for more.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
|
||||||
|
```html
|
||||||
|
<Tweet id="1390115482657726468" />
|
||||||
|
```
|
||||||
|
|
||||||
|
<Tweet id="1390115482657726468" scale="0.65" />
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Presenter note with **bold**, *italic*, and ~~striked~~ text.
|
||||||
|
|
||||||
|
Also, HTML elements are valid:
|
||||||
|
<div class="flex w-full">
|
||||||
|
<span style="flex-grow: 1;">Left content</span>
|
||||||
|
<span>Right content</span>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## class: px-20
|
||||||
|
|
||||||
|
# Themes
|
||||||
|
|
||||||
|
Slidev comes with powerful theming support. Themes can provide styles, layouts, components, or even configurations for tools. Switching between themes by just **one edit** in your frontmatter:
|
||||||
|
|
||||||
|
<div grid="~ cols-2 gap-2" m="t-2">
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
theme: default
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
theme: seriph
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
<img border="rounded" src="https://github.com/slidevjs/themes/blob/main/screenshots/theme-default/01.png?raw=true" alt="">
|
||||||
|
|
||||||
|
<img border="rounded" src="https://github.com/slidevjs/themes/blob/main/screenshots/theme-seriph/01.png?raw=true" alt="">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Read more about [How to use a theme](https://sli.dev/guide/theme-addon#use-theme) and
|
||||||
|
check out the [Awesome Themes Gallery](https://sli.dev/resources/theme-gallery).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Clicks Animations
|
||||||
|
|
||||||
|
You can add `v-click` to elements to add a click animation.
|
||||||
|
|
||||||
|
<div v-click>
|
||||||
|
|
||||||
|
This shows up when you click the slide:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<div v-click>This shows up when you click the slide.</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<v-click>
|
||||||
|
|
||||||
|
The <span v-mark.red="3"><code>v-mark</code> directive</span>
|
||||||
|
also allows you to add
|
||||||
|
<span v-mark.circle.orange="4">inline marks</span>
|
||||||
|
, powered by [Rough Notation](https://roughnotation.com/):
|
||||||
|
|
||||||
|
```html
|
||||||
|
<span v-mark.underline.orange>inline markers</span>
|
||||||
|
```
|
||||||
|
|
||||||
|
</v-click>
|
||||||
|
|
||||||
|
<div mt-20 v-click>
|
||||||
|
|
||||||
|
[Learn more](https://sli.dev/guide/animations#click-animation)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Monaco Editor
|
||||||
|
|
||||||
|
Slidev provides built-in Monaco Editor support.
|
||||||
|
|
||||||
|
Add `{monaco}` to the code block to turn it into an editor:
|
||||||
|
|
||||||
|
```ts {monaco}
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { emptyArray } from './external'
|
||||||
|
|
||||||
|
const arr = ref(emptyArray(10))
|
||||||
|
```
|
||||||
|
|
||||||
|
Use `{monaco-run}` to create an editor that can execute the code directly in the slide:
|
||||||
|
|
||||||
|
```ts {monaco-run}
|
||||||
|
import { version } from 'vue'
|
||||||
|
import { emptyArray, sayHello } from './external'
|
||||||
|
|
||||||
|
sayHello()
|
||||||
|
console.log(`vue ${version}`)
|
||||||
|
console.log(
|
||||||
|
emptyArray<number>(10).reduce(
|
||||||
|
(fib) => [...fib, fib.at(-1)! + fib.at(-2)!],
|
||||||
|
[1, 1]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
layout: center
|
||||||
|
class: text-center
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Learn More
|
||||||
|
|
||||||
|
[Documentation](https://sli.dev) · [GitHub](https://github.com/slidevjs/slidev) · [Showcases](https://sli.dev/resources/showcases)
|
||||||
|
|
||||||
|
<PoweredBySlidev mt-10 />
|
5
layouts/bullets.vue
Normal file
5
layouts/bullets.vue
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<template>
|
||||||
|
<div class="slidev-layout bullets">
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
7
layouts/cover.vue
Normal file
7
layouts/cover.vue
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<template>
|
||||||
|
<div class="slidev-layout cover">
|
||||||
|
<div class="my-auto w-full">
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
14
layouts/intro.vue
Normal file
14
layouts/intro.vue
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<template>
|
||||||
|
<div class="slidev-layout place-content-center intro">
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.intro {
|
||||||
|
block-size: 100%;
|
||||||
|
:deep(h1) {
|
||||||
|
font-size: var(--size-6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
5
layouts/quote.vue
Normal file
5
layouts/quote.vue
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<template>
|
||||||
|
<div class="slidev-layout h-full place-content-center">
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
32
layouts/title-image.vue
Normal file
32
layouts/title-image.vue
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { imageSrc } from '../utils/imageHelper'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
image: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const image = imageSrc(props.image)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="slidev-layout h-full title">
|
||||||
|
<div class="grid grid-cols-2 h-full">
|
||||||
|
<div class="place-self-center">
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
<div class="image"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.image {
|
||||||
|
block-size: 100%;
|
||||||
|
background-image: v-bind(image);
|
||||||
|
background-size: cover;
|
||||||
|
background-position: center;
|
||||||
|
}
|
||||||
|
</style>
|
36
package.json
Normal file
36
package.json
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"name": "slidev-theme-narduin",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"type": "module",
|
||||||
|
"keywords": [
|
||||||
|
"slidev-theme",
|
||||||
|
"slidev"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18.0.0"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"build": "slidev build example.md",
|
||||||
|
"dev": "slidev example.md",
|
||||||
|
"export": "slidev export example.md",
|
||||||
|
"screenshot": "slidev export example.md --format png"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@slidev/types": "^0.50.0-beta.10",
|
||||||
|
"@unocss/reset": "^0.65.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@slidev/cli": "^0.50.0-beta.10",
|
||||||
|
"prettier": "3.4.2"
|
||||||
|
},
|
||||||
|
"slidev": {
|
||||||
|
"colorSchema": "light",
|
||||||
|
"defaults": {
|
||||||
|
"canvasWidth": 1280,
|
||||||
|
"fonts": {
|
||||||
|
"mono": "Monaspace Neon,monospace",
|
||||||
|
"local": "system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto, Oxygen,Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif,Monaspace Neon"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
setup/shiki.ts
Normal file
11
setup/shiki.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import type { ShikiSetupReturn } from '@slidev/types'
|
||||||
|
import { defineShikiSetup } from '@slidev/types'
|
||||||
|
|
||||||
|
export default defineShikiSetup((): ShikiSetupReturn => {
|
||||||
|
return {
|
||||||
|
themes: {
|
||||||
|
dark: 'vitesse-dark',
|
||||||
|
light: 'vitesse-light'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
226
styles/base.css
Normal file
226
styles/base.css
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
/* BASE */
|
||||||
|
::placeholder {
|
||||||
|
color: var(--color-dark);
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
::selection,
|
||||||
|
::target-text {
|
||||||
|
color: var(--color-light-blue);
|
||||||
|
background-color: var(--color-dark-blue);
|
||||||
|
}
|
||||||
|
::target-text {
|
||||||
|
color: var(--color-soft-blue);
|
||||||
|
background-color: var(--color-blue);
|
||||||
|
}
|
||||||
|
::marker {
|
||||||
|
color: var(--color-brique);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-size: var(--size-0);
|
||||||
|
line-height: 1.5;
|
||||||
|
color: var(--color-dark);
|
||||||
|
background-color: var(--color-light-white);
|
||||||
|
accent-color: var(--color-brique);
|
||||||
|
}
|
||||||
|
|
||||||
|
:is(h1, h2, h3, h4, .h2, .h3, .h4) {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
:where(h1, h2, h3, h4, .h2, .h3, .h4) + * {
|
||||||
|
margin-block-start: var(--space-s);
|
||||||
|
}
|
||||||
|
:is(h1) {
|
||||||
|
max-inline-size: 20ch;
|
||||||
|
font-size: var(--size-5);
|
||||||
|
color: var(--color-dark-blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
h2,
|
||||||
|
.h2 {
|
||||||
|
font-size: var(--size-3);
|
||||||
|
color: var(--color-dark-blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
h3,
|
||||||
|
.h3 {
|
||||||
|
max-inline-size: initial;
|
||||||
|
font-size: var(--size-2);
|
||||||
|
letter-spacing: 0.05rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4,
|
||||||
|
.h4 {
|
||||||
|
font-size: var(--size-2);
|
||||||
|
color: var(--color-dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
h5,
|
||||||
|
.h5 {
|
||||||
|
font-size: var(--size-1);
|
||||||
|
color: var(--color-darkBlue);
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--color-blue);
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
/* a:visited {
|
||||||
|
color: currentColor;
|
||||||
|
} */
|
||||||
|
a:hover,
|
||||||
|
a:focus {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
margin-block: var(--space-m-l);
|
||||||
|
block-size: 4px;
|
||||||
|
background-color: var(--color-dark);
|
||||||
|
}
|
||||||
|
hr.small {
|
||||||
|
margin-block: var(--space-xs);
|
||||||
|
block-size: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul:not([role='list']),
|
||||||
|
ol:not([role='list']) {
|
||||||
|
padding-inline-start: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul:not([role='list']) > li + li,
|
||||||
|
ol:not([role='list']) > li + li {
|
||||||
|
margin-block-start: var(--space-xs);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sr-only {
|
||||||
|
clip: rect(0 0 0 0);
|
||||||
|
clip-path: inset(50%);
|
||||||
|
block-size: 1px;
|
||||||
|
overflow: hidden;
|
||||||
|
position: absolute;
|
||||||
|
white-space: nowrap;
|
||||||
|
inline-size: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.clean-button {
|
||||||
|
appearance: none;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
cursor: pointer;
|
||||||
|
border: none;
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
.btn {
|
||||||
|
padding: var(--space-2xs) var(--space-xs);
|
||||||
|
margin-block: var(--space-s);
|
||||||
|
display: inline-block;
|
||||||
|
font-size: var(--size-0);
|
||||||
|
font-weight: bold;
|
||||||
|
text-decoration: none;
|
||||||
|
border: 2px solid var(--color-blue);
|
||||||
|
border-radius: var(--radius-small);
|
||||||
|
color: var(--color-white);
|
||||||
|
background-color: var(--color-blue);
|
||||||
|
transition-property: color, background-color;
|
||||||
|
transition-duration: 0.3s;
|
||||||
|
transition-timing-function: ease;
|
||||||
|
}
|
||||||
|
.btn:hover,
|
||||||
|
.btn:focus {
|
||||||
|
color: var(--color-blue);
|
||||||
|
background-color: var(--color-white);
|
||||||
|
}
|
||||||
|
|
||||||
|
button[disabled] {
|
||||||
|
cursor: not-allowed;
|
||||||
|
color: var(--color-grey-dark);
|
||||||
|
border-color: var(--color-grey);
|
||||||
|
background-color: var(--color-white);
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight {
|
||||||
|
color: var(--color-blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clean style link */
|
||||||
|
.clean-link {
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: inherit;
|
||||||
|
color: currentColor;
|
||||||
|
}
|
||||||
|
.clean-link:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* nice hover link */
|
||||||
|
.nice-link {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.nice-link:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.nice-link::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
bottom: -2px;
|
||||||
|
inline-size: 100%;
|
||||||
|
block-size: 2px;
|
||||||
|
text-decoration: none;
|
||||||
|
transform: scaleX(0);
|
||||||
|
opacity: 1;
|
||||||
|
transform-origin: 100% 50%;
|
||||||
|
background-color: var(--color-brique);
|
||||||
|
}
|
||||||
|
.nice-link:hover::after {
|
||||||
|
transform: scaleX(1);
|
||||||
|
transform-origin: 0% 50%;
|
||||||
|
}
|
||||||
|
@media (prefers-reduced-motion: no-preference) {
|
||||||
|
.nice-link::after {
|
||||||
|
transition: transform 0.4s cubic-bezier(0.77, 0, 0.175, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* blockquote */
|
||||||
|
blockquote {
|
||||||
|
margin: var(--space-s) 0;
|
||||||
|
padding: var(--space-s);
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: 1.4;
|
||||||
|
border-left: 3px solid var(--color-blue);
|
||||||
|
border-radius: 3px;
|
||||||
|
background-color: var(--color-soft-blue);
|
||||||
|
}
|
||||||
|
blockquote cite {
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
font-size: var(--size-0);
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrapper {
|
||||||
|
/* GRID WRAPPER */
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: var(--grid-wrapper);
|
||||||
|
--_content-padding: var(--content-padding, var(--space-s));
|
||||||
|
column-gap: var(--_content-padding);
|
||||||
|
}
|
||||||
|
/* set content inside wrapper column */
|
||||||
|
:where(.wrapper, .slidev-layout) > * {
|
||||||
|
grid-column: wrapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set full width content to full grid */
|
||||||
|
:where(.wrapper, .slidev-layout) > .full-width {
|
||||||
|
/* calculate inline padding based on available space minus content space to align full-width content with wrapper content */
|
||||||
|
padding-inline: max(
|
||||||
|
calc((100vw - var(--content-width)) / 2),
|
||||||
|
var(--_content-padding)
|
||||||
|
);
|
||||||
|
grid-column: full;
|
||||||
|
}
|
5
styles/index.ts
Normal file
5
styles/index.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import '@unocss/reset/normalize.css'
|
||||||
|
import './reset.css'
|
||||||
|
import './variables.css'
|
||||||
|
import './base.css'
|
||||||
|
import './layouts.css'
|
8
styles/layouts.css
Normal file
8
styles/layouts.css
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
.slidev-layout {
|
||||||
|
@apply: grid-wrapper;
|
||||||
|
padding-block: var(--space-m-l);
|
||||||
|
}
|
||||||
|
|
||||||
|
.bullets :where(ul, ol, dl) {
|
||||||
|
list-style-type: initial;
|
||||||
|
}
|
188
styles/reset.css
Normal file
188
styles/reset.css
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
/* RESET */
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--font-tnum: 'tnum' on;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
/* Remove default margin on everything */
|
||||||
|
margin: 0;
|
||||||
|
/* Remove default padding on everything */
|
||||||
|
padding: 0;
|
||||||
|
/* Calc `em` based line height, bigger line height for smaller font size and smaller line height for bigger font size: https://kittygiraudel.com/2020/05/18/using-calc-to-figure-out-optimal-line-height/ */
|
||||||
|
line-height: calc(0.25rem + 1em + 0.25rem);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use a more-intuitive box-sizing model on everything */
|
||||||
|
*,
|
||||||
|
::before,
|
||||||
|
::after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove border and set sensible defaults for backgrounds, on all elements except fieldset progress and meter */
|
||||||
|
*:where(:not(fieldset, progress, meter)) {
|
||||||
|
border-width: 0;
|
||||||
|
border-style: solid;
|
||||||
|
background-origin: border-box;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
@supports (font-variant-numeric: tabular-nums) {
|
||||||
|
html {
|
||||||
|
--font-tnum: '____';
|
||||||
|
font-variant-numeric: tabular-nums;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
html {
|
||||||
|
/* Allow percentage-based heights in the application */
|
||||||
|
block-size: 100%;
|
||||||
|
/* Making sure text size is only controlled by font-size */
|
||||||
|
-webkit-text-size-adjust: none;
|
||||||
|
/* Improve text rendering */
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
font-feature-settings: var(--font-tnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Smooth scrolling for users that don't prefer reduced motion */
|
||||||
|
@media (prefers-reduced-motion: no-preference) {
|
||||||
|
html:focus-within {
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
overflow-x: hidden;
|
||||||
|
font-weight: normal;
|
||||||
|
/* Allow percentage-based heights in the application */
|
||||||
|
min-block-size: 100%;
|
||||||
|
/* https://www.sarasoueidan.com/blog/safari-fluid-typography-bug-fix/ */
|
||||||
|
-webkit-marquee-increment: 0vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Improve media defaults */
|
||||||
|
:where(img, svg, video, canvas, audio, iframe, embed, object) {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
:where(img, svg, video) {
|
||||||
|
block-size: auto;
|
||||||
|
max-inline-size: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
:where(details) {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove stroke and set fill colour to the inherited font colour */
|
||||||
|
:where(svg) {
|
||||||
|
stroke: none;
|
||||||
|
fill: currentColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set a size for SVG's without a width attribute */
|
||||||
|
:where(svg):where(:not([width])) {
|
||||||
|
inline-size: 5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove built-in form typography styles */
|
||||||
|
:where(input, button, textarea, select),
|
||||||
|
:where(input[type='file'])::-webkit-file-upload-button {
|
||||||
|
color: inherit;
|
||||||
|
font: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
letter-spacing: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Change textarea resize to vertical only and block only if the browser supports that */
|
||||||
|
:where(textarea) {
|
||||||
|
resize: vertical;
|
||||||
|
}
|
||||||
|
@supports (resize: block) {
|
||||||
|
:where(textarea) {
|
||||||
|
resize: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Avoid text overflows */
|
||||||
|
:where(h1, h2, h3) {
|
||||||
|
line-height: 1.1;
|
||||||
|
}
|
||||||
|
:where(p, h1, h2, h3, h4, h5, h6) {
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */
|
||||||
|
:where(ul, ol)[role='list'] {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* More readable underline style for anchor tags without a class. This could be set on anchor tags globally, but it can cause conflicts. */
|
||||||
|
a:not([class]) {
|
||||||
|
text-decoration-skip-ink: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make it clear that interactive elements are interactive */
|
||||||
|
:where(
|
||||||
|
a[href],
|
||||||
|
area,
|
||||||
|
button,
|
||||||
|
input,
|
||||||
|
label[for],
|
||||||
|
select,
|
||||||
|
summary,
|
||||||
|
textarea,
|
||||||
|
[tabindex]:not([tabindex*='-'])
|
||||||
|
) {
|
||||||
|
cursor: pointer;
|
||||||
|
touch-action: manipulation;
|
||||||
|
}
|
||||||
|
:where(input[type='file']) {
|
||||||
|
cursor: auto;
|
||||||
|
}
|
||||||
|
:where(input[type='file'])::-webkit-file-upload-button,
|
||||||
|
:where(input[type='file'])::file-selector-button {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Animate focus outline */
|
||||||
|
@media (prefers-reduced-motion: no-preference) {
|
||||||
|
:focus-visible {
|
||||||
|
transition: outline-offset 145ms cubic-bezier(0.25, 0, 0.4, 1);
|
||||||
|
}
|
||||||
|
:where(:not(:active)):focus-visible {
|
||||||
|
transition-duration: 0.25s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
:where(:not(:active)):focus-visible {
|
||||||
|
outline-offset: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure users can't select button text */
|
||||||
|
:where(
|
||||||
|
button,
|
||||||
|
button[type],
|
||||||
|
input[type='button'],
|
||||||
|
input[type='submit'],
|
||||||
|
input[type='reset']
|
||||||
|
),
|
||||||
|
:where(input[type='file'])::-webkit-file-upload-button,
|
||||||
|
:where(input[type='file'])::file-selector-button {
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
-webkit-touch-callout: none;
|
||||||
|
user-select: none;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disabled cursor for disabled buttons */
|
||||||
|
:where(
|
||||||
|
button,
|
||||||
|
button[type],
|
||||||
|
input[type='button'],
|
||||||
|
input[type='submit'],
|
||||||
|
input[type='reset']
|
||||||
|
)[disabled] {
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* END RESET */
|
95
styles/variables.css
Normal file
95
styles/variables.css
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/* VARIABLES */
|
||||||
|
|
||||||
|
:root {
|
||||||
|
/* font sizes
|
||||||
|
https://utopia.fyi/type/calculator?c=320,18,1.2,1040,20,1.25,5,2,&s=0.75%7C0.5%7C0.25,1.5%7C2%7C3%7C4%7C6,m-xl&g=s,l,xl,12
|
||||||
|
*/
|
||||||
|
--size--1: clamp(0.94rem, calc(0.91rem + 0.14vw), 1rem);
|
||||||
|
--size-0: clamp(1.13rem, calc(1.07rem + 0.28vw), 1.25rem);
|
||||||
|
--size-1: clamp(1.35rem, calc(1.26rem + 0.47vw), 1.56rem);
|
||||||
|
--size-2: clamp(1.62rem, calc(1.47rem + 0.74vw), 1.95rem);
|
||||||
|
--size-3: clamp(1.94rem, calc(1.72rem + 1.11vw), 2.44rem);
|
||||||
|
--size-4: clamp(2.33rem, calc(2.01rem + 1.6vw), 3.05rem);
|
||||||
|
--size-5: clamp(2.8rem, calc(2.35rem + 2.26vw), 3.82rem);
|
||||||
|
--size-6: clamp(3.36rem, calc(2.73rem + 3.13vw), 4.77rem);
|
||||||
|
--size-7: clamp(4.03rem, calc(3.17rem + 4.29vw), 5.96rem);
|
||||||
|
--size-8: clamp(4.84rem, calc(3.68rem + 5.81vw), 7.45rem);
|
||||||
|
|
||||||
|
/* spaces
|
||||||
|
https://utopia.fyi/space/calculator?c=320,18,1.2,1040,20,1.25,5,2,&s=0.75|0.5|0.25,1.5|2|3|4|6,m-xl&g=s,l,xl,12
|
||||||
|
*/
|
||||||
|
--space-3xs: clamp(0.31rem, calc(0.31rem + 0vw), 0.31rem);
|
||||||
|
--space-2xs: clamp(0.56rem, calc(0.53rem + 0.14vw), 0.63rem);
|
||||||
|
--space-xs: clamp(0.88rem, calc(0.85rem + 0.14vw), 0.94rem);
|
||||||
|
--space-s: clamp(1.13rem, calc(1.07rem + 0.28vw), 1.25rem);
|
||||||
|
--space-m: clamp(1.69rem, calc(1.6rem + 0.42vw), 1.88rem);
|
||||||
|
--space-l: clamp(2.25rem, calc(2.14rem + 0.56vw), 2.5rem);
|
||||||
|
--space-xl: clamp(3.38rem, calc(3.21rem + 0.83vw), 3.75rem);
|
||||||
|
--space-2xl: clamp(4.5rem, calc(4.28rem + 1.11vw), 5rem);
|
||||||
|
--space-3xl: clamp(6.75rem, calc(6.42rem + 1.67vw), 7.5rem);
|
||||||
|
|
||||||
|
/* One-up pairs */
|
||||||
|
--space-3xs-2xs: clamp(0.31rem, calc(0.17rem + 0.69vw), 0.63rem);
|
||||||
|
--space-2xs-xs: clamp(0.56rem, calc(0.4rem + 0.83vw), 0.94rem);
|
||||||
|
--space-xs-s: clamp(0.88rem, calc(0.71rem + 0.83vw), 1.25rem);
|
||||||
|
--space-s-m: clamp(1.13rem, calc(0.79rem + 1.67vw), 1.88rem);
|
||||||
|
--space-m-l: clamp(1.69rem, calc(1.33rem + 1.81vw), 2.5rem);
|
||||||
|
--space-l-xl: clamp(2.25rem, calc(1.58rem + 3.33vw), 3.75rem);
|
||||||
|
--space-xl-2xl: clamp(3.38rem, calc(2.65rem + 3.61vw), 5rem);
|
||||||
|
--space-2xl-3xl: clamp(4.5rem, calc(3.17rem + 6.67vw), 7.5rem);
|
||||||
|
|
||||||
|
/* multi steps */
|
||||||
|
--space-3xs-s: clamp(0.31rem, calc(-0.1rem + 2.08vw), 1.25rem);
|
||||||
|
--space-2xs-s: clamp(0.56rem, calc(0.26rem + 1.53vw), 1.25rem);
|
||||||
|
--space-2xs-m: clamp(0.56rem, calc(-0.02rem + 2.92vw), 1.88rem);
|
||||||
|
--space-xs-m: clamp(0.88rem, calc(0.43rem + 2.22vw), 1.88rem);
|
||||||
|
--space-xs-l: clamp(0.88rem, calc(0.15rem + 3.61vw), 2.5rem);
|
||||||
|
--space-s-l: clamp(1.13rem, calc(0.51rem + 3.06vw), 2.5rem);
|
||||||
|
--space-s-xl: clamp(1.13rem, calc(-0.04rem + 5.83vw), 3.75rem);
|
||||||
|
--space-m-xl: clamp(1.69rem, calc(0.77rem + 4.58vw), 3.75rem);
|
||||||
|
--space-l-2xl: clamp(2.25rem, calc(1.03rem + 6.11vw), 5rem);
|
||||||
|
--space-l-3xl: clamp(2.25rem, calc(-0.08rem + 11.67vw), 7.5rem);
|
||||||
|
|
||||||
|
/* colors */
|
||||||
|
--color-dark: hsl(239, 57%, 15%);
|
||||||
|
--color-grey: hsl(211, 12%, 35%);
|
||||||
|
--color-light-grey: hsl(0, 0%, 94%);
|
||||||
|
--color-blue: hsl(253, 98%, 41%);
|
||||||
|
--color-dark-blue: hsl(218, 60%, 21%);
|
||||||
|
--color-light-blue: hsl(194, 54%, 89%);
|
||||||
|
--color-blend-blue: hsl(253, 100%, 32%);
|
||||||
|
--color-soft-blue: hsl(210, 73%, 94%);
|
||||||
|
--color-violet: hsl(248, 73%, 52%);
|
||||||
|
--color-brique: hsl(358, 54%, 54%);
|
||||||
|
--color-white: hsl(0, 0%, 100%);
|
||||||
|
--color-light-white: hsl(240, 50%, 98%);
|
||||||
|
--color-black: hsl(0, 0%, 0%);
|
||||||
|
|
||||||
|
/* shadows */
|
||||||
|
--shadow-color: 0deg 0% 80%;
|
||||||
|
--shadow-elevation-medium: 0px 0.7px 0.7px hsl(var(--shadow-color) / 0.28),
|
||||||
|
0px 1.5px 1.6px -0.7px hsl(var(--shadow-color) / 0.26),
|
||||||
|
0px 2.9px 3px -1.5px hsl(var(--shadow-color) / 0.24),
|
||||||
|
0px 6px 6.3px -2.2px hsl(var(--shadow-color) / 0.22),
|
||||||
|
0px 11.8px 12.4px -3px hsl(var(--shadow-color) / 0.2);
|
||||||
|
--shadow-elevation-high: 0px 0.5px 0.5px hsl(var(--shadow-color) / 0.18),
|
||||||
|
0px 1.4px 1.5px -0.3px hsl(var(--shadow-color) / 0.18),
|
||||||
|
0px 2.3px 2.4px -0.7px hsl(var(--shadow-color) / 0.17),
|
||||||
|
0px 3.4px 3.6px -1px hsl(var(--shadow-color) / 0.16),
|
||||||
|
0px 5.1px 5.4px -1.3px hsl(var(--shadow-color) / 0.16),
|
||||||
|
0px 7.5px 7.9px -1.7px hsl(var(--shadow-color) / 0.15),
|
||||||
|
0px 10.8px 11.3px -2px hsl(var(--shadow-color) / 0.15),
|
||||||
|
-0.1px 15.4px 16.2px -2.3px hsl(var(--shadow-color) / 0.14),
|
||||||
|
-0.1px 21.3px 22.4px -2.7px hsl(var(--shadow-color) / 0.13),
|
||||||
|
-0.1px 28.9px 30.3px -3px hsl(var(--shadow-color) / 0.13);
|
||||||
|
|
||||||
|
/* radius */
|
||||||
|
--radius: 20px;
|
||||||
|
--radius-small: 10px;
|
||||||
|
|
||||||
|
/* grid */
|
||||||
|
--content-width: 75rem;
|
||||||
|
--grid-wrapper: [full-start] 1fr [wrapper-start]
|
||||||
|
minmax(0, var(--content-width)) [wrapper-end] 1fr [full-end];
|
||||||
|
--_content-padding: var(--content-padding, var(--space-s));
|
||||||
|
}
|
21
uno.config.ts
Normal file
21
uno.config.ts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import { defineConfig } from 'unocss'
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
shortcuts: {
|
||||||
|
// custom the default background
|
||||||
|
'bg-main': 'bg-white text-[#181818] dark:(bg-[#121212] text-[#ddd])'
|
||||||
|
},
|
||||||
|
rules: [
|
||||||
|
[
|
||||||
|
'grid-wrapper',
|
||||||
|
{
|
||||||
|
display: 'grid',
|
||||||
|
'--grid-wrapper':
|
||||||
|
'[full-start] 1fr [wrapper-start] minmax(0, var(--content-width)) [wrapper-end] 1fr [full-end]',
|
||||||
|
'grid-template-columns': 'var(--grid-wrapper)',
|
||||||
|
'--_content-padding': 'var(--content-padding, var(--space-s))',
|
||||||
|
'column-gap': 'var(--_content-padding)'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
})
|
3
utils/imageHelper.ts
Normal file
3
utils/imageHelper.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export function imageSrc(src: string) {
|
||||||
|
return src.startsWith('http') ? `url(${src})` : `/images/${src}`
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user