slidev-theme-meetup 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ <svg width="322" height="279" viewBox="0 0 322 279" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M92.5 38C73.3 18.8 22.8333 4.66666 3.32108e-06 0L0 278.5L322 278.5C316.833 269.167 298.4 248.5 266 240.5C225.5 230.5 187.5 214 176 202C164.5 190 144 158 137 123C130 88 116.5 62 92.5 38Z" fill="#859900" fill-opacity="0.3"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="317" height="83" viewBox="0 0 317 83" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M6.0946 82.9068C3.66097 83.1007 1.61977 83.082 1.65093e-09 82.9068L6.0946 82.9068C22.1913 81.6248 55.4565 71.0434 97.5 34.9068C158 -17.0932 234.5 -18.5932 317 82.9068L6.0946 82.9068Z" fill="#b58900"/>
3
+ </svg>
package/example.md ADDED
@@ -0,0 +1,89 @@
1
+ ---
2
+ theme: ./
3
+ layout: intro
4
+ themeConfig:
5
+ title: Welcome to Slidev
6
+ twitter: tboerger
7
+ github: tboerger
8
+ ---
9
+ # Welcome to Slidev
10
+
11
+ ---
12
+ layout: presenter
13
+ photo: /images/tboerger.jpg
14
+ ---
15
+ # Thomas Boerger
16
+
17
+ Cloud engineer @ cloudpunks GmbH
18
+
19
+ * Golang
20
+ * Containers
21
+ * Kubernetes
22
+ * Terraform
23
+ * Ansible
24
+ * Prometheus
25
+
26
+ ---
27
+ layout: twocols
28
+ ---
29
+ # Twocols Example
30
+
31
+ ::left::
32
+ - This is the left column
33
+ - Sed diam voluptua
34
+
35
+ ::right::
36
+ - This is the right column
37
+ - Lorem ipsum dolor sit amet
38
+ - Consetetur sadipscing elitr
39
+
40
+ ---
41
+ layout: center
42
+ ---
43
+ # This is a centered slide
44
+
45
+ ```ts
46
+ const aspectRatioPlugin = plugin(({ addUtilities }) => {
47
+ const newUtilities = {
48
+ '.aspect-none': {
49
+ aspectRatio: 'none',
50
+ },
51
+ '.aspect-16-9': {
52
+ aspectRatio: '16/9',
53
+ },
54
+ '.aspect-4-3': {
55
+ aspectRatio: '4/3',
56
+ },
57
+ '.aspect-1-1': {
58
+ aspectRatio: '1/1',
59
+ },
60
+ }
61
+ addUtilities(newUtilities, ['responsive', 'hover'])
62
+ })
63
+ ```
64
+
65
+ ---
66
+ layout: cover
67
+ ---
68
+ # This is a cover
69
+
70
+ ---
71
+ layout: default
72
+ ---
73
+ # What is Slidev?
74
+
75
+ Slidev is a slides maker and presenter designed for developers, consist of the following features
76
+
77
+ - ๐Ÿ“ **Text-based** - focus on the content with Markdown, and then style them later
78
+ - ๐ŸŽจ **Themable** - theme can be shared and used with npm packages
79
+ - ๐Ÿง‘โ€๐Ÿ’ป **Developer Friendly** - code highlighting, live coding with autocompletion
80
+ - ๐Ÿคน **Interactive** - embedding Vue components to enhance your expressions
81
+ - ๐ŸŽฅ **Recording** - built-in recording and camera view
82
+ - ๐Ÿ“ค **Portable** - export into PDF, PNGs, or even a hostable SPA
83
+ - ๐Ÿ›  **Hackable** - anything possible on a webpage
84
+
85
+ ---
86
+ layout: qrcode
87
+ url: https://example.com
88
+ ---
89
+ # Link to slides
@@ -0,0 +1,9 @@
1
+ <template>
2
+ <div class="slidev-layout text-center">
3
+ <LayoutHeader class="absolute bottom-0 right-0 transform flip-x" />
4
+ <div class="my-auto">
5
+ <slot />
6
+ </div>
7
+ <LayoutFooter />
8
+ </div>
9
+ </template>
@@ -0,0 +1,9 @@
1
+ <template>
2
+ <div class="slidev-layout cover text-center">
3
+ <LayoutHeader class="absolute bottom-0 right-0 transform flip-x" />
4
+ <div class="my-auto">
5
+ <slot />
6
+ </div>
7
+ <LayoutFooter />
8
+ </div>
9
+ </template>
@@ -0,0 +1,66 @@
1
+ <script setup lang="ts">
2
+ const props = defineProps({
3
+ class: {
4
+ type: String,
5
+ default: '',
6
+ },
7
+ });
8
+ </script>
9
+
10
+ <template>
11
+ <div class="slidev-layout default col-grid">
12
+ <div
13
+ class="top"
14
+ :class="props.class"
15
+ >
16
+ <LayoutHeader class="absolute bottom-0 right-0 transform flip-x" />
17
+ <slot />
18
+ </div>
19
+ <div
20
+ class="left"
21
+ :class="props.class"
22
+ >
23
+ <slot name="left" />
24
+ </div>
25
+ <div
26
+ class="right"
27
+ :class="props.class"
28
+ >
29
+ <slot name="right" />
30
+ </div>
31
+ <div
32
+ class="bottom"
33
+ :class="props.class"
34
+ >
35
+ <slot name="bottom" />
36
+ <LayoutFooter />
37
+ </div>
38
+ </div>
39
+ </template>
40
+
41
+ <style>
42
+ .col-grid {
43
+ display: grid;
44
+ grid-template-columns: 1fr 1fr;
45
+ grid-template-rows: min-content auto min-content;
46
+ grid-column-gap: 3rem;
47
+ grid-row-gap: 0;
48
+ height: 100%;
49
+ }
50
+
51
+ .top {
52
+ grid-area: 1 / 1 / 2 / 3;
53
+ }
54
+
55
+ .left {
56
+ grid-area: 2 / 1 / 3 / 2;
57
+ }
58
+
59
+ .right {
60
+ grid-area: 2 / 2 / 3 / 3;
61
+ }
62
+
63
+ .bottom {
64
+ grid-area: 3 / 1 / 4 / 3;
65
+ }
66
+ </style>
@@ -0,0 +1,9 @@
1
+ <template>
2
+ <div class="slidev-layout intro text-center">
3
+ <LayoutHeader class="absolute left-0 top-0 transform rotate-90" />
4
+ <div class="my-auto">
5
+ <slot />
6
+ </div>
7
+ <LayoutFooter />
8
+ </div>
9
+ </template>
@@ -0,0 +1,43 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import { resolveAssetUrl } from '@slidev/client/layoutHelper'
4
+
5
+ const props = defineProps({
6
+ photo: {
7
+ type: String,
8
+ default: '',
9
+ },
10
+ })
11
+
12
+ const photoSrc = computed(() => resolveAssetUrl(props.photo))
13
+ </script>
14
+
15
+ <template>
16
+ <div class="slidev-layout presenter">
17
+ <LayoutHeader class="absolute bottom-0 right-0 transform flip-x" />
18
+ <div class="grid grid-cols-2 w-full h-full">
19
+ <div class="image-right">
20
+ <slot />
21
+ </div>
22
+ <div class="my-14 mr-14">
23
+ <img
24
+ v-if="photo"
25
+ :src="photoSrc"
26
+ class="
27
+ rounded-full
28
+ object-cover
29
+ object-top
30
+ h-80
31
+ w-80
32
+ border
33
+ border-8
34
+ border-secondary-400
35
+ z-10
36
+ float-right
37
+ "
38
+ >
39
+ </div>
40
+ </div>
41
+ <LayoutFooter />
42
+ </div>
43
+ </template>
@@ -0,0 +1,33 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import QRious from 'qrious'
4
+
5
+ const props = defineProps({
6
+ url: {
7
+ type: String,
8
+ default: '',
9
+ },
10
+ })
11
+
12
+ const qrcode = computed(() => {
13
+ return new QRious({
14
+ value: props.url,
15
+ size: 300
16
+ }).toDataURL()
17
+ })
18
+ </script>
19
+
20
+ <template>
21
+ <div class="slidev-layout qrcode text-center">
22
+ <LayoutHeader class="absolute bottom-0 right-0 transform flip-x" />
23
+ <slot />
24
+ <div class="container mx-auto">
25
+ <img
26
+ :src="qrcode"
27
+ alt="QR Code"
28
+ class="w-m inline-block"
29
+ >
30
+ </div>
31
+ <LayoutFooter />
32
+ </div>
33
+ </template>
@@ -0,0 +1,36 @@
1
+ <script setup lang="ts">
2
+ const props = defineProps({
3
+ class: {
4
+ type: String,
5
+ default: '',
6
+ },
7
+ })
8
+ </script>
9
+
10
+ <template>
11
+ <div class="slidev-layout default">
12
+ <LayoutHeader class="absolute bottom-0 right-0 transform flip-x" />
13
+ <slot />
14
+ <div class="flex mt-6 mb-3">
15
+ <div
16
+ class="w-1/2 mr-8"
17
+ :class="props.class"
18
+ >
19
+ <slot name="left" />
20
+ </div>
21
+ <div
22
+ class="w-1/2 ml-8"
23
+ :class="props.class"
24
+ >
25
+ <slot name="right" />
26
+ </div>
27
+ </div>
28
+ <div
29
+ class="bottom"
30
+ :class="props.class"
31
+ >
32
+ <slot name="bottom" />
33
+ <LayoutFooter />
34
+ </div>
35
+ </div>
36
+ </template>
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "slidev-theme-meetup",
3
+ "version": "1.0.0",
4
+ "description": "Slidev theme used for talks on meetups",
5
+ "homepage": "https://github.com/tboerger/slidev-theme-meetup#readme",
6
+ "license": "CC-BY-SA-4.0",
7
+ "author": "Thomas Boerger <thomas@boerger.ws>",
8
+ "repository": "https://github.com/tboerger/slidev-theme-meetup.git",
9
+ "bugs": {
10
+ "url": "https://github.com/tboerger/slidev-theme-meetup/issues",
11
+ "email": "thomas@boerger.ws"
12
+ },
13
+ "scripts": {
14
+ "build": "slidev build example.md",
15
+ "dev": "slidev example.md --open",
16
+ "export": "slidev export example.md",
17
+ "screenshot": "slidev export example.md --format png",
18
+ "lint": "eslint --ext js --ext ts --ext vue .",
19
+ "release": "semantic-release"
20
+ },
21
+ "dependencies": {
22
+ "@slidev/types": "0.36.4",
23
+ "codemirror-theme-vars": "0.1.1",
24
+ "prism-theme-vars": "0.2.4",
25
+ "theme-vitesse": "0.4.10",
26
+ "vite-svg-loader": "3.6.0"
27
+ },
28
+ "devDependencies": {
29
+ "@iconify-json/mdi": "1.1.32",
30
+ "@semantic-release/changelog": "^6.0.1",
31
+ "@semantic-release/commit-analyzer": "^9.0.2",
32
+ "@semantic-release/git": "^10.0.1",
33
+ "@semantic-release/github": "^8.0.6",
34
+ "@semantic-release/npm": "^9.0.1",
35
+ "@semantic-release/release-notes-generator": "^10.0.3",
36
+ "@slidev/cli": "0.36.4",
37
+ "conventional-changelog-conventionalcommits": "^5.0.0",
38
+ "eslint": "^8.23.1",
39
+ "eslint-plugin-vue": "^9.4.0",
40
+ "playwright-chromium": "1.25.2",
41
+ "qrious": "4.0.2"
42
+ },
43
+ "keywords": [
44
+ "slidev-theme",
45
+ "slidev"
46
+ ],
47
+ "engines": {
48
+ "node": ">=14.0.0",
49
+ "slidev": ">=0.36.4"
50
+ },
51
+ "slidev": {
52
+ "colorSchema": "both",
53
+ "highlighter": "all",
54
+ "defaults": {
55
+ "fonts": {
56
+ "sans": "Helvetica",
57
+ "mono": "Fira Code"
58
+ },
59
+ "hightlighter": "prism"
60
+ }
61
+ }
62
+ }
Binary file
@@ -0,0 +1,53 @@
1
+ import { resolve } from 'path'
2
+ import { defineWindiSetup } from '@slidev/types'
3
+
4
+ const plugin = require('windicss/plugin')
5
+
6
+ const aspectRatioPlugin = plugin(({ addUtilities }) => {
7
+ const newUtilities = {
8
+ '.aspect-none': {
9
+ aspectRatio: 'none',
10
+ },
11
+ '.aspect-16-9': {
12
+ aspectRatio: '16/9',
13
+ },
14
+ '.aspect-4-3': {
15
+ aspectRatio: '4/3',
16
+ },
17
+ '.aspect-1-1': {
18
+ aspectRatio: '1/1',
19
+ },
20
+ }
21
+ addUtilities(newUtilities, ['responsive', 'hover'])
22
+ })
23
+
24
+ export default defineWindiSetup(() => ({
25
+ extract: {
26
+ include: [
27
+ resolve(__dirname, '../**/*.{vue,ts}'),
28
+ ],
29
+ },
30
+ theme: {
31
+ extend: {
32
+ fontFamily: {
33
+ sans: ['Nunito', 'system-ui', 'sans-serif'],
34
+ title: ['Georgia', 'serif'],
35
+ mono: ['Fira Code', 'ui-monospace'],
36
+ },
37
+ }
38
+ },
39
+ plugins: [
40
+ aspectRatioPlugin,
41
+ plugin(function ({ addUtilities, variants }) {
42
+ const newUtilities = {
43
+ '.flip-y': {
44
+ '--tw-scale-y': '-1 !important',
45
+ },
46
+ '.flip-x': {
47
+ '--tw-scale-x': '-1 !important',
48
+ },
49
+ }
50
+ addUtilities(newUtilities, variants('flip'))
51
+ }),
52
+ ],
53
+ }))
@@ -0,0 +1,76 @@
1
+ @import 'prism-theme-vars/base.css';
2
+ @import 'codemirror-theme-vars/base.css';
3
+ @import 'prism-theme-vars/to-codemirror.css';
4
+
5
+ :root {
6
+ --prism-font-family: var(--slidev-code-font-family);
7
+ }
8
+
9
+ html:not(.dark) {
10
+ --prism-foreground: #393a34;
11
+ --prism-background: #f8f8f8;
12
+ --prism-comment: #a0ada0;
13
+ --prism-string: #b56959;
14
+ --prism-literal: #2f8a89;
15
+ --prism-number: #296aa3;
16
+ --prism-keyword: #1c6b48;
17
+ --prism-function: #6c7834;
18
+ --prism-boolean: #1c6b48;
19
+ --prism-constant: #a65e2b;
20
+ --prism-deleted: #a14f55;
21
+ --prism-class: #2993a3;
22
+ --prism-builtin: #ab5959;
23
+ --prism-property: #b58451;
24
+ --prism-namespace: #b05a78;
25
+ --prism-punctuation: #8e8f8b;
26
+ --prism-decorator: #bd8f8f;
27
+ --prism-regex: #ab5e3f;
28
+ --prism-json-property: #698c96;
29
+ }
30
+
31
+ html.dark {
32
+ --prism-foreground: #d4cfbf;
33
+ --prism-background: #1b1b1b;
34
+ --prism-comment: #758575;
35
+ --prism-string: #d48372;
36
+ --prism-literal: #429988;
37
+ --prism-keyword: #4d9375;
38
+ --prism-boolean: #1c6b48;
39
+ --prism-number: #6394bf;
40
+ --prism-variable: #c2b36e;
41
+ --prism-function: #a1b567;
42
+ --prism-deleted: #a14f55;
43
+ --prism-class: #54b1bf;
44
+ --prism-builtin: #e0a569;
45
+ --prism-property: #dd8e6e;
46
+ --prism-namespace: #db889a;
47
+ --prism-punctuation: #858585;
48
+ --prism-decorator: #bd8f8f;
49
+ --prism-regex: #ab5e3f;
50
+ --prism-json-property: #6b8b9e;
51
+ --prism-line-number: #888888;
52
+ --prism-line-number-gutter: #eeeeee;
53
+ --prism-line-highlight-background: #444444;
54
+ --prism-selection-background: #444444;
55
+ }
56
+
57
+ pre[class*='language-'] {
58
+ @apply p-2;
59
+ }
60
+
61
+ :not(pre) > code {
62
+ font-size: 0.9em;
63
+ background: var(--prism-background);
64
+ @apply font-light py-0.5 rounded;
65
+ }
66
+
67
+
68
+ :not(pre) > code:before,
69
+ :not(pre) > code:after {
70
+ content: '`';
71
+ opacity: 0.50;
72
+ }
73
+
74
+ :not(pre) > code:before {
75
+ margin-right: -0.08em;
76
+ }
@@ -0,0 +1,4 @@
1
+ import '@slidev/client/styles/layouts-base.css'
2
+
3
+ import './layout.css'
4
+ import './code.css'
@@ -0,0 +1,178 @@
1
+ @import url(http://fonts.googleapis.com/css?family=Nunito);
2
+ @import url(http://fonts.googleapis.com/css?family=Georgia);
3
+ @import url(http://fonts.googleapis.com/css?family=Fira+Code);
4
+
5
+ :root {
6
+ --slidev-theme-primary: #5d8392;
7
+ --slidev-code-font-size: 0.95rem;
8
+ --slidev-code-line-height: 1.25rem;
9
+ }
10
+
11
+ html, body {
12
+ background-color: #fdf6e3;
13
+ color: #839496;
14
+ }
15
+
16
+ html:not(.dark) {
17
+ a, a:visited, a:active {
18
+ color: #2aa198;
19
+ border-color: #eee8d5;
20
+ }
21
+
22
+ a:hover {
23
+ background-color: #eee8d5;
24
+ border-color: #eee8d5;
25
+ color: #2aa198;
26
+ }
27
+
28
+ h1, h2, h3 {
29
+ color: #cb4b16;
30
+ }
31
+
32
+ h1 a, h1 a:visited, h1 a:active {
33
+ color: #cb4b16;
34
+ }
35
+
36
+ h1 a:hover {
37
+ background-color: #eee8d5;
38
+ border-color: #eee8d5;
39
+ }
40
+
41
+ article h1 a.anchor {
42
+ color: #2aa198;
43
+ }
44
+
45
+ blockquote {
46
+ border-color: #cb4b16;
47
+ }
48
+ }
49
+
50
+ html.dark {
51
+ a, a:visited, a:active {
52
+ color: #2aa198;
53
+ border-color: #073642;
54
+ }
55
+
56
+ a:hover {
57
+ background-color: #073642;
58
+ border-color: #073642;
59
+ color: #2aa198;
60
+ }
61
+
62
+ h1, h2, h3 {
63
+ color: #cb4b16;
64
+ }
65
+
66
+ h1 a, h1 a:visited, h1 a:active {
67
+ color: #cb4b16;
68
+ }
69
+
70
+ h1 a:hover {
71
+ background-color: #073642;
72
+ border-color: #073642;
73
+ color: #cb4b16;
74
+ }
75
+
76
+ article h1 a.anchor {
77
+ color: #2aa198;
78
+ }
79
+
80
+ blockquote {
81
+ border-color: #cb4b16;
82
+ }
83
+ }
84
+
85
+ .slidev-layout {
86
+ font-variant-ligatures: none;
87
+ text-align: justify;
88
+
89
+ h1, h2, h3, h4, p, div {
90
+ @apply select-text;
91
+ }
92
+
93
+ h1 {
94
+ @apply font-bold;
95
+ }
96
+
97
+ h1 + h2 {
98
+ @apply -mt-4;
99
+ }
100
+
101
+ h2 {
102
+ @apply text-2xl font-bold;
103
+ }
104
+
105
+ h3 {
106
+ @apply text-xl font-bold;
107
+ }
108
+
109
+ p {
110
+ @apply mt-4 mb-4;
111
+ }
112
+
113
+ p:first-child {
114
+ @apply mt-0 mb-4;
115
+ }
116
+
117
+ p:last-child {
118
+ @apply mb-0;
119
+ }
120
+
121
+ p + h2, ul + h2, table + h2 {
122
+ @apply mt-10;
123
+ }
124
+
125
+ blockquote > * {
126
+ @apply my-0;
127
+ }
128
+
129
+ ul {
130
+ list-style: disc;
131
+ }
132
+
133
+ li > ul,
134
+ li > ol,
135
+ ul:first-child,
136
+ ol:first-child {
137
+ margin-top: 0;
138
+ }
139
+
140
+ :not(pre) > code:before,
141
+ :not(pre) > code:after {
142
+ content: '\2005';
143
+ }
144
+
145
+ .katex-display {
146
+ @apply my-0
147
+ }
148
+
149
+ th {
150
+ @apply font-bold;
151
+ }
152
+
153
+ td {
154
+ @apply py-1.5;
155
+ }
156
+
157
+ li {
158
+ line-height: 1.6em;
159
+ }
160
+ }
161
+
162
+ .slidev-layout.intro,
163
+ .slidev-layout.cover {
164
+ @apply h-full grid;
165
+
166
+ h1 {
167
+ @apply text-6xl font-700 leading-20;
168
+ }
169
+
170
+ h1 + p {
171
+ @apply font-700 -mt-4 text-2xl;
172
+ }
173
+ }
174
+
175
+ :not(li) > ul > li:not(li:first-child),
176
+ :not(li) > ol > li:not(li:first-child) {
177
+ margin-top: 1rem;
178
+ }
package/vite.config.js ADDED
@@ -0,0 +1,6 @@
1
+ import { defineConfig } from 'vite'
2
+ import svgLoader from 'vite-svg-loader'
3
+
4
+ export default defineConfig({
5
+ plugins: [svgLoader()],
6
+ })