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,267 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+
4
+ const props = defineProps<{
5
+ section?: string
6
+ author?: string
7
+ role?: string
8
+ class?: string
9
+ quoteStyle?: 'curly' | 'guillemet' | 'line' | 'minimal' | 'none'
10
+ }>()
11
+
12
+ const isDark = computed(() => {
13
+ return props.class?.includes('dark')
14
+ })
15
+
16
+ const quoteChar = computed(() => {
17
+ switch (props.quoteStyle) {
18
+ case 'guillemet': return '«'
19
+ case 'minimal': return '"'
20
+ case 'none': return ''
21
+ case 'line': return ''
22
+ default: return '"' // curly is default
23
+ }
24
+ })
25
+ </script>
26
+
27
+ <template>
28
+ <div
29
+ class="slidev-layout quote"
30
+ :class="[$props.class, { 'is-dark': isDark }]"
31
+ >
32
+ <!-- Grid background -->
33
+ <div class="grid-bg">
34
+ <img src="/contact-grid-background.svg" alt="" />
35
+ </div>
36
+
37
+ <!-- Header -->
38
+ <div class="slide-header">
39
+ <span v-if="section" class="section-label">{{ section }}</span>
40
+ <span v-else class="section-label"></span>
41
+ <div class="header-logo">
42
+ <img
43
+ v-show="!isDark"
44
+ src="/measurelab_logo.svg"
45
+ alt="Measurelab"
46
+ />
47
+ <img
48
+ v-show="isDark"
49
+ src="/measurelab-dark-logo.svg"
50
+ alt="Measurelab"
51
+ />
52
+ </div>
53
+ </div>
54
+
55
+ <!-- Quote content -->
56
+ <div class="quote-content" :class="[`style-${quoteStyle || 'curly'}`]">
57
+ <div v-if="quoteStyle === 'line'" class="quote-line"></div>
58
+ <div v-else-if="quoteChar" class="quote-mark">{{ quoteChar }}</div>
59
+ <div class="quote-text">
60
+ <slot />
61
+ </div>
62
+ <div v-if="author" class="quote-attribution">
63
+ <span class="author-name">{{ author }}</span>
64
+ <span v-if="role" class="author-role">{{ role }}</span>
65
+ </div>
66
+ </div>
67
+
68
+ <!-- Footer -->
69
+ <div class="slide-footer">
70
+ <div class="footer-left">
71
+ <span class="copyright">© <strong>Measurelab</strong></span>
72
+ <span class="confidential">All rights reserved. Company confidential.</span>
73
+ </div>
74
+ <div class="footer-right">
75
+ <span class="page-number">{{ $slidev?.nav.currentPage }}</span>
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </template>
80
+
81
+ <style scoped>
82
+ .quote {
83
+ display: flex;
84
+ flex-direction: column;
85
+ height: 100%;
86
+ position: relative;
87
+ background: #ffffff;
88
+ color: #081f30;
89
+ overflow: hidden;
90
+ }
91
+
92
+ .quote.is-dark {
93
+ background: #081f30;
94
+ color: #f9f9f9;
95
+ }
96
+
97
+ /* Grid background */
98
+ .grid-bg {
99
+ position: absolute;
100
+ top: 0;
101
+ left: 0;
102
+ right: 0;
103
+ bottom: 3rem;
104
+ pointer-events: none;
105
+ }
106
+
107
+ .grid-bg img {
108
+ width: 100%;
109
+ height: auto;
110
+ position: absolute;
111
+ bottom: 0;
112
+ left: 0;
113
+ }
114
+
115
+ .quote.is-dark .grid-bg {
116
+ opacity: 0.3;
117
+ }
118
+
119
+ /* Header */
120
+ .slide-header {
121
+ display: flex;
122
+ justify-content: space-between;
123
+ align-items: flex-start;
124
+ padding: 1.5rem 2.5rem;
125
+ position: relative;
126
+ z-index: 10;
127
+ }
128
+
129
+ .section-label {
130
+ font-size: 0.75rem;
131
+ font-weight: 400;
132
+ color: inherit;
133
+ }
134
+
135
+ .header-logo {
136
+ height: 1.25rem;
137
+ }
138
+
139
+ .header-logo img {
140
+ height: 100%;
141
+ width: auto;
142
+ }
143
+
144
+ /* Quote content */
145
+ .quote-content {
146
+ flex: 1;
147
+ display: flex;
148
+ flex-direction: column;
149
+ align-items: center;
150
+ justify-content: flex-start;
151
+ text-align: center;
152
+ padding: 2rem 4rem 0 4rem;
153
+ position: relative;
154
+ z-index: 10;
155
+ gap: 1.5rem;
156
+ }
157
+
158
+ /* Default curly quote mark */
159
+ .quote-mark {
160
+ font-size: 5rem;
161
+ font-weight: 700;
162
+ line-height: 1;
163
+ color: #6dd750;
164
+ margin-bottom: -1rem;
165
+ }
166
+
167
+ /* Guillemet style - French angle quotes */
168
+ .style-guillemet .quote-mark {
169
+ font-size: 4rem;
170
+ font-weight: 300;
171
+ }
172
+
173
+ /* Minimal style - smaller, subtle */
174
+ .style-minimal .quote-mark {
175
+ font-size: 3rem;
176
+ font-weight: 400;
177
+ opacity: 0.6;
178
+ }
179
+
180
+ /* Line style - vertical bar instead of quote */
181
+ .quote-line {
182
+ width: 4px;
183
+ height: 3rem;
184
+ background: #6dd750;
185
+ border-radius: 2px;
186
+ }
187
+
188
+ /* None style - align text left with padding */
189
+ .style-none {
190
+ align-items: flex-start;
191
+ text-align: left;
192
+ padding-left: 6rem;
193
+ padding-right: 6rem;
194
+ padding-top: calc(4rem + 20px);
195
+ }
196
+
197
+ .style-none .quote-text {
198
+ text-align: left;
199
+ padding-left: 2rem;
200
+ border-left: 4px solid #6dd750;
201
+ }
202
+
203
+ .style-none .quote-attribution {
204
+ align-items: flex-start;
205
+ padding-left: 2rem;
206
+ border-left: 4px solid transparent;
207
+ }
208
+
209
+ .quote-text {
210
+ max-width: 800px;
211
+ }
212
+
213
+ .quote-text :deep(p) {
214
+ font-size: 1.75rem;
215
+ font-weight: 300;
216
+ line-height: 1.5;
217
+ margin: 0;
218
+ color: inherit;
219
+ }
220
+
221
+ .quote-attribution {
222
+ display: flex;
223
+ flex-direction: column;
224
+ gap: 0.25rem;
225
+ margin-top: 1rem;
226
+ }
227
+
228
+ .author-name {
229
+ font-size: 1.125rem;
230
+ font-weight: 600;
231
+ color: inherit;
232
+ }
233
+
234
+ .author-role {
235
+ font-size: 0.875rem;
236
+ font-weight: 400;
237
+ color: inherit;
238
+ opacity: 0.7;
239
+ }
240
+
241
+ /* Footer */
242
+ .slide-footer {
243
+ display: flex;
244
+ justify-content: space-between;
245
+ align-items: center;
246
+ padding: 1rem 2.5rem;
247
+ position: relative;
248
+ z-index: 10;
249
+ color: inherit;
250
+ }
251
+
252
+ .footer-left {
253
+ display: flex;
254
+ gap: 1rem;
255
+ font-size: 0.75rem;
256
+ color: inherit;
257
+ }
258
+
259
+ .footer-left strong {
260
+ font-weight: 500;
261
+ }
262
+
263
+ .footer-right {
264
+ font-size: 0.75rem;
265
+ color: inherit;
266
+ }
267
+ </style>
@@ -0,0 +1,217 @@
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 section-1"
16
+ :class="[$props.class, { 'is-dark': isDark }]"
17
+ >
18
+ <!-- Top background pattern -->
19
+ <div class="section-bg-top">
20
+ <img src="/services-hero-background.svg" alt="" />
21
+ </div>
22
+
23
+ <!-- Bottom background graphic -->
24
+ <div class="section-bg">
25
+ <img src="/services-hero.svg" alt="" />
26
+ </div>
27
+
28
+ <!-- Header -->
29
+ <div class="slide-header">
30
+ <span class="section-label"></span>
31
+ <div class="header-logo">
32
+ <img
33
+ v-show="!isDark"
34
+ src="/measurelab_logo.svg"
35
+ alt="Measurelab"
36
+ />
37
+ <img
38
+ v-show="isDark"
39
+ src="/measurelab-dark-logo.svg"
40
+ alt="Measurelab"
41
+ />
42
+ </div>
43
+ </div>
44
+
45
+ <!-- Centered content -->
46
+ <div class="section-content">
47
+ <slot />
48
+ </div>
49
+
50
+ <!-- Footer -->
51
+ <div class="slide-footer">
52
+ <div class="footer-left">
53
+ <span class="copyright">© <strong>Measurelab</strong></span>
54
+ <span class="confidential">All rights reserved. Company confidential.</span>
55
+ </div>
56
+ <div class="footer-right">
57
+ <span class="page-number">{{ $slidev?.nav.currentPage }}</span>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </template>
62
+
63
+ <style scoped>
64
+ .section-1 {
65
+ display: flex;
66
+ flex-direction: column;
67
+ height: 100%;
68
+ position: relative;
69
+ background: #ffffff;
70
+ color: #081f30;
71
+ overflow: hidden;
72
+ }
73
+
74
+ .section-1.is-dark {
75
+ background: #081f30;
76
+ color: #f9f9f9;
77
+ }
78
+
79
+ /* Top background pattern */
80
+ .section-bg-top {
81
+ position: absolute;
82
+ top: 0;
83
+ left: 0;
84
+ right: 0;
85
+ height: 50%;
86
+ pointer-events: none;
87
+ overflow: hidden;
88
+ z-index: 2;
89
+ }
90
+
91
+ .section-bg-top img {
92
+ width: 100%;
93
+ height: auto;
94
+ position: absolute;
95
+ top: 20px;
96
+ left: 0;
97
+ }
98
+
99
+ .section-1.is-dark .section-bg-top {
100
+ opacity: 0.3;
101
+ }
102
+
103
+ /* Bottom background graphic - positioned like grid in default */
104
+ .section-bg {
105
+ position: absolute;
106
+ top: 0;
107
+ left: 0;
108
+ right: 0;
109
+ bottom: 3rem;
110
+ pointer-events: none;
111
+ z-index: 1;
112
+ }
113
+
114
+ .section-bg img {
115
+ width: 100%;
116
+ height: auto;
117
+ position: absolute;
118
+ bottom: 0;
119
+ left: 0;
120
+ }
121
+
122
+ .section-1.is-dark .section-bg {
123
+ opacity: 0.3;
124
+ }
125
+
126
+ /* Header */
127
+ .slide-header {
128
+ display: flex;
129
+ justify-content: space-between;
130
+ align-items: flex-start;
131
+ padding: 1.5rem 2.5rem;
132
+ position: relative;
133
+ z-index: 10;
134
+ }
135
+
136
+ .section-label {
137
+ font-size: 0.75rem;
138
+ font-weight: 400;
139
+ color: inherit;
140
+ }
141
+
142
+ .header-logo {
143
+ height: 1.25rem;
144
+ }
145
+
146
+ .header-logo img {
147
+ height: 100%;
148
+ width: auto;
149
+ }
150
+
151
+ /* Centered content */
152
+ .section-content {
153
+ flex: 1;
154
+ display: flex;
155
+ flex-direction: column;
156
+ align-items: center;
157
+ justify-content: center;
158
+ text-align: center;
159
+ padding: 0 2.5rem;
160
+ position: relative;
161
+ z-index: 10;
162
+ gap: 1rem;
163
+ transform: translateY(-75px);
164
+ }
165
+
166
+ .section-content :deep(h1) {
167
+ font-size: 2.5rem;
168
+ font-weight: 600;
169
+ line-height: 1.2;
170
+ margin: 0;
171
+ color: inherit;
172
+ }
173
+
174
+ .section-content :deep(h2) {
175
+ font-size: 1.5rem;
176
+ font-weight: 400;
177
+ line-height: 1.4;
178
+ margin: 0;
179
+ color: inherit;
180
+ opacity: 0.8;
181
+ }
182
+
183
+ .section-content :deep(p) {
184
+ font-size: 1.25rem;
185
+ line-height: 1.6;
186
+ margin: 0;
187
+ color: inherit;
188
+ opacity: 0.8;
189
+ }
190
+
191
+ /* Footer */
192
+ .slide-footer {
193
+ display: flex;
194
+ justify-content: space-between;
195
+ align-items: center;
196
+ padding: 1rem 2.5rem;
197
+ position: relative;
198
+ z-index: 10;
199
+ color: inherit;
200
+ }
201
+
202
+ .footer-left {
203
+ display: flex;
204
+ gap: 1rem;
205
+ font-size: 0.75rem;
206
+ color: inherit;
207
+ }
208
+
209
+ .footer-left strong {
210
+ font-weight: 500;
211
+ }
212
+
213
+ .footer-right {
214
+ font-size: 0.75rem;
215
+ color: inherit;
216
+ }
217
+ </style>
@@ -0,0 +1,217 @@
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 section-2"
16
+ :class="[$props.class, { 'is-dark': isDark }]"
17
+ >
18
+ <!-- Top background pattern -->
19
+ <div class="section-bg-top">
20
+ <img src="/services-hero-background.svg" alt="" />
21
+ </div>
22
+
23
+ <!-- Bottom background graphic -->
24
+ <div class="section-bg">
25
+ <img src="/technology-background.svg" alt="" />
26
+ </div>
27
+
28
+ <!-- Header -->
29
+ <div class="slide-header">
30
+ <span class="section-label"></span>
31
+ <div class="header-logo">
32
+ <img
33
+ v-show="!isDark"
34
+ src="/measurelab_logo.svg"
35
+ alt="Measurelab"
36
+ />
37
+ <img
38
+ v-show="isDark"
39
+ src="/measurelab-dark-logo.svg"
40
+ alt="Measurelab"
41
+ />
42
+ </div>
43
+ </div>
44
+
45
+ <!-- Centered content -->
46
+ <div class="section-content">
47
+ <slot />
48
+ </div>
49
+
50
+ <!-- Footer -->
51
+ <div class="slide-footer">
52
+ <div class="footer-left">
53
+ <span class="copyright">© <strong>Measurelab</strong></span>
54
+ <span class="confidential">All rights reserved. Company confidential.</span>
55
+ </div>
56
+ <div class="footer-right">
57
+ <span class="page-number">{{ $slidev?.nav.currentPage }}</span>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </template>
62
+
63
+ <style scoped>
64
+ .section-2 {
65
+ display: flex;
66
+ flex-direction: column;
67
+ height: 100%;
68
+ position: relative;
69
+ background: #ffffff;
70
+ color: #081f30;
71
+ overflow: hidden;
72
+ }
73
+
74
+ .section-2.is-dark {
75
+ background: #081f30;
76
+ color: #f9f9f9;
77
+ }
78
+
79
+ /* Top background pattern */
80
+ .section-bg-top {
81
+ position: absolute;
82
+ top: 0;
83
+ left: 0;
84
+ right: 0;
85
+ height: 50%;
86
+ pointer-events: none;
87
+ overflow: hidden;
88
+ z-index: 2;
89
+ }
90
+
91
+ .section-bg-top img {
92
+ width: 100%;
93
+ height: auto;
94
+ position: absolute;
95
+ top: 20px;
96
+ left: 0;
97
+ }
98
+
99
+ .section-2.is-dark .section-bg-top {
100
+ opacity: 0.3;
101
+ }
102
+
103
+ /* Bottom background graphic - positioned like grid in default */
104
+ .section-bg {
105
+ position: absolute;
106
+ top: 0;
107
+ left: 0;
108
+ right: 0;
109
+ bottom: 3rem;
110
+ pointer-events: none;
111
+ z-index: 1;
112
+ }
113
+
114
+ .section-bg img {
115
+ width: 100%;
116
+ height: auto;
117
+ position: absolute;
118
+ bottom: 0;
119
+ left: 0;
120
+ }
121
+
122
+ .section-2.is-dark .section-bg {
123
+ opacity: 0.3;
124
+ }
125
+
126
+ /* Header */
127
+ .slide-header {
128
+ display: flex;
129
+ justify-content: space-between;
130
+ align-items: flex-start;
131
+ padding: 1.5rem 2.5rem;
132
+ position: relative;
133
+ z-index: 10;
134
+ }
135
+
136
+ .section-label {
137
+ font-size: 0.75rem;
138
+ font-weight: 400;
139
+ color: inherit;
140
+ }
141
+
142
+ .header-logo {
143
+ height: 1.25rem;
144
+ }
145
+
146
+ .header-logo img {
147
+ height: 100%;
148
+ width: auto;
149
+ }
150
+
151
+ /* Centered content */
152
+ .section-content {
153
+ flex: 1;
154
+ display: flex;
155
+ flex-direction: column;
156
+ align-items: center;
157
+ justify-content: center;
158
+ text-align: center;
159
+ padding: 0 2.5rem;
160
+ position: relative;
161
+ z-index: 10;
162
+ gap: 1rem;
163
+ transform: translateY(-75px);
164
+ }
165
+
166
+ .section-content :deep(h1) {
167
+ font-size: 2.5rem;
168
+ font-weight: 600;
169
+ line-height: 1.2;
170
+ margin: 0;
171
+ color: inherit;
172
+ }
173
+
174
+ .section-content :deep(h2) {
175
+ font-size: 1.5rem;
176
+ font-weight: 400;
177
+ line-height: 1.4;
178
+ margin: 0;
179
+ color: inherit;
180
+ opacity: 0.8;
181
+ }
182
+
183
+ .section-content :deep(p) {
184
+ font-size: 1.25rem;
185
+ line-height: 1.6;
186
+ margin: 0;
187
+ color: inherit;
188
+ opacity: 0.8;
189
+ }
190
+
191
+ /* Footer */
192
+ .slide-footer {
193
+ display: flex;
194
+ justify-content: space-between;
195
+ align-items: center;
196
+ padding: 1rem 2.5rem;
197
+ position: relative;
198
+ z-index: 10;
199
+ color: inherit;
200
+ }
201
+
202
+ .footer-left {
203
+ display: flex;
204
+ gap: 1rem;
205
+ font-size: 0.75rem;
206
+ color: inherit;
207
+ }
208
+
209
+ .footer-left strong {
210
+ font-weight: 500;
211
+ }
212
+
213
+ .footer-right {
214
+ font-size: 0.75rem;
215
+ color: inherit;
216
+ }
217
+ </style>