0 Votes

Changes for page Home

Last modified by Alex Cotiugă on 2026/01/13 13:12

From version 7.117
edited by Alex Cotiugă
on 2025/11/14 08:16
Change comment: There is no comment for this version
To version 7.132
edited by Alex Cotiugă
on 2025/11/17 09:07
Change comment: There is no comment for this version

Summary

Details

Page properties
Content
... ... @@ -3,32 +3,25 @@
3 3  Agnease helps organizations maintain, upgrade, and extend their XWiki environments with clarity and precision. Focusing on stability, performance, and long-term support we ensure your business knowledge and collaboration tools remain dependable, secure, and adaptable to growth.*#
4 4  {{html clean="false"}}
5 5  <main class="agnease-landing">
6 - <!-- ================= HERO ================= -->
6 + ## HERO
7 7   <section class="hero hero-centered" aria-labelledby="hero-title">
8 - <div class="container">
9 - <div class="row">
10 - <div class="col-sm-12">
11 - <div class="hero-inner">
12 - <h1 id="hero-title">Professional XWiki solutions, from setup to long-term stability</h1>
13 - <p class="lead">Need your XWiki upgraded, secured, or improved? Let’s make it happen.</p>
14 - <div class="hero-cta">
15 - <a class="btn btn-primary" href="#contact" aria-label="Schedule a call with Agnease">
16 - Request a consultation
17 - </a>
18 - </div>
19 - <ul class="benefits">
20 - <li>Smooth upgrades</li>
21 - <li>Reliable support plans</li>
22 - <li>Custom integrations</li>
23 - <li>Secure, optimized platforms</li>
24 - </ul>
25 - </div>
26 - </div>
8 + <div class="container hero-inner">
9 + <h1 id="hero-title">Professional XWiki solutions, from setup to long-term stability</h1>
10 + <p class="lead">Need your XWiki upgraded, secured, or improved? Let’s make it happen.</p>
11 + <div class="hero-cta">
12 + <a class="btn btn-primary" href="#contact" aria-label="Schedule a call with Agnease">
13 + Request a consultation
14 + </a>
27 27   </div>
16 + <ul class="benefits">
17 + <li>Smooth upgrades</li>
18 + <li>Reliable support plans</li>
19 + <li>Custom integrations</li>
20 + <li>Secure, optimized platforms</li>
21 + </ul>
28 28   </div>
29 29   </section>
30 -
31 - <!-- ========= WHY CHOOSE AGNEASE (widgets) ========= -->
24 + ## WHY CHOOSE
32 32   #set ($whySectionData = [{
33 33   'title': 'Stability & security',
34 34   'icon': 'shield',
... ... @@ -50,20 +50,20 @@
50 50   <div class="container">
51 51   <h2 id="why-title">Why choose Agnease</h2>
52 52   <p class="lead">10+ years of XWiki expertise with structured delivery and lasting collaboration</p>
53 - <div class="row widgets" role="list">
46 + <div class="widgets">
54 54   #foreach ($entry in $whySectionData)
55 - <div class="widget col-sm-6 col-md-3" role="listitem">
48 + <article class="widget">
56 56   <div class="icon" aria-hidden="true">
57 57   <i class="fa fa-$entry.icon"></i>
58 58   <h4>$entry.title</h4>
59 59   </div>
60 60   <p>$entry.content</p>
61 - </div>
54 + </article>
62 62   #end
63 63   </div>
64 64   </div>
65 65   </section>
66 - <!-- ================= SERVICES ================= -->
59 + ## SERVICES
67 67   #set ($servicesSectionData = [{
68 68   'title': 'Upgrades',
69 69   'icon': 'refresh',
... ... @@ -116,17 +116,9 @@
116 116   <p class="lead">
117 117   All the XWiki services you need, delivered with precision and care
118 118   </p>
119 -
120 - #set ($servicesSize = $servicesSectionData.size())
121 - <div class="row services-grid" role="list">
112 + <div class="services-grid">
122 122   #foreach ($entry in $servicesSectionData)
123 - #set ($classes = "service col-xs-12 col-sm-6")
124 - ## If this is the last item and the number of services is odd,
125 - ## center it on its own row on small+ screens
126 - #if ($foreach.count == $servicesSize && ($servicesSize % 2) == 1)
127 - #set ($classes = "$classes col-sm-offset-3")
128 - #end
129 - <div class="$classes" role="listitem">
114 + <article class="service">
130 130   <div class="service-icon">
131 131   <i class="fa fa-$entry.icon" aria-hidden="true"></i>
132 132   </div>
... ... @@ -139,11 +139,12 @@
139 139   #end
140 140   </ul>
141 141   </div>
142 - </div>
127 + </article>
143 143   #end
144 144   </div>
145 145   </div>
146 146   </section>
132 + ## CTA INLINE
147 147   <section id="contact" class="cta-section">
148 148   <div class="container">
149 149   <p class="text-center contact-inline">
XWiki.StyleSheetExtension[0]
Code
... ... @@ -1,53 +1,87 @@
1 -/* ========== Agnease Landing (LESS, scoped to .agnease-landing) ========== */
1 +/* ========== Agnease Landing (no Bootstrap grid) ========== */
2 2  @brand: #00937D;
3 3  @brand-strong: #007B6A;
4 4  @text: #2D3A34;
5 5  @muted: #5B6B64;
6 -@bg: #FFFFFF;
7 -@panel: #F7F9F8;
8 8  @line: #E4ECE9;
9 9  @radius: 16px;
10 -@radius-sm: 12px;
11 11  @shadow-sm: 0 6px 20px rgba(0,0,0,.06);
12 12  @shadow: 0 12px 36px rgba(0,0,0,.08);
13 13  @maxw: 1140px;
14 14  
15 15  .agnease-landing {
16 - /* Base */
17 17   color: @text;
18 - font: 16px/1.6 Inter, Segoe UI, Roboto, system-ui, -apple-system, Arial, sans-serif;
19 - a { color: @brand; text-decoration: none; &:hover { color: @brand-strong; text-decoration: underline; } }
20 - img { max-width: 100%; display: block; }
21 - /*h1 { font-size: clamp(1.8rem, 2.5vw + .8rem, 3rem); line-height: 1.15; margin: .2rem 0 .6rem; }
22 - h2 { font-size: clamp(1.4rem, 1.4vw + .8rem, 2rem); line-height: 1.2; margin: .2rem 0 .4rem; }
23 - h3 { font-size: 1.12rem; margin: .2rem 0 .25rem; }*/
24 - .lead { color: @muted; max-width: 72ch; }
25 - .container { max-width: @maxw; margin-top: 5px; padding: 0; overflow-x: clip;}
26 26  
27 - /* Global sections */
28 - section { padding: 32px 0; border-top: 1px solid @line; }
29 - section:first-of-type { border-top: none; }
15 + a {
16 + color: @brand;
17 + text-decoration: none;
18 + &:hover {
19 + color: @brand-strong;
20 + text-decoration: underline;
21 + }
22 + }
30 30  
24 + img {
25 + max-width: 100%;
26 + height: auto;
27 + display: block;
28 + }
29 +
30 + .container {
31 + max-width: @maxw;
32 + margin: 0 auto;
33 + padding: 0 16px;
34 + }
35 +
36 + .lead {
37 + color: @muted;
38 + max-width: 72ch;
39 + }
40 +
41 + section {
42 + padding: 32px 0;
43 + border-top: 1px solid @line;
44 +
45 + &:first-of-type {
46 + border-top: none;
47 + }
48 + }
49 +
31 31   /* Buttons */
32 32   .btn {
33 - display: inline-flex; align-items: center; gap: .55rem;
34 - padding: .85rem 1.1rem; border-radius: 12px; border: 2px solid transparent;
35 - font-weight: 650; letter-spacing: .2px; cursor: pointer; box-shadow: @shadow-sm;
52 + display: inline-flex;
53 + align-items: center;
54 + justify-content: center;
55 + padding: .85rem 1.1rem;
56 + border-radius: 12px;
57 + border: 2px solid transparent;
58 + font-weight: 650;
59 + letter-spacing: .2px;
60 + cursor: pointer;
61 + box-shadow: @shadow-sm;
36 36  
37 - &:focus-visible { outline: 3px solid @brand; outline-offset: 2px; }
63 + &:focus-visible {
64 + outline: 3px solid @brand;
65 + outline-offset: 2px;
66 + }
38 38  
39 39   &-primary {
40 - background: @brand; color: #fff;
41 - &:hover, &:focus { background: @brand-strong; color: #fff; }
69 + background: @brand;
70 + color: #fff;
71 + &:hover,
72 + &:focus {
73 + background: @brand-strong;
74 + color: #fff;
75 + }
42 42   }
43 - &-ghost {
44 - background: #fff; color: @brand; border-color: @brand;
45 - &:hover { color: @brand-strong; border-color: @brand-strong; }
46 - }
47 47   }
48 48  
49 - /* HERO (centered) */
79 + /* ===== HERO ===== */
50 50   .hero {
81 + overflow: hidden;
82 + background-repeat: no-repeat;
83 + background-attachment: scroll;
84 +
51 51   &.hero-centered {
52 52   text-align: center;
53 53   background:
... ... @@ -56,237 +56,177 @@
56 56   display: flex;
57 57   align-items: center;
58 58   justify-content: center;
59 - min-height: 350px; /* reduced height */
60 - /*padding: 48px 0; /* controlled vertical spacing */
93 + min-height: 350px;
94 + }
61 61  
62 - .hero-inner {
63 - /*max-width: 760px;*/
64 - margin: auto;
65 - display: flex;
66 - flex-direction: column;
67 - align-items: center;
68 - gap: 1rem;
69 - }
96 + .hero-inner {
97 + max-width: 850px;
98 + margin: 0 auto;
99 + display: flex;
100 + flex-direction: column;
101 + align-items: center;
102 + gap: 1rem;
103 + }
70 70  
71 - /*h1 {
72 - font-size: clamp(1.9rem, 2.3vw + 1rem, 2.7rem);
73 - line-height: 1.15;
74 - margin: 0.4rem 0 0.5rem;
75 - }*/
105 + .hero-cta {
106 + display: flex;
107 + gap: 0.8rem;
108 + flex-wrap: wrap;
109 + justify-content: center;
110 + margin-top: 0.3rem;
111 + }
76 76  
77 - .lead {
78 - color: @muted;
79 - /*max-width: 68ch;*/
80 - margin: 0 auto 0.9rem;
81 - }
113 + .benefits {
114 + display: flex;
115 + flex-wrap: wrap;
116 + justify-content: center;
117 + list-style: none;
118 + padding: 0;
119 + margin: 0.8rem 0 0;
120 + color: @muted;
121 + font-size: 14px;
82 82  
83 - .hero-cta {
84 - display: flex;
85 - gap: 0.8rem;
86 - flex-wrap: wrap;
87 - justify-content: center;
88 - margin-top: 0.3rem;
123 + li + li::before {
124 + content: "•";
125 + margin: 0 5px;
89 89   }
90 90  
91 - .benefits {
92 - display: flex;
93 - flex-wrap: wrap;
94 - justify-content: center;
95 - list-style: none;
96 - padding: 0;
97 - margin: 0.8rem 0 0;
98 - color: @muted;
99 - font-size: 14px;
100 - gap: 5px;
101 - li {
102 - /*margin-left: 5px;*/
103 - }
128 + @media (max-width: 640px) {
104 104   li + li::before {
130 + content: none;
131 + }
132 + li:nth-child(1)::after,
133 + li:nth-child(3)::after {
105 105   content: "•";
106 - margin-right: 5px;
135 + margin: 0 5px;
107 107   }
108 - /* Mobile: show bullets only between 1–2 and 3–4 */
109 - @media (max-width: 640px) {
110 - /* override the exact selector used above */
111 - li + li::before { content: none; }
112 - /* Add bullet only after item 1 and item 3 */
113 - li:nth-child(1)::after,
114 - li:nth-child(3)::after {
115 - content: "•";
116 - margin-left: 5px;
117 - }
118 - }
119 119   }
120 120   }
121 121   }
122 122  
123 - /* === WHY CHOOSE (widgets using Bootstrap grid) === */
141 + /* ===== WHY CHOOSE (cards) ===== */
124 124   .widgets {
125 125   margin-top: 12px;
144 + display: grid;
145 + grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
146 + grid-gap: 16px;
147 + }
126 126  
127 - /* Flex layout for equal-height and spacing */
149 + .widget {
150 + padding: 18px;
151 + background: #fff;
152 + border: 1px solid @line;
153 + border-radius: @radius;
154 + box-shadow: @shadow-sm;
155 + transition: transform .18s ease, box-shadow .18s ease;
128 128   display: flex;
129 - flex-wrap: wrap;
130 - justify-content: space-between;
157 + flex-direction: column;
158 + height: 100%;
131 131  
132 - .widget {
133 - box-sizing: border-box;
160 + &:hover {
161 + transform: translateY(-2px);
162 + box-shadow: @shadow;
163 + }
134 134  
135 - /* Desktop (md+) – 4 per row */
136 - flex: 0 0 24%;
137 - max-width: 24%;
138 - margin-bottom: 16px;
139 -
140 - /* Card look */
165 + .icon {
141 141   display: flex;
142 - flex-direction: column;
143 - height: 100%;
144 - padding: 18px;
145 - background: #fff;
146 - border: 1px solid @line;
147 - border-radius: @radius;
148 - box-shadow: @shadow-sm;
149 - transition: transform .18s ease, box-shadow .18s ease;
150 -
151 - &:hover {
152 - transform: translateY(-2px);
153 - box-shadow: @shadow;
154 - }
155 -
156 - .icon {
157 - display: flex;
158 - align-items: center;
159 - gap: 10px;
160 - padding-bottom: 6px;
161 - margin-bottom: 8px;
162 - border-bottom: 1px solid fade(@line, 60%);
163 - i { color: @brand; }
164 - h4 { margin: 0; line-height: 1.2; color: @text; }
165 - }
166 -
167 - p {
168 - margin: 0;
169 - color: @muted;
170 - line-height: 1.45;
171 - }
167 + align-items: center;
168 + gap: 10px;
169 + padding-bottom: 6px;
170 + margin-bottom: 8px;
171 + border-bottom: 1px solid fade(@line, 60%);
172 + i { color: @brand; }
173 + h4 { margin: 0; line-height: 1.2; color: @text; }
172 172   }
173 173  
174 - /* Tablet (sm–md) – 2 per row */
175 - @media (max-width: 991px) {
176 - .widget {
177 - flex: 0 0 48%;
178 - max-width: 48%;
179 - }
176 + p {
177 + margin: 0;
178 + color: @muted;
179 + line-height: 1.45;
180 180   }
181 -
182 - /* Mobile (xs) – 1 per row */
183 - @media (max-width: 767px) {
184 - .widget {
185 - flex: 0 0 100%;
186 - max-width: 100%;
187 - }
188 - }
189 189   }
190 190  
191 - /* SERVICES */
183 + /* ===== SERVICES ===== */
192 192   .services {
193 193   .services-grid {
194 - margin-top: 12px;
186 + margin-top: 20px;
187 + display: flex;
188 + flex-wrap: wrap;
189 + gap: 24px; // space between items
190 + }
195 195  
196 - .service {
197 - margin-bottom: 24px;
192 + .service {
193 + /* 2 items per row: 50% minus half the gap so row fits in 100% */
194 + flex: 0 1 calc(50% - 12px);
195 + display: flex;
196 + align-items: flex-start;
197 + gap: 16px;
198 + margin-bottom: 8px; // extra vertical breathing room
198 198  
199 - /* icon + text side by side */
200 + .service-icon {
201 + width: 42px;
202 + height: 42px;
203 + border-radius: 50%;
200 200   display: flex;
201 - align-items: flex-start;
202 - gap: 16px;
205 + align-items: center;
206 + justify-content: center;
207 + font-size: 18px;
208 + color: @brand;
209 + background: fade(@brand, 10%);
210 + flex-shrink: 0;
211 + margin-top: 3px;
212 + }
203 203  
204 - .service-icon {
205 - width: 42px;
206 - height: 42px;
207 - border-radius: 50%;
208 - display: flex;
209 - align-items: center;
210 - justify-content: center;
211 - font-size: 18px;
212 - color: @brand;
213 - background: fade(@brand, 10%);
214 - margin-top: 3px;
215 - flex-shrink: 0;
214 + .service-body {
215 + h4 {
216 + margin: 0 0 4px;
217 + font-size: 1.125rem;
218 + font-weight: 800;
216 216   }
217 217  
218 - .service-body {
219 - h4 {
220 - margin: 0 0 4px;
221 - font-size: 1.125rem;
222 - font-weight: 800;
223 - }
224 -
225 - p {
226 - margin: 0 0 6px;
227 - color: @text;
228 - line-height: 1.5;
229 - }
230 -
231 - ul {
232 - margin: .45rem 0 0;
233 - padding-left: 1.1rem;
234 - color: @muted;
235 - font-size: 13px;
236 - }
237 -
238 - li {
239 - margin: .25rem 0;
240 - line-height: 1.45;
241 - }
221 + p {
222 + margin: 0 0 6px;
223 + color: @text;
224 + line-height: 1.5;
242 242   }
243 - }
244 - }
245 245  
246 - @media (max-width: 767px) {
247 - .services-grid {
248 - .service {
249 - margin-bottom: 20px;
227 + ul {
228 + margin: .45rem 0 0;
229 + padding-left: 1.1rem;
230 + color: @muted;
231 + font-size: 13px;
250 250   }
251 251  
252 - .service-icon {
253 - width: 36px;
254 - height: 36px;
255 - font-size: 16px;
234 + li {
235 + margin: .25rem 0;
236 + line-height: 1.45;
256 256   }
257 257   }
258 258   }
259 - }
260 260  
261 - /* METRICS */
262 - .metrics {
263 - display: grid; gap: 14px; grid-template-columns: repeat(2, 1fr);
264 - @media (min-width: 720px) { grid-template-columns: repeat(4, 1fr); }
265 - .metric {
266 - background: #fff; border: 1px solid @line; border-radius: 14px; padding: 16px; text-align: center; box-shadow: @shadow-sm;
267 - .num { font-size: 1.6rem; font-weight: 800; color: @brand; }
268 - .label { color: @muted; font-size: .92rem; }
241 + /* Center the last item when odd:
242 + auto margins in a flex row push it to the middle */
243 + .service--center {
244 + margin-left: auto;
245 + margin-right: auto;
269 269   }
270 - }
271 271  
272 - /* PROCESS */
273 - .steps {
274 - display: grid; gap: 16px; grid-template-columns: 1fr;
275 - @media (min-width: 860px) { grid-template-columns: repeat(3, 1fr); }
276 - .step {
277 - background: #fff; border: 1px solid @line; border-radius: @radius; padding: 18px; box-shadow: @shadow-sm;
248 + /* Mobile: 1 per row */
249 + @media (max-width: 767px) {
250 + .services-grid {
251 + gap: 16px;
252 + }
253 + .service {
254 + flex: 0 1 100%;
255 + }
256 + .service--center {
257 + margin-left: 0;
258 + margin-right: 0;
259 + }
278 278   }
279 279   }
280 280  
281 - /* FAQ */
282 - .faq {
283 - details {
284 - border: 1px solid @line; border-radius: @radius-sm; padding: .75rem .9rem; background: #fff; margin: .6rem 0;
285 - summary { cursor: pointer; font-weight: 650; }
286 - &[open] { box-shadow: @shadow-sm; }
287 - }
288 - }
289 -
263 + /* ===== CTA ===== */
290 290   .cta-section {
291 291   padding: 24px 0 16px;
292 292  
... ... @@ -296,23 +296,5 @@
296 296   a { color: @brand; }
297 297   }
298 298   }
299 -
300 - /* ===== Prevent horizontal overflow ===== */
301 - html, body {
302 - overflow-x: hidden;
303 - }
304 -
305 - /* Ensure hero gradients don't bleed */
306 - .hero {
307 - overflow: hidden; /* contain background overflow */
308 - background-repeat: no-repeat;
309 - background-attachment: scroll;
310 - }
311 -
312 - /* Safety for large paddings/margins that might extend */
313 - section, .widgets, .services, .metrics, .steps {
314 - margin-left: auto;
315 - margin-right: auto;
316 - }
317 317  }
318 318