@sp-days-framework/slidev-theme-sykehuspartner 1.1.1 → 1.1.3-beta1

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.
@@ -19,6 +19,75 @@ All packages within `@sp-days-framework` use the same version number. In some ca
19
19
 
20
20
  ---
21
21
 
22
+ ## Version 1.1.3-beta1 ![Beta](https://img.shields.io/badge/beta-prerelease-orange)
23
+
24
+ New column layout features, styling improvements, and bug fixes
25
+
26
+ <details>
27
+ <summary><strong>Details</strong> (2026 May 08)</summary>
28
+
29
+ ### Breaking Changes
30
+
31
+ - **Column layouts**: `two-cols` and `three-cols` (without `-header`) now use a named `::left::` slot instead of the default slot for left column content. Update existing slides to use `::left::` explicitly.
32
+
33
+ ### New Features
34
+
35
+ - **Column ratio**: `two-cols` and `two-cols-header` layouts now accept a `ratio` prop to control the left/right column split (e.g., `ratio: "70%"` gives 70% left, 30% right). Default remains `50%`.
36
+ - **Top/bottom slots**: All column layouts (`two-cols`, `two-cols-header`, `three-cols`, `three-cols-header`) now support `::top::`, `::top-center::`, `::bottom::`, and `::bottom-center::` slots for content above and below the columns.
37
+
38
+ ### Bug Fixes
39
+
40
+ - **Inline code dark mode**: Fixed inline code background not being visible when the theme is installed as a package (CSS property was being overridden by conflicting rules)
41
+ - **Inline code background opacity**: Fixed dark mode `--sp-code-background` being nearly invisible (`#01010213` → `#ffffff0f`)
42
+
43
+ ### Improvements
44
+
45
+ - **Inline code color**: Inline code now has a subtle yellow tint (`#e8d44d`) in dark mode for better distinction from regular text
46
+ - **Table headers**: Table headers (`th`) are now bold (`font-weight: 700`) and slightly larger (`font-size: 1.05em`) for better visual hierarchy
47
+ - **Dependencies**: Replaced deprecated `glob` package with Node.js built-in `fs.globSync` (requires Node.js >= 22.0.0)
48
+
49
+ ### Migration
50
+
51
+ **Column layout slot changes** — Update `two-cols` and `three-cols` slides to use named `::left::` slot:
52
+
53
+ ```markdown
54
+ # Before (v1.1.2)
55
+ ---
56
+ layout: two-cols
57
+ ---
58
+
59
+ # Left content here
60
+
61
+ ::right::
62
+
63
+ # Right content
64
+ ```
65
+
66
+ ```markdown
67
+ # After (v1.1.3)
68
+ ---
69
+ layout: two-cols
70
+ ---
71
+
72
+ ::left::
73
+
74
+ # Left content here
75
+
76
+ ::right::
77
+
78
+ # Right content
79
+ ```
80
+
81
+ </details>
82
+
83
+ ---
84
+
85
+ ## Version 1.1.2 ![Sync](https://img.shields.io/badge/sync-version--bump-lightgrey)
86
+
87
+ Version bump to match other packages in the framework
88
+
89
+ ---
90
+
22
91
  ## Version 1.1.1 ![Release](https://img.shields.io/badge/release-production-blue)
23
92
 
24
93
  Relative image path support and security updates
@@ -12,7 +12,20 @@ Three equal columns with a header spanning all three.
12
12
  | Parameter | Type | Default | Description |
13
13
  |-----------|------|---------|-------------|
14
14
  | `logo` | boolean | `true` | Show/hide logo |
15
- | `textAlignment` | string | `'center'` | Content vertical alignment |
15
+ | `textAlignment` | string | `'center'` | Content vertical alignment (`'top'`, `'center'`, `'bottom'`) |
16
+
17
+ ## Slots
18
+
19
+ | Slot | Description |
20
+ |------|-------------|
21
+ | default | Header content (spans full width, above columns) |
22
+ | `left` | Left column content |
23
+ | `middle` | Middle column content |
24
+ | `right` | Right column content |
25
+ | `top` | Left-aligned text above all columns (below header) |
26
+ | `top-center` | Center-aligned text above all columns (below header) |
27
+ | `bottom` | Left-aligned text below all columns |
28
+ | `bottom-center` | Center-aligned text below all columns |
16
29
 
17
30
  ## Basic Example
18
31
 
@@ -13,6 +13,18 @@ Organize content across three equal columns.
13
13
  |-----------|------|---------|-------------|
14
14
  | `logo` | boolean | `false` | Show/hide logo |
15
15
 
16
+ ## Slots
17
+
18
+ | Slot | Description |
19
+ |------|-------------|
20
+ | `left` | Left column content |
21
+ | `middle` | Middle column content |
22
+ | `right` | Right column content |
23
+ | `top` | Left-aligned text above all columns |
24
+ | `top-center` | Center-aligned text above all columns |
25
+ | `bottom` | Left-aligned text below all columns |
26
+ | `bottom-center` | Center-aligned text below all columns |
27
+
16
28
  ## Basic Example
17
29
 
18
30
  ```markdown
@@ -20,6 +32,8 @@ Organize content across three equal columns.
20
32
  layout: three-cols
21
33
  ---
22
34
 
35
+ ::left::
36
+
23
37
  # Development
24
38
 
25
39
  - Local Docker
@@ -45,3 +59,34 @@ layout: three-cols
45
59
  - Logging
46
60
  - Backups
47
61
  ```
62
+
63
+ ## Top & Bottom Slots Example
64
+
65
+ ```markdown
66
+ ---
67
+ layout: three-cols
68
+ ---
69
+
70
+ ::top-center::
71
+
72
+ Overview of all environments
73
+
74
+ ::left::
75
+
76
+ ## Dev
77
+ - Content here
78
+
79
+ ::middle::
80
+
81
+ ## Staging
82
+ - Content here
83
+
84
+ ::right::
85
+
86
+ ## Prod
87
+ - Content here
88
+
89
+ ::bottom::
90
+
91
+ All environments use the same base configuration.
92
+ ```
@@ -5,14 +5,27 @@ description: Two columns with spanning header
5
5
 
6
6
  # Two Cols Header Layout
7
7
 
8
- Two equal columns with a header that spans both columns.
8
+ Two columns with a header that spans both columns.
9
9
 
10
10
  ## Parameters
11
11
 
12
12
  | Parameter | Type | Default | Description |
13
13
  |-----------|------|---------|-------------|
14
14
  | `logo` | boolean | `true` | Show/hide logo |
15
- | `textAlignment` | string | `'center'` | Content vertical alignment |
15
+ | `textAlignment` | string | `'center'` | Content vertical alignment (`'top'`, `'center'`, `'bottom'`) |
16
+ | `ratio` | string | `'50%'` | Width of the left column (e.g., `'70%'` gives 70% left, 30% right) |
17
+
18
+ ## Slots
19
+
20
+ | Slot | Description |
21
+ |------|-------------|
22
+ | default | Header content (spans full width, above columns) |
23
+ | `left` | Left column content |
24
+ | `right` | Right column content |
25
+ | `top` | Left-aligned text above both columns (below header) |
26
+ | `top-center` | Center-aligned text above both columns (below header) |
27
+ | `bottom` | Left-aligned text below both columns |
28
+ | `bottom-center` | Center-aligned text below both columns |
16
29
 
17
30
  ## Basic Example
18
31
 
@@ -41,3 +54,26 @@ layout: two-cols-header
41
54
  - Zero-downtime deploy
42
55
  - Easy rollback
43
56
  ```
57
+
58
+ ## Custom Ratio Example
59
+
60
+ ```markdown
61
+ ---
62
+ layout: two-cols-header
63
+ ratio: "30%"
64
+ ---
65
+
66
+ # Sidebar Layout
67
+
68
+ ::left::
69
+
70
+ ## Navigation
71
+ - Item 1
72
+ - Item 2
73
+
74
+ ::right::
75
+
76
+ ## Main Content (70%)
77
+
78
+ The right column gets the remaining space.
79
+ ```
@@ -5,13 +5,25 @@ description: Two equal-width columns
5
5
 
6
6
  # Two Cols Layout
7
7
 
8
- Split content into two equal columns for comparisons, lists, or parallel information.
8
+ Split content into two columns for comparisons, lists, or parallel information.
9
9
 
10
10
  ## Parameters
11
11
 
12
12
  | Parameter | Type | Default | Description |
13
13
  |-----------|------|---------|-------------|
14
14
  | `logo` | boolean | `false` | Show/hide logo |
15
+ | `ratio` | string | `'50%'` | Width of the left column (e.g., `'70%'` gives 70% left, 30% right) |
16
+
17
+ ## Slots
18
+
19
+ | Slot | Description |
20
+ |------|-------------|
21
+ | `left` | Left column content |
22
+ | `right` | Right column content |
23
+ | `top` | Left-aligned text above both columns |
24
+ | `top-center` | Center-aligned text above both columns |
25
+ | `bottom` | Left-aligned text below both columns |
26
+ | `bottom-center` | Center-aligned text below both columns |
15
27
 
16
28
  ## Basic Example
17
29
 
@@ -20,6 +32,8 @@ Split content into two equal columns for comparisons, lists, or parallel informa
20
32
  layout: two-cols
21
33
  ---
22
34
 
35
+ ::left::
36
+
23
37
  # Traditional VMs
24
38
 
25
39
  - Heavy resource usage
@@ -36,3 +50,50 @@ layout: two-cols
36
50
  - Shared OS kernel
37
51
  - Simple orchestration
38
52
  ```
53
+
54
+ ## Custom Ratio Example
55
+
56
+ ```markdown
57
+ ---
58
+ layout: two-cols
59
+ ratio: "70%"
60
+ ---
61
+
62
+ ::left::
63
+
64
+ # Main Content (70%)
65
+
66
+ This column takes up 70% of the width.
67
+
68
+ ::right::
69
+
70
+ # Sidebar (30%)
71
+
72
+ - Quick notes
73
+ ```
74
+
75
+ ## Top & Bottom Slots Example
76
+
77
+ ```markdown
78
+ ---
79
+ layout: two-cols
80
+ ---
81
+
82
+ ::top::
83
+
84
+ This text appears above both columns, left-aligned.
85
+
86
+ ::left::
87
+
88
+ ## Left Column
89
+ - Content here
90
+
91
+ ::right::
92
+
93
+ ## Right Column
94
+ - Content here
95
+
96
+ ::bottom-center::
97
+
98
+ This centered text appears below both columns.
99
+ ```
@@ -6,6 +6,10 @@
6
6
  <div class="header">
7
7
  <slot />
8
8
  </div>
9
+ <div v-if="$slots.top || $slots['top-center']" class="top-section" :class="{ 'text-center': $slots['top-center'] && !$slots.top }">
10
+ <slot name="top" />
11
+ <slot name="top-center" />
12
+ </div>
9
13
  <div class="cols-container">
10
14
  <div class="col left">
11
15
  <slot name="left" />
@@ -17,6 +21,10 @@
17
21
  <slot name="right" />
18
22
  </div>
19
23
  </div>
24
+ <div v-if="$slots.bottom || $slots['bottom-center']" class="bottom-section" :class="{ 'text-center': $slots['bottom-center'] && !$slots.bottom }">
25
+ <slot name="bottom" />
26
+ <slot name="bottom-center" />
27
+ </div>
20
28
  </div>
21
29
  </template>
22
30
 
@@ -66,6 +74,14 @@ const contentAlignmentStyle = computed(() => {
66
74
  margin-bottom: 1rem;
67
75
  }
68
76
 
77
+ .top-section {
78
+ margin-bottom: 1rem;
79
+ }
80
+
81
+ .bottom-section {
82
+ margin-top: 1rem;
83
+ }
84
+
69
85
  .cols-container {
70
86
  display: flex;
71
87
  flex-grow: 1;
@@ -98,6 +114,4 @@ const contentAlignmentStyle = computed(() => {
98
114
  right: 1rem;
99
115
  z-index: 10;
100
116
  }
101
-
102
- /* Logo styling moved to global layout.css */
103
117
  </style>
@@ -3,9 +3,13 @@
3
3
  <div v-if="showLogo" class="logo-container">
4
4
  <div class="logo-image logo"></div>
5
5
  </div>
6
+ <div v-if="$slots.top || $slots['top-center']" class="top-section" :class="{ 'text-center': $slots['top-center'] && !$slots.top }">
7
+ <slot name="top" />
8
+ <slot name="top-center" />
9
+ </div>
6
10
  <div class="cols-container">
7
11
  <div class="col left">
8
- <slot />
12
+ <slot name="left" />
9
13
  </div>
10
14
  <div class="col middle">
11
15
  <slot name="middle" />
@@ -14,6 +18,10 @@
14
18
  <slot name="right" />
15
19
  </div>
16
20
  </div>
21
+ <div v-if="$slots.bottom || $slots['bottom-center']" class="bottom-section" :class="{ 'text-center': $slots['bottom-center'] && !$slots.bottom }">
22
+ <slot name="bottom" />
23
+ <slot name="bottom-center" />
24
+ </div>
17
25
  </div>
18
26
  </template>
19
27
 
@@ -41,6 +49,14 @@ const showLogo = computed(() => {
41
49
  flex-direction: column;
42
50
  }
43
51
 
52
+ .top-section {
53
+ margin-bottom: 1rem;
54
+ }
55
+
56
+ .bottom-section {
57
+ margin-top: 1rem;
58
+ }
59
+
44
60
  .cols-container {
45
61
  display: flex;
46
62
  flex-grow: 1;
@@ -72,6 +88,4 @@ const showLogo = computed(() => {
72
88
  right: 1rem;
73
89
  z-index: 10;
74
90
  }
75
-
76
- /* Logo styling moved to global layout.css */
77
91
  </style>
@@ -6,14 +6,22 @@
6
6
  <div class="header">
7
7
  <slot />
8
8
  </div>
9
+ <div v-if="$slots.top || $slots['top-center']" class="top-section" :class="{ 'text-center': $slots['top-center'] && !$slots.top }">
10
+ <slot name="top" />
11
+ <slot name="top-center" />
12
+ </div>
9
13
  <div class="cols-container">
10
- <div class="col left">
14
+ <div class="col left" :style="{ width: leftWidth }">
11
15
  <slot name="left" />
12
16
  </div>
13
- <div class="col right">
17
+ <div class="col right" :style="{ width: rightWidth }">
14
18
  <slot name="right" />
15
19
  </div>
16
20
  </div>
21
+ <div v-if="$slots.bottom || $slots['bottom-center']" class="bottom-section" :class="{ 'text-center': $slots['bottom-center'] && !$slots.bottom }">
22
+ <slot name="bottom" />
23
+ <slot name="bottom-center" />
24
+ </div>
17
25
  </div>
18
26
  </template>
19
27
 
@@ -29,6 +37,10 @@ const props = defineProps({
29
37
  type: String,
30
38
  default: 'center',
31
39
  validator: (value) => ['top', 'center', 'bottom'].includes(value)
40
+ },
41
+ ratio: {
42
+ type: String,
43
+ default: '50%'
32
44
  }
33
45
  })
34
46
 
@@ -51,6 +63,16 @@ const contentAlignmentStyle = computed(() => {
51
63
  return 'center'
52
64
  }
53
65
  })
66
+
67
+ const leftWidth = computed(() => {
68
+ const r = props.ratio.endsWith('%') ? props.ratio : `${parseFloat(props.ratio)}%`
69
+ return r
70
+ })
71
+
72
+ const rightWidth = computed(() => {
73
+ const left = parseFloat(leftWidth.value)
74
+ return `${100 - left}%`
75
+ })
54
76
  </script>
55
77
 
56
78
  <style scoped>
@@ -69,6 +91,14 @@ const contentAlignmentStyle = computed(() => {
69
91
  margin-bottom: 0.5rem;
70
92
  }
71
93
 
94
+ .top-section {
95
+ margin-bottom: 1rem;
96
+ }
97
+
98
+ .bottom-section {
99
+ margin-top: 1rem;
100
+ }
101
+
72
102
  .cols-container {
73
103
  display: flex;
74
104
  flex-grow: 1;
@@ -78,7 +108,6 @@ const contentAlignmentStyle = computed(() => {
78
108
  .col {
79
109
  display: flex;
80
110
  flex-direction: column;
81
- width: 50%;
82
111
  justify-content: v-bind(contentAlignmentStyle);
83
112
  }
84
113
 
@@ -96,6 +125,4 @@ const contentAlignmentStyle = computed(() => {
96
125
  right: 1rem;
97
126
  z-index: 10;
98
127
  }
99
-
100
- /* Logo styling moved to global layout.css */
101
128
  </style>
@@ -3,14 +3,22 @@
3
3
  <div v-if="showLogo" class="logo-container">
4
4
  <div class="logo-image logo"></div>
5
5
  </div>
6
+ <div v-if="$slots.top || $slots['top-center']" class="top-section" :class="{ 'text-center': $slots['top-center'] && !$slots.top }">
7
+ <slot name="top" />
8
+ <slot name="top-center" />
9
+ </div>
6
10
  <div class="cols-container">
7
- <div class="col left">
8
- <slot />
11
+ <div class="col left" :style="{ width: leftWidth }">
12
+ <slot name="left" />
9
13
  </div>
10
- <div class="col right">
14
+ <div class="col right" :style="{ width: rightWidth }">
11
15
  <slot name="right" />
12
16
  </div>
13
17
  </div>
18
+ <div v-if="$slots.bottom || $slots['bottom-center']" class="bottom-section" :class="{ 'text-center': $slots['bottom-center'] && !$slots.bottom }">
19
+ <slot name="bottom" />
20
+ <slot name="bottom-center" />
21
+ </div>
14
22
  </div>
15
23
  </template>
16
24
 
@@ -21,6 +29,10 @@ const props = defineProps({
21
29
  logo: {
22
30
  type: Boolean,
23
31
  default: false
32
+ },
33
+ ratio: {
34
+ type: String,
35
+ default: '50%'
24
36
  }
25
37
  })
26
38
 
@@ -30,6 +42,16 @@ const showLogo = computed(() => {
30
42
  }
31
43
  return props.logo
32
44
  })
45
+
46
+ const leftWidth = computed(() => {
47
+ const r = props.ratio.endsWith('%') ? props.ratio : `${parseFloat(props.ratio)}%`
48
+ return r
49
+ })
50
+
51
+ const rightWidth = computed(() => {
52
+ const left = parseFloat(leftWidth.value)
53
+ return `${100 - left}%`
54
+ })
33
55
  </script>
34
56
 
35
57
  <style scoped>
@@ -38,6 +60,14 @@ const showLogo = computed(() => {
38
60
  flex-direction: column;
39
61
  }
40
62
 
63
+ .top-section {
64
+ margin-bottom: 1rem;
65
+ }
66
+
67
+ .bottom-section {
68
+ margin-top: 1rem;
69
+ }
70
+
41
71
  .cols-container {
42
72
  display: flex;
43
73
  flex-grow: 1;
@@ -47,7 +77,6 @@ const showLogo = computed(() => {
47
77
  .col {
48
78
  display: flex;
49
79
  flex-direction: column;
50
- width: 50%;
51
80
  }
52
81
 
53
82
  .left {
@@ -64,6 +93,4 @@ const showLogo = computed(() => {
64
93
  right: 1rem;
65
94
  z-index: 10;
66
95
  }
67
-
68
- /* Logo styling moved to global layout.css */
69
96
  </style>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sp-days-framework/slidev-theme-sykehuspartner",
3
- "version": "1.1.1",
3
+ "version": "1.1.3-beta1",
4
4
  "description": "A Slidev theme for Sykehuspartner presentations.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -19,7 +19,7 @@
19
19
  "./publish-package-docs": "./publish-package-docs.js"
20
20
  },
21
21
  "engines": {
22
- "node": ">=18.0.0"
22
+ "node": ">=22.0.0"
23
23
  },
24
24
  "scripts": {
25
25
  "slidev": "slidev",
@@ -28,9 +28,7 @@
28
28
  "export": "slidev export example.md",
29
29
  "screenshot": "slidev export example.md --format png"
30
30
  },
31
- "dependencies": {
32
- "glob": "^11.1.0"
33
- },
31
+ "dependencies": {},
34
32
  "devDependencies": {
35
33
  "@iconify-json/vscode-icons": "^1.2.36",
36
34
  "@slidev/cli": "^52.9.1",
@@ -43,7 +41,7 @@
43
41
  },
44
42
  "overrides": {
45
43
  "dompurify": "^3.2.4",
46
- "lodash-es": ">=4.17.23",
44
+ "lodash-es": ">=4.18.1",
47
45
  "chevrotain": ">=11.1.1"
48
46
  },
49
47
  "files": [
package/styles/layout.css CHANGED
@@ -7,7 +7,7 @@
7
7
  --sp-danger: #fa383e;
8
8
  --sp-background: #f7faff;
9
9
  --sp-shadow: #00000028;
10
- --sp-code-background: #53535309;
10
+ --sp-code-background: #2525250a;
11
11
 
12
12
  /* Primary color variations (light) */
13
13
  --sp-primary-dark: #023977;
@@ -29,7 +29,7 @@
29
29
  --sp-danger: #ff6369;
30
30
  --sp-background: #0d1117;
31
31
  --sp-shadow: #ffffff28;
32
- --sp-code-background: #01010213;
32
+ --sp-code-background: #cfcfcf0f;
33
33
 
34
34
  /* Primary color variations inverted (dark) */
35
35
  --sp-primary-light: #5ea4e1;
@@ -40,6 +40,15 @@
40
40
  --sp-primary-darkest: #c1dcf4;
41
41
  }
42
42
 
43
+ .slidev-layout :not(pre) > code {
44
+ color: #272200;
45
+ }
46
+
47
+ /* Dark mode inline code font color */
48
+ .dark .slidev-layout :not(pre) > code {
49
+ color: #f0e38f;
50
+ }
51
+
43
52
  /* Default styling for all layouts */
44
53
  .slidev-layout {
45
54
  h1 {
@@ -65,7 +74,17 @@
65
74
  position: relative;
66
75
 
67
76
  :not(pre) > code {
68
- background: var(--sp-code-background);
77
+ background: var(--sp-code-background) !important;
78
+ border-radius: var(--slidev-code-radius) !important;
79
+ padding-top: 0.06rem !important;
80
+ padding-bottom: 0.06rem !important;
81
+ padding-left: 0.375rem !important;
82
+ padding-right: 0.375rem !important;
83
+ }
84
+
85
+ th {
86
+ font-weight: 700;
87
+ font-size: 1.05em;
69
88
  }
70
89
 
71
90
  /* blockquote {
package/uno.config.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { defineConfig } from 'unocss'
2
2
  import fs from 'fs'
3
3
  import path from 'path'
4
- import { globSync } from 'glob'
5
4
 
6
5
  /**
7
6
  * Scans markdown files for VSCode icon patterns used in code blocks.
@@ -75,12 +74,10 @@ function scanFilesForIcons(): string[] {
75
74
  if (!fs.existsSync(searchRoot)) continue
76
75
 
77
76
  // Find all markdown files, excluding node_modules but INCLUDE .docusaurus
78
- const slideFiles = globSync('**/*.md', {
79
- absolute: true,
77
+ const slideFiles = fs.globSync('**/*.md', {
80
78
  cwd: searchRoot,
81
- ignore: ['**/node_modules/**', '**/dist/**', '**/build/**'],
82
- dot: true
83
- })
79
+ exclude: (name) => name === 'node_modules' || name === 'dist' || name === 'build'
80
+ }).map((f: string) => path.resolve(searchRoot, f))
84
81
 
85
82
  // Scan each file for icon patterns
86
83
  slideFiles.forEach((file: string) => {