slidev-theme-neversink 0.4.0 → 0.4.1

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 (68) hide show
  1. package/.vscode/settings.json +4 -1
  2. package/components/CreditScroll.vue +16 -21
  3. package/components/StickyNote.vue +11 -1
  4. package/docs/.vitepress/config.js +1 -0
  5. package/docs/components/creditscroll.md +34 -0
  6. package/docs/components/stickynote.md +16 -0
  7. package/docs/dark-mode.md +134 -0
  8. package/docs/getting-started.md +1 -0
  9. package/docs/layouts/credits.md +1 -1
  10. package/docs/public/screenshots/1.png +0 -0
  11. package/docs/public/screenshots/10.png +0 -0
  12. package/docs/public/screenshots/11.png +0 -0
  13. package/docs/public/screenshots/12.png +0 -0
  14. package/docs/public/screenshots/13.png +0 -0
  15. package/docs/public/screenshots/14.png +0 -0
  16. package/docs/public/screenshots/15.png +0 -0
  17. package/docs/public/screenshots/16.png +0 -0
  18. package/docs/public/screenshots/17.png +0 -0
  19. package/docs/public/screenshots/18.png +0 -0
  20. package/docs/public/screenshots/19.png +0 -0
  21. package/docs/public/screenshots/2.png +0 -0
  22. package/docs/public/screenshots/20.png +0 -0
  23. package/docs/public/screenshots/21.png +0 -0
  24. package/docs/public/screenshots/22.png +0 -0
  25. package/docs/public/screenshots/23.png +0 -0
  26. package/docs/public/screenshots/24.png +0 -0
  27. package/docs/public/screenshots/25.png +0 -0
  28. package/docs/public/screenshots/26.png +0 -0
  29. package/docs/public/screenshots/27.png +0 -0
  30. package/docs/public/screenshots/28.png +0 -0
  31. package/docs/public/screenshots/29.png +0 -0
  32. package/docs/public/screenshots/3.png +0 -0
  33. package/docs/public/screenshots/30.png +0 -0
  34. package/docs/public/screenshots/31.png +0 -0
  35. package/docs/public/screenshots/32.png +0 -0
  36. package/docs/public/screenshots/33.png +0 -0
  37. package/docs/public/screenshots/34.png +0 -0
  38. package/docs/public/screenshots/35.png +0 -0
  39. package/docs/public/screenshots/36.png +0 -0
  40. package/docs/public/screenshots/37.png +0 -0
  41. package/docs/public/screenshots/38.png +0 -0
  42. package/docs/public/screenshots/39.png +0 -0
  43. package/docs/public/screenshots/4.png +0 -0
  44. package/docs/public/screenshots/40.png +0 -0
  45. package/docs/public/screenshots/41.png +0 -0
  46. package/docs/public/screenshots/42.png +0 -0
  47. package/docs/public/screenshots/5.png +0 -0
  48. package/docs/public/screenshots/6.png +0 -0
  49. package/docs/public/screenshots/7.png +0 -0
  50. package/docs/public/screenshots/8.png +0 -0
  51. package/docs/public/screenshots/9.png +0 -0
  52. package/docs/styling.md +85 -1
  53. package/example.md +108 -1
  54. package/layoutHelper.ts +13 -0
  55. package/layouts/default.vue +9 -1
  56. package/layouts/full.vue +9 -5
  57. package/layouts/section.vue +9 -1
  58. package/layouts/side-title.vue +12 -5
  59. package/layouts/top-title-two-cols.vue +10 -3
  60. package/layouts/top-title.vue +10 -3
  61. package/layouts/two-cols-title.vue +9 -2
  62. package/package.json +7 -5
  63. package/screenshot.md +89 -1
  64. package/styles/base.css +12 -5
  65. package/styles/dark-mode.css +785 -0
  66. package/styles/index.ts +1 -0
  67. package/styles/neversink-c.css +20 -0
  68. package/uno.config.ts +3 -0
@@ -1,4 +1,7 @@
1
1
  {
2
2
  "slidev.force-enabled": true,
3
- "slidev.include": ["**/slides.md", "example.md", "screenshot.md"]
3
+ "slidev.include": ["**/slides.md", "example.md", "screenshot.md"],
4
+ "[markdown]": {
5
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
6
+ }
4
7
  }
@@ -5,25 +5,26 @@ import { onSlideEnter, useSlideContext } from '@slidev/client'
5
5
  const { $renderContext } = useSlideContext()
6
6
  const props = defineProps({
7
7
  speed: {
8
+ type: Number,
8
9
  default: 0.5,
9
10
  },
10
11
  loop: {
12
+ type: Boolean,
11
13
  default: false,
12
14
  },
13
15
  })
14
16
 
15
17
  const containerRef = ref(null)
16
18
  const scrollPosition = ref(0)
17
- const isScrolling = ref(false)
18
19
 
19
20
  let animationFrameId = null
20
21
 
21
22
  const scroll = () => {
22
23
  scrollPosition.value -= props.speed
23
24
  if (Math.abs(scrollPosition.value) >= 550) {
24
- if (props.loop.value) {
25
- console.log('resetting loop', props.loop.value)
25
+ if (props.loop) {
26
26
  resetScroll()
27
+ animationFrameId = requestAnimationFrame(scroll)
27
28
  } else {
28
29
  stopScrolling()
29
30
  return
@@ -40,34 +41,29 @@ const startScrolling = () => {
40
41
  const stopScrolling = () => {
41
42
  if (animationFrameId) {
42
43
  cancelAnimationFrame(animationFrameId)
44
+ animationFrameId = null
43
45
  }
44
46
  }
45
47
 
46
48
  const resetScroll = () => {
47
- scrollPosition.value = 480 //containerRef.value.offsetHeight * 2.5
49
+ scrollPosition.value = 480
48
50
  if (animationFrameId) {
49
51
  cancelAnimationFrame(animationFrameId)
52
+ animationFrameId = null
50
53
  }
51
54
  }
52
55
 
53
- onMounted(() => {
54
- console.log('mounted')
55
- // Reset scrolling when entering the slide
56
- onSlideEnter(() => {
57
- console.log('context ', $renderContext.value)
58
- if (['slide', 'presenter'].includes($renderContext.value)) {
59
- console.log('onSlideEnter')
60
- resetScroll()
61
- console.log('starting scrolling')
62
- startScrolling()
63
- }
64
- })
56
+ // Must be called in setup scope
57
+ onSlideEnter(() => {
58
+ if (['slide', 'presenter'].includes($renderContext.value)) {
59
+ stopScrolling()
60
+ resetScroll()
61
+ startScrolling()
62
+ }
65
63
  })
66
64
 
67
65
  onUnmounted(() => {
68
- if (animationFrameId) {
69
- cancelAnimationFrame(animationFrameId)
70
- }
66
+ stopScrolling()
71
67
  })
72
68
  </script>
73
69
 
@@ -81,10 +77,9 @@ onUnmounted(() => {
81
77
 
82
78
  <style scoped>
83
79
  .scroll-container {
84
- height: 100vh; /* Use full viewport height */
80
+ height: 100vh;
85
81
  overflow: hidden;
86
82
  position: relative;
87
- cursor: pointer;
88
83
  }
89
84
 
90
85
  .scroll-content {
@@ -28,6 +28,16 @@ const props = defineProps({
28
28
  type: String,
29
29
  default: 'block text-xs font-mono tracking-normal font-bold',
30
30
  },
31
+ devOnly: {
32
+ // only show in dev mode (useful for notes that shouldn't appear in exports)
33
+ type: Boolean,
34
+ default: false,
35
+ },
36
+ })
37
+
38
+ const isVisible = computed(() => {
39
+ if (!props.devOnly) return true
40
+ return import.meta.env.DEV
31
41
  })
32
42
 
33
43
  const colorscheme = computed(() => {
@@ -48,7 +58,7 @@ const stickyStyles = computed(() => ({
48
58
  </script>
49
59
 
50
60
  <template>
51
- <div :class="stickyClasses" :style="stickyStyles">
61
+ <div v-if="isVisible" :class="stickyClasses" :style="stickyStyles">
52
62
  <template v-if="props.title !== ''"
53
63
  ><span :class="props.customTitle">{{ props.title }}</span></template
54
64
  >
@@ -28,6 +28,7 @@ export default defineConfig({
28
28
  { text: 'Getting Started', link: '/getting-started' },
29
29
  { text: 'Markdown Features', link: '/markdown' },
30
30
  { text: 'Colors Schemes', link: '/colors' },
31
+ { text: 'Dark Mode', link: '/dark-mode' },
31
32
  { text: 'Styling', link: '/styling' },
32
33
  { text: 'Branding', link: '/branding' },
33
34
  {
@@ -1 +1,35 @@
1
1
  # CreditScroll
2
+
3
+ ## Description
4
+
5
+ The `CreditScroll` component creates a scrolling container similar to movie credits. Content placed inside will automatically scroll upward when the slide is entered. This component is used internally by the [`layout: credits`](/layouts/credits) layout, but can also be used standalone.
6
+
7
+ ## Props
8
+
9
+ - `speed` (optional) controls how fast the content scrolls. Default is `0.5`. Higher numbers scroll faster.
10
+ - `loop` (optional) whether the credits should loop back to the beginning after scrolling completes. Default is `false`.
11
+
12
+ ## Usage
13
+
14
+ The component uses a default slot for content.
15
+
16
+ ```vue
17
+ <CreditScroll speed="1.0" loop>
18
+ <div class="text-center">
19
+ <h2>Credits</h2>
20
+ <p>Person 1</p>
21
+ <p>Person 2</p>
22
+ </div>
23
+ </CreditScroll>
24
+ ```
25
+
26
+ ## Behavior
27
+
28
+ - Scrolling automatically starts when you navigate to the slide
29
+ - Scrolling resets when re-entering the slide
30
+ - If `loop` is `true`, the content will restart from the beginning after completing
31
+ - If `loop` is `false`, scrolling stops when the content has fully scrolled through
32
+
33
+ ## Note
34
+
35
+ For most use cases, it's easier to use the [`layout: credits`](/layouts/credits) layout which wraps this component and provides frontmatter options for `speed` and `loop`.
@@ -16,6 +16,7 @@ The `StickyNote` component is used to create a colored box with an title and con
16
16
  - `textAlign` (optional) the text alignment of the content. Default is `left`.
17
17
  - `custom` (optional) a custom CSS class to apply to the sticky note content. Default is empty.
18
18
  - `customTitle` (optional) a custom CSS class to apply to the sticky note title. Default is `block text-xs font-mono tracking-normal font-bold`.
19
+ - `devOnly` (optional) when set to `true`, the sticky note will only be visible in development mode and will be hidden in production builds and exports. This is useful for personal notes or reminders that shouldn't appear in the final presentation. Default is `false`.
19
20
 
20
21
  Example:
21
22
 
@@ -71,3 +72,18 @@ Another color:
71
72
 
72
73
  Hello, I'm a **sticky note**.
73
74
  </StickyNote>
75
+
76
+ ## Dev-Only Notes
77
+
78
+ Use the `devOnly` prop to create sticky notes that only appear during development. These are perfect for speaker notes, reminders, or TODOs that you don't want in your exported presentation:
79
+
80
+ ```vue
81
+ <StickyNote color="amber-light" width="180px" title="Note to self" devOnly>
82
+ Remember to add more examples here before the talk!
83
+ </StickyNote>
84
+ ```
85
+
86
+ When `devOnly` is set to `true`:
87
+
88
+ - The sticky note is visible when running `slidev dev`
89
+ - The sticky note is **hidden** when running `slidev build` or `slidev export`
@@ -0,0 +1,134 @@
1
+ # Dark Mode
2
+
3
+ Neversink supports Slidev's built-in dark mode feature, allowing your presentations to adapt to light and dark viewing preferences.
4
+
5
+ ## Enabling Dark Mode
6
+
7
+ To enable dark mode support in your presentation, set the `colorSchema` option in your first slide's frontmatter:
8
+
9
+ ```md
10
+ ---
11
+ theme: neversink
12
+ colorSchema: auto
13
+ ---
14
+ ```
15
+
16
+ ### Color Schema Options
17
+
18
+ | Value | Description |
19
+ |-------|-------------|
20
+ | `auto` | Automatically switches based on system preference (recommended) |
21
+ | `light` | Forces light mode only |
22
+ | `dark` | Forces dark mode only |
23
+
24
+ ## Toggling Dark Mode
25
+
26
+ When `colorSchema` is set to `auto` or when both modes are available, you can toggle between light and dark mode using:
27
+
28
+ - **Keyboard shortcut**: Press `d` to toggle dark mode
29
+ - **Navigation controls**: Click the dark mode toggle in Slidev's navigation panel
30
+ - **System preference**: The presentation will automatically follow your OS dark mode setting when using `auto`
31
+
32
+ ## How Color Schemes Work in Dark Mode
33
+
34
+ Neversink's [color schemes](/colors) automatically adapt when dark mode is enabled. Each scheme has been roughly designed to maintain readability and visual appeal in both modes. Suggested improvements are welcome!
35
+
36
+ For example, when you use a layout with `color: amber`:
37
+
38
+ ```md
39
+ ---
40
+ layout: top-title
41
+ color: amber
42
+ ---
43
+ ```
44
+
45
+ The amber colors will automatically adjust to appropriate dark mode variants when the user toggles dark mode.
46
+
47
+ ### CSS Variables in Dark Mode
48
+
49
+ The theme's CSS variables are redefined in dark mode to ensure proper contrast:
50
+
51
+ ```css
52
+ /* Light mode (default) */
53
+ --neversink-bg-color: /* light background */
54
+ --neversink-text-color: /* dark text */
55
+
56
+ /* Dark mode (html.dark) */
57
+ --neversink-bg-color: /* dark background */
58
+ --neversink-text-color: /* light text */
59
+ ```
60
+
61
+ ## Conditional Content with LightOrDark
62
+
63
+ Slidev provides a built-in `<LightOrDark>` component for showing different content based on the current mode:
64
+
65
+ ```vue
66
+ <LightOrDark>
67
+ <template #light>
68
+ <img src="/logo-light.png" />
69
+ </template>
70
+ <template #dark>
71
+ <img src="/logo-dark.png" />
72
+ </template>
73
+ </LightOrDark>
74
+ ```
75
+
76
+ This is useful for:
77
+
78
+ - Showing different logo versions
79
+ - Displaying images optimized for each mode
80
+ - Any content that needs to differ between modes
81
+
82
+ ## Images in Dark Mode
83
+
84
+ Some images designed for light backgrounds may look odd on dark backgrounds. You have several options:
85
+
86
+ ### 1. Use the `.invert` Class
87
+
88
+ Add the `invert` class to invert image colors in dark mode:
89
+
90
+ ```html
91
+ <img src="/diagram.png" class="invert" />
92
+ ```
93
+
94
+ ### 2. Use Conditional Images
95
+
96
+ Use the `<LightOrDark>` component to show different images:
97
+
98
+ ```vue
99
+ <LightOrDark>
100
+ <template #light>
101
+ <img src="/chart-light.png" />
102
+ </template>
103
+ <template #dark>
104
+ <img src="/chart-dark.png" />
105
+ </template>
106
+ </LightOrDark>
107
+ ```
108
+
109
+ ## Components in Dark Mode
110
+
111
+ All Neversink components (StickyNote, Admonition, SpeechBubble, etc.) automatically adapt to dark mode when using color schemes:
112
+
113
+ ```vue
114
+ <StickyNote color="amber-light" title="Note">
115
+ This sticky note will look great in both modes!
116
+ </StickyNote>
117
+ ```
118
+
119
+ ## Programmatic Dark Mode Access
120
+
121
+ For advanced use cases, you can access the dark mode state in Vue components:
122
+
123
+ ```vue
124
+ <script setup>
125
+ import { isDark, toggleDark } from '@slidev/client/logic/dark'
126
+ </script>
127
+
128
+ <template>
129
+ <button @click="toggleDark()">
130
+ {{ isDark ? 'Switch to Light' : 'Switch to Dark' }}
131
+ </button>
132
+ </template>
133
+ ```
134
+
@@ -24,6 +24,7 @@ If you are new to Slidev highly recommend you check out the [Slidev documentatio
24
24
 
25
25
  - [Markdown features](markdown.md) - special addons to the Slidev markdown syntax
26
26
  - [Color schemes](colors.md) - the color schemes available in Neversink
27
+ - [Dark mode](dark-mode.md) - how to enable and use dark mode in your presentations
27
28
  - [Branding](branding.md) - how to customize the theme to your brand/logos
28
29
  - [Styling](styling.md) - the custom CSS classes available in Neversink
29
30
  - [Custom layouts](layouts.md) - the custom slide layouts available in Neversink
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Description
4
4
 
5
- The `layout: credits` make a scrolling credits slide simliar to the end of a movive. The slide will automatically scroll the content up the screen. The actual logic for the scrolling is handled by the [CreditScroll component](/components/creditscroll).
5
+ The `layout: credits` makes a scrolling credits slide similar to the end of a movie. The slide will automatically scroll the content up the screen. The actual logic for the scrolling is handled by the [CreditScroll component](/components/creditscroll).
6
6
 
7
7
  ## Frontmatter
8
8
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/docs/styling.md CHANGED
@@ -58,7 +58,91 @@ If you want to make bullets a little closer together to make spaceadd the `class
58
58
  </div>
59
59
  ```
60
60
 
61
- Other options are `ns-c-tight` and `ns-c-supertight`.
61
+ Other options are `ns-c-verytight` and `ns-c-supertight`.
62
+
63
+ ## Slide Margins
64
+
65
+ Sometimes you need more space on a slide to fit extra content. Neversink provides two ways to reduce slide margins:
66
+
67
+ ### Frontmatter Option
68
+
69
+ Most layouts support a `margin` frontmatter option:
70
+
71
+ ```md
72
+ ---
73
+ layout: default
74
+ margin: tight
75
+ ---
76
+ ```
77
+
78
+ | Value | Description | Top Padding | Side Padding |
79
+ |-------|-------------|-------------|--------------|
80
+ | `normal` | Default margins (no change) | 1.8rem | default |
81
+ | `tight` | Reduced padding for more content space | 0.8rem | 1.5rem |
82
+ | `tighter` | Even smaller margins | 0.4rem | 1rem |
83
+ | `none` | Remove all padding | 0 | 0 |
84
+
85
+ This works with layouts: `default`, `full`, `section`, `top-title`, `top-title-two-cols`, `side-title`, and `two-cols-title`.
86
+
87
+ ### Visual Comparison
88
+
89
+ Here's how each margin setting affects slide content:
90
+
91
+ <div class="flex flex-wrap gap-4">
92
+ <div class="w-[48%]">
93
+
94
+ **`margin: normal`** (default)
95
+
96
+ <img src="/screenshots/39.png" alt="normal margins" class="screenshot" />
97
+
98
+ </div>
99
+ <div class="w-[48%]">
100
+
101
+ **`margin: tight`**
102
+
103
+ <img src="/screenshots/40.png" alt="tight margins" class="screenshot" />
104
+
105
+ </div>
106
+ <div class="w-[48%]">
107
+
108
+ **`margin: tighter`**
109
+
110
+ <img src="/screenshots/41.png" alt="tighter margins" class="screenshot" />
111
+
112
+ </div>
113
+ <div class="w-[48%]">
114
+
115
+ **`margin: none`**
116
+
117
+ <img src="/screenshots/42.png" alt="no margins" class="screenshot" />
118
+
119
+ </div>
120
+ </div>
121
+
122
+ ### CSS Classes
123
+
124
+ You can also apply margin classes directly to elements:
125
+
126
+ | Class | Effect |
127
+ |-------|--------|
128
+ | `ns-c-tight-margin` | Reduced padding (same as `margin: tight`) |
129
+ | `ns-c-tighter-margin` | Even smaller margins (same as `margin: tighter`) |
130
+ | `ns-c-no-margin` | Remove all padding (same as `margin: none`) |
131
+
132
+ Example using a class on a div:
133
+
134
+ ```html
135
+ <div class="ns-c-tight-margin">
136
+ Content with reduced margins
137
+ </div>
138
+ ```
139
+
140
+ ### When to Use Each Option
141
+
142
+ - **`normal`**: Most slides - good balance of whitespace and content
143
+ - **`tight`**: When you need a little extra room for one more bullet point or a slightly larger image
144
+ - **`tighter`**: For data-heavy slides, large tables, or detailed diagrams
145
+ - **`none`**: Full-bleed images, custom layouts, or when you need absolute control over positioning
62
146
 
63
147
  ## Centering content
64
148
 
package/example.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- colorSchema: light
2
+ colorSchema: auto
3
3
  layout: cover
4
4
  routerMode: hash
5
5
  title: Base Template
@@ -1238,6 +1238,30 @@ Hello, I'm also a **sticky note** but I'm customized with a title and a custom c
1238
1238
  </StickyNote>
1239
1239
  ```
1240
1240
 
1241
+ ---
1242
+ layout: default
1243
+ title: Dev-Only Sticky Notes
1244
+ ---
1245
+
1246
+ # Dev-Only Sticky Notes
1247
+
1248
+ <StickyNote color="rose-light" textAlign="left" width="200px" title="Dev Note" devOnly v-drag="[650,150,200,200]">
1249
+
1250
+ This note only appears in **dev mode**! It won't show in exports or production builds.
1251
+ </StickyNote>
1252
+
1253
+ Use the `devOnly` prop to create sticky notes that only appear during development. These are perfect for speaker notes, reminders, or TODOs that you don't want in your final presentation.
1254
+
1255
+ ```vue
1256
+ <StickyNote color="rose-light" title="Dev Note" devOnly>
1257
+ This note only appears in dev mode!
1258
+ </StickyNote>
1259
+ ```
1260
+
1261
+ When `devOnly` is set to `true`:
1262
+ - Visible when running `slidev dev`
1263
+ - Hidden when running `slidev build` or `slidev export`
1264
+
1241
1265
  ---
1242
1266
  layout: default
1243
1267
  title: Kawaii 1
@@ -1298,6 +1322,89 @@ Result:
1298
1322
 
1299
1323
 
1300
1324
 
1325
+ ---
1326
+ layout: default
1327
+ title: Slide Margins - Normal
1328
+ ---
1329
+
1330
+ # Slide Margins: `normal` (default)
1331
+
1332
+ Sometimes you need more space on a slide. Use the `margin` frontmatter option to control slide padding.
1333
+
1334
+ - This slide uses the default `margin: normal`
1335
+ - Notice the standard padding around the content
1336
+ - Good for most slides with typical content
1337
+
1338
+ ```yaml
1339
+ ---
1340
+ layout: default
1341
+ margin: normal # or just omit this line
1342
+ ---
1343
+ ```
1344
+
1345
+ ---
1346
+ layout: default
1347
+ margin: tight
1348
+ title: Slide Margins - Tight
1349
+ ---
1350
+
1351
+ # Slide Margins: `tight`
1352
+
1353
+ This slide uses `margin: tight` for reduced padding.
1354
+
1355
+ - More horizontal and vertical space for content
1356
+ - Useful when you need to fit more on a slide
1357
+ - Notice how the content extends closer to the edges
1358
+
1359
+ ```yaml
1360
+ ---
1361
+ layout: default
1362
+ margin: tight
1363
+ ---
1364
+ ```
1365
+
1366
+ ---
1367
+ layout: default
1368
+ margin: tighter
1369
+ title: Slide Margins - Tighter
1370
+ ---
1371
+
1372
+ # Slide Margins: `tighter`
1373
+
1374
+ This slide uses `margin: tighter` for even smaller margins.
1375
+
1376
+ - Maximum content space while still having some padding
1377
+ - Good for dense information or larger diagrams
1378
+ - Compare to the previous slides to see the difference
1379
+
1380
+ ```yaml
1381
+ ---
1382
+ layout: default
1383
+ margin: tighter
1384
+ ---
1385
+ ```
1386
+
1387
+ ---
1388
+ layout: default
1389
+ margin: none
1390
+ title: Slide Margins - None
1391
+ ---
1392
+
1393
+ # Slide Margins: `none`
1394
+
1395
+ This slide uses `margin: none` to remove all padding.
1396
+
1397
+ - Content goes edge-to-edge
1398
+ - Useful for full-bleed images or custom layouts
1399
+ - Be careful with readability near edges
1400
+
1401
+ ```yaml
1402
+ ---
1403
+ layout: default
1404
+ margin: none
1405
+ ---
1406
+ ```
1407
+
1301
1408
  ---
1302
1409
  layout: default
1303
1410
  title: Lines