Changes for page Tidy-Lab Cloud Platform

Last modified by Humphrey AI on 2026/03/22 10:27

From version 13.1
edited by Humphrey AI
on 2026/03/18 15:35
Change comment: There is no comment for this version
To version 18.1
edited by Christian Wawrzinek
on 2026/03/18 15:55
Change comment: There is no comment for this version

Summary

Details

Page properties
Author
... ... @@ -1,1 +1,1 @@
1 -XWiki.humphrey
1 +XWiki.wac
Content
... ... @@ -1,5 +1,27 @@
1 - {{tidy-lab-hero /}}
1 + {{velocity}}
2 + $xwiki.ssx.use($doc.fullName)
3 + $xwiki.jsx.use($doc.fullName, {"minify": false})
4 + #set($logoUrl = $doc.getAttachmentURL('tidylab-logo.svg'))
5 + {{/velocity}}
2 2  
7 + {{html clean="false" wiki="false"}}
8 + <div class="tl-hero">
9 + <div class="tl-hero-top">
10 + <div class="tl-hero-logo-bar">
11 + <img src="$escapetool.xml($logoUrl)" alt="Tidy-Lab" class="tl-hero-logo-img" />
12 + </div>
13 + <div class="tl-hero-center">
14 + <h1 class="tl-hero-title">Tidy-Lab Cloud Platform</h1>
15 + </div>
16 + </div>
17 + <div class="tl-hero-bottom">
18 + <p class="tl-hero-tagline">data &middot; done &middot; better</p>
19 + </div>
20 + <a href="#tl-content" class="tl-hero-scroll">&#x25BC;</a>
21 + </div>
22 + <div id="tl-content"></div>
23 + {{/html}}
24 +
3 3   == Welcome ==
4 4  
5 5   Welcome to the **Tidy-Lab Cloud Platform** community wiki.
... ... @@ -6,41 +6,41 @@
6 6  
7 7   Tidy-Lab is a secure research platform that connects inventory, experiments and workflows in one place — making your results traceable, reproducible and audit-ready.
8 8  
9 - === Quick Links ===
31 +=== Quick Links ===
10 10  
11 - * [[Getting Started>>doc:]]
12 - * [[Documentation>>doc:]]
13 - * [[FAQ>>doc:]]
14 - * [[Community Forum>>doc:]]
33 +* [[Getting Started>>doc:]]
34 +* [[Documentation>>doc:]]
35 +* [[FAQ>>doc:]]
36 +* [[Community Forum>>doc:]]
15 15  
16 - == About the Platform ==
38 +== About the Platform ==
17 17  
18 18   Tidy-Lab is an open-source, metadata-driven platform for ITSM, CMDB, and research data management. Built on a flexible data model, it lets you define the structure of your data and processes without custom code.
19 19  
20 - === Key Features ===
42 +=== Key Features ===
21 21  
22 - * **Inventory Management** — Track samples, reagents, equipment and any entity with custom metadata fields
23 - * **Experiment Tracking** — Design experiment templates, log results and link them to inventory
24 - * **Workflow Automation** — Define approval chains, notifications and automated actions
25 - * **Compliance & Audit** — Full audit trail, electronic signatures and FAIR data principles
44 +* **Inventory Management** — Track samples, reagents, equipment and any entity with custom metadata fields
45 +* **Experiment Tracking** — Design experiment templates, log results and link them to inventory
46 +* **Workflow Automation** — Define approval chains, notifications and automated actions
47 +* **Compliance & Audit** — Full audit trail, electronic signatures and FAIR data principles
26 26  
27 - === Getting Started ===
49 +=== Getting Started ===
28 28  
29 - |=Step|=Description
30 - |1|Create your account and set up your profile
31 - |2|Join or create a research group
32 - |3|Configure your inventory categories
33 - |4|Set up your first experiment template
34 - |5|Invite collaborators and assign roles
51 + ~|=Step|=Description
52 + ~|1|Create your account and set up your profile
53 + ~|2|Join or create a research group
54 + ~|3|Configure your inventory categories
55 + ~|4|Set up your first experiment template
56 + ~|5|Invite collaborators and assign roles
35 35  
36 - == Community ==
58 +== Community ==
37 37  
38 38   Tidy-Lab is stewarded by the **Stichting Tidy-Lab Foundation**, an independent Dutch foundation. We welcome contributions from everyone.
39 39  
40 - === How to Contribute ===
62 +=== How to Contribute ===
41 41  
42 - * Fork a repository and submit a pull request
43 - * Report bugs and suggest features through the issue tracker
44 - * Write documentation and tutorials
45 - * Help translate the platform into other languages
46 - * Share your experiment templates with the community
64 +* Fork a repository and submit a pull request
65 +* Report bugs and suggest features through the issue tracker
66 +* Write documentation and tutorials
67 +* Help translate the platform into other languages
68 +* Share your experiment templates with the community
XWiki.JavaScriptExtension[0]
cache
... ... @@ -1,0 +1,1 @@
1 +long
code
... ... @@ -1,0 +1,81 @@
1 + document.body.classList.add('tl-hero-page');
2 +
3 + (function() {
4 + var hero = document.querySelector('.tl-hero');
5 + if (!hero) return;
6 +
7 + // Collect all chrome elements to fade
8 + var chromeSelectors = [
9 + '#menuview', '#headerglobal', '#hierarchy_breadcrumb',
10 + '.document-header', '#xdocFooter', '#xwikidata',
11 + '#footerglobal', '.skip-nav'
12 + ];
13 + var chromeElements = [];
14 + chromeSelectors.forEach(function(sel) {
15 + var el = document.querySelector(sel);
16 + if (el) chromeElements.push(el);
17 + });
18 +
19 + var wasFading = false;
20 +
21 + function onScroll() {
22 + var heroHeight = hero.offsetHeight;
23 + var scrollY = window.pageYOffset || document.documentElement.scrollTop;
24 +
25 + // Start fading at 30% scroll, fully visible at 70%
26 + var fadeStart = heroHeight * 0.3;
27 + var fadeEnd = heroHeight * 0.7;
28 + var progress = 0;
29 +
30 + if (scrollY <= fadeStart) {
31 + progress = 0;
32 + } else if (scrollY >= fadeEnd) {
33 + progress = 1;
34 + } else {
35 + progress = (scrollY - fadeStart) / (fadeEnd - fadeStart);
36 + }
37 +
38 + if (progress > 0 && progress < 1) {
39 + // Fading: switch from display:none to opacity-based
40 + if (!wasFading) {
41 + document.body.classList.add('tl-fading');
42 + document.body.classList.remove('tl-scrolled');
43 + wasFading = true;
44 + }
45 + chromeElements.forEach(function(el) {
46 + el.style.opacity = progress;
47 + });
48 + } else if (progress >= 1) {
49 + // Fully scrolled: restore normal layout
50 + document.body.classList.remove('tl-fading');
51 + document.body.classList.add('tl-scrolled');
52 + chromeElements.forEach(function(el) {
53 + el.style.opacity = '';
54 + });
55 + wasFading = false;
56 + } else {
57 + // At top: hide everything
58 + document.body.classList.remove('tl-fading');
59 + document.body.classList.remove('tl-scrolled');
60 + chromeElements.forEach(function(el) {
61 + el.style.opacity = '';
62 + });
63 + wasFading = false;
64 + }
65 + }
66 +
67 + window.addEventListener('scroll', onScroll, { passive: true });
68 + onScroll(); // run once on load
69 +
70 + // Smooth scroll for the arrow
71 + var scrollLink = document.querySelector('.tl-hero-scroll');
72 + var tlContent = document.getElementById('tl-content');
73 + if (scrollLink) {
74 + scrollLink.addEventListener('click', function(e) {
75 + e.preventDefault();
76 + if (tlContent) {
77 + tlContent.scrollIntoView({ behavior: 'smooth' });
78 + }
79 + });
80 + }
81 + })();
name
... ... @@ -1,0 +1,1 @@
1 +Tidy-Lab Hero Page Script
parse
... ... @@ -1,0 +1,1 @@
1 +No
use
... ... @@ -1,0 +1,1 @@
1 +onDemand
XWiki.StyleSheetExtension[0]
cache
... ... @@ -1,0 +1,1 @@
1 +long
code
... ... @@ -1,0 +1,237 @@
1 + /* ==========================================================================
2 + Tidy-Lab Homepage — Full-Page Hero
3 + Targets exact XWiki 18.1 Flamingo DOM element IDs.
4 + ========================================================================== */
5 +
6 + /* ==========================================================================
7 + Phase 1: HERO VISIBLE — hide chrome, full-bleed layout
8 + ========================================================================== */
9 +
10 + /* Chrome elements: hidden initially with display:none (no space taken) */
11 + .tl-hero-page:not(.tl-scrolled) #menuview,
12 + .tl-hero-page:not(.tl-scrolled) #headerglobal,
13 + .tl-hero-page:not(.tl-scrolled) #hierarchy_breadcrumb,
14 + .tl-hero-page:not(.tl-scrolled) .document-header,
15 + .tl-hero-page:not(.tl-scrolled) #xdocFooter,
16 + .tl-hero-page:not(.tl-scrolled) #xwikidata,
17 + .tl-hero-page:not(.tl-scrolled) #footerglobal,
18 + .tl-hero-page:not(.tl-scrolled) .skip-nav {
19 + display: none !important;
20 + }
21 +
22 + /* When fading in (JS adds tl-fading), switch to opacity-based visibility */
23 + .tl-hero-page.tl-fading #menuview,
24 + .tl-hero-page.tl-fading #headerglobal,
25 + .tl-hero-page.tl-fading #hierarchy_breadcrumb,
26 + .tl-hero-page.tl-fading .document-header,
27 + .tl-hero-page.tl-fading #xdocFooter,
28 + .tl-hero-page.tl-fading #xwikidata,
29 + .tl-hero-page.tl-fading #footerglobal,
30 + .tl-hero-page.tl-fading .skip-nav {
31 + display: block !important;
32 + }
33 +
34 + .tl-hero-page.tl-fading .document-header {
35 + display: flex !important;
36 + }
37 +
38 + /* Sticky navbar once visible */
39 + .tl-hero-page.tl-fading #menuview,
40 + .tl-hero-page.tl-scrolled #menuview {
41 + position: fixed !important;
42 + top: 0;
43 + left: 0;
44 + width: 100%;
45 + z-index: 1030;
46 + overflow: hidden;
47 + }
48 +
49 + /* Prevent any horizontal overflow */
50 + html, body.tl-hero-page,
51 + .tl-hero-page #xwikimaincontainer,
52 + .tl-hero-page #xwikimaincontainerinner {
53 + overflow-x: hidden !important;
54 + }
55 +
56 + /* Reset containers for full-bleed hero — only while hero is visible */
57 + .tl-hero-page:not(.tl-scrolled) #xwikimaincontainer,
58 + .tl-hero-page:not(.tl-scrolled) #xwikimaincontainerinner,
59 + .tl-hero-page:not(.tl-scrolled) #contentcontainer,
60 + .tl-hero-page:not(.tl-scrolled) #contentcolumn,
61 + .tl-hero-page:not(.tl-scrolled) .main,
62 + .tl-hero-page:not(.tl-scrolled) #mainContentArea,
63 + .tl-hero-page:not(.tl-scrolled) #xwikicontent {
64 + margin: 0 !important;
65 + padding: 0 !important;
66 + width: 100% !important;
67 + max-width: 100% !important;
68 + }
69 +
70 + .tl-hero-page:not(.tl-scrolled) #mainContentArea > hr {
71 + display: none !important;
72 + }
73 +
74 + .tl-hero-page:not(.tl-scrolled) #xwikicontent > .row {
75 + margin: 0 !important;
76 + }
77 +
78 + body.tl-hero-page:not(.tl-scrolled) {
79 + padding-top: 0 !important;
80 + margin-top: 0 !important;
81 + }
82 +
83 + /* ==========================================================================
84 + Hero Section — ALWAYS full viewport width, even after scroll
85 + ========================================================================== */
86 + .tl-hero {
87 + position: relative;
88 + min-height: 100vh;
89 + width: 100%;
90 + display: flex;
91 + flex-direction: column;
92 + overflow: hidden;
93 + }
94 +
95 + /* --- Top half: dark purple --- */
96 + .tl-hero-top {
97 + flex: 1;
98 + background-color: #2D2B55;
99 + display: flex;
100 + flex-direction: column;
101 + justify-content: flex-end;
102 + align-items: center;
103 + position: relative !important;
104 + padding-bottom: 30px;
105 + overflow: visible;
106 + }
107 +
108 + /* --- Bottom half: white --- */
109 + .tl-hero-bottom {
110 + flex: 1;
111 + background-color: #FFFFFF;
112 + display: flex;
113 + flex-direction: column;
114 + justify-content: flex-start;
115 + align-items: center;
116 + padding-top: 20px;
117 + }
118 +
119 + /* --- Logo bar (top-left) --- */
120 + .tl-hero-logo-bar {
121 + position: absolute;
122 + top: 30px;
123 + left: 40px;
124 + z-index: 2;
125 + }
126 +
127 + .tl-hero-logo-img {
128 + max-width: 240px;
129 + height: auto;
130 + filter: brightness(1.8) saturate(1.2);
131 + }
132 +
133 + /* --- Centered title --- */
134 + .tl-hero-center {
135 + text-align: center;
136 + padding: 0 20px;
137 + }
138 +
139 + .tl-hero-title {
140 + color: #FFFFFF !important;
141 + font-family: "Calibri Light", "Calibri", "Segoe UI Light", "Segoe UI", sans-serif !important;
142 + font-weight: 300 !important;
143 + font-size: 56px !important;
144 + letter-spacing: 1px;
145 + margin: 0 !important;
146 + text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
147 + }
148 +
149 + /* --- Tagline --- */
150 + .tl-hero-tagline {
151 + color: #7B78FF;
152 + font-family: "Calibri", "Segoe UI", sans-serif;
153 + font-size: 22px;
154 + font-weight: 300;
155 + letter-spacing: 8px;
156 + text-transform: lowercase;
157 + margin: 0;
158 + }
159 +
160 + /* --- Scroll indicator --- */
161 + .tl-hero-scroll {
162 + position: absolute;
163 + bottom: 30px;
164 + left: 50%;
165 + transform: translateX(-50%);
166 + color: rgba(123, 120, 255, 0.6);
167 + font-size: 24px;
168 + text-decoration: none;
169 + animation: tl-bounce 2s ease infinite;
170 + z-index: 2;
171 + }
172 +
173 + .tl-hero-scroll:hover {
174 + color: #7B78FF;
175 + text-decoration: none;
176 + }
177 +
178 + @keyframes tl-bounce {
179 + 0%, 20%, 50%, 80%, 100% { transform: translateX(-50%) translateY(0); }
180 + 40% { transform: translateX(-50%) translateY(-12px); }
181 + 60% { transform: translateX(-50%) translateY(-6px); }
182 + }
183 +
184 + /* ==========================================================================
185 + Content area below hero — restore normal layout
186 + ========================================================================== */
187 + #tl-content {
188 + scroll-margin-top: 70px;
189 + }
190 +
191 + #tl-content ~ h2,
192 + #tl-content ~ h3,
193 + #tl-content ~ p,
194 + #tl-content ~ ul,
195 + #tl-content ~ ol,
196 + #tl-content ~ table,
197 + #tl-content ~ div {
198 + max-width: 1000px;
199 + margin-left: auto;
200 + margin-right: auto;
201 + padding-left: 20px;
202 + padding-right: 20px;
203 + }
204 +
205 + /* ==========================================================================
206 + Responsive
207 + ========================================================================== */
208 + @media (max-width: 992px) {
209 + .tl-hero-title { font-size: 40px !important; }
210 + .tl-hero-tagline { font-size: 18px; letter-spacing: 6px; }
211 + .tl-hero-logo-img { max-width: 180px; }
212 + .tl-hero-logo-bar { top: 20px; left: 20px; }
213 + .tl-hero-top { padding-bottom: 24px; }
214 + .tl-hero-bottom { padding-top: 16px; }
215 + }
216 +
217 + @media (max-width: 576px) {
218 + .tl-hero-title { font-size: 28px !important; }
219 + .tl-hero-tagline { font-size: 14px; letter-spacing: 4px; }
220 + .tl-hero-logo-img { max-width: 140px; }
221 + .tl-hero-logo-bar { top: 15px; left: 15px; }
222 + .tl-hero-scroll { bottom: 15px; }
223 + .tl-hero-top { padding-bottom: 20px; }
224 + .tl-hero-bottom { padding-top: 12px; }
225 + }
226 +
227 + /* --- Print: skip hero --- */
228 + @media print {
229 + .tl-hero { display: none; }
230 + .tl-hero-page #tmHeader,
231 + .tl-hero-page .navbar,
232 + .tl-hero-page #hierarchy {
233 + opacity: 1;
234 + pointer-events: auto;
235 + }
236 + }
237 +
contentType
... ... @@ -1,0 +1,1 @@
1 +CSS
name
... ... @@ -1,0 +1,1 @@
1 +Tidy-Lab Homepage Hero
parse
... ... @@ -1,0 +1,1 @@
1 +No
use
... ... @@ -1,0 +1,1 @@
1 +onDemand