Changes for page Public Web Site
Last modified by Alex Cotiugă on 2026/05/04 06:16
From version 2.1
edited by Alex Cotiugă
on 2025/11/24 07:18
on 2025/11/24 07:18
Change comment:
There is no comment for this version
To version 4.9
edited by Alex Cotiugă
on 2026/05/01 13:05
on 2026/05/01 13:05
Change comment:
There is no comment for this version
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Objects (0 modified, 1 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -1,147 +1,237 @@ 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 + ## LANDING HERO 7 + <section class="landing-hero" aria-labelledby="hero-title"> 8 + <div class="container landing-hero-inner"> 9 + <h1 id="hero-title">Keep Your XWiki Platform Secure, Stable and Up-to-Date</h1> 10 + <p class="lead"> 11 + Helping organizations safely upgrade, maintain, customize, and integrate their XWiki environments. 12 + </p> 13 + 14 + <ul class="benefits"> 15 + <li><a href="/services/xwiki-upgrades">Smooth upgrades</a></li> 16 + <li>Reliable support plans</li> 17 + <li>Custom integrations</li> 18 + <li>Secure, optimized platforms</li> 19 + </ul> 20 + 21 + <div class="cta-row"> 22 + <a class="btn-main" href="mailto:alex@agnease.com">Contact Agnease</a> 23 + <a class="btn-secondary" href="/services">View services</a> 24 + </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 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> 26 + </section> 110 110 111 - #set ($servicesSize = $servicesSectionData.size()) 112 - <div class="services-grid"> 113 - #foreach ($entry in $servicesSectionData) 114 - #set ($classes = "service") 115 - ## If this is the last item AND the total number is odd, center it 116 - #if ($foreach.count == $servicesSize && ($servicesSize % 2) == 1) 117 - #set ($classes = "service service-center") 118 - #end 28 + ## WHY CHOOSE 29 + #set ($whySectionData = [{ 30 + 'title': 'Stability & security', 31 + 'icon': 'shield', 32 + 'content': 'Proven upgrade steps, rollback safety, and proactive hardening keep your wiki reliable.', 33 + 'url': '/services/xwiki-upgrades' 34 + },{ 35 + 'title': 'Predictable delivery', 36 + 'icon': 'check-square-o', 37 + 'content': 'Clear scope, defined steps, and documented results to avoid surprises.', 38 + 'url': '' 39 + },{ 40 + 'title': 'Clean integrations', 41 + 'icon': 'link', 42 + 'content': 'Maintainable SSO, API, and system connections tailored to your environment.', 43 + 'url': '/services/xwiki-integrations' 44 + },{ 45 + 'title': 'Long-term support', 46 + 'icon': 'life-ring', 47 + 'content': 'Guaranteed response times, regular checks, and fast assistance when needed.', 48 + 'url': '/services/xwiki-maintenance-support' 49 + }]) 119 119 120 - <article class="$classes"> 121 - <div class="service-icon"> 122 - <i class="fa fa-$entry.icon" aria-hidden="true"></i> 123 - </div> 124 - <div class="service-body"> 125 - <h4>$entry.title</h4> 51 + <section aria-labelledby="why-title"> 52 + <div class="container"> 53 + <h2 id="why-title">Why choose Agnease</h2> 54 + <p class="lead">10+ years of XWiki expertise with structured delivery and lasting collaboration</p> 55 + 56 + <div class="widgets"> 57 + #foreach ($entry in $whySectionData) 58 + <article class="widget"> 59 + <div class="icon" aria-hidden="true"> 60 + <i class="fa fa-$entry.icon"></i> 61 + <h4>$entry.title</h4> 62 + </div> 126 126 <p>$entry.content</p> 127 - <ul> 128 - #foreach ($item in $entry.items) 129 - <li>$item</li> 64 + #if ($entry.url && $entry.url != '') 65 + <p class="card-link"><a href="$entry.url">Learn more</a></p> 66 + #end 67 + </article> 68 + #end 69 + </div> 70 + </div> 71 + </section> 72 + 73 + ## SERVICES 74 + #set ($servicesSectionData = [{ 75 + 'title': 'XWiki Upgrades', 76 + 'icon': 'refresh', 77 + 'url': '/services/xwiki-upgrades', 78 + 'content': 'Stay current with the latest XWiki LTS and reduce security, stability, and compatibility risks.', 79 + 'items': [ 80 + 'Audit setup, extensions, and configurations', 81 + 'Test upgrades with backups and validation', 82 + 'Safe production rollout with minimal downtime' 83 + ] 84 + },{ 85 + 'title': 'Maintenance, Support & Recovery', 86 + 'icon': 'stethoscope', 87 + 'url': '/services/xwiki-maintenance-support', 88 + 'content': 'Ensure long-term stability and quick response when issues appear.', 89 + 'items': [ 90 + 'Monitoring and performance checks', 91 + 'Security patching, log analysis, triage', 92 + 'Issue recovery, data repair, hardening' 93 + ] 94 + },{ 95 + 'title': 'Development & Integrations', 96 + 'icon': 'cogs', 97 + 'url': '/services/xwiki-development-integrations', 98 + 'content': 'Extend and connect XWiki to fit your workflow and systems.', 99 + 'items': [ 100 + 'Custom apps, macros, automation', 101 + 'SSO, REST APIs, LDAP, CRM links', 102 + 'Maintainable extensions for long-term use' 103 + ] 104 + },{ 105 + 'title': 'Hosting & Deployment', 106 + 'icon': 'cloud', 107 + 'url': '/services/xwiki-hosting-deployment', 108 + 'content': 'Cloud-ready environments designed for reliability and performance.', 109 + 'items': [ 110 + 'Containerized deployment and TLS', 111 + 'Backups, restore strategy, observability', 112 + 'Optimization and load tuning' 113 + ] 114 + },{ 115 + 'title': 'Migrations to XWiki', 116 + 'icon': 'exchange', 117 + 'url': '/services/xwiki-migrations', 118 + 'content': 'Move from Confluence, SharePoint, or MediaWiki to XWiki with full data integrity and structure.', 119 + 'items': [ 120 + 'Preserve hierarchy, attachments, and permissions', 121 + 'Convert macros, categories, and metadata for XWiki', 122 + 'Redirect old URLs and maintain SEO consistency' 123 + ] 124 + }]) 125 + 126 + <section class="services" aria-labelledby="services-title"> 127 + <div class="container"> 128 + <h2 id="services-title">Services</h2> 129 + <p class="lead">All the XWiki services you need, delivered with precision and care</p> 130 + 131 + <div class="services-grid"> 132 + #foreach ($entry in $servicesSectionData) 133 + <article class="service"> 134 + <div class="service-icon"> 135 + <i class="fa fa-$entry.icon" aria-hidden="true"></i> 136 + </div> 137 + <div class="service-body"> 138 + <h4> 139 + #if ($entry.url && $entry.url != '') 140 + <a href="$entry.url">$entry.title</a> 141 + #else 142 + $entry.title 143 + #end 144 + </h4> 145 + <p>$entry.content</p> 146 + <ul> 147 + #foreach ($item in $entry.items) 148 + <li>$item</li> 149 + #end 150 + </ul> 151 + #if ($entry.url && $entry.url != '') 152 + <p class="service-link"><a href="$entry.url">Learn more</a></p> 130 130 #end 131 - </ ul>132 - </ div>133 - </article>134 - #end154 + </div> 155 + </article> 156 + #end 157 + </div> 135 135 </div> 159 + </section> 160 + 161 + ## CTA 162 + <section id="contact" class="cta-section"> 163 + <div class="container"> 164 + <p class="text-center contact-inline"> 165 + Need help with your XWiki? <a href="mailto:alex@agnease.com">Contact Agnease</a>. 166 + </p> 167 + </div> 168 + </section> 169 + {{/html}} 170 +#end 171 + 172 +#macro(requestConsultationModal) 173 + <div class="modal fade" id="requestConsultation" tabindex="-1" role="dialog"> 174 + <div class="modal-dialog"> 175 + <div class="modal-content"> 176 + <div class="modal-header"> 177 + <button type="button" class="close" data-dismiss="modal">×</button> 178 + <h4 class="modal-title">Request a consultation</h4> 179 + </div> 180 + <div class="modal-body"> 181 + <div> 182 + ##Need help with your XWiki? <a href="mailto:alex@agnease.com">Contact Agnease</a> 183 + #displayFormFromSheetCode() 184 + </div> 185 + </div> 186 + <div class="modal-footer"> 187 + ##<input id="continueCategorySelection" type="button" class="btn btn-default" data-dismiss="modal" 188 + ## value="$escapetool.xml($services.localization.render('yesno_1'))"> 189 + </div> 190 + </div> 136 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}} 192 + </div> 193 +#end 194 + 195 +#macro (stripHTMLMacro $displayOutput) 196 + $stringtool.removeEnd($stringtool.removeStart($displayOutput, '{{html clean="false" wiki="false"}}'), '{{/html}}').replace('Agnease.Code.Lead.LeadClass_0_', 'acl-') 197 +#end 198 + 199 +#macro (displayFormFromSheetCode) 200 + #set ($editing = true) 201 + ## The object to display. 202 + #set ($xobject = $doc.newObject('Agnease.Code.Lead.LeadClass')) 203 + ## The class that describes the object properties. 204 + #set ($xclass = $xwiki.getClass('Agnease.Code.Lead.LeadClass')) 205 + ## Make sure the following display* method calls use the right object. 206 + #set ($discard = $doc.use($xobject)) 207 + ## Using the xform vertical form layout. 208 + <div class="xform"> 209 + <dl> 210 + #foreach ($property in $xclass.properties) 211 + #if ($property.name != 'status') 212 + <dt #if (!$editing) 213 + class="editableProperty" 214 + #set ($xobjectPropertyReference = $xobject.getPropertyReference($property.name)) 215 + data-property="$escapetool.xml($services.model.serialize($xobjectPropertyReference))" 216 + data-property-type="object"#end> 217 + ## This must match the id generated by the $doc.display() method below. 218 + #set ($propertyId = "acl-$property.name") 219 + <label#if ($editing) for="$escapetool.xml($propertyId)"#end> 220 + $escapetool.xml($property.translatedPrettyName) 221 + </label> 222 + ## Support for specifying a translation key as hint in the property definition. 223 + <span class="xHint">$!escapetool.xml($services.localization.render($property.hint))</span> 224 + </dt> 225 + #set ($displayOutput = $doc.display($property.name, 'edit')) 226 + <dd>#stripHTMLMacro($displayOutput)</dd> 227 + #end 228 + #end 229 + #if (!$xclass.properties || $xclass.properties.size() == 0) 230 + ## Keep the empty definition term in order to have valid HTML. 231 + <dt></dt> 232 + <dd>$escapetool.xml($services.localization.render('xclass.defaultObjectSheet.noProperties'))</dd> 233 + #end 234 + </dl> 235 + </div> 236 +#end 147 147 {{/velocity}}
- XWiki.StyleSheetExtension[0]
-
- cache
-
... ... @@ -1,0 +1,1 @@ 1 +long - code
-
... ... @@ -1,0 +1,510 @@ 1 +/* ========== Agnease Public Website Theme ========== */ 2 + 3 +@brand: #00937D; 4 +@brand-strong: #007B6A; 5 +@text: #2D3A34; 6 +@muted: #5B6B64; 7 +@line: #E4ECE9; 8 +@soft: #F6FBF9; 9 +@radius: 16px; 10 +@shadow-sm: 0 6px 20px rgba(0,0,0,.06); 11 +@shadow: 0 12px 36px rgba(0,0,0,.08); 12 +@maxw: 1140px; 13 + 14 +#mainContentArea { 15 + padding: 0; 16 +} 17 + 18 +.container { 19 + max-width: @maxw; 20 + margin-left: auto; 21 + margin-right: auto; 22 +} 23 + 24 +.text-center { 25 + text-align: center; 26 +} 27 + 28 +.lead { 29 + color: @muted; 30 + text-align: center; 31 + line-height: 1.5; 32 +} 33 + 34 +.page-lead { 35 + max-width: 760px; 36 + margin: 0 auto; 37 + color: @muted; 38 + font-size: 18px; 39 + line-height: 1.5; 40 + text-align: center; 41 +} 42 + 43 +section { 44 + padding: 32px 0; 45 + border-top: 1px solid @line; 46 + 47 + &:first-of-type { 48 + border-top: none; 49 + } 50 +} 51 + 52 +h1, h2, h3, h4 { 53 + color: @text; 54 +} 55 + 56 +h2 { 57 + text-align: center; 58 +} 59 + 60 +/* ===== Buttons / links ===== */ 61 + 62 +.btn-main, 63 +.btn-secondary { 64 + display: inline-block; 65 + border-radius: 8px; 66 + padding: 9px 14px; 67 + font-weight: 700; 68 + text-decoration: none; 69 + line-height: 1.2; 70 +} 71 + 72 +.btn-main { 73 + color: #fff; 74 + background: @brand; 75 + 76 + &:hover, 77 + &:focus { 78 + color: #fff; 79 + background: @brand-strong; 80 + text-decoration: none; 81 + } 82 +} 83 + 84 +.btn-secondary { 85 + color: @brand; 86 + background: fade(@brand, 8%); 87 + border: 1px solid fade(@brand, 20%); 88 + 89 + &:hover, 90 + &:focus { 91 + color: @brand-strong; 92 + background: fade(@brand, 12%); 93 + text-decoration: none; 94 + } 95 +} 96 + 97 +.cta-row { 98 + display: flex; 99 + gap: 10px; 100 + flex-wrap: wrap; 101 + justify-content: center; 102 + margin-top: 16px; 103 +} 104 + 105 +/* ===== Landing page hero ===== */ 106 + 107 +.landing-hero { 108 + text-align: center; 109 + min-height: 340px; 110 + display: flex; 111 + align-items: center; 112 + justify-content: center; 113 + background: 114 + radial-gradient(50rem 18rem at 50% -10%, #E7FFF8 0%, transparent 60%), 115 + radial-gradient(50rem 18rem at 50% 0%, #E8F6F3 0%, transparent 60%); 116 +} 117 + 118 +.landing-hero-inner { 119 + max-width: 860px; 120 + margin: 0 auto; 121 +} 122 + 123 +.landing-hero h1 { 124 + margin: 0 0 10px; 125 + font-size: 36px; 126 + line-height: 1.18; 127 +} 128 + 129 +.landing-hero .lead { 130 + margin: 0 auto 12px; 131 + max-width: 760px; 132 + font-size: 18px; 133 +} 134 + 135 +/* ===== Compact page header for section pages ===== */ 136 + 137 +.page-header-compact { 138 + padding: 34px 0 28px; 139 + text-align: center; 140 + border-top: none; 141 + background: 142 + radial-gradient(42rem 12rem at 50% -20%, #E7FFF8 0%, transparent 65%); 143 +} 144 + 145 +.page-header-compact .container { 146 + max-width: 850px; 147 +} 148 + 149 +.page-eyebrow { 150 + margin: 0 0 8px; 151 + color: @brand; 152 + font-size: 12px; 153 + font-weight: 800; 154 + text-transform: uppercase; 155 + letter-spacing: .08em; 156 +} 157 + 158 +.page-header-compact h1 { 159 + margin: 0 0 10px; 160 + font-size: 34px; 161 + line-height: 1.15; 162 +} 163 + 164 +/* ===== Benefits / chips ===== */ 165 + 166 +.benefits, 167 +.inline-benefits { 168 + display: flex; 169 + flex-wrap: wrap; 170 + justify-content: center; 171 + gap: 8px; 172 + list-style: none; 173 + padding: 0; 174 + margin: 12px 0 0; 175 +} 176 + 177 +.benefits li, 178 +.inline-benefits li { 179 + color: @muted; 180 + font-size: 13px; 181 + background: fade(@brand, 8%); 182 + border: 1px solid fade(@brand, 18%); 183 + border-radius: 999px; 184 + padding: 4px 10px; 185 +} 186 + 187 +/* ===== Cards ===== */ 188 + 189 +.widgets { 190 + margin-top: 16px; 191 + display: grid; 192 + grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); 193 + grid-gap: 16px; 194 +} 195 + 196 +.widget { 197 + padding: 18px; 198 + background: #fff; 199 + border: 1px solid @line; 200 + border-radius: @radius; 201 + box-shadow: @shadow-sm; 202 + transition: transform .18s ease, box-shadow .18s ease; 203 + display: flex; 204 + flex-direction: column; 205 + height: 100%; 206 + 207 + &:hover { 208 + transform: translateY(-2px); 209 + box-shadow: @shadow; 210 + } 211 + 212 + .icon { 213 + display: flex; 214 + align-items: center; 215 + gap: 10px; 216 + padding-bottom: 6px; 217 + margin-bottom: 8px; 218 + border-bottom: 1px solid fade(@line, 60%); 219 + 220 + i { 221 + color: @brand; 222 + } 223 + 224 + h4 { 225 + margin: 0; 226 + line-height: 1.2; 227 + color: @text; 228 + } 229 + } 230 + 231 + p { 232 + margin: 0; 233 + color: @muted; 234 + line-height: 1.45; 235 + } 236 + 237 + .card-link { 238 + margin-top: 12px; 239 + 240 + a { 241 + color: @brand; 242 + font-weight: 700; 243 + text-decoration: none; 244 + 245 + &:hover { 246 + color: @brand-strong; 247 + text-decoration: underline; 248 + } 249 + } 250 + } 251 +} 252 + 253 +/* ===== Service / listing rows ===== */ 254 + 255 +.services-grid { 256 + margin-top: 20px; 257 + display: flex; 258 + flex-wrap: wrap; 259 + gap: 24px; 260 + max-width: 960px; 261 + margin-left: auto; 262 + margin-right: auto; 263 + justify-content: center; 264 +} 265 + 266 +.service { 267 + flex: 0 1 calc(50% - 12px); 268 + display: flex; 269 + align-items: flex-start; 270 + gap: 16px; 271 + margin-bottom: 8px; 272 +} 273 + 274 +.service-icon { 275 + width: 42px; 276 + height: 42px; 277 + border-radius: 50%; 278 + display: flex; 279 + align-items: center; 280 + justify-content: center; 281 + color: @brand; 282 + background: fade(@brand, 10%); 283 + flex-shrink: 0; 284 + margin-top: 3px; 285 +} 286 + 287 +.service-body { 288 + h4 { 289 + margin: 0 0 4px; 290 + font-size: 1.125rem; 291 + font-weight: 800; 292 + 293 + a { 294 + color: @text; 295 + text-decoration: none; 296 + 297 + &:hover { 298 + color: @brand; 299 + text-decoration: underline; 300 + } 301 + } 302 + } 303 + 304 + p { 305 + margin: 0 0 6px; 306 + color: @text; 307 + line-height: 1.5; 308 + } 309 + 310 + ul { 311 + margin: .45rem 0 0; 312 + padding-left: 1.1rem; 313 + color: @muted; 314 + font-size: 13px; 315 + } 316 + 317 + li { 318 + margin: .25rem 0; 319 + line-height: 1.45; 320 + } 321 + 322 + .service-link { 323 + margin-top: .45rem; 324 + font-size: 13px; 325 + 326 + a { 327 + color: @brand; 328 + font-weight: 700; 329 + text-decoration: none; 330 + 331 + &:hover { 332 + color: @brand-strong; 333 + text-decoration: underline; 334 + } 335 + } 336 + } 337 +} 338 + 339 +/* ===== Split section ===== */ 340 + 341 +.split-section { 342 + display: grid; 343 + grid-template-columns: minmax(0, 1.1fr) minmax(280px, .9fr); 344 + gap: 32px; 345 + align-items: start; 346 + max-width: 960px; 347 + margin: 0 auto; 348 +} 349 + 350 +.panel { 351 + background: #fff; 352 + border: 1px solid @line; 353 + border-radius: @radius; 354 + box-shadow: @shadow-sm; 355 + padding: 20px; 356 +} 357 + 358 +.panel h3 { 359 + margin-top: 0; 360 +} 361 + 362 +/* ===== Contact / form page ===== */ 363 + 364 +.contact-layout { 365 + display: grid; 366 + grid-template-columns: minmax(0, .85fr) minmax(320px, 1.15fr); 367 + gap: 32px; 368 + max-width: 1000px; 369 + margin: 0 auto; 370 + align-items: start; 371 +} 372 + 373 +.contact-card { 374 + background: #fff; 375 + border: 1px solid @line; 376 + border-radius: @radius; 377 + box-shadow: @shadow-sm; 378 + padding: 20px; 379 +} 380 + 381 +.contact-card h3 { 382 + margin-top: 0; 383 +} 384 + 385 +.contact-list { 386 + list-style: none; 387 + padding: 0; 388 + margin: 12px 0 0; 389 + 390 + li { 391 + margin: 8px 0; 392 + color: @muted; 393 + } 394 + 395 + i { 396 + color: @brand; 397 + margin-right: 8px; 398 + } 399 + 400 + a { 401 + color: @brand; 402 + } 403 +} 404 + 405 +.form-panel { 406 + background: #fff; 407 + border: 1px solid @line; 408 + border-radius: @radius; 409 + box-shadow: @shadow-sm; 410 + padding: 22px; 411 +} 412 + 413 +.form-panel .xform dl { 414 + margin: 0; 415 +} 416 + 417 +.form-panel .xform dt { 418 + margin-top: 12px; 419 +} 420 + 421 +.form-panel .xform dt:first-child { 422 + margin-top: 0; 423 +} 424 + 425 +.form-panel .xform label { 426 + color: @text; 427 + font-weight: 700; 428 +} 429 + 430 +.form-panel .xform .xHint { 431 + display: block; 432 + color: @muted; 433 + font-size: 12px; 434 + margin-top: 2px; 435 +} 436 + 437 +.form-panel .xform dd { 438 + margin-left: 0; 439 + margin-bottom: 10px; 440 +} 441 + 442 +.form-panel input[type="text"], 443 +.form-panel input[type="email"], 444 +.form-panel textarea, 445 +.form-panel select { 446 + width: 100%; 447 + max-width: 100%; 448 + border: 1px solid @line; 449 + border-radius: 8px; 450 + padding: 8px 10px; 451 +} 452 + 453 +/* ===== CTA ===== */ 454 + 455 +.cta-section { 456 + padding: 24px 0 16px; 457 +} 458 + 459 +.contact-inline { 460 + margin: 0; 461 + color: @muted; 462 + 463 + a { 464 + color: @brand; 465 + font-weight: 700; 466 + } 467 +} 468 + 469 +/* ===== Compact sections ===== */ 470 + 471 +.compact-section { 472 + padding: 28px 0; 473 +} 474 + 475 +.compact-section h2 { 476 + margin-top: 0; 477 + margin-bottom: 14px; 478 +} 479 + 480 +/* ===== Responsive ===== */ 481 + 482 +@media (max-width: 767px) { 483 + section { 484 + padding: 26px 0; 485 + } 486 + 487 + .landing-hero { 488 + min-height: 280px; 489 + } 490 + 491 + .landing-hero h1, 492 + .page-header-compact h1 { 493 + font-size: 28px; 494 + } 495 + 496 + .page-lead, 497 + .landing-hero .lead { 498 + font-size: 16px; 499 + } 500 + 501 + .service { 502 + flex: 0 1 100%; 503 + } 504 + 505 + .split-section, 506 + .contact-layout { 507 + grid-template-columns: 1fr; 508 + gap: 20px; 509 + } 510 +} - contentType
-
... ... @@ -1,0 +1,1 @@ 1 +LESS - use
-
... ... @@ -1,0 +1,1 @@ 1 +onDemand