Solving for complex UI designs

128
A FRONT-END PERSPECTIVE & APPROACH RAMI ENBASHI . NRG-EDGE MAY 6 , 2015 . FOSTER CITY, CALIFORNIA SOLVING FOR COMPLEX UI DESIGNS

Transcript of Solving for complex UI designs

Page 1: Solving for complex UI designs

A FRONT-END PERSPECTIVE & APPROACH

RAMI ENBASHI . NRG-EDGE MAY 6 , 2015 . FOSTER CITY, CALIFORNIA

SOLVING FOR COMPLEX UI DESIGNS

Page 2: Solving for complex UI designs

About me

Page 3: Solving for complex UI designs

I am lazy

Page 4: Solving for complex UI designs

Work smart not hard

Page 5: Solving for complex UI designs

Work on fresh ideas not tedious tasks

Page 6: Solving for complex UI designs

Productive

Page 7: Solving for complex UI designs

Laziness

Prod

uctiv

ity

Page 8: Solving for complex UI designs

Good decision making

Page 9: Solving for complex UI designs

Decision Fatigue

Page 10: Solving for complex UI designs

A lazy team is a productive team

Page 11: Solving for complex UI designs

The machine

Page 12: Solving for complex UI designs
Page 13: Solving for complex UI designs

Automate my workflow

Page 14: Solving for complex UI designs
Page 15: Solving for complex UI designs

Magnolia

Page 16: Solving for complex UI designs

The story of Mr. X and the green bars

Page 17: Solving for complex UI designs
Page 18: Solving for complex UI designs
Page 19: Solving for complex UI designs
Page 20: Solving for complex UI designs

A lazy user is a happy user

Page 21: Solving for complex UI designs

A lazy developer is a productive developer

Page 22: Solving for complex UI designs

Magnolia Template Development

Page 23: Solving for complex UI designs

How do we get there?

Page 24: Solving for complex UI designs

UI Sandbox™

Page 25: Solving for complex UI designs

Background

Page 26: Solving for complex UI designs

UI-Focused, Content Managed,

Responsive Solutions

Page 27: Solving for complex UI designs

UI-Focused

Page 28: Solving for complex UI designs

Design first

Page 29: Solving for complex UI designs

Complex client-side functionality

Page 30: Solving for complex UI designs

Project Manager

Lead AnalystDesignerDev Lead

UI LeadMagnolia

Lead

UI Developer

UI Developer

Magnolia Developer

Magnolia Developer

Analyst/ Tester

Analyst/ Tester

Page 31: Solving for complex UI designs

Express

CSS JS HTML

Page 32: Solving for complex UI designs

The problem

Page 33: Solving for complex UI designs

The environment

Page 34: Solving for complex UI designs
Page 35: Solving for complex UI designs

Magnolia Dev

UI Dev

Page 36: Solving for complex UI designs

Magnolia Dev

UI Dev

Page 37: Solving for complex UI designs

The process

Page 38: Solving for complex UI designs

01 UX/Design

02 Mobile Strategy

03 Template Analysis

04 UI Development

05 UI Build / QA

06 UI-Magnolia Sync

07 Magnolia Development

08 Final Testing

Page 39: Solving for complex UI designs

01 UX/Design

02 Mobile Strategy

03 Template Analysis

04 UI Development

05 UI Build / QA

06 UI-Magnolia Sync

07 Magnolia Development

08 Final Testing

Page 40: Solving for complex UI designs

01 UX/Design

02 Mobile Strategy

03 Template Analysis

04 UI Development

05 UI Build / QA

06 UI-Magnolia Sync

07 Magnolia Development

08 Final Testing

Wireframes Color Palate Typography Style Guide

Interaction Guide High Fidelity Designs

(PSDs)

Page 41: Solving for complex UI designs

UX/Design

Mobile Strategy

Template Analysis

UI Development

UI Build / QA

UI-Magnolia Sync

Magnolia Development

Final Testing

Major/Minor Breakpoints Supported Devices

Grid System Definition Fluid/Fixed-width Layout

Responsive/Adaptive

01

02

03

04

05

06

07

08

Page 42: Solving for complex UI designs

01 UX/Design

02 Mobile Strategy

03 Template Analysis

04 UI Development

05 UI Build / QA

06 UI-Magnolia Sync

07 Magnolia Development

08 Final Testing

Content Managed Fields Templates

Areas Components Content Type

Page 43: Solving for complex UI designs
Page 44: Solving for complex UI designs

01 UX/Design

02 Mobile Strategy

03 Template Analysis

04 UI Development

05 UI Build / QA

06 UI-Magnolia Sync

07 Magnolia Development

08 Final Testing

Design Implementation Client-side Functionality

Front-end API Integration Functional Website

Page 45: Solving for complex UI designs

Template Engine

Page 46: Solving for complex UI designs

var$data$=${$

$$title:$'My$Buddies',$

$$friends:$[$

$$$$'Tyrion',$

$$$$'Arya',$

$$$$'Ygritte',$

$$$$'Drogo'$

$$]$

};

<h1>{{$title$}}</h1>$

<ul>$

{%$for$friend$in$friends$%}$

$$$$<li>{{$friend$}}</li>$

{%$endfor$%}$

</ul>

<h1>My$Buddies</h1>$

<ul>$

$$$$<li>Tyrion</li>$

$$$$<li>Arya</li>$

$$$$<li>Ygritte</li>$

$$$$<li>Drogo</li>$

</ul>

+ →

Page 47: Solving for complex UI designs

. ├── global │   ├── areas │   │   ├── footer.swig │   │   ├── htmlHeader.swig │   │   ├── logo.swig │   │   ├── mainArea.swig │   │   └── navigation.swig │   ├── components │   │   └── genericContent.swig │   └── macros │   └── calculator.swig ├── layouts │   ├── about.swig │   ├── generic.swig │   └── homepage.swig └── pages └── homepage ├── areas │   ├── callout.swig │   ├── features.swig │   ├── products.swig │   ├── welcome.swig │   └── whoWeAre.swig └── components └── featureItem.swig

Page 48: Solving for complex UI designs

<div$id="welcome">$$$<div$class="container">$$$$$<h3$$class="heading">Welcome$to$Launch</h3>$$$$$<h4$class="subheading">We$are$a$Magnolia$CMS$Services$&$Integration$Company</h4>$$$$$<a$href="/login"$class=“login">Log$In</a>$$$</div>$</div>$

#welcome{$$$background:$url(../assets/images/welcomeYbg.jpg)$noYrepeat$50%$84%;$$$backgroundYsize:$cover;$$$width:$inherit;$}$

CSS

HTML

Page 49: Solving for complex UI designs

<div$id=“welcome"$style=“backgroundYimage:$url(../assets/images/welcomeYbg.jpg)”$>$$$<div$class="container">$$$$$<h3$$class="heading">Welcome$to$Launch</h3>$$$$$<h4$class="subheading">We$are$a$Magnolia$CMS$Services$&$Integration$Company</h4>$$$$$<a$href="/login"$class=“login">Log$In</a>$$$</div>$</div>$

#welcome{$$$background:$noYrepeat$50%$84%;$$$backgroundYsize:$cover;$$$width:$inherit;$}$

CSS

HTML

Page 50: Solving for complex UI designs

Bower

Page 51: Solving for complex UI designs

Front-end Dependency Management

Page 52: Solving for complex UI designs

{$$$"name":$"magnoliaYdemo",$$$"version":$"1.3.0YSNAPSHOT",$$$"dependencies":${$$$$$"angular":$">=1.3.*",$$$$$"json3":$"~3.3.1",$$$$$"es5Yshim":$"~3.0.1",$$$$$"foundation":$"~5.4.3",$$$$$"angularYresource":$">=1.2.*",$$$$$"angularYcookies":$">=1.2.*",$$$$$"angularYsanitize":$">=1.2.*",$$$$$"fontYawesome":$">=4.1.0",$$$$$"lodash":$"~2.4.1",$$$$$"angularYuiYrouter":$"~0.2.10",$$$$$"ngYlodash":$"~0.0.2",$$$$$"cssYtoggleYswitch":$"~3.0.0",$$$$$"angularYplaceholderYtai":$"~1.0.1",$$$$$"angularYscroll":$"~0.6.4",$$$$$"angularjsYgeolocation":$"~0.1.1",$$$$$"mobileYdetect":$"hgoebl/mobileYdetect.js#~0.4.3"$$$},$$$"devDependencies":${$$$$$"angularYmocks":$">=1.2.*",$$$$$"angularYscenario":$">=1.2.*"$$$}$}$

bower.json

Page 53: Solving for complex UI designs

Grunt

Page 54: Solving for complex UI designs

Task Runner

Page 55: Solving for complex UI designs

Compiling

Page 56: Solving for complex UI designs

Injection

Page 57: Solving for complex UI designs
Page 58: Solving for complex UI designs

Minification

Page 59: Solving for complex UI designs

UnCSS

Page 60: Solving for complex UI designs

Watch / Live Reload

Page 61: Solving for complex UI designs

Testing

Page 62: Solving for complex UI designs

Deployment

Page 63: Solving for complex UI designs

module.exports$=$function(grunt)${$

$$grunt.initConfig({$$$$$jshint:${$$$$$$$files:$['Gruntfile.js',$'src/**/*.js',$$$$$$$$$$$'test/**/*.js'],$$$$$$$options:${$$$$$$$$$globals:${$$$$$$$$$$$jQuery:$true$$$$$$$$$}$$$$$$$}$$$$$},$$$$$watch:${$$$$$$$files:$['<%=$jshint.files$%>'],$$$$$$$tasks:$['jshint']$$$$$}$$$});$

$$grunt.loadNpmTasks('gruntYcontribYjshint');$$$grunt.loadNpmTasks('gruntYcontribYwatch');$

$$grunt.registerTask('default',$['jshint']);$

};$

{""""name":""magnolia-frontend",""""version":""1.0.1",""""dependencies":"{},""""devDependencies":"{""""""bower":""~1.3.3",""""""browserify":""~6.2.0",""""""grunt":""~0.4.2",""""""grunt-autoprefixer":""~1.0.1",""""""grunt-browserify":""~3.2.0",""""""grunt-contrib-concat":""~0.5.0",""""""grunt-contrib-cssmin":""~0.10.0",""""""grunt-contrib-htmlmin":""~0.3.0",""""""grunt-contrib-imagemin":""~0.9.1",""""""grunt-contrib-jshint":""~0.10.0",""""""grunt-contrib-less":""~0.12.0",""""""grunt-contrib-uglify":""~0.6.0",""""""grunt-contrib-watch":""~0.6.1",""""""grunt-injector":""~0.5.3",""""""grunt-karma":""~0.9.0",""""""grunt-swig-templates":""~0.1.2",""""""grunt-usemin":""2.1.1",""""""jshint-stylish":""~1.0.0",""""""karma":""~0.12.21",""""""karma-chrome-launcher":""^0.1.7",""""""karma-phantomjs-launcher":""~0.1.2",""""""kss":""~1.3.0",""""""lodash":""~2.4.1",""""""minifyify":""~5.0.0"""}"}"

Gruntfile.json package.json

Page 64: Solving for complex UI designs

Yeoman

Page 65: Solving for complex UI designs

App Scaffolding Tool

Page 66: Solving for complex UI designs

Knyle Style Sheets (KSS)

Page 67: Solving for complex UI designs

01 UX/Design

02 Mobile Strategy

03 Template Analysis

04 UI Development

05 UI Build / QA

06 UI-Magnolia Sync

07 Magnolia Development

08 Final Testing

Centralized CI Build Automated Tests Browser / Device

Compatibility Testing

Page 68: Solving for complex UI designs

01 UX/Design

02 Mobile Strategy

03 Template Analysis

04 UI Development

05 UI Build / QA

06 UI-Magnolia Sync

07 Magnolia Development

08 Final Testing

A process to allow incremental UI changes

with minimal configuration or backend changes

Page 69: Solving for complex UI designs

{""""name":""magnolia-frontend",""""version":"“1.0.1-SNAPSHOT”,""""dependencies":"{},""""devDependencies":"{"""""...""}"}"

package.json

$$<groupId>com.project.frontend</groupId>$$$<artifactId>projectYmoduleYtheme</artifactId>$$$<version>1.0.1YSNAPSHOT</version>$$$<name>Project$Magnolia$Theme</name>$

pom.xml

Page 70: Solving for complex UI designs

<plugin>$$$<groupId>org.jasig.maven</groupId>$$$<artifactId>sassYmavenYplugin</artifactId>$</plugin>$

SASS

Page 71: Solving for complex UI designs

<plugin>$$$<groupId>pl.allegro</groupId>$$$<artifactId>gruntYmavenYplugin</artifactId>$</plugin>$

Grunt

Page 72: Solving for complex UI designs

http://addyosmani.com/blog/making-maven-grunt

Page 73: Solving for complex UI designs

<plugin>$$$<groupId>com.github.eirslett</groupId>$$$<artifactId>frontendYmavenYplugin</artifactId>$</plugin>$

NodeJS

<execution>$$$<id>npm$install</id>$</execution>$

<execution>$$$<id>bower$install</id>$</execution>$

<execution>$$$<id>grunt$build</id>$<configuration>$$$<arguments>build:magnolia</arguments>$</configuration>$

</execution>$

Page 74: Solving for complex UI designs

{$//$Environment$targets$

$$development:${$$$$$options:${$$$$$$$loginURL:$'http://localhost:9000/login'$$$$$$$herokuPath:$'[email protected]:devYproject.git',$$$$$$$endpoint:$'content/products.json',$$$$$$$googleMapsKey:$'AucmoT6cAyH9TeXeGGqsB8LIYoJhvs',$$$$$$$assetsPath:$'assets/images'$$$$$}$$$},$$$magnoliaBuild:${$$$$$options:${$$$$$$$loginURL:$'/login'$$$$$$$herokuPath:$'[email protected]:mgnlYproject.git',$$$$$$$endpoint:$'/magnoliaYinstance/.rest/products',$$$$$$$googleMapsKey:$'zciuv2aS1N04nujJw0_hZoP',$$$$$$$assetsPath:$'/.resources/projectYmoduleYtheme/assets/images'$$$$$}$$$}$}

Gruntfile.json

Page 75: Solving for complex UI designs

angular.module('app')$$$.factory('products',$function($http)${$$$$$return${$$$$$$$getProducts:$function(params)${$$$$$$$$$return$$http.get('content/products.json',${$params:$params$});$$$$$$$}$$$$$};$$$});$

products.service.js

angular.module('app')$$$.factory('products',$function($http)${$$$$$return${$$$$$$$getProducts:$function(params)${$$$$$$$$$return$$http.get(‘/magnoliaYinstance/.rest/products',${$params:$params$});$$$$$$$}$$$$$};$$$});$

angular.module('app')$$$.factory('products',$function($http,$ENV)${$$$$$return${$$$$$$$getProducts:$function(params)${$$$$$$$$$return$$http.get(ENV.endpoint,${$params:$params$});$$$$$$$}$$$$$};$$$});$

Page 76: Solving for complex UI designs

<div$id="welcome">$$$<div$class="container">$$$$$<h3$class=“heading”>{{content.headingText}}</h3>$$$$$<h4$class=“subheading”>{{content.subheadingText}}</h4>$$$</div>$</div>$

welcome.swig

<div$id="welcome">$$$<div$class="container">$$$$$<h3$class=“heading">${content.headingText}</h3>$$$$$<h4$class=“subheading">${content.subheadingText}</h4>$$$</div>$</div>$

welcome.ftl

Page 77: Solving for complex UI designs

01 UX/Design

02 Mobile Strategy

03 Template Analysis

04 UI Development

05 UI Build / QA

06 UI-Magnolia Sync

07 Magnolia Development

08 Final Testing

Template configuration

Page 78: Solving for complex UI designs

01 UX/Design

02 Mobile Strategy

03 Template Analysis

04 UI Development

05 UI Build / QA

06 UI-Magnolia Sync

07 Magnolia Development

08 Final Testing

Page 79: Solving for complex UI designs

Template Configuration

Page 80: Solving for complex UI designs

<div$id="whoYweYare">$$$<div$class="container">$$$$$<h3$$class="heading">Who$We$Are</h3>$$$$$<h4$class="subheading">We$are$a$Magnolia$CMS$Services$&$Integration$Company</h4>$$$$$<div$class="bodyText">$$$$$$$<p>NRG$Edge$has$helped$organizations$implement$and$use$Magnolia$CMS$to$build$$$$$$$$$$and$improve$the$digital$experiences$they$provide$to$their$customers.</p>$$$$$</div>$$$$$<a$href="/about"$class="learnmore">Learn$More</a>$$$</div>$</div>$

Page 81: Solving for complex UI designs

Area Definiton

Page 82: Solving for complex UI designs

Dialog Definiton

Page 83: Solving for complex UI designs

<div$id="whoYweYare">$$$<div$class="container">$$$$$<h3$$class=“heading">${content.headingText!}</h3>$$$$$<h4$class=“subheading">${content.subheadingText!}</h4>$$$$$<div$class="bodyText">$$$$$$$${cmsfn.decode(content).bodyText}$$$$$</div>$$$$$<a$href="/about"$class="learnmore">Learn$More</a>$$$</div>$</div>$

Template Script

Page 84: Solving for complex UI designs

Pages App

Page 85: Solving for complex UI designs

Content

Page 86: Solving for complex UI designs

Configuration hell

Page 87: Solving for complex UI designs

YO DAWG, I HEARD YOU LIKE MAGNOLIA CONFIGURATION

SO I PUT CONFIGURATION IN YOUR CONFIGURATION SO YOU CAN

CONFIGURE YOUR CONFIGURATION.

Page 88: Solving for complex UI designs

Alternative configuration methods

Page 89: Solving for complex UI designs

http://kickstart.io

Page 90: Solving for complex UI designs

STK

Page 91: Solving for complex UI designs

A front-end solution

Page 92: Solving for complex UI designs

UI Sandbox™

Page 93: Solving for complex UI designs

<div$id="whoYweYare">$$$<div$class="container">$$$$$<h3$$class="heading">Who$We$Are</h3>$$$$$<h4$class="subheading">We$are$a$Magnolia$CMS$Services$&$Integration$Company</h4>$$$$$<div$class="bodyText">$$$$$$$<p>NRG$Edge$has$helped$organizations$implement$and$use$Magnolia$CMS$to$build$$$$$$$$$$and$improve$the$digital$experiences$they$provide$to$their$customers.</p>$$$$$</div>$$$$$<a$href="/about"$class="learnmore">Learn$More</a>$$$</div>$</div>$

Area Definiton

Template Script

Dialog Definiton Content

Page 94: Solving for complex UI designs

Introduce conventions

Page 95: Solving for complex UI designs

Abstract out conventional configuration

Page 96: Solving for complex UI designs

Specify only unconventional configuration

Page 97: Solving for complex UI designs

Examples of Area Definition conventions

Page 98: Solving for complex UI designs

• Area name = HTML element ID in camelCase

• “who-we-are” => “whoWeAre”

Page 99: Solving for complex UI designs

• Area title = Area name in Title Case

• “whoWeAre” => “Who We Are”

Page 100: Solving for complex UI designs

Defaults

Page 101: Solving for complex UI designs

• type = “noComponent”

• renderType = “freemarker”

• enabled = true

Page 102: Solving for complex UI designs

<div$id="whoYweYare">$$$<div$class="container">$$$$$<h3$$class="heading">Who$We$Are</h3>$$$$$<h4$class="subheading">We$are$a$Magnolia$CMS$Services$&$Integration$Company</h4>$$$$$<div$class="bodyText">$$$$$$$<p>NRG$Edge$has$helped$organizations$implement$and$use$Magnolia$CMS$to$build$$$$$$$$$$and$improve$the$digital$experiences$they$provide$to$their$customers.</p>$$$$$</div>$$$$$<a$href="/about"$class="learnmore">Learn$More</a>$$$</div>$</div>$

Autogenerate

Area$Definition$:{$name:$“whoWeAre",$title:$“Who$We$Are”,$enabled:$true,$type:$“noComponent”,$renderType:$“freemarker”,$templateScript:$“…”$

}$

Page 103: Solving for complex UI designs

Gain simplicity

Page 104: Solving for complex UI designs

Do we have to lose Flexibility?

Page 105: Solving for complex UI designs

Convention over Configuration (CoC)

Page 106: Solving for complex UI designs

“Convention over configuration is a software design paradigm which seeks to decrease the number of decisions that developers need to make, gaining simplicity, but not necessarily

losing flexibility.”

Page 107: Solving for complex UI designs

Conventions are subjective

Page 108: Solving for complex UI designs

Use Domain Specific Language (DSL) rules to

define conventions

Page 109: Solving for complex UI designs

Rules$:{$areaNameSuffix:$“Area”,$dialogNameSuffix:$“Dialog”,$defaultAreaType:$“noComponent”,$//$$or$“single”,$“list”$areaEnabledByDefault:$true,$defaultRenderType:$“freemarker”,$//$or$“jsp”$...$

}$

Page 110: Solving for complex UI designs

<div$id="whoYweYare">$$$<div$class="container">$$$$$<h3$class="heading">Who$We$Are</h3>$$$$$<h4$class="subheading">We$are$a$Magnolia$CMS$Services$&$Integration$Company</h4>$$$$$<div$class="bodyText">$$$$$$$<p>NRG$Edge$has$helped$organizations$implement$and$use$Magnolia$CMS$to$build$$$$$$$$$$and$improve$the$digital$experiences$they$provide$to$their$customers.</p>$$$$$</div>$$$$$<a$href="/about"$class="learnmore">Learn$More</a>$$$</div>$</div>$

Rules

Area$Definition$:{$name:$“whoWeAre",$title:$“Who$We$Are”,$enabled:$true,$type:$“noComponent”,$renderType:$“freemarker”,$templateScript:$“…”$

}$

Magnolia Config

+

→Autogenerate

Page 111: Solving for complex UI designs

Minimum Effective Dose of configuration (MED Config)

Page 112: Solving for complex UI designs

Implicit/Explicit Configuration

Page 113: Solving for complex UI designs

<div$id="whoYweYare">$$$<div$class="container">$$$$$<h3$class="heading">Who$We$Are</h3>$$$$$<h4$class="subheading">We$are$a$Magnolia$CMS$Services$&$Integration$Company</h4>$$$$$<div$class="bodyText">$$$$$$$<p>NRG$Edge$has$helped$organizations$implement$and$use$Magnolia$CMS$to$build$$$$$$$$$$and$improve$the$digital$experiences$they$provide$to$their$customers.</p>$$$$$</div>$$$$$<a$href="/about"$class="learnmore">Learn$More</a>$$$</div>$</div>$

Rules

Area$Definition$:{$name:$“whoWeAre",$title:$“Who$We$Are”,$enabled:$true,$type:$“noComponent”,$renderType:$“freemarker”,$templateScript:$“…”$

}$

Magnolia Config

+

→Autogenerate

Page 114: Solving for complex UI designs

<div$id="whoYweYare"$areaYname="myArea">$$$<div$class="container">$$$$$<h3$class="heading">Who$We$Are</h3>$$$$$<h4$class="subheading">We$are$a$Magnolia$CMS$Services$&$Integration$Company</h4>$$$$$<div$class="bodyText">$$$$$$$<p>NRG$Edge$has$helped$organizations$implement$and$use$Magnolia$CMS$to$build$$$$$$$$$$and$improve$the$digital$experiences$they$provide$to$their$customers.</p>$$$$$</div>$$$$$<a$href="/about"$class="learnmore">Learn$More</a>$$$</div>$</div>$

{"areaName:"“myArea”"

}"

MED Config

Area$Definition$:{$name:$“myArea",$title:$“My$Area”,$enabled:$true,$type:$“noComponent”,$renderType:$“freemarker”,$templateScript:$“…”$

}$

Magnolia Config

+

→Autogenerate

Page 115: Solving for complex UI designs

<div$id="whoYweYare">$$$<div$class="container">$$$$$<h3$class="heading">Who$We$Are</h3>$$$$$<h4$class="subheading">We$are$a$Magnolia$CMS$Services$&$Integration$Company</h4>$$$$$<div$class="bodyText">$$$$$$$<p>NRG$Edge$has$helped$organizations$implement$and$use$Magnolia$CMS$to$build$$$$$$$$$$and$improve$the$digital$experiences$they$provide$to$their$customers.</p>$$$$$</div>$$$$$<a$href="/about"$class="learnmore">Learn$More</a>$$$</div>$</div>$

Page 116: Solving for complex UI designs

<div$id="whoYweYare">$$$<div$class="container">$$$$$<h3$class=“heading"$field="heading">Who$We$Are</h3>$$$$$<h4$class=“subheading"$field="subheading">We$are$a$Magnolia$CMS$Services$&$Integration$Company</h4>$$$$$<div$class=“bodyText"$field="bodyText">$$$$$$$<p>NRG$Edge$has$helped$organizations$implement$and$use$Magnolia$CMS$to$build$$$$$$$$$$and$improve$the$digital$experiences$they$provide$to$their$customers.</p>$$$$$</div>$$$$$<a$href="/about"$class="learnmore">Learn$More</a>$$$</div>$</div>

{"content:"["{"name:"“heading”,""type:"“text”"

},"{"name:"“subheading”,""type:"“text”"

},"{"name:"“bodyText”,""type:"“richText”"

}"]"

}

MED Config

+

<div$id="whoYweYare">$$$<div$class="container">$$$$$<h3$$class=“heading">$

${content.headingText!”Heading”}$</h3>$

$$$$<h4$class=“subheading">$${content.subheadingText!”Subheading”}$

</h4>$$$$$<div$class="bodyText">$$$$$$$${cmsfn.decode(content).bodyText!”bodytext”}$$$$$</div>$$$$$<a$href="/about"$class=“learnmore">$

Learn$More$</a>$

$$</div>$</div>

FTL Template

Page 117: Solving for complex UI designs

<div$id="whoYweYare">$$$<div$class="container">$$$$$<h3$class=“heading"$field="heading">Who$We$Are</h3>$$$$$<h4$class=“subheading"$field="subheading">We$are$a$Magnolia$CMS$Services$&$Integration$Company</h4>$$$$$<div$class=“bodyText"$field="bodyText">$$$$$$$<p>NRG$Edge$has$helped$organizations$implement$and$use$Magnolia$CMS$to$build$$$$$$$$$$and$improve$the$digital$experiences$they$provide$to$their$customers.</p>$$$$$</div>$$$$$<a$href="/about"$class="learnmore">Learn$More</a>$$$</div>$</div>

{"content:"["{"name:"“heading”,""type:"“text”"

},"{"name:"“subheading”,""type:"“text”"

},"{"name:"“bodyText”,""type:"“richText”"

}"]"

}

MED Config

+

→ Dialog/Content

Page 118: Solving for complex UI designs

What did we gain?

Page 119: Solving for complex UI designs

Demo time!

Page 120: Solving for complex UI designs

Right technology stack

Page 121: Solving for complex UI designs

Data binding

Page 122: Solving for complex UI designs

Source

Target

One-way data binding

Page 123: Solving for complex UI designs

Model

View

Two-way data binding

Page 124: Solving for complex UI designs

Template

ViewModel

Three-way data binding

Page 125: Solving for complex UI designs

UI Sandbox

DSL Rules

+MGNL Config

SlicingIn-memory NoSQL DB

NoCR

REST

MED Config

HTML

MGNL Config

Magnolia

JCR

Template

Model View

Page 126: Solving for complex UI designs

Is this for everyone?

Page 127: Solving for complex UI designs

What’s next?

Page 128: Solving for complex UI designs

[email protected]

Thank you