@eox/pages-theme-eox 1.5.0 → 1.6.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ # [1.6.0](https://gitlab.eox.at/eox/hub/eoxhub-portal/compare/v1.5.1...v1.6.0) (2026-04-30)
4
+
5
+ ### Bug Fixes
6
+
7
+ - **style:** link display in sidebar and footer ([766d4f4](https://gitlab.eox.at/eox/hub/eoxhub-portal/commit/766d4f40ec9a185c270211f40280848b90c32fe5))
8
+ - **style:** more compact footer layout ([b190cb9](https://gitlab.eox.at/eox/hub/eoxhub-portal/commit/b190cb9038887ad19cffc2419aea93762aee98a2))
9
+
10
+ ### Features
11
+
12
+ - custom CTAs in pricing table ([8900a3c](https://gitlab.eox.at/eox/hub/eoxhub-portal/commit/8900a3c148630e86ef84cf433b7d8008daeba8f5))
13
+
14
+ ## [1.5.1](https://gitlab.eox.at/eox/hub/eoxhub-portal/compare/v1.5.0...v1.5.1) (2026-04-30)
15
+
16
+ ### Bug Fixes
17
+
18
+ - **style:** positioning of outline marker ([e6ce573](https://gitlab.eox.at/eox/hub/eoxhub-portal/commit/e6ce5731eabac08dbb8efa5593e8c34a7e75fcf1))
19
+
3
20
  # [1.5.0](https://gitlab.eox.at/eox/hub/eoxhub-portal/compare/v1.4.0...v1.5.0) (2026-04-28)
4
21
 
5
22
  ### Features
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eox/pages-theme-eox",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "type": "module",
5
5
  "description": "Vitepress Theme with EOX branding",
6
6
  "main": "src/index.js",
@@ -3,32 +3,34 @@
3
3
  <div class="holder large-padding">
4
4
  <div class="large-space"></div>
5
5
  <div class="grid">
6
- <div class="s12 l6">
7
- <img
8
- :src="withBase(theme.logo.light)"
9
- :alt="`${site.title} logo`"
10
- class="logo"
11
- />
12
- <div class="small-space"></div>
13
- <a
14
- v-if="theme.nav.find((i) => i.link && i.link.includes('contact'))"
15
- :href="
16
- theme.nav.find((i) => i.link && i.link.includes('contact')).link
17
- "
18
- class="button small border no-margin"
19
- style="color: var(--on-surface)"
20
- @click="trackEvent(['CTA', 'Click', 'Footer', action.text])"
21
- >{{
22
- theme.nav.find((i) => i.link && i.link.includes("contact")).text
23
- }}</a
24
- >
25
- <p v-html="theme.footer.message"></p>
26
- <p v-html="theme.footer.copyright"></p>
6
+ <div class="s12 l6 footer-info">
7
+ <div class="footer-info-content">
8
+ <img
9
+ :src="withBase(theme.logo.light)"
10
+ :alt="`${site.title} logo`"
11
+ class="logo"
12
+ />
13
+ <div class="small-space"></div>
14
+ <a
15
+ v-if="theme.nav.find((i) => i.link && i.link.includes('contact'))"
16
+ :href="
17
+ theme.nav.find((i) => i.link && i.link.includes('contact')).link
18
+ "
19
+ class="button small border no-margin"
20
+ style="color: var(--on-surface)"
21
+ @click="trackEvent(['CTA', 'Click', 'Footer', action.text])"
22
+ >{{
23
+ theme.nav.find((i) => i.link && i.link.includes("contact")).text
24
+ }}</a
25
+ >
26
+ <p v-html="theme.footer.message"></p>
27
+ </div>
28
+ <p class="footer-copyright" v-html="theme.footer.copyright"></p>
27
29
  </div>
28
30
  <div class="s12 l6">
29
- <div class="grid large-line">
31
+ <div class="footer-columns">
30
32
  <div
31
- class="s6 l4"
33
+ class="footer-column-item"
32
34
  v-if="theme.nav.filter((i) => !i.action && i.link).length"
33
35
  >
34
36
  <p class="bold">{{ t("About", theme.i18n) }}</p>
@@ -42,7 +44,10 @@
42
44
  >
43
45
  </p>
44
46
  </div>
45
- <div class="s6 l4" v-for="item in theme.nav.filter((i) => i.items)">
47
+ <div
48
+ class="footer-column-item"
49
+ v-for="item in theme.nav.filter((i) => i.items)"
50
+ >
46
51
  <p class="bold">{{ item.text }}</p>
47
52
  <p v-for="subItem in getFlatList(item.items)">
48
53
  <a
@@ -54,7 +59,7 @@
54
59
  >
55
60
  </p>
56
61
  </div>
57
- <div class="s6 l4">
62
+ <div class="footer-column-item">
58
63
  <p class="bold">{{ t("Legal", theme.i18n) }}</p>
59
64
  <p>
60
65
  <a
@@ -123,9 +128,66 @@ const termsLinks = computed(() => {
123
128
  </script>
124
129
 
125
130
  <style>
126
- @media screen and (max-width: 600px) {
127
- footer > .holder > .grid > div:first-child {
131
+ footer .grid > div:not(:first-child) p,
132
+ .footer-column-item p {
133
+ margin: 0 !important;
134
+ }
135
+
136
+ footer .link {
137
+ text-decoration: none;
138
+ }
139
+
140
+ .footer-columns {
141
+ columns: 1;
142
+ column-gap: 2rem;
143
+ }
144
+
145
+ .footer-column-item {
146
+ break-inside: avoid;
147
+ margin-bottom: 2rem;
148
+ }
149
+
150
+ @media screen and (min-width: 601px) {
151
+ .footer-columns {
152
+ columns: 2;
153
+ }
154
+ }
155
+
156
+ @media screen and (min-width: 993px) {
157
+ .footer-columns {
158
+ columns: 3;
159
+ }
160
+ }
161
+
162
+ .footer-info {
163
+ display: flex;
164
+ flex-direction: column;
165
+ justify-content: space-between;
166
+ }
167
+
168
+ @media screen and (max-width: 992px) {
169
+ footer .grid {
170
+ display: flex;
171
+ flex-direction: column;
172
+ }
173
+ .footer-info {
174
+ order: -1;
175
+ margin-bottom: 0;
176
+ display: contents;
177
+ }
178
+ .footer-info-content {
179
+ order: -2;
180
+ margin-bottom: 2rem;
181
+ }
182
+ .footer-columns {
128
183
  order: 1;
129
184
  }
185
+ .footer-copyright {
186
+ order: 2;
187
+ margin-top: 2rem !important;
188
+ }
189
+ }
190
+
191
+ @media screen and (max-width: 600px) {
130
192
  }
131
193
  </style>
@@ -48,7 +48,11 @@
48
48
  :href="addPlanConfig(contactLink, plan)"
49
49
  class="button responsive bold margin-top-1 margin-bottom-2"
50
50
  >
51
- {{ t("Contact us", theme.i18n) }}
51
+ {{
52
+ plan.salesCTA
53
+ ? t(plan.salesCTA, theme.i18n)
54
+ : t("Contact us", theme.i18n)
55
+ }}
52
56
  </a>
53
57
  </ClientOnly>
54
58
  </div>
@@ -159,7 +163,7 @@
159
163
  <div v-if="showDescriptionColumn" class="cell orig-col-1 l"></div>
160
164
  <div
161
165
  v-for="(plan, index) in localPlans"
162
- :key="'cta-' + index"
166
+ :key="'features-' + index"
163
167
  :class="`surface-container-low cell bottom-cell orig-col-${index + 2} center-align`"
164
168
  >
165
169
  <a v-if="plan.link" :href="plan.link"
@@ -181,7 +185,7 @@
181
185
  <div
182
186
  v-if="showSales"
183
187
  v-for="(plan, index) in localPlans"
184
- :key="'cta-' + index"
188
+ :key="'sales-' + index"
185
189
  :class="`surface-container-low cell bottom-cell orig-col-${index + 2} center-align`"
186
190
  >
187
191
  <ClientOnly>
@@ -189,8 +193,13 @@
189
193
  v-if="showSales"
190
194
  :href="addPlanConfig(contactLink, plan)"
191
195
  class="button responsive bold"
192
- >{{ t("Contact us", theme.i18n) }}</a
193
196
  >
197
+ {{
198
+ plan.salesCTA
199
+ ? t(plan.salesCTA, theme.i18n)
200
+ : t("Contact us", theme.i18n)
201
+ }}
202
+ </a>
194
203
  </ClientOnly>
195
204
  </div>
196
205
  </div>
@@ -357,13 +366,13 @@ export default {
357
366
  this.$forceUpdate();
358
367
  },
359
368
  initializeData() {
360
- this.title = this.config.title ?? this.title;
361
- this.showSales = this.config.showSales ?? this.showSales;
362
- this.contactLink = this.config.contactLink ?? this.contactLink;
363
- this.showVAT = this.config.showVAT ?? this.showVAT;
364
- this.localOptions = this.config.options ?? this.localOptions;
365
- this.localPlans = this.config.plans ?? this.localPlans;
366
- this.localDetails = this.config.details ?? this.localDetails;
369
+ this.title = this.config.title ?? "Pricing Options";
370
+ this.showSales = this.config.showSales ?? true;
371
+ this.contactLink = this.config.contactLink ?? "";
372
+ this.showVAT = this.config.showVAT ?? "2025-06-30";
373
+ this.localOptions = this.config.options ?? [];
374
+ this.localPlans = this.config.plans ?? [];
375
+ this.localDetails = this.config.details ?? [];
367
376
  },
368
377
  handleResize() {
369
378
  if (typeof window !== "undefined") {
@@ -386,35 +395,52 @@ export default {
386
395
  }
387
396
  },
388
397
  addPlanConfig(contactLink, plan) {
389
- if (typeof document === "undefined") {
390
- return contactLink; // Return original link as fallback
398
+ const baseLink = plan.salesLink || contactLink;
399
+ if (!baseLink) {
400
+ return "";
391
401
  }
392
- const parts = contactLink.split("?");
393
- let search = parts[1] || "";
402
+
403
+ const [url, ...searchParts] = baseLink.split("?");
404
+ let search = searchParts.join("?");
394
405
  const params = new URLSearchParams(search);
395
- params.append("plan", plan.name);
396
- const alternative = Object.entries(plan.details).find(
397
- ([key, value]) => value.alternative,
398
- );
399
- if (alternative) {
400
- const checked = document.querySelector(
401
- `[id='${plan.name}-${alternative[0]}']`,
402
- )?.checked;
403
- if (checked) {
404
- params.append("alternative", alternative[1].alternative.name);
406
+
407
+ // Only automatically add "plan" if it's the default contact link
408
+ // and not already present
409
+ if (!plan.salesLink && !params.has("plan") && plan.name) {
410
+ params.append("plan", plan.name);
411
+ }
412
+
413
+ // Add alternatives if they are checked
414
+ if (plan.details) {
415
+ Object.entries(plan.details).forEach(([key, value]) => {
416
+ if (
417
+ value &&
418
+ typeof value === "object" &&
419
+ value.alternative?.checked
420
+ ) {
421
+ params.append("alternative", value.alternative.name);
422
+ }
423
+ });
424
+ }
425
+
426
+ // Add global options
427
+ if (this.localOptions && this.localOptions.length > 0) {
428
+ this.localOptions.forEach((o) => {
429
+ if (o.checked) {
430
+ params.append("option", o.label);
431
+ }
432
+ });
433
+ }
434
+
435
+ // Add custom salesParams
436
+ if (plan.salesParams) {
437
+ for (const [key, value] of Object.entries(plan.salesParams)) {
438
+ params.set(key, value);
405
439
  }
406
440
  }
407
- if (this.localOptions.length > 0)
408
- [
409
- this.localOptions.forEach((o) => {
410
- const checked = document.querySelector(`input#${o.id}`)?.checked;
411
- if (checked) {
412
- params.append("option", o.label);
413
- }
414
- }),
415
- ];
441
+
416
442
  search = params.toString();
417
- return `${parts[0]}${search ? `?${search}` : ""}`;
443
+ return `${url}${search ? `?${search}` : ""}`;
418
444
  },
419
445
  },
420
446
  created() {
@@ -431,19 +457,7 @@ export default {
431
457
  window.removeEventListener("resize", this.handleResize);
432
458
  },
433
459
  watch: {
434
- options: {
435
- handler() {
436
- this.initializeData();
437
- },
438
- deep: true,
439
- },
440
- plans: {
441
- handler() {
442
- this.initializeData();
443
- },
444
- deep: true,
445
- },
446
- details: {
460
+ config: {
447
461
  handler() {
448
462
  this.initializeData();
449
463
  },
package/src/style.css CHANGED
@@ -201,7 +201,7 @@ details[open] > summary > i.mdi-chevron-down {
201
201
  top: var(--vp-nav-height) !important;
202
202
  padding-top: 0 !important;
203
203
  padding-left: 0 !important;
204
- margin-top: -2px;
204
+ margin-top: -2px !important;
205
205
  }
206
206
 
207
207
  .VPSidebar > nav,
@@ -238,6 +238,11 @@ details[open] > summary > i.mdi-chevron-down {
238
238
  padding: 3px 0 !important;
239
239
  font-size: 14px;
240
240
  line-height: 20px;
241
+ text-decoration: none;
242
+ }
243
+
244
+ .VPSidebar .VPLink p {
245
+ margin: 0;
241
246
  }
242
247
 
243
248
  .social-links {
@@ -269,6 +274,43 @@ details[open] > summary > i.mdi-chevron-down {
269
274
  list-style: none;
270
275
  }
271
276
 
277
+ /* VPDocAsideOutline Fixes */
278
+ .VPDocAsideOutline ul {
279
+ display: block !important;
280
+ list-style: none !important;
281
+ margin: 0 !important;
282
+ padding: 0 !important;
283
+ }
284
+
285
+ .VPDocAsideOutline li {
286
+ list-style: none !important;
287
+ position: static !important;
288
+ margin: 0 !important;
289
+ padding: 0 !important;
290
+ }
291
+
292
+ .VPDocAsideOutline .outline-link {
293
+ display: block !important;
294
+ line-height: 32px !important;
295
+ font-size: 14px !important;
296
+ }
297
+
298
+ .VPDocAsideOutline .outline-marker {
299
+ width: 2px !important;
300
+ height: 18px !important;
301
+ transition:
302
+ top 0.25s cubic-bezier(0, 1, 0.5, 1),
303
+ background-color 0.5s,
304
+ opacity 0.25s !important;
305
+ }
306
+
307
+ .VPDocAsideOutline .outline-title {
308
+ display: block !important;
309
+ line-height: 32px !important;
310
+ font-size: 14px !important;
311
+ font-weight: 600 !important;
312
+ }
313
+
272
314
  /* Doc layout fixes */
273
315
  .Layout.layout-doc .content-container,
274
316
  .VPDocFooter {