vitepress 1.0.0-draft.1 → 1.0.0-draft.4

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.
Files changed (46) hide show
  1. package/dist/client/app/composables/head.js +2 -2
  2. package/dist/client/app/data.js +2 -4
  3. package/dist/client/index.d.ts +8 -0
  4. package/dist/client/shared.js +22 -0
  5. package/dist/client/theme-default/Layout.vue +18 -1
  6. package/dist/client/theme-default/components/VPBackdrop.vue +1 -1
  7. package/dist/client/theme-default/components/VPBox.vue +59 -0
  8. package/dist/client/theme-default/components/VPButton.vue +123 -0
  9. package/dist/client/theme-default/components/VPContent.vue +34 -10
  10. package/dist/client/theme-default/components/{VPContentDoc.vue → VPDoc.vue} +66 -42
  11. package/dist/client/theme-default/components/{VPContentDocFooter.vue → VPDocFooter.vue} +3 -2
  12. package/dist/client/theme-default/components/{VPContentDocOutline.vue → VPDocOutline.vue} +14 -3
  13. package/dist/client/theme-default/components/VPFooter.vue +53 -0
  14. package/dist/client/theme-default/components/VPHero.vue +144 -0
  15. package/dist/client/theme-default/components/VPHome.vue +33 -0
  16. package/dist/client/theme-default/components/VPHomeFeatures.vue +96 -0
  17. package/dist/client/theme-default/components/VPHomeHero.vue +17 -0
  18. package/dist/client/theme-default/components/VPHomeSponsors.vue +93 -0
  19. package/dist/client/theme-default/components/VPNavBar.vue +2 -1
  20. package/dist/client/theme-default/components/VPNavBarAppearance.vue +4 -1
  21. package/dist/client/theme-default/components/VPNavBarExtra.vue +2 -2
  22. package/dist/client/theme-default/components/VPNavBarSearch.vue +3 -3
  23. package/dist/client/theme-default/components/VPNavBarTitle.vue +26 -13
  24. package/dist/client/theme-default/components/VPNavScreenAppearance.vue +4 -1
  25. package/dist/client/theme-default/components/VPPage.vue +5 -0
  26. package/dist/client/theme-default/components/VPSidebar.vue +2 -2
  27. package/dist/client/theme-default/components/VPSponsors.vue +77 -0
  28. package/dist/client/theme-default/components/VPSponsorsGrid.vue +32 -0
  29. package/dist/client/theme-default/components/VPSwitchAppearance.vue +3 -3
  30. package/dist/client/theme-default/components/icons/VPIconHeart.vue +5 -0
  31. package/dist/client/theme-default/composables/outline.js +12 -20
  32. package/dist/client/theme-default/composables/sponsor-grid.js +92 -0
  33. package/dist/client/theme-default/index.js +6 -1
  34. package/dist/client/theme-default/styles/base.css +3 -0
  35. package/dist/client/theme-default/styles/components/custom-block.css +90 -0
  36. package/dist/client/theme-default/styles/{vp-doc.css → components/vp-doc.css} +63 -11
  37. package/dist/client/theme-default/styles/components/vp-sponsor.css +86 -0
  38. package/dist/client/theme-default/styles/vars.css +150 -29
  39. package/dist/client/theme-default/support/utils.js +19 -0
  40. package/dist/node/cli.js +1 -1
  41. package/dist/node/index.d.ts +22 -1
  42. package/dist/node/index.js +1 -1
  43. package/dist/node/{serve-428d4610.js → serve-b3182d88.js} +50 -8
  44. package/package.json +2 -1
  45. package/types/default-theme.d.ts +12 -0
  46. package/types/shared.d.ts +14 -6
@@ -0,0 +1,32 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ import { useSponsorsGrid } from '../composables/sponsor-grid'
4
+
5
+ interface Sponsor {
6
+ name: string
7
+ img: string
8
+ url: string
9
+ }
10
+
11
+ const props = defineProps<{
12
+ size?: 'small' | 'medium' | 'big'
13
+ data: Sponsor[]
14
+ }>()
15
+
16
+ const el = ref(null)
17
+
18
+ useSponsorsGrid({ el, size: props.size })
19
+ </script>
20
+
21
+ <template>
22
+ <div class="VPSponsorsGrid vp-sponsor-grid" :class="[props.size ?? 'medium']" ref="el">
23
+ <div v-for="sponsor in data" :key="sponsor.tier" class="vp-sponsor-grid-item">
24
+ <a class="vp-sponsor-grid-link" :href="sponsor.url" target="_blank" rel="sponsored noopener">
25
+ <article class="vp-sponsor-grid-box">
26
+ <h4 class="visually-hidden">{{ sponsor.name }}</h4>
27
+ <img class="vp-sponsor-grid-image" :src="sponsor.img" :alt="sponsor.name" />
28
+ </article>
29
+ </a>
30
+ </div>
31
+ </div>
32
+ </template>
@@ -1,4 +1,5 @@
1
1
  <script lang="ts" setup>
2
+ import { APPEARANCE_KEY } from '../../shared'
2
3
  import VPSwitch from './VPSwitch.vue'
3
4
  import VPIconSun from './icons/VPIconSun.vue'
4
5
  import VPIconMoon from './icons/VPIconMoon.vue'
@@ -6,11 +7,10 @@ import VPIconMoon from './icons/VPIconMoon.vue'
6
7
  const toggle = typeof localStorage !== 'undefined' ? useAppearance() : () => {}
7
8
 
8
9
  function useAppearance() {
9
- const storageKey = 'vitepress-theme-appearance'
10
10
  const query = window.matchMedia('(prefers-color-scheme: dark)')
11
11
  const classList = document.documentElement.classList
12
12
 
13
- let userPreference = localStorage.getItem(storageKey) || 'auto'
13
+ let userPreference = localStorage.getItem(APPEARANCE_KEY) || 'auto'
14
14
 
15
15
  let isDark = userPreference === 'auto'
16
16
  ? query.matches
@@ -29,7 +29,7 @@ function useAppearance() {
29
29
  ? query.matches ? 'auto' : 'dark'
30
30
  : query.matches ? 'light' : 'auto'
31
31
 
32
- localStorage.setItem(storageKey, userPreference)
32
+ localStorage.setItem(APPEARANCE_KEY, userPreference)
33
33
  }
34
34
 
35
35
  function setClass(dark: boolean): void {
@@ -0,0 +1,5 @@
1
+ <template>
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
3
+ <path d="M12,22.2c-0.3,0-0.5-0.1-0.7-0.3l-8.8-8.8c-2.5-2.5-2.5-6.7,0-9.2c2.5-2.5,6.7-2.5,9.2,0L12,4.3l0.4-0.4c0,0,0,0,0,0C13.6,2.7,15.2,2,16.9,2c0,0,0,0,0,0c1.7,0,3.4,0.7,4.6,1.9l0,0c1.2,1.2,1.9,2.9,1.9,4.6c0,1.7-0.7,3.4-1.9,4.6l-8.8,8.8C12.5,22.1,12.3,22.2,12,22.2zM7,4C5.9,4,4.7,4.4,3.9,5.3c-1.8,1.8-1.8,4.6,0,6.4l8.1,8.1l8.1-8.1c0.9-0.9,1.3-2,1.3-3.2c0-1.2-0.5-2.3-1.3-3.2l0,0C19.3,4.5,18.2,4,17,4c0,0,0,0,0,0c-1.2,0-2.3,0.5-3.2,1.3c0,0,0,0,0,0l-1.1,1.1c-0.4,0.4-1,0.4-1.4,0l-1.1-1.1C9.4,4.4,8.2,4,7,4z" />
4
+ </svg>
5
+ </template>
@@ -1,7 +1,18 @@
1
- import { onMounted, onUpdated, onUnmounted } from 'vue';
1
+ import { computed, onMounted, onUpdated, onUnmounted } from 'vue';
2
+ import { useData } from 'vitepress';
2
3
  import { useMediaQuery } from '@vueuse/core';
4
+ import { throttleAndDebounce } from '../support/utils';
3
5
  // magic number to avoid repeated retrieval
4
6
  const PAGE_OFFSET = 56;
7
+ export function useOutline() {
8
+ const { page } = useData();
9
+ const hasOutline = computed(() => {
10
+ return page.value.headers.length > 0;
11
+ });
12
+ return {
13
+ hasOutline
14
+ };
15
+ }
5
16
  export function resolveHeaders(headers) {
6
17
  return mapHeaders(groupHeaders(headers));
7
18
  }
@@ -109,22 +120,3 @@ function isAnchorActive(index, anchor, nextAnchor) {
109
120
  }
110
121
  return [false, null];
111
122
  }
112
- function throttleAndDebounce(fn, delay) {
113
- let timeout;
114
- let called = false;
115
- return () => {
116
- if (timeout) {
117
- clearTimeout(timeout);
118
- }
119
- if (!called) {
120
- fn();
121
- called = true;
122
- setTimeout(() => {
123
- called = false;
124
- }, delay);
125
- }
126
- else {
127
- timeout = setTimeout(fn, delay);
128
- }
129
- };
130
- }
@@ -0,0 +1,92 @@
1
+ import { onMounted, onUnmounted } from 'vue';
2
+ import { throttleAndDebounce } from '../support/utils';
3
+ /**
4
+ * Defines grid configuration for each sponsor size in touple.
5
+ *
6
+ * [Screen widh, Column size]
7
+ *
8
+ * It sets grid size on matching screen size. For example, `[768, 5]` will set
9
+ * 5 columns when screen size is bigger or equal to 768px.
10
+ *
11
+ * Column will set only when item size is bigger than the column size. For
12
+ * example, even we want 5 columns, if we only have 1 sponsor yet, we would
13
+ * like to show it in 1 column.
14
+ */
15
+ const GridSettings = {
16
+ small: [
17
+ [920, 6],
18
+ [768, 5],
19
+ [640, 4],
20
+ [480, 3],
21
+ [0, 2]
22
+ ],
23
+ medium: [
24
+ [960, 5],
25
+ [832, 4],
26
+ [640, 3],
27
+ [480, 2]
28
+ ],
29
+ big: [
30
+ [832, 3],
31
+ [640, 2]
32
+ ]
33
+ };
34
+ export function useSponsorsGrid(options) {
35
+ const onResize = throttleAndDebounce(manage, 100);
36
+ onMounted(() => {
37
+ manage();
38
+ window.addEventListener('resize', onResize);
39
+ });
40
+ onUnmounted(() => {
41
+ window.removeEventListener('resize', onResize);
42
+ });
43
+ function manage() {
44
+ adjustSlots(options.el.value, options.size);
45
+ }
46
+ }
47
+ function adjustSlots(el, size) {
48
+ const tsize = el.children.length;
49
+ const asize = el.querySelectorAll('.vp-sponsor-grid-item:not(.empty)').length;
50
+ const grid = setGrid(el, size, asize);
51
+ manageSlots(el, grid, tsize, asize);
52
+ }
53
+ function setGrid(el, size, items) {
54
+ const settings = GridSettings[size];
55
+ const screen = window.innerWidth;
56
+ let grid = 1;
57
+ settings.some(([breakpoint, value]) => {
58
+ if (screen >= breakpoint) {
59
+ grid = items < value ? items : value;
60
+ return true;
61
+ }
62
+ });
63
+ setGridData(el, grid);
64
+ return grid;
65
+ }
66
+ function setGridData(el, value) {
67
+ el.dataset.vpGrid = String(value);
68
+ }
69
+ function manageSlots(el, grid, tsize, asize) {
70
+ const diff = tsize - asize;
71
+ const rem = asize % grid;
72
+ const drem = rem === 0 ? rem : grid - rem;
73
+ neutralizeSlots(el, drem - diff);
74
+ }
75
+ function neutralizeSlots(el, count) {
76
+ if (count === 0) {
77
+ return;
78
+ }
79
+ count > 0 ? addSlots(el, count) : removeSlots(el, count * -1);
80
+ }
81
+ function addSlots(el, count) {
82
+ for (let i = 0; i < count; i++) {
83
+ const slot = document.createElement('div');
84
+ slot.classList.add('vp-sponsor-grid-item', 'empty');
85
+ el.append(slot);
86
+ }
87
+ }
88
+ function removeSlots(el, count) {
89
+ for (let i = 0; i < count; i++) {
90
+ el.removeChild(el.lastElementChild);
91
+ }
92
+ }
@@ -2,9 +2,14 @@ import './styles/fonts.css';
2
2
  import './styles/vars.css';
3
3
  import './styles/base.css';
4
4
  import './styles/utils.css';
5
- import './styles/vp-doc.css';
5
+ import './styles/components/custom-block.css';
6
+ import './styles/components/vp-doc.css';
7
+ import './styles/components/vp-sponsor.css';
6
8
  import Layout from './Layout.vue';
7
9
  import NotFound from './NotFound.vue';
10
+ export { default as VPHomeHero } from './components/VPHomeHero.vue';
11
+ export { default as VPHomeFeatures } from './components/VPHomeFeatures.vue';
12
+ export { default as VPHomeSponsors } from './components/VPHomeSponsors.vue';
8
13
  const theme = {
9
14
  Layout,
10
15
  NotFound
@@ -39,6 +39,9 @@ h4,
39
39
  h5,
40
40
  h6 {
41
41
  margin: 0;
42
+ line-height: 24px;
43
+ font-size: 16px;
44
+ font-weight: 400;
42
45
  }
43
46
 
44
47
  p {
@@ -0,0 +1,90 @@
1
+ .custom-block {
2
+ border: 1px solid transparent;
3
+ border-radius: 8px;
4
+ padding: 16px 16px 8px;
5
+ line-height: 20px;
6
+ font-size: 14px;
7
+ color: var(--vp-c-text-2);
8
+ }
9
+
10
+ .custom-block.info {
11
+ border-color: var(--vp-custom-block-info-border);
12
+ color: var(--vp-custom-block-info-text);
13
+ background-color: var(--vp-custom-block-info-bg);
14
+ }
15
+
16
+ .custom-block.info code {
17
+ background-color: var(--vp-custom-block-info-code-bg);
18
+ }
19
+
20
+ .custom-block.tip {
21
+ border-color: var(--vp-custom-block-tip-border);
22
+ color: var(--vp-custom-block-tip-text);
23
+ background-color: var(--vp-custom-block-tip-bg);
24
+ }
25
+
26
+ .custom-block.tip code {
27
+ background-color: var(--vp-custom-block-tip-code-bg);
28
+ }
29
+
30
+ .custom-block.warning {
31
+ border-color: var(--vp-custom-block-warning-border);
32
+ color: var(--vp-custom-block-warning-text);
33
+ background-color: var(--vp-custom-block-warning-bg);
34
+ }
35
+
36
+ .custom-block.warning code {
37
+ background-color: var(--vp-custom-block-warning-code-bg);
38
+ }
39
+
40
+ .custom-block.danger {
41
+ border-color: var(--vp-custom-block-danger-border);
42
+ color: var(--vp-custom-block-danger-text);
43
+ background-color: var(--vp-custom-block-danger-bg);
44
+ }
45
+
46
+ .custom-block.danger code {
47
+ background-color: var(--vp-custom-block-danger-code-bg);
48
+ }
49
+
50
+ .custom-block.details {
51
+ border-color: var(--vp-custom-block-details-border);
52
+ color: var(--vp-custom-block-details-text);
53
+ background-color: var(--vp-custom-block-details-bg);
54
+ }
55
+
56
+ .custom-block.details code {
57
+ background-color: var(--vp-custom-block-details-code-bg);
58
+ }
59
+
60
+ .custom-block-title {
61
+ font-weight: 700;
62
+ }
63
+
64
+ .custom-block p + p {
65
+ margin: 8px 0;
66
+ }
67
+
68
+ .custom-block.details summary {
69
+ margin: 0 0 8px;
70
+ font-weight: 700;
71
+ }
72
+
73
+ .custom-block.details summary + p {
74
+ margin: 8px 0;
75
+ }
76
+
77
+ .custom-block a {
78
+ color: inherit;
79
+ font-weight: 600;
80
+ text-decoration: underline;
81
+ transition: opacity .25s;
82
+ }
83
+
84
+ .custom-block a:hover {
85
+ opacity: 0.6;
86
+ }
87
+
88
+ .custom-block code {
89
+ font-size: var(--vp-custom-block-code-font-size);
90
+ }
@@ -115,14 +115,27 @@
115
115
 
116
116
  .vp-doc ul,
117
117
  .vp-doc ol {
118
+ padding-left: 1.25rem;
118
119
  margin: 16px 0;
119
120
  }
120
121
 
121
122
  .vp-doc ul {
122
- padding-left: 1.25rem;
123
123
  list-style: disc;
124
124
  }
125
125
 
126
+ .vp-doc ol {
127
+ list-style: decimal;
128
+ }
129
+
130
+ .vp-doc li + li {
131
+ margin-top: 8px;
132
+ }
133
+
134
+ .vp-doc li > ol,
135
+ .vp-doc li > ul {
136
+ margin: 8px 0 0;
137
+ }
138
+
126
139
  /**
127
140
  * Table
128
141
  * -------------------------------------------------------------------------- */
@@ -173,6 +186,49 @@
173
186
  border-top: 1px solid var(--vp-c-divider-light);
174
187
  }
175
188
 
189
+ /**
190
+ * Custom Block
191
+ * -------------------------------------------------------------------------- */
192
+
193
+ .vp-doc .custom-block {
194
+ margin: 16px 0;
195
+ }
196
+
197
+ .vp-doc .custom-block p {
198
+ margin: 8px 0;
199
+ line-height: 24px;
200
+ }
201
+
202
+ .vp-doc .custom-block p:first-child {
203
+ margin: 0;
204
+ }
205
+
206
+ .vp-doc .custom-block a {
207
+ color: inherit;
208
+ font-weight: 600;
209
+ text-decoration: underline;
210
+ transition: opacity .25s;
211
+ }
212
+
213
+ .vp-doc .custom-block a:hover {
214
+ opacity: 0.6;
215
+ }
216
+
217
+ .vp-doc .custom-block code {
218
+ font-size: var(--vp-custom-block-code-font-size);
219
+ font-weight: 600;
220
+ color: inherit;
221
+ }
222
+
223
+ .vp-doc .custom-block div[class*='language-'] {
224
+ margin: 8px 0;
225
+ }
226
+
227
+ .vp-doc .custom-block div[class*='language-'] code {
228
+ font-weight: 400;
229
+ background-color: var(--vp-code-block-bg);
230
+ }
231
+
176
232
  /**
177
233
  * Code
178
234
  * -------------------------------------------------------------------------- */
@@ -184,7 +240,7 @@
184
240
 
185
241
  .vp-doc :not(pre) > code {
186
242
  border-radius: 4px;
187
- padding: 4px 6px;
243
+ padding: 3px 6px;
188
244
  color: var(--vp-c-text-code);
189
245
  background-color: var(--vp-c-bg-mute);
190
246
  transition: color 0.5s, background-color 0.5s;
@@ -196,19 +252,13 @@
196
252
  font-size: 0.9em;
197
253
  }
198
254
 
199
- @media (min-width: 768px) {
200
- .vp-doc :not(pre) > code {
201
- white-space: nowrap;
202
- }
203
- }
204
-
205
255
  .vp-doc a > code {
206
256
  color: var(--vp-c-brand-dark);
207
257
  }
208
258
 
209
259
  .vp-doc div[class*='language-'] {
210
260
  position: relative;
211
- margin: 20px -24px;
261
+ margin: 16px -24px;
212
262
  background-color: var(--vp-code-block-bg);
213
263
  overflow-x: auto;
214
264
  transition: background-color 0.5s;
@@ -217,7 +267,7 @@
217
267
  @media (min-width: 640px) {
218
268
  .vp-doc div[class*='language-'] {
219
269
  border-radius: 8px;
220
- margin: 20px 0;
270
+ margin: 16px 0;
221
271
  }
222
272
  }
223
273
 
@@ -230,7 +280,7 @@
230
280
  .vp-doc div[class*='language-'] + div[class*='language-'],
231
281
  .vp-doc div[class$='-api'] + div[class*='language-'],
232
282
  .vp-doc div[class*='language-'] + div[class$='-api'] > div[class*='language-'] {
233
- margin-top: -12px;
283
+ margin-top: -8px;
234
284
  }
235
285
 
236
286
  .vp-doc [class*='language-'] pre,
@@ -331,6 +381,8 @@
331
381
  .vp-doc [class~='language-ts']:before { content: 'ts'; }
332
382
  .vp-doc [class~='language-tsx']:before { content: 'tsx'; }
333
383
  .vp-doc [class~='language-json']:before { content: 'json'; }
384
+ .vp-doc [class~='language-yaml']:before { content: 'yaml'; }
385
+ .vp-doc [class~='language-yml']:before { content: 'yaml'; }
334
386
  .vp-doc [class~='language-sh']:before { content: 'sh'; }
335
387
  .vp-doc [class~='language-bash']:before { content: 'sh'; }
336
388
 
@@ -0,0 +1,86 @@
1
+ .vp-sponsor-grid {
2
+ display: flex;
3
+ flex-wrap: wrap;
4
+ gap: 4px;
5
+ }
6
+
7
+ .vp-sponsor-grid.small .vp-sponsor-grid-link { height: 96px; }
8
+ .vp-sponsor-grid.small .vp-sponsor-grid-image { max-width: 96px; max-height: 24px }
9
+
10
+ .vp-sponsor-grid.medium .vp-sponsor-grid-link { height: 112px; }
11
+ .vp-sponsor-grid.medium .vp-sponsor-grid-image { max-width: 120px; max-height: 36px }
12
+
13
+ .vp-sponsor-grid.big .vp-sponsor-grid-link { height: 184px; }
14
+ .vp-sponsor-grid.big .vp-sponsor-grid-image { max-width: 192px; max-height: 56px }
15
+
16
+ .vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item {
17
+ width: calc((100% - 4px) / 2);
18
+ }
19
+
20
+ .vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item {
21
+ width: calc((100% - 4px * 2) / 3);
22
+ }
23
+
24
+ .vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item {
25
+ width: calc((100% - 4px * 3) / 4);
26
+ }
27
+
28
+ .vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item {
29
+ width: calc((100% - 4px * 4) / 5);
30
+ }
31
+
32
+ .vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item {
33
+ width: calc((100% - 4px * 5) / 6);
34
+ }
35
+
36
+ .vp-sponsor-grid-item {
37
+ flex-shrink: 0;
38
+ width: 100%;
39
+ background-color: var(--vp-c-white-soft);
40
+ transition: background-color 0.25s;
41
+ }
42
+
43
+ .vp-sponsor-grid-item:hover {
44
+ background-color: var(--vp-c-white-mute);
45
+ }
46
+
47
+ .vp-sponsor-grid-item:hover .vp-sponsor-grid-image {
48
+ filter: grayscale(0) invert(0);
49
+ }
50
+
51
+ .vp-sponsor-grid-item.empty:hover {
52
+ background-color: var(--vp-c-white-soft);
53
+ }
54
+
55
+ .dark .vp-sponsor-grid-item {
56
+ background-color: var(--vp-c-black-mute);
57
+ }
58
+
59
+ .dark .vp-sponsor-grid-item:hover {
60
+ background-color: var(--vp-c-white-soft);
61
+ }
62
+
63
+ .dark .vp-sponsor-grid-item.empty:hover {
64
+ background-color: var(--vp-c-black-mute);
65
+ }
66
+
67
+ .vp-sponsor-grid-link {
68
+ display: flex;
69
+ }
70
+
71
+ .vp-sponsor-grid-box {
72
+ display: flex;
73
+ justify-content: center;
74
+ align-items: center;
75
+ width: 100%;
76
+ }
77
+
78
+ .vp-sponsor-grid-image {
79
+ max-width: 100%;
80
+ filter: grayscale(1);
81
+ transition: filter 0.25s;
82
+ }
83
+
84
+ .dark .vp-sponsor-grid-image {
85
+ filter: grayscale(1) invert(1);
86
+ }