slidev-theme-measurelab 0.1.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.
Files changed (36) hide show
  1. package/README.md +132 -0
  2. package/global.css +646 -0
  3. package/layouts/cover.vue +154 -0
  4. package/layouts/default.vue +254 -0
  5. package/layouts/full-image.vue +167 -0
  6. package/layouts/quote.vue +267 -0
  7. package/layouts/section-1.vue +217 -0
  8. package/layouts/section-2.vue +217 -0
  9. package/layouts/section-3.vue +217 -0
  10. package/layouts/three-cols.vue +291 -0
  11. package/layouts/two-cols-pic.vue +276 -0
  12. package/layouts/two-cols.vue +275 -0
  13. package/package.json +54 -0
  14. package/public/background-header-circles.svg +69 -0
  15. package/public/background-illustration.svg +1 -0
  16. package/public/background-image-half.svg +52 -0
  17. package/public/contact-background.svg +80 -0
  18. package/public/contact-grid-background-flipped.svg +53 -0
  19. package/public/contact-grid-background.svg +53 -0
  20. package/public/cta-background.svg +69 -0
  21. package/public/footer-background-illustration.svg +1 -0
  22. package/public/gmpcertified.png +0 -0
  23. package/public/google-cloud-partner.png +0 -0
  24. package/public/home-hero-background.svg +63 -0
  25. package/public/home-hero.svg +79 -0
  26. package/public/marketing-analytics-services-specialization.png +0 -0
  27. package/public/measurelab-dark-logo.svg +19 -0
  28. package/public/measurelab_favicon.svg +1 -0
  29. package/public/measurelab_logo.svg +1 -0
  30. package/public/services-analytics-bg.svg +101 -0
  31. package/public/services-hero-background.svg +39 -0
  32. package/public/services-hero.svg +76 -0
  33. package/public/technology-background.svg +71 -0
  34. package/setup/unocss.ts +68 -0
  35. package/styles/base.css +209 -0
  36. package/styles/index.ts +1 -0
@@ -0,0 +1,154 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+
4
+ const props = defineProps<{
5
+ class?: string
6
+ }>()
7
+
8
+ const isDark = computed(() => {
9
+ return props.class?.includes('dark')
10
+ })
11
+ </script>
12
+
13
+ <template>
14
+ <div
15
+ class="slidev-layout cover"
16
+ :class="[$props.class, { 'is-dark': isDark }]"
17
+ >
18
+ <!-- Background decorations -->
19
+ <div class="cover-bg">
20
+ <img src="/home-hero-background.svg" alt="" class="bg-pattern" />
21
+ </div>
22
+
23
+ <!-- Content -->
24
+ <div class="cover-content">
25
+ <div class="cover-logo">
26
+ <img
27
+ v-show="!isDark"
28
+ src="/measurelab_logo.svg"
29
+ alt="Measurelab"
30
+ />
31
+ <img
32
+ v-show="isDark"
33
+ src="/measurelab-dark-logo.svg"
34
+ alt="Measurelab"
35
+ />
36
+ </div>
37
+
38
+ <div class="cover-text">
39
+ <slot />
40
+ </div>
41
+ </div>
42
+
43
+ <!-- Hero graphic at bottom -->
44
+ <div class="cover-hero">
45
+ <img src="/home-hero.svg" alt="" />
46
+ </div>
47
+ </div>
48
+ </template>
49
+
50
+ <style scoped>
51
+ .cover {
52
+ display: flex;
53
+ flex-direction: column;
54
+ align-items: center;
55
+ justify-content: center;
56
+ height: 100%;
57
+ position: relative;
58
+ overflow: hidden;
59
+ background: #ffffff;
60
+ color: #081f30;
61
+ }
62
+
63
+ .cover.is-dark {
64
+ background: #081f30;
65
+ color: #f9f9f9;
66
+ }
67
+
68
+ /* Background pattern */
69
+ .cover-bg {
70
+ position: absolute;
71
+ inset: 0;
72
+ pointer-events: none;
73
+ }
74
+
75
+ .bg-pattern {
76
+ width: 100%;
77
+ height: auto;
78
+ position: absolute;
79
+ top: 0;
80
+ left: 0;
81
+ }
82
+
83
+ .cover.is-dark .bg-pattern {
84
+ opacity: 0.2;
85
+ filter: invert(1);
86
+ }
87
+
88
+ /* Content */
89
+ .cover-content {
90
+ position: relative;
91
+ z-index: 10;
92
+ display: flex;
93
+ flex-direction: column;
94
+ align-items: center;
95
+ justify-content: center;
96
+ text-align: center;
97
+ gap: 2.5rem;
98
+ padding: 3rem;
99
+ margin-bottom: 4rem;
100
+ transform: translateY(-25px);
101
+ }
102
+
103
+ .cover-logo {
104
+ height: 1.8rem;
105
+ transform: translateY(-25px);
106
+ }
107
+
108
+ .cover-logo img {
109
+ height: 100%;
110
+ width: auto;
111
+ }
112
+
113
+ .cover-text {
114
+ display: flex;
115
+ flex-direction: column;
116
+ align-items: center;
117
+ gap: 1rem;
118
+ }
119
+
120
+ .cover-text :deep(h1) {
121
+ font-size: 3rem;
122
+ font-weight: 600;
123
+ line-height: 1.2;
124
+ margin: 0;
125
+ color: inherit;
126
+ }
127
+
128
+ .cover-text :deep(p) {
129
+ font-size: 1.25rem;
130
+ margin: 0;
131
+ color: inherit;
132
+ opacity: 0.8;
133
+ }
134
+
135
+ /* Hero graphic at bottom */
136
+ .cover-hero {
137
+ position: absolute;
138
+ bottom: 0;
139
+ left: 0;
140
+ right: 0;
141
+ pointer-events: none;
142
+ z-index: 5;
143
+ }
144
+
145
+ .cover-hero img {
146
+ width: 100%;
147
+ height: auto;
148
+ display: block;
149
+ }
150
+
151
+ .cover.is-dark .cover-hero {
152
+ opacity: 0.3;
153
+ }
154
+ </style>
@@ -0,0 +1,254 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+
4
+ const props = defineProps<{
5
+ section?: string
6
+ heading?: string
7
+ class?: string
8
+ }>()
9
+
10
+ const isDark = computed(() => {
11
+ return props.class?.includes('dark')
12
+ })
13
+ </script>
14
+
15
+ <template>
16
+ <div
17
+ class="slidev-layout default"
18
+ :class="[$props.class, { 'is-dark': isDark }]"
19
+ >
20
+ <!-- Grid background -->
21
+ <div class="grid-bg">
22
+ <img src="/contact-grid-background.svg" alt="" />
23
+ </div>
24
+
25
+ <!-- Header -->
26
+ <div class="slide-header">
27
+ <span v-if="section" class="section-label">{{ section }}</span>
28
+ <span v-else class="section-label"></span>
29
+ <div class="header-logo">
30
+ <img
31
+ v-show="!isDark"
32
+ src="/measurelab_logo.svg"
33
+ alt="Measurelab"
34
+ class="logo-light"
35
+ />
36
+ <img
37
+ v-show="isDark"
38
+ src="/measurelab-dark-logo.svg"
39
+ alt="Measurelab"
40
+ class="logo-dark"
41
+ />
42
+ </div>
43
+ </div>
44
+
45
+ <!-- Title -->
46
+ <h1 v-if="heading" class="slide-title">{{ heading }}</h1>
47
+
48
+ <!-- Content -->
49
+ <div class="slide-content">
50
+ <slot />
51
+ </div>
52
+
53
+ <!-- Footer -->
54
+ <div class="slide-footer">
55
+ <div class="footer-left">
56
+ <span class="copyright">© <strong>Measurelab</strong></span>
57
+ <span class="confidential">All rights reserved. Company confidential.</span>
58
+ </div>
59
+ <div class="footer-right">
60
+ <span class="page-number">{{ $slidev?.nav.currentPage }}</span>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ </template>
65
+
66
+ <style scoped>
67
+ .default {
68
+ display: flex;
69
+ flex-direction: column;
70
+ height: 100%;
71
+ position: relative;
72
+ background: #ffffff;
73
+ color: #081f30;
74
+ overflow: hidden;
75
+ }
76
+
77
+ .default.is-dark {
78
+ background: #081f30;
79
+ color: #f9f9f9;
80
+ }
81
+
82
+ /* Grid background - sits above footer, full width */
83
+ .grid-bg {
84
+ position: absolute;
85
+ top: 0;
86
+ left: 0;
87
+ right: 0;
88
+ bottom: 3rem;
89
+ pointer-events: none;
90
+ }
91
+
92
+ .grid-bg img {
93
+ width: 100%;
94
+ height: auto;
95
+ position: absolute;
96
+ bottom: 0;
97
+ left: 0;
98
+ }
99
+
100
+ .default.is-dark .grid-bg {
101
+ opacity: 0.3;
102
+ }
103
+
104
+ /* Header */
105
+ .slide-header {
106
+ display: flex;
107
+ justify-content: space-between;
108
+ align-items: flex-start;
109
+ padding: 1.5rem 2.5rem;
110
+ position: relative;
111
+ z-index: 10;
112
+ }
113
+
114
+ .section-label {
115
+ font-size: 0.75rem;
116
+ font-weight: 400;
117
+ color: inherit;
118
+ }
119
+
120
+ .header-logo {
121
+ height: 1.25rem;
122
+ }
123
+
124
+ .header-logo img {
125
+ height: 100%;
126
+ width: auto;
127
+ }
128
+
129
+ /* Title */
130
+ .slide-title {
131
+ font-size: 2rem;
132
+ font-weight: 600;
133
+ line-height: 1.2;
134
+ margin: 20px 0 1.5rem 0;
135
+ padding: 0 2.5rem;
136
+ color: inherit;
137
+ position: relative;
138
+ z-index: 10;
139
+ }
140
+
141
+ /* Content */
142
+ .slide-content {
143
+ flex: 1;
144
+ padding: 0 2.5rem;
145
+ position: relative;
146
+ z-index: 10;
147
+ display: flex;
148
+ flex-direction: column;
149
+ gap: 0.25rem;
150
+ color: inherit;
151
+ }
152
+
153
+ .slide-content :deep(h1) {
154
+ font-size: 2rem;
155
+ font-weight: 600;
156
+ line-height: 1.2;
157
+ margin: 0 0 1rem 0;
158
+ color: inherit;
159
+ }
160
+
161
+ .slide-content :deep(h2) {
162
+ font-size: 1.35rem;
163
+ font-weight: 500;
164
+ line-height: 1.3;
165
+ margin: 1rem 0 0.125rem 0;
166
+ color: inherit;
167
+ }
168
+
169
+ .slide-content :deep(h3) {
170
+ font-size: 1.125rem;
171
+ font-weight: 500;
172
+ line-height: 1.3;
173
+ margin: 0.75rem 0 0.125rem 0;
174
+ color: inherit;
175
+ }
176
+
177
+ .slide-content :deep(h4) {
178
+ font-size: 1rem;
179
+ font-weight: 500;
180
+ line-height: 1.3;
181
+ margin: 0.5rem 0 0.125rem 0;
182
+ color: inherit;
183
+ }
184
+
185
+ .slide-content :deep(p) {
186
+ font-size: 1.125rem;
187
+ line-height: 1.6;
188
+ margin: 0;
189
+ color: inherit;
190
+ }
191
+
192
+ .slide-content :deep(ul) {
193
+ margin: 0;
194
+ padding-left: 1.5rem;
195
+ list-style: disc;
196
+ }
197
+
198
+ .slide-content :deep(ol) {
199
+ margin: 0;
200
+ padding-left: 1.5rem;
201
+ list-style: decimal;
202
+ }
203
+
204
+ .slide-content :deep(ol li::marker) {
205
+ color: #6dd750;
206
+ }
207
+
208
+ .slide-content :deep(li) {
209
+ font-size: 1.125rem;
210
+ line-height: 1.6;
211
+ margin: 0.5rem 0;
212
+ color: inherit;
213
+ }
214
+
215
+ .slide-content :deep(li::marker) {
216
+ color: #6dd750;
217
+ }
218
+
219
+ .slide-content :deep(blockquote) {
220
+ border-left: 4px solid #6dd750;
221
+ padding-left: 1rem;
222
+ margin: 1rem 0;
223
+ font-style: italic;
224
+ color: inherit;
225
+ opacity: 0.8;
226
+ }
227
+
228
+ /* Footer */
229
+ .slide-footer {
230
+ display: flex;
231
+ justify-content: space-between;
232
+ align-items: center;
233
+ padding: 1rem 2.5rem;
234
+ position: relative;
235
+ z-index: 10;
236
+ color: inherit;
237
+ }
238
+
239
+ .footer-left {
240
+ display: flex;
241
+ gap: 1rem;
242
+ font-size: 0.75rem;
243
+ color: inherit;
244
+ }
245
+
246
+ .footer-left strong {
247
+ font-weight: 500;
248
+ }
249
+
250
+ .footer-right {
251
+ font-size: 0.75rem;
252
+ color: inherit;
253
+ }
254
+ </style>
@@ -0,0 +1,167 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+
4
+ const props = defineProps<{
5
+ section?: string
6
+ caption?: string
7
+ class?: string
8
+ }>()
9
+
10
+ const isDark = computed(() => {
11
+ return props.class?.includes('dark')
12
+ })
13
+ </script>
14
+
15
+ <template>
16
+ <div
17
+ class="slidev-layout full-image"
18
+ :class="[$props.class, { 'is-dark': isDark }]"
19
+ >
20
+ <!-- Header -->
21
+ <div class="slide-header">
22
+ <span v-if="section" class="section-label">{{ section }}</span>
23
+ <span v-else class="section-label"></span>
24
+ <div class="header-logo">
25
+ <img
26
+ v-show="!isDark"
27
+ src="/measurelab_logo.svg"
28
+ alt="Measurelab"
29
+ />
30
+ <img
31
+ v-show="isDark"
32
+ src="/measurelab-dark-logo.svg"
33
+ alt="Measurelab"
34
+ />
35
+ </div>
36
+ </div>
37
+
38
+ <!-- Image area -->
39
+ <div class="image-area">
40
+ <slot />
41
+ </div>
42
+
43
+ <!-- Caption -->
44
+ <div v-if="caption" class="image-caption">
45
+ {{ caption }}
46
+ </div>
47
+
48
+ <!-- Footer -->
49
+ <div class="slide-footer">
50
+ <div class="footer-left">
51
+ <span class="copyright">© <strong>Measurelab</strong></span>
52
+ <span class="confidential">All rights reserved. Company confidential.</span>
53
+ </div>
54
+ <div class="footer-right">
55
+ <span class="page-number">{{ $slidev?.nav.currentPage }}</span>
56
+ </div>
57
+ </div>
58
+ </div>
59
+ </template>
60
+
61
+ <style scoped>
62
+ .full-image {
63
+ display: flex;
64
+ flex-direction: column;
65
+ height: 100%;
66
+ position: relative;
67
+ background: #ffffff;
68
+ color: #081f30;
69
+ overflow: hidden;
70
+ }
71
+
72
+ .full-image.is-dark {
73
+ background: #081f30;
74
+ color: #f9f9f9;
75
+ }
76
+
77
+ /* Header */
78
+ .slide-header {
79
+ display: flex;
80
+ justify-content: space-between;
81
+ align-items: flex-start;
82
+ padding: 1.5rem 2.5rem;
83
+ position: relative;
84
+ z-index: 10;
85
+ }
86
+
87
+ .section-label {
88
+ font-size: 0.75rem;
89
+ font-weight: 400;
90
+ color: inherit;
91
+ }
92
+
93
+ .header-logo {
94
+ height: 1.25rem;
95
+ }
96
+
97
+ .header-logo img {
98
+ height: 100%;
99
+ width: auto;
100
+ }
101
+
102
+ /* Image area */
103
+ .image-area {
104
+ flex: 1;
105
+ display: flex;
106
+ align-items: center;
107
+ justify-content: center;
108
+ padding: 0 2.5rem;
109
+ position: relative;
110
+ z-index: 10;
111
+ }
112
+
113
+ .image-area :deep(img) {
114
+ max-width: 100%;
115
+ max-height: 100%;
116
+ object-fit: contain;
117
+ border-radius: 0.5rem;
118
+ }
119
+
120
+ .image-area :deep(p) {
121
+ margin: 0;
122
+ display: flex;
123
+ align-items: center;
124
+ justify-content: center;
125
+ width: 100%;
126
+ height: 100%;
127
+ }
128
+
129
+ /* Caption */
130
+ .image-caption {
131
+ padding: 0.75rem 2.5rem;
132
+ font-size: 0.875rem;
133
+ font-style: italic;
134
+ text-align: center;
135
+ color: inherit;
136
+ opacity: 0.8;
137
+ position: relative;
138
+ z-index: 10;
139
+ }
140
+
141
+ /* Footer */
142
+ .slide-footer {
143
+ display: flex;
144
+ justify-content: space-between;
145
+ align-items: center;
146
+ padding: 1rem 2.5rem;
147
+ position: relative;
148
+ z-index: 10;
149
+ color: inherit;
150
+ }
151
+
152
+ .footer-left {
153
+ display: flex;
154
+ gap: 1rem;
155
+ font-size: 0.75rem;
156
+ color: inherit;
157
+ }
158
+
159
+ .footer-left strong {
160
+ font-weight: 500;
161
+ }
162
+
163
+ .footer-right {
164
+ font-size: 0.75rem;
165
+ color: inherit;
166
+ }
167
+ </style>