Changes for page Public Web Site
Last modified by Agnease on 2026/05/30 16:24
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Objects (0 modified, 1 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -1,147 +1,235 @@ 1 1 {{velocity}} 2 -#set ($discard = $xwiki.ssx.use('Main.WebHome')) 3 -{{html clean="false"}} 4 - ## HERO 5 - <section class="hero hero-centered" aria-labelledby="hero-title"> 6 - <div class="container hero-inner"> 7 - <h1 id="hero-title">Professional XWiki solutions, from setup to long-term stability</h1> 8 - <p class="lead">Need your XWiki upgraded, secured, or improved? Let’s make it happen.</p> 9 - <div class="hero-cta"> 10 - <a class="btn btn-primary" href="#contact" aria-label="Schedule a call with Agnease"> 11 - Request a consultation 12 - </a> 2 +#macro (displayPublicContent) 3 + #set ($discard = $xwiki.ssx.use('PublicWebSite.WebHome')) 4 + {{html clean="false"}} 5 + 6 + <section class="hero hero-centered" aria-labelledby="hero-title"> 7 + <div class="container hero-inner"> 8 + <div class="hero-kicker"> 9 + <i class="fa fa-shield" aria-hidden="true"></i> 10 + XWiki consulting, upgrades and long-term support 11 + </div> 12 + 13 + <h1 id="hero-title">Reliable XWiki engineering for organizations that depend on their knowledge platform</h1> 14 + 15 + <p class="lead"> 16 + Agnease helps companies keep XWiki secure, stable, up-to-date and adapted to real business processes. 17 + </p> 18 + 19 + <p class="hero-support"> 20 + From LTS upgrades and maintenance to custom applications, integrations, workflows and migrations, 21 + Agnease provides focused XWiki expertise with practical delivery and long-term care. 22 + </p> 23 + 24 + <ul class="benefits"> 25 + <li>Safe LTS upgrades</li> 26 + <li>Support and recovery</li> 27 + <li>Custom XWiki applications</li> 28 + <li>Integrations and migrations</li> 29 + </ul> 30 + 31 + <div class="hero-actions"> 32 + <a class="btn btn-primary" href="$xwiki.getURL('contact.WebHome')">Request a consultation</a> 33 + <a class="btn btn-secondary" href="$xwiki.getURL('services.WebHome')">View XWiki services</a> 34 + </div> 13 13 </div> 14 - <ul class="benefits"> 15 - <li>Smooth upgrades</li> 16 - <li>Reliable support plans</li> 17 - <li>Custom integrations</li> 18 - <li>Secure, optimized platforms</li> 19 - </ul> 20 - </div> 21 - </section> 22 - ## WHY CHOOSE 23 - #set ($whySectionData = [{ 24 - 'title': 'Stability & security', 25 - 'icon': 'shield', 26 - 'content': 'Proven upgrade steps, rollback safety, and proactive hardening keep your wiki reliable.' 27 - },{ 28 - 'title': 'Predictable delivery', 29 - 'icon': 'check-square-o', 30 - 'content': 'Clear scope, defined steps, and documented results to avoid surprises.' 31 - },{ 32 - 'title': 'Clean integrations', 33 - 'icon': 'link', 34 - 'content': 'Maintainable SSO, API, and system connections tailored to your environment.' 35 - },{ 36 - 'title': 'Long-term support', 37 - 'icon': 'life-ring', 38 - 'content': 'Guaranteed response times, regular checks, and fast assistance when needed.' 39 - }]) 40 - <section aria-labelledby="why-title"> 41 - <div class="container"> 42 - <h2 id="why-title">Why choose Agnease</h2> 43 - <p class="lead">10+ years of XWiki expertise with structured delivery and lasting collaboration</p> 44 - <div class="widgets"> 45 - #foreach ($entry in $whySectionData) 46 - <article class="widget"> 47 - <div class="icon" aria-hidden="true"> 48 - <i class="fa fa-$entry.icon"></i> 49 - <h4>$entry.title</h4> 50 - </div> 51 - <p>$entry.content</p> 52 - </article> 53 - #end 36 + </section> 37 + 38 + <section class="trust-strip" aria-label="Agnease experience"> 39 + <div class="container"> 40 + <ul> 41 + <li><i class="fa fa-check-circle" aria-hidden="true"></i> 11+ years of XWiki experience</li> 42 + <li><i class="fa fa-check-circle" aria-hidden="true"></i> Upgrades, support and custom development</li> 43 + <li><i class="fa fa-check-circle" aria-hidden="true"></i> Security-aware maintenance</li> 44 + <li><i class="fa fa-check-circle" aria-hidden="true"></i> Practical long-term collaboration</li> 45 + </ul> 54 54 </div> 55 - </div> 56 - </section> 57 - ## SERVICES 58 - #set ($servicesSectionData = [{ 59 - 'title': 'Upgrades', 60 - 'icon': 'refresh', 61 - 'content': 'Stay current with the latest XWiki LTS and keep your instance reliable.', 62 - 'items': [ 63 - 'Audit setup, extensions, and configurations', 64 - 'Test upgrades with backups and validation', 65 - 'Safe production rollout with minimal downtime' 66 - ] 67 - },{ 68 - 'title': 'Maintenance, Support & Recovery', 69 - 'icon': 'stethoscope', 70 - 'content': 'Ensure long-term stability and quick response when issues appear.', 71 - 'items': [ 72 - 'Monitoring and performance checks', 73 - 'Security patching, log analysis, triage', 74 - 'Issue recovery, data repair, hardening' 75 - ] 76 - },{ 77 - 'title': 'Development & Integrations', 78 - 'icon': 'cogs', 79 - 'content': 'Extend and connect XWiki to fit your workflow and systems.', 80 - 'items': [ 81 - 'Custom apps, macros, automation', 82 - 'SSO, REST APIs, LDAP, CRM links', 83 - 'Maintainable extensions for long-term use' 84 - ] 85 - },{ 86 - 'title': 'Hosting & Deployment', 87 - 'icon': 'cloud', 88 - 'content': 'Cloud-ready environments designed for reliability and performance.', 89 - 'items': [ 90 - 'Containerized deployment and TLS', 91 - 'Backups, restore strategy, observability', 92 - 'Optimization and load tuning' 93 - ] 94 - },{ 95 - 'title': 'Migrations to XWiki', 96 - 'icon': 'exchange', 97 - 'content': 'Move from Confluence, SharePoint, or MediaWiki to XWiki with full data integrity and structure.', 98 - 'items': [ 99 - 'Preserve hierarchy, attachments, and permissions', 100 - 'Convert macros, categories, and metadata for XWiki', 101 - 'Redirect old URLs and maintain SEO consistency' 102 - ] 103 - }]) 104 - <section class="services" aria-labelledby="services-title"> 105 - <div class="container"> 106 - <h2 id="services-title">Services</h2> 107 - <p class="lead"> 108 - All the XWiki services you need, delivered with precision and care 109 - </p> 47 + </section> 110 110 111 - #set($servicesSize= $servicesSectionData.size())112 - <div class=" services-grid">113 - #foreach($entryin$servicesSectionData)114 - #set ($classes="service")115 - ##Ifthisisthe last itemANDthetotalnumber is odd, centerit116 - #if($foreach.count== $servicesSize&& ($servicesSize % 2) == 1)117 - #set ($classes="serviceservice-center")118 - #end49 + <section aria-labelledby="platform-title"> 50 + <div class="container"> 51 + <h2 id="platform-title">When XWiki becomes business-critical, it needs professional care</h2> 52 + <p class="section-intro"> 53 + Many organizations start with XWiki as a documentation platform. Over time, it becomes a knowledge base, 54 + intranet, SOP portal, workflow system, audit trail or integration hub. At that point, upgrades, security, 55 + performance, permissions and maintainability are no longer optional technical details. 56 + </p> 119 119 120 - <article class="$classes"> 121 - <div class="service-icon"> 122 - <i class="fa fa-$entry.icon" aria-hidden="true"></i> 58 + <div class="pathways"> 59 + <article class="pathway-card"> 60 + <div class="pathway-icon"> 61 + <i class="fa fa-refresh" aria-hidden="true"></i> 123 123 </div> 124 - <div class="service-body"> 125 - <h4>$entry.title</h4> 126 - <p>$entry.content</p> 127 - <ul> 128 - #foreach ($item in $entry.items) 129 - <li>$item</li> 130 - #end 131 - </ul> 63 + <h3>Keep XWiki current</h3> 64 + <p> 65 + Plan and execute safe upgrades to supported XWiki versions, with compatibility checks and rollback planning. 66 + </p> 67 + <ul> 68 + <li>LTS upgrade planning</li> 69 + <li>Extension and custom code review</li> 70 + <li>Production rollout validation</li> 71 + </ul> 72 + <p class="card-link"> 73 + <a href="/services/xwiki-upgrades">View upgrade services</a> 74 + </p> 75 + </article> 76 + 77 + <article class="pathway-card"> 78 + <div class="pathway-icon"> 79 + <i class="fa fa-life-ring" aria-hidden="true"></i> 132 132 </div> 81 + <h3>Keep XWiki reliable</h3> 82 + <p> 83 + Get long-term technical care for instances that need to stay stable, secure and recoverable. 84 + </p> 85 + <ul> 86 + <li>Troubleshooting and recovery</li> 87 + <li>Performance and log analysis</li> 88 + <li>Security-aware maintenance</li> 89 + </ul> 90 + <p class="card-link"> 91 + <a href="/services/xwiki-maintenance-support">View support services</a> 92 + </p> 133 133 </article> 134 - #end 94 + 95 + <article class="pathway-card"> 96 + <div class="pathway-icon"> 97 + <i class="fa fa-cogs" aria-hidden="true"></i> 98 + </div> 99 + <h3>Adapt XWiki to your business</h3> 100 + <p> 101 + Build workflows, custom applications, dashboards, integrations and automation around your processes. 102 + </p> 103 + <ul> 104 + <li>Custom XWiki applications</li> 105 + <li>Workflows and approvals</li> 106 + <li>SSO, LDAP, APIs and integrations</li> 107 + </ul> 108 + <p class="card-link"> 109 + <a href="/services/xwiki-development-integrations">View development services</a> 110 + </p> 111 + </article> 112 + </div> 135 135 </div> 136 - </div> 137 - </section> 138 - ## CTA INLINE 139 - <section id="contact" class="cta-section"> 140 - <div class="container"> 141 - <p class="text-center contact-inline"> 142 - Need help with your XWiki? <a href="mailto:alex@agnease.com">Contact Agnease</a>. 143 - </p> 144 - </div> 145 - </section> 146 -{{/html}} 114 + </section> 115 + 116 + <section class="split-section" aria-labelledby="why-title"> 117 + <div class="container"> 118 + <div class="split-grid"> 119 + <div class="split-copy"> 120 + <h2 id="why-title">Why choose Agnease</h2> 121 + <p> 122 + Agnease brings more than 11 years of hands-on XWiki expertise to organizations that need reliable 123 + knowledge platforms, secure upgrades, custom applications, integrations, migrations and long-term support. 124 + </p> 125 + <p> 126 + The approach is practical and engineering-focused: understand the current system, reduce risk, 127 + document the work and leave your XWiki easier to maintain. 128 + </p> 129 + </div> 130 + 131 + <ol class="process-list"> 132 + <li> 133 + <strong>Review the current situation</strong> 134 + Version, extensions, infrastructure, authentication, custom code and business-critical features. 135 + </li> 136 + <li> 137 + <strong>Define a safe path forward</strong> 138 + Clear scope, expected effort, risks, rollback options and recommended next steps. 139 + </li> 140 + <li> 141 + <strong>Deliver and document the work</strong> 142 + Practical implementation, validation and documentation for future maintenance. 143 + </li> 144 + </ol> 145 + </div> 146 + </div> 147 + </section> 148 + 149 + <section class="resource-strip" aria-labelledby="resources-title"> 150 + <div class="container"> 151 + <h2 id="resources-title">Useful XWiki resources</h2> 152 + <p class="section-intro"> 153 + Practical guidance for organizations running XWiki in production. 154 + </p> 155 + 156 + <div class="resource-grid"> 157 + <article class="resource-card"> 158 + <h4>Why upgrade your XWiki instance?</h4> 159 + <p> 160 + A business-focused explanation of why regular LTS upgrades reduce security, compatibility and maintenance risk. 161 + </p> 162 + <a href="/resources/why-upgrade-xwiki">Read the resource</a> 163 + </article> 164 + 165 + <article class="resource-card"> 166 + <h4>XWiki upgrade services</h4> 167 + <p> 168 + How Agnease approaches safe XWiki upgrades for real production environments with customizations and integrations. 169 + </p> 170 + <a href="/services/xwiki-upgrades">View the service</a> 171 + </article> 172 + </div> 173 + </div> 174 + </section> 175 + 176 + <section class="cta-section" aria-labelledby="contact-title"> 177 + <div class="container"> 178 + <div class="cta-panel"> 179 + <h2 id="contact-title">Need help with XWiki?</h2> 180 + <p> 181 + Send your current XWiki version, the problem you are facing, or the type of project you want to build. 182 + A short description is enough to start the conversation. 183 + </p> 184 + <a class="btn btn-primary" href="$xwiki.getURL('contact.WebHome')">Contact Agnease</a> 185 + </div> 186 + </div> 187 + </section> 188 + 189 + {{/html}} 190 +#end 191 + 192 +#macro (stripHTMLMacro $displayOutput) 193 + $stringtool.removeEnd($stringtool.removeStart($displayOutput, '{{html clean="false" wiki="false"}}'), '{{/html}}').replace('Agnease.Code.Lead.LeadClass_0_', 'acl-') 194 +#end 195 + 196 +#macro (displayFormFromSheetCode) 197 + #set ($editing = true) 198 + ## The object to display. 199 + #set ($xobject = $doc.newObject('Agnease.Code.Lead.LeadClass')) 200 + ## The class that describes the object properties. 201 + #set ($xclass = $xwiki.getClass('Agnease.Code.Lead.LeadClass')) 202 + ## Make sure the following display* method calls use the right object. 203 + #set ($discard = $doc.use($xobject)) 204 + ## Using the xform vertical form layout. 205 + <div class="xform"> 206 + <dl> 207 + #foreach ($property in $xclass.properties) 208 + #if ($property.name != 'status') 209 + <dt #if (!$editing) 210 + class="editableProperty" 211 + #set ($xobjectPropertyReference = $xobject.getPropertyReference($property.name)) 212 + data-property="$escapetool.xml($services.model.serialize($xobjectPropertyReference))" 213 + data-property-type="object"#end> 214 + ## This must match the id generated by the $doc.display() method below. 215 + #set ($propertyId = "acl-$property.name") 216 + <label#if ($editing) for="$escapetool.xml($propertyId)"#end> 217 + $escapetool.xml($property.translatedPrettyName) 218 + </label> 219 + ## Support for specifying a translation key as hint in the property definition. 220 + <span class="xHint">$!escapetool.xml($services.localization.render($property.hint))</span> 221 + </dt> 222 + #set ($displayOutput = $doc.display($property.name, 'edit')) 223 + <dd>#stripHTMLMacro($displayOutput)</dd> 224 + #end 225 + #end 226 + #if (!$xclass.properties || $xclass.properties.size() == 0) 227 + ## Keep the empty definition term in order to have valid HTML. 228 + <dt></dt> 229 + <dd>$escapetool.xml($services.localization.render('xclass.defaultObjectSheet.noProperties'))</dd> 230 + #end 231 + </dl> 232 + </div> 233 +#end 234 +#displayPublicContent 147 147 {{/velocity}}
- XWiki.StyleSheetExtension[0]
-
- cache
-
... ... @@ -1,0 +1,1 @@ 1 +long - code
-
... ... @@ -1,0 +1,237 @@ 1 +/* ========== Agnease Landing (no Bootstrap grid) ========== */ 2 +@brand: #00937D; 3 +@brand-strong: #007B6A; 4 +@text: #2D3A34; 5 +@muted: #5B6B64; 6 +@line: #E4ECE9; 7 +@radius: 16px; 8 +@shadow-sm: 0 6px 20px rgba(0,0,0,.06); 9 +@shadow: 0 12px 36px rgba(0,0,0,.08); 10 +@maxw: 1140px; 11 + 12 +#mainContentArea { 13 + padding: 0; 14 +} 15 + 16 +.container { 17 + max-width: @maxw; 18 +} 19 + 20 +.lead { 21 + color: @muted; 22 + text-align: center; 23 + margin-bottom: 0; 24 +} 25 +h2 { 26 + text-align: center; 27 +} 28 + 29 +section { 30 + padding: 32px 0; 31 + border-top: 1px solid @line; 32 + 33 + &:first-of-type { 34 + border-top: none; 35 + } 36 +} 37 + 38 +/* ===== HERO ===== */ 39 +.hero { 40 + overflow: hidden; 41 + background-repeat: no-repeat; 42 + background-attachment: scroll; 43 + 44 + &.hero-centered { 45 + text-align: center; 46 + background: 47 + radial-gradient(50rem 18rem at 50% -10%, #E7FFF8 0%, transparent 60%), 48 + radial-gradient(50rem 18rem at 50% 0%, #E8F6F3 0%, transparent 60%); 49 + display: flex; 50 + align-items: center; 51 + justify-content: center; 52 + min-height: 300px; 53 + } 54 + 55 + .hero-inner { 56 + max-width: 850px; 57 + margin: 0 auto; 58 + display: flex; 59 + flex-direction: column; 60 + align-items: center; 61 + } 62 + 63 + #hero-cta { 64 + display: flex; 65 + gap: 0.8rem; 66 + flex-wrap: wrap; 67 + justify-content: center; 68 + margin-top: 1.3rem; 69 + } 70 + 71 + .benefits { 72 + display: flex; 73 + flex-wrap: wrap; 74 + justify-content: center; 75 + list-style: none; 76 + padding: 0; 77 + margin: 0.8rem 0 0; 78 + color: @muted; 79 + font-size: 14px; 80 + 81 + li + li::before { 82 + content: "•"; 83 + margin: 0 5px; 84 + } 85 + 86 + @media (max-width: 640px) { 87 + li + li::before { 88 + content: none; 89 + } 90 + li:nth-child(1)::after, 91 + li:nth-child(3)::after { 92 + content: "•"; 93 + margin: 0 5px; 94 + } 95 + } 96 + } 97 +} 98 + 99 +/* ===== WHY CHOOSE (cards) ===== */ 100 +.widgets { 101 + margin-top: 12px; 102 + display: grid; 103 + grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); 104 + grid-gap: 16px; 105 +} 106 + 107 +.widget { 108 + padding: 18px; 109 + background: #fff; 110 + border: 1px solid @line; 111 + border-radius: @radius; 112 + box-shadow: @shadow-sm; 113 + transition: transform .18s ease, box-shadow .18s ease; 114 + display: flex; 115 + flex-direction: column; 116 + height: 100%; 117 + 118 + &:hover { 119 + transform: translateY(-2px); 120 + box-shadow: @shadow; 121 + } 122 + 123 + .icon { 124 + display: flex; 125 + align-items: center; 126 + gap: 10px; 127 + padding-bottom: 6px; 128 + margin-bottom: 8px; 129 + border-bottom: 1px solid fade(@line, 60%); 130 + i { color: @brand; } 131 + h4 { margin: 0; line-height: 1.2; color: @text; } 132 + } 133 + 134 + p { 135 + margin: 0; 136 + color: @muted; 137 + line-height: 1.45; 138 + } 139 +} 140 + 141 +/* ===== SERVICES ===== */ 142 +.services { 143 + .services-grid { 144 + margin-top: 20px; 145 + display: flex; 146 + flex-wrap: wrap; 147 + gap: 24px; 148 + 149 + /* center the whole block under the heading */ 150 + max-width: 960px; 151 + margin-left: auto; 152 + margin-right: auto; 153 + justify-content: center; 154 + } 155 + 156 + .service { 157 + flex: 0 1 calc(50% - 12px); 158 + display: flex; 159 + align-items: flex-start; 160 + gap: 16px; 161 + margin-bottom: 8px; 162 + 163 + .service-icon { 164 + width: 42px; 165 + height: 42px; 166 + border-radius: 50%; 167 + display: flex; 168 + align-items: center; 169 + justify-content: center; 170 + font-size: 18px; 171 + color: @brand; 172 + background: fade(@brand, 10%); 173 + flex-shrink: 0; 174 + margin-top: 3px; 175 + } 176 + 177 + .service-body { 178 + h4 { 179 + margin: 0 0 4px; 180 + font-size: 1.125rem; 181 + font-weight: 800; 182 + } 183 + p { 184 + margin: 0 0 6px; 185 + color: @text; 186 + line-height: 1.5; 187 + } 188 + ul { 189 + margin: .45rem 0 0; 190 + padding-left: 1.1rem; 191 + color: @muted; 192 + font-size: 13px; 193 + } 194 + li { 195 + margin: .25rem 0; 196 + line-height: 1.45; 197 + } 198 + } 199 + } 200 + 201 + /* ==== Center last item on its own row while keeping 50% width ==== */ 202 + .service-center { 203 + /* same width as siblings */ 204 + flex: 0 1 calc(55% - 12px); 205 + 206 + /* push to center */ 207 + margin-left: auto; 208 + margin-right: auto; 209 + } 210 + 211 + /* Mobile: 1 per row */ 212 + @media (max-width: 767px) { 213 + .services-grid { 214 + gap: 16px; 215 + max-width: 100%; 216 + } 217 + 218 + .service, 219 + .service-center { 220 + flex: 0 1 100%; 221 + margin-left: 0; 222 + margin-right: 0; 223 + } 224 + } 225 +} 226 + 227 +/* ===== CTA ===== */ 228 +.cta-section { 229 + padding: 24px 0 16px; 230 + 231 + .contact-inline { 232 + margin: 0; 233 + color: @muted; 234 + a { color: @brand; } 235 + } 236 +} 237 + - contentType
-
... ... @@ -1,0 +1,1 @@ 1 +LESS - use
-
... ... @@ -1,0 +1,1 @@ 1 +onDemand