Changes for page products
Last modified by Alex Cotiugă on 2026/05/12 20:27
From version 1.10
edited by Alex Cotiugă
on 2026/05/12 20:02
on 2026/05/12 20:02
Change comment:
There is no comment for this version
To version 1.3
edited by Alex Cotiugă
on 2026/05/12 19:52
on 2026/05/12 19:52
Change comment:
There is no comment for this version
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Objects (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -1,92 +1,54 @@ 1 1 {{velocity}} 2 2 #set ($discard = $xwiki.ssx.use('PublicWebSite.WebHome')) 3 -#set ($discard = $xwiki.ssx.use('products.WebHome')) 4 4 {{html clean="false"}} 5 5 6 - ## PAGE HEADER 7 - <section class="hero hero-centered product-hero" aria-labelledby="hero-title"> 8 - <div class="container hero-inner"> 9 - <div class="hero-kicker"> 10 - <i class="fa fa-cube" aria-hidden="true"></i> 11 - Agnease products 12 - </div> 5 +<section class="page-header-compact" aria-labelledby="page-title"> 6 + <div class="container"> 7 + <p class="page-eyebrow">Agnease products</p> 8 + <h1 id="page-title">XWiki Applications and Extensions</h1> 9 + <p class="page-lead"> 10 + Practical XWiki extensions built to improve security, workflows, administration and long-term platform usability. 11 + </p> 12 + </div> 13 +</section> 13 13 14 - <h1 id="hero-title">XWiki applications and extensions</h1> 15 +<section aria-labelledby="products-title"> 16 + <div class="container"> 17 + <h2 id="products-title">Available extensions</h2> 15 15 16 - <p class="lead"> 17 - Practical XWiki extensions built to improve security, workflows, administration and long-term platform usability. 18 - </p> 19 + <div class="product-card-grid"> 20 + <article class="product-card"> 21 + <div class="product-card-icon"> 22 + <i class="fa fa-lock" aria-hidden="true"></i> 23 + </div> 19 19 20 - <p class="hero-support"> 21 - Agnease products are designed for organizations that use XWiki as a production platform and need focused, 22 - maintainable extensions that fit naturally into the XWiki experience. 23 - </p> 24 - </div> 25 - </section> 25 + <h3>XWiki Two-Factor Authentication</h3> 26 26 27 - ## PRODUCT CARDS 28 - #set ($productItems = [{ 29 - 'title': 'XWiki Two-Factor Authentication', 30 - 'icon': 'lock', 31 - 'url': 'products.xwiki-two-factor-authentication', 32 - 'label': 'Security extension', 33 - 'content': 'Add a second verification step to the standard XWiki login flow using time-based one-time codes, without replacing the standard XWiki authentication experience.' 34 - }]) 35 - 36 - <section id="products-list" class="services products-list" aria-labelledby="items-title"> 37 - <div class="container"> 38 - <h2 id="items-title">Available extensions</h2> 39 - 40 - <p class="section-intro"> 41 - The first Agnease product focuses on strengthening access to XWiki while keeping the standard XWiki login experience. 42 - </p> 43 - 44 - <div class="services-grid products-grid"> 45 - #foreach ($entry in $productItems) 46 - <article class="service product-item"> 47 - <div class="service-icon" aria-hidden="true"> 48 - <i class="fa fa-$entry.icon"></i> 49 - </div> 50 - 51 - <div class="service-body"> 52 - <div class="hero-kicker product-item-kicker"> 53 - <i class="fa fa-$entry.icon" aria-hidden="true"></i> 54 - $entry.label 55 - </div> 56 - 57 - <h4>$entry.title</h4> 58 - <p>$entry.content</p> 59 - 60 - <ul class="product-highlights"> 61 - <li>Works with the standard XWiki authentication flow</li> 62 - <li>Adds a TOTP verification step after username/password login</li> 63 - <li>Includes user setup and administration controls</li> 64 - </ul> 65 - 66 - <p class="card-link"> 67 - <a href="$xwiki.getURL($entry.url)">View extension</a> 68 - </p> 69 - </div> 70 - </article> 71 - #end 72 - </div> 73 - </div> 74 - </section> 75 - 76 - ## CTA 77 - <section class="cta-section" aria-labelledby="cta-title"> 78 - <div class="container"> 79 - <div class="cta-panel"> 80 - <h2 id="cta-title">Need a custom XWiki application?</h2> 81 - 82 82 <p> 83 - Agnease also builds custom XWiki applications, workflows, integrations and extensions adapted to specific business processes. 28 + Add a second verification step to the standard XWiki login flow using time-based one-time codes. 29 + The extension is designed for organizations that want stronger account protection without replacing 30 + the standard XWiki authentication experience. 84 84 </p> 85 85 86 - <a class="btn btn-primary" href="$xwiki.getURL('contact.WebHome')">Contact Agnease</a> 87 - </div> 33 + <p class="card-link"> 34 + <a href="$xwiki.getURL('products.xwiki-two-factor-authentication')">View extension</a> 35 + </p> 36 + </article> 88 88 </div> 89 - </section> 38 + </div> 39 +</section> 90 90 41 +<section class="cta-section"> 42 + <div class="container"> 43 + <div class="cta-panel"> 44 + <h2>Need a custom XWiki application?</h2> 45 + <p> 46 + Agnease also builds custom XWiki applications, workflows, integrations and extensions adapted to specific business processes. 47 + </p> 48 + <a class="btn btn-primary" href="$xwiki.getURL('contact.WebHome')">Contact Agnease</a> 49 + </div> 50 + </div> 51 +</section> 52 + 91 91 {{/html}} 92 92 {{/velocity}}
- XWiki.StyleSheetExtension[0]
-
- code
-
... ... @@ -1,31 +1,28 @@ 1 1 /* ========== Agnease Products / Extensions ========== */ 2 -/* Self-contained variables because LESS variables are not shared between SSX pages. */ 3 3 4 -@brand: #00937D; 5 -@brand-strong: #007B6A; 6 -@text: #2D3A34; 7 -@muted: #5B6B64; 8 -@line: #E4ECE9; 9 -@brand-bg: #F4FCFA; 10 -@brand-soft: #E7FFF8; 11 -@radius: 14px; 12 -@shadow-sm: 0 10px 28px rgba(0, 0, 0, .06); 3 +.public-nav { 4 + display: flex; 5 + align-items: center; 6 + gap: 24px; 13 13 14 -.agnease-product-page { 15 - color: @text; 8 + a { 9 + color: @brand; 10 + font-weight: 700; 11 + text-decoration: none; 16 16 17 - .container { 18 - max-width: 1040px; 13 + &:hover, 14 + &:focus { 15 + color: @brand-strong; 16 + text-decoration: underline; 17 + } 19 19 } 19 +} 20 20 21 - .product-index-hero { 22 - padding: 56px 0 48px; 23 - text-align: center; 24 - background: 25 - radial-gradient(42rem 16rem at 50% -10%, @brand-soft 0%, transparent 65%), 26 - radial-gradient(42rem 16rem at 50% 0%, #E8F6F3 0%, transparent 60%); 27 - border-bottom: 1px solid @line; 28 - } 21 +.page-header-compact { 22 + background: 23 + radial-gradient(42rem 16rem at 50% -10%, #E7FFF8 0%, transparent 65%), 24 + radial-gradient(42rem 16rem at 50% 0%, #E8F6F3 0%, transparent 60%); 25 + text-align: center; 29 29 30 30 .page-eyebrow { 31 31 color: @brand; ... ... @@ -33,193 +33,250 @@ 33 33 font-weight: 800; 34 34 text-transform: uppercase; 35 35 letter-spacing: .06em; 36 - margin: 0 0 10px;33 + margin-bottom: 8px; 37 37 } 38 38 39 39 h1 { 40 - margin: 0; 37 + margin-top: 0; 41 41 color: @text; 42 - font-size: 36px; 43 - line-height: 1.2; 44 - font-weight: 700; 45 45 } 46 46 47 47 .page-lead { 48 48 max-width: 760px; 49 - margin: 14pxauto0;43 + margin: 0 auto; 50 50 color: @muted; 51 51 font-size: 18px; 52 52 line-height: 1.55; 53 53 } 48 +} 54 54 55 - .product-index-section { 56 - padding: 52px 0 56px; 50 +.product-hero { 51 + background: 52 + radial-gradient(48rem 18rem at 50% -10%, #E7FFF8 0%, transparent 65%), 53 + radial-gradient(48rem 18rem at 50% 0%, #E8F6F3 0%, transparent 60%); 54 +} 57 57 58 - h2 { 59 - text-align: center; 60 - margin: 0 0 10px; 61 - color: @text; 62 - font-size: 28px; 63 - line-height: 1.25; 64 - font-weight: 600; 65 - } 56 +.product-kicker { 57 + display: inline-flex; 58 + align-items: center; 59 + gap: 8px; 60 + color: @brand; 61 + background: fade(@brand, 8%); 62 + border: 1px solid fade(@brand, 18%); 63 + border-radius: 999px; 64 + padding: 6px 12px; 65 + margin-bottom: 14px; 66 + font-size: 13px; 67 + font-weight: 800; 68 +} 69 + 70 +.product-layout { 71 + max-width: 1040px; 72 + margin: 0 auto; 73 + display: grid; 74 + grid-template-columns: 1.1fr .9fr; 75 + grid-gap: 28px; 76 + align-items: start; 77 +} 78 + 79 +.product-summary-card, 80 +.product-info-card, 81 +.product-gallery-panel { 82 + background: #fff; 83 + border: 1px solid @line; 84 + border-radius: @radius; 85 + box-shadow: @shadow-sm; 86 +} 87 + 88 +.product-summary-card { 89 + padding: 24px; 90 + 91 + h2 { 92 + text-align: left; 93 + margin-top: 0; 66 66 } 67 67 68 - .section-intro { 69 - max-width: 760px; 70 - margin: 0 auto 26px; 71 - text-align: center; 96 + p { 72 72 color: @muted; 73 - font-size: 16px; 74 - line-height: 1.55; 98 + line-height: 1.6; 75 75 } 100 +} 76 76 77 - .product-card-grid{78 - max-width:840px;79 - margin: 0 auto;80 - display: grid;81 - grid-template-columns:1fr;82 - grid-gap:18px;102 +.product-info-card { 103 + padding: 20px; 104 + 105 + h3 { 106 + margin-top: 0; 107 + color: @text; 83 83 } 84 84 85 - .product-card { 86 - background: #fff; 87 - border: 1px solid @line; 88 - border-radius: @radius; 89 - box-shadow: @shadow-sm; 90 - padding: 28px; 91 - display: grid; 92 - grid-template-columns: 68px 1fr; 93 - grid-gap: 22px; 94 - align-items: start; 110 + ul { 111 + margin: 0; 112 + padding-left: 20px; 113 + color: @muted; 95 95 } 96 96 97 - .product-card-icon { 98 - width: 58px; 99 - height: 58px; 116 + li { 117 + margin: 8px 0; 118 + line-height: 1.45; 119 + } 120 +} 121 + 122 +.product-feature-grid { 123 + max-width: 1040px; 124 + margin: 22px auto 0; 125 + display: grid; 126 + grid-template-columns: repeat(3, minmax(0, 1fr)); 127 + grid-gap: 16px; 128 +} 129 + 130 +.product-feature { 131 + background: #fff; 132 + border: 1px solid @line; 133 + border-radius: @radius; 134 + box-shadow: @shadow-sm; 135 + padding: 18px; 136 + 137 + .feature-icon { 138 + width: 42px; 139 + height: 42px; 100 100 border-radius: 50%; 101 101 background: fade(@brand, 10%); 102 - border: 1px solid fade(@brand, 20%); 103 103 color: @brand; 104 104 display: flex; 105 105 align-items: center; 106 106 justify-content: center; 107 - font-size: 22px; 146 + margin-bottom: 12px; 147 + font-size: 17px; 108 108 } 109 109 110 - .product-label { 111 - display: inline-flex; 150 + h3 { 112 112 margin: 0 0 8px; 113 - padding: 5px 10px; 114 - border-radius: 999px; 115 - color: @brand; 116 - background: fade(@brand, 8%); 117 - border: 1px solid fade(@brand, 18%); 118 - font-size: 12px; 119 - font-weight: 800; 120 - text-transform: uppercase; 121 - letter-spacing: .04em; 122 - } 123 - 124 - .product-card h3 { 125 - margin: 0 0 10px; 126 126 color: @text; 127 - font-size: 23px; 128 - line-height: 1.25; 129 - font-weight: 600; 153 + font-size: 18px; 130 130 } 131 131 132 - .product-card p { 156 + p { 157 + margin: 0; 133 133 color: @muted; 134 - line-height: 1. 6;159 + line-height: 1.5; 135 135 } 161 +} 136 136 137 - .product-highlights{138 - margin: 14px020px;139 - padding-left:18px;140 - color:@muted;163 +.product-gallery-panel { 164 + max-width: 1040px; 165 + margin: 20px auto 0; 166 + padding: 22px; 141 141 142 - li { 143 - margin: 6px 0; 144 - line-height: 1.45; 145 - } 168 + h2 { 169 + margin-top: 0; 146 146 } 147 147 148 - .card-link { 149 - margin: 0; 172 + .gallery-note { 173 + max-width: 700px; 174 + margin: 0 auto 18px; 175 + color: @muted; 176 + text-align: center; 177 + line-height: 1.55; 150 150 } 179 +} 151 151 152 - .btn-secondary { 181 +.product-gallery-placeholder { 182 + border: 1px dashed fade(@brand, 40%); 183 + background: fade(@brand, 5%); 184 + border-radius: @radius; 185 + min-height: 260px; 186 + padding: 28px; 187 + text-align: center; 188 + color: @muted; 189 + display: flex; 190 + align-items: center; 191 + justify-content: center; 192 +} 193 + 194 +.product-card-grid { 195 + max-width: 1040px; 196 + margin: 22px auto 0; 197 + display: grid; 198 + grid-template-columns: repeat(2, minmax(0, 1fr)); 199 + grid-gap: 18px; 200 +} 201 + 202 +.product-card { 203 + background: #fff; 204 + border: 1px solid @line; 205 + border-radius: @radius; 206 + box-shadow: @shadow-sm; 207 + padding: 22px; 208 + display: flex; 209 + flex-direction: column; 210 + 211 + .product-card-icon { 212 + width: 46px; 213 + height: 46px; 214 + border-radius: 50%; 215 + background: fade(@brand, 10%); 153 153 color: @brand; 154 - background: #fff; 155 - border: 1px solid fade(@brand, 35%); 217 + display: flex; 218 + align-items: center; 219 + justify-content: center; 220 + margin-bottom: 14px; 221 + font-size: 18px; 222 + } 156 156 157 - &:hover, 158 - &:focus { 159 - color: @brand-strong; 160 - border-color: @brand; 161 - background: @brand-bg; 162 - text-decoration: none; 163 - } 224 + h3 { 225 + margin: 0 0 8px; 226 + color: @text; 164 164 } 165 165 166 - .product-cta-section { 167 - padding: 0 0 56px; 229 + p { 230 + color: @muted; 231 + line-height: 1.55; 168 168 } 169 169 170 - .product-cta-panel { 171 - max-width: 860px; 172 - margin: 0 auto; 173 - padding: 32px; 174 - border-radius: @radius; 175 - border: 1px solid fade(@brand, 20%); 176 - background: 177 - radial-gradient(34rem 12rem at 50% 0%, @brand-soft 0%, #fff 70%); 178 - box-shadow: @shadow-sm; 179 - text-align: center; 234 + .card-link { 235 + margin-top: auto; 180 180 181 - h2 { 182 - margin: 0 0 12px; 183 - color: @text; 184 - font-size: 26px; 185 - line-height: 1.25; 237 + a { 238 + color: @brand; 239 + font-weight: 800; 186 186 } 187 - 188 - p { 189 - max-width: 680px; 190 - margin: 0 auto 18px; 191 - color: @muted; 192 - line-height: 1.55; 193 - } 194 194 } 195 195 } 196 196 197 -@media (max-width: 767px) { 198 - .agnease-product-page { 199 - .product-index-hero { 200 - padding: 38px 0 34px; 201 - } 244 +.cta-panel { 245 + max-width: 860px; 246 + margin: 0 auto; 247 + padding: 30px; 248 + border-radius: @radius; 249 + border: 1px solid fade(@brand, 20%); 250 + background: 251 + radial-gradient(34rem 12rem at 50% 0%, #E7FFF8 0%, #fff 70%); 252 + box-shadow: @shadow-sm; 253 + text-align: center; 202 202 203 - h1{204 - font-size:30px;205 - }255 + h2 { 256 + margin-top: 0; 257 + } 206 206 207 - .page-lead { 208 - font-size: 16px; 209 - } 259 + p { 260 + color: @muted; 261 + line-height: 1.55; 262 + } 263 +} 210 210 211 - .product-card { 212 - grid-template-columns: 1fr; 213 - padding: 22px; 214 - text-align: left; 215 - } 265 +@media (max-width: 900px) { 266 + .product-layout, 267 + .product-feature-grid, 268 + .product-card-grid { 269 + grid-template-columns: 1fr; 270 + } 216 216 217 - .product-card-icon{218 - margin-bottom:2px;219 - }272 + .product-summary-card h2 { 273 + text-align: center; 274 + } 220 220 221 - .product-cta-panel { 222 - padding: 24px; 223 - } 276 + .public-nav { 277 + gap: 14px; 224 224 } 225 225 }