SlideShare a Scribd company logo
Automating UI
Development
Angular Connect 2018
@ddprrt @Ka_TriN_F
Slide about usKatrin Freihofner

@Ka_TriN_F
devone.at
Slide about usStefan Baumgartner

@ddprrt
javascript-podcast.com
expert groups
Highly specialised screens
… with lots of generic, flexible components
Git
Design System update
Symbols library
Git
Design System update
Symbols library
Design System update
Design System update
You might wonder
…how will this affect the product?
Initial idea
UX + design
Initial idea
UX + design
Initial idea
Sketch lib
UX + design
Initial idea
Angular
component lib
Product
code
Sketch lib
UX + design
Initial idea
Angular
component lib
Product
code
Sketch lib
Barista
Design System
UX + design
Initial idea
Angular
component lib
Product
code
Sketch lib
Barista
Design System
UX + design
Initial idea
Angular
component lib
Product
code
Sketch lib
Barista
Design System
UX + design
Initial idea
Angular
component lib
Product
code
Sketch lib
Barista
Design System
UX + design
Initial idea
Angular
component lib
Product
code
Sketch lib
Barista
Design System
UX + design
Initial idea
Angular
component lib
Product
code
Sketch lib
Barista
Design System
UX + design
Initial idea
Angular
component lib
Product
code
Sketch lib
Barista
Design System
Angular
component lib
Barista
Design System
Product
code
Angular
component lib
Barista
Design System
Product
code
? Angular
component lib
Barista
Design System
Product
code
UX + design
Sketch lib Angular
component lib
Transform Angular to Sketch
Angular library Sketch library
?
.sketch is bunch of JSON files
library.sketch
pages
D91775B4-2C6C-4FCC-9209-6D8C930B9013.json
document.json
meta.json
user.json
.sketch is bunch of JSON files
library.sketch
pages
D91775B4-2C6C-4FCC-9209-6D8C930B9013.json
document.json
meta.json
user.json
We can hack that!
CSS equivalents in .sketch JSON
button {
width: 122px;
height: 32px;
background-color: #00f;
}
ShapeGroup: {
frame: {x: 0, y: 0, width: 122, height: 32}
layers: [
ShapePath: {
points: [‘{0,0}’,‘{0,1}’,‘{1,1}’,‘{1,0}’]
}
],
style: {
fills: [
color: {
red: 0, green: 0, blue: 1, alpha: 1
}
]
}
}
CSS equivalents in .sketch JSON
button {
width: 122px;
height: 32px;
background-color: #00f;
}
ShapeGroup: {
frame: {x: 0, y: 0, width: 122, height: 32}
layers: [
ShapePath: {
points: [‘{0,0}’,‘{0,1}’,‘{1,1}’,‘{1,0}’]
}
],
style: {
fills: [
color: {
red: 0, green: 0, blue: 1, alpha: 1
}
]
}
}
{
"_class": "page",
"do_objectID": "6224EB85-9573-4D33-BEE5-C57F892B94E4",
"exportOptions": {
"_class": "exportOptions",
"exportFormats": [],
"includedLayerIds": [],
"layerOptions": 0,
"shouldTrim": false
},
"frame": {
"_class": "rect",
"constrainProportions": false,
"height": 300,
"width": 300,
"x": 0,
"y": 0
},
"isFlippedHorizontal": false,
CSS equivalents in .sketch JSON
button {
width: 122px;
height: 32px;
background-color: #00f;
}
CSS equivalents in .sketch JSON
button {
width: 122px;
height: 32px;
background-color: #00f;
}
parsable properties
export class StyleDeclaration {
borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’;
borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)';
borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px';
borderTopRightRadius = '0px'; borderBottomRightRadius = '0px';
borderBottomLeftRadius = '0px'; borderWidth = '0px';
boxShadow = 'none'; padding = '0px';
backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)';
fill = 'rgb(0, 0, 0)’; strokeWidth = '1px';
fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400';
letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal';
textDecoration = 'none solid rgb(0, 0, 0)';
textAlign = 'start'; textTransform = 'none'; transform = 'none';
opacity = ‘1'; display = ‘block'; visibility = 'visible';
}
parsable properties
export class StyleDeclaration {
borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’;
borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)';
borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px';
borderTopRightRadius = '0px'; borderBottomRightRadius = '0px';
borderBottomLeftRadius = '0px'; borderWidth = '0px';
boxShadow = 'none'; padding = '0px';
backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)';
fill = 'rgb(0, 0, 0)’; strokeWidth = '1px';
fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400';
letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal';
textDecoration = 'none solid rgb(0, 0, 0)';
textAlign = 'start'; textTransform = 'none'; transform = 'none';
opacity = ‘1'; display = ‘block'; visibility = 'visible';
}
parsable properties
export class StyleDeclaration {
borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’;
borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)';
borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px';
borderTopRightRadius = '0px'; borderBottomRightRadius = '0px';
borderBottomLeftRadius = '0px'; borderWidth = '0px';
boxShadow = 'none'; padding = '0px';
backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)';
fill = 'rgb(0, 0, 0)’; strokeWidth = '1px';
fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400';
letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal';
textDecoration = 'none solid rgb(0, 0, 0)';
textAlign = 'start'; textTransform = 'none'; transform = 'none';
opacity = ‘1'; display = ‘block'; visibility = 'visible';
}
parsable properties
export class StyleDeclaration {
borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’;
borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)';
borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px';
borderTopRightRadius = '0px'; borderBottomRightRadius = '0px';
borderBottomLeftRadius = '0px'; borderWidth = '0px';
boxShadow = 'none'; padding = '0px';
backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)';
fill = 'rgb(0, 0, 0)’; strokeWidth = '1px';
fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400';
letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal';
textDecoration = 'none solid rgb(0, 0, 0)';
textAlign = 'start'; textTransform = 'none'; transform = 'none';
opacity = ‘1'; display = ‘block'; visibility = 'visible';
}
parsable properties
export class StyleDeclaration {
borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’;
borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)';
borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px';
borderTopRightRadius = '0px'; borderBottomRightRadius = '0px';
borderBottomLeftRadius = '0px'; borderWidth = '0px';
boxShadow = 'none'; padding = '0px';
backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)';
fill = 'rgb(0, 0, 0)’; strokeWidth = '1px';
fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400';
letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal';
textDecoration = 'none solid rgb(0, 0, 0)';
textAlign = 'start'; textTransform = 'none'; transform = 'none';
opacity = ‘1'; display = ‘block'; visibility = 'visible';
}
parsable properties
export class StyleDeclaration {
borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’;
borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)';
borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px';
borderTopRightRadius = '0px'; borderBottomRightRadius = '0px';
borderBottomLeftRadius = '0px'; borderWidth = '0px';
boxShadow = 'none'; padding = '0px';
backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)';
fill = 'rgb(0, 0, 0)’; strokeWidth = '1px';
fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400';
letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal';
textDecoration = 'none solid rgb(0, 0, 0)';
textAlign = 'start'; textTransform = 'none'; transform = 'none';
opacity = ‘1'; display = ‘block'; visibility = 'visible';
}
parsable properties
export class StyleDeclaration {
borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’;
borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)';
borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px';
borderTopRightRadius = '0px'; borderBottomRightRadius = '0px';
borderBottomLeftRadius = '0px'; borderWidth = '0px';
boxShadow = 'none'; padding = '0px';
backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)';
fill = 'rgb(0, 0, 0)’; strokeWidth = '1px';
fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400';
letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal';
textDecoration = 'none solid rgb(0, 0, 0)';
textAlign = 'start'; textTransform = 'none'; transform = 'none';
opacity = ‘1'; display = ‘block'; visibility = 'visible';
}
export class StyleDeclaration {
borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’;
borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)';
borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px';
borderTopRightRadius = '0px'; borderBottomRightRadius = '0px';
borderBottomLeftRadius = '0px'; borderWidth = '0px';
boxShadow = 'none'; padding = '0px';
backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)';
fill = 'rgb(0, 0, 0)’; strokeWidth = '1px';
fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400';
letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal';
textDecoration = 'none solid rgb(0, 0, 0)';
textAlign = 'start'; textTransform = 'none'; transform = 'none';
opacity = ‘1'; display = ‘block'; visibility = 'visible';
}
“browser stylesheet”
CSS+HTML to Sketch
<button …>
+ CSSStyleDeclaration
<div …>
+ CSSStyleDeclaration
<h1>
+ CSSStyleDeclaration
…
…
"frame": {
"_class": "rect",
"constrainProportions":
false,
"height": 44,
"width": 764,
"x": 0,
"y": 0
},
…
.json
Transform Angular to Sketch
Angular library Sketch library
? CSSDecl jsonSketch Generator
Generate CSS Declaration files
CSS
scraper
Generate CSS Declaration files
CSS
scraper
Generate CSS Declaration files
CSS
scraper
<button …>
Generate CSS Declaration files
CSS
scraper
<button …>
➡ getComputedStyle()
Generate CSS Declaration files
CSS
scraper
<button …>
➡ getComputedStyle()
➡ getBoundingClientRect()
Generate CSS Declaration files
CSS
scraper
<button …>
➡ getComputedStyle()
➡ getBoundingClientRect()
<div …>
Generate CSS Declaration files
CSS
scraper
<button …>
➡ getComputedStyle()
➡ getBoundingClientRect()
<div …>
➡ getComputedStyle()
➡ getBoundingClientRect()
Generate CSS Declaration files
CSS
scraper
<button …>
➡ getComputedStyle()
➡ getBoundingClientRect()
<div …>
➡ getComputedStyle()
➡ getBoundingClientRect()
<h1>
➡ getComputedStyle()
➡ getBoundingClientRect()
…
Generate CSS Declaration files
CSS
scraper
<button …>
➡ getComputedStyle()
➡ getBoundingClientRect()
<div …>
➡ getComputedStyle()
➡ getBoundingClientRect()
<h1>
➡ getComputedStyle()
➡ getBoundingClientRect()
…
<button …>
+ CSSStyleDeclaration
<div …>
+ CSSStyleDeclaration
<h1>
+ CSSStyleDeclaration
…
Generate CSS Declaration files
CSS
scraper
<button …>
➡ getComputedStyle()
➡ getBoundingClientRect()
<div …>
➡ getComputedStyle()
➡ getBoundingClientRect()
<h1>
➡ getComputedStyle()
➡ getBoundingClientRect()
…
Generate CSS Declaration files
CSS
scraper
Generate CSS Declaration files
CSS
scraper
update!
Generate CSS Declaration files
CSS
scraper
update!
Generate CSS Declaration files
CSS
scraper
update!
Transform angular to sketch
Angular library Sketch library
? CSSDecl jsonSketch GeneratorApp CSS scraper
Parsing component code
Angular
component lib
TS
Parsing component code
Angular
component lib
Parses AST
A ‘pure’ example and component variants
TSAngular
component lib
Parses AST
A ‘pure’ example and component variants
TSAngular
component lib
examples
A ‘pure’ example and component variants
TSAngular
component lib
@Component({
moduleId: module.id,
template: `<button dt-button>Simple button</button>`,
})
export class ButtonPureExampleComponent { }
examples
A ‘pure’ example and component variants
TSAngular
component lib
@Component({
moduleId: module.id,
template: `<button dt-button>Simple button</button>`,
})
export class ButtonPureExampleComponent { }
examples
A ‘pure’ example and component variants
TSAngular
component lib
@Component({
moduleId: module.id,
template: `<button dt-button>Simple button</button>`,
})
export class ButtonPureExampleComponent { }
examples
variants
A ‘pure’ example and component variants
TSAngular
component lib
@Component({
moduleId: module.id,
template: `<button dt-button>Simple button</button>`,
})
export class ButtonPureExampleComponent { }
@Component({
selector: `button[dt-button], button[dt-icon-button]`,
templateUrl: 'button.html',
})
export class DtButton extends … {
@Input()
get variant(): ‘primary’ | ‘secondary’ { return this._variant; }
}
examples
variants
A ‘pure’ example and component variants
TSAngular
component lib
@Component({
moduleId: module.id,
template: `<button dt-button>Simple button</button>`,
})
export class ButtonPureExampleComponent { }
@Component({
selector: `button[dt-button], button[dt-icon-button]`,
templateUrl: 'button.html',
})
export class DtButton extends … {
@Input()
get variant(): ‘primary’ | ‘secondary’ { return this._variant; }
}
examples
variants
A ‘pure’ example and component variants
TSAngular
component lib
@Component({
moduleId: module.id,
template: `<button dt-button>Simple button</button>`,
})
export class ButtonPureExampleComponent { }
@Component({
selector: `button[dt-button], button[dt-icon-button]`,
templateUrl: 'button.html',
})
export class DtButton extends … {
@Input()
get variant(): ‘primary’ | ‘secondary’ { return this._variant; }
}
examples
variants
A ‘pure’ example and component variants
TSAngular
component lib
@Component({
moduleId: module.id,
template: `<button dt-button>Simple button</button>`,
})
export class ButtonPureExampleComponent { }
@Component({
selector: `button[dt-button], button[dt-icon-button]`,
templateUrl: 'button.html',
})
export class DtButton extends … {
@Input()
get variant(): ‘primary’ | ‘secondary’ { return this._variant; }
}
examples
variants
A ‘pure’ example and component variants
TSAngular
component lib
examples
variants
A ‘pure’ example and component variants
TSAngular
component lib
examples
+
variants
A ‘pure’ example and component variants
TSAngular
component lib
examples
+
variants
A ‘pure’ example and component variants
TSAngular
component lib
examples
+
variants
A ‘pure’ example and component variants
TSAngular
component lib
examples
+
variants
Transform Angular to Sketch
Angular library Sketch libraryCSSDecl json
Sketch GeneratorApp
CSS
scraper
Library
App
generator
UX + design
Initial idea
Angular
component lib
Product
code
Sketch lib
Barista
Design System
Angular
component lib
Barista
Design System
Sketch lib
Product
code
UX + design
$royalblue-700: #393db0;
dt-theme-palette($green-600,
$green-700, $green-800),
Lukas Holzer

@luka5c0m
Katrin Freihofner

@Ka_TriN_F
Stefan Baumgartner

@ddprrt
Office hours

12:30 - 13:00

More Related Content

Similar to Automating UI development

cssstyle.cssbody { font-family Montserrat, Arial, sa
cssstyle.cssbody {    font-family Montserrat, Arial, sacssstyle.cssbody {    font-family Montserrat, Arial, sa
cssstyle.cssbody { font-family Montserrat, Arial, sa
MargenePurnell14
 
Theme01
Theme01Theme01
Week ThreeExpress Holidayscssstyle.csshtml{ height 100.docx
Week ThreeExpress Holidayscssstyle.csshtml{ height 100.docxWeek ThreeExpress Holidayscssstyle.csshtml{ height 100.docx
Week ThreeExpress Holidayscssstyle.csshtml{ height 100.docx
philipnelson29183
 
Sassive Aggressive: Using Sass to Make Your Life Easier (NSWG Version)
Sassive Aggressive: Using Sass to Make Your Life Easier (NSWG Version)Sassive Aggressive: Using Sass to Make Your Life Easier (NSWG Version)
Sassive Aggressive: Using Sass to Make Your Life Easier (NSWG Version)
Adam Darowski
 
Simple Blue Blog Template XML 的副本
Simple Blue Blog Template XML 的副本Simple Blue Blog Template XML 的副本
Simple Blue Blog Template XML 的副本
a5494535
 
Theme04
Theme04Theme04
Yeni metin belgesi (2)
Yeni metin belgesi (2)Yeni metin belgesi (2)
Yeni metin belgesi (2)
makarnalar
 
JDRF: Improving Lives. Curing Type 1 Diabetes
JDRF: Improving Lives. Curing Type 1 DiabetesJDRF: Improving Lives. Curing Type 1 Diabetes
JDRF: Improving Lives. Curing Type 1 Diabetes
stella6copeland43
 
Mobile-first OOCSS, Sass & Compass at BBC Responsive News
Mobile-first OOCSS, Sass & Compass at BBC Responsive NewsMobile-first OOCSS, Sass & Compass at BBC Responsive News
Mobile-first OOCSS, Sass & Compass at BBC Responsive News
Kaelig Deloumeau-Prigent
 
LessCSS Presentation @ April 2015 GTALUG Meeting
LessCSS Presentation @ April 2015 GTALUG MeetingLessCSS Presentation @ April 2015 GTALUG Meeting
LessCSS Presentation @ April 2015 GTALUG Meeting
Myles Braithwaite
 
AnguVeluRajamanickamArjun_Week-01 Praccontact.htmlHex Simpl.docx
AnguVeluRajamanickamArjun_Week-01 Praccontact.htmlHex Simpl.docxAnguVeluRajamanickamArjun_Week-01 Praccontact.htmlHex Simpl.docx
AnguVeluRajamanickamArjun_Week-01 Praccontact.htmlHex Simpl.docx
daniahendric
 
FCIP SASS Talk
FCIP SASS TalkFCIP SASS Talk
FCIP SASS Talk
Chris Schneider
 
Theme futura suicida não use como base e nem copie
Theme futura suicida não use como base e nem copieTheme futura suicida não use como base e nem copie
Theme futura suicida não use como base e nem copie
Rafaela Souza
 
Theme futura suicida não use como base e nem copie
Theme futura suicida não use como base e nem copieTheme futura suicida não use como base e nem copie
Theme futura suicida não use como base e nem copie
Rafaela Souza
 
Version1.0 StartHTML000000217 EndHTML000067516 StartFragment0000
Version1.0 StartHTML000000217 EndHTML000067516 StartFragment0000Version1.0 StartHTML000000217 EndHTML000067516 StartFragment0000
Version1.0 StartHTML000000217 EndHTML000067516 StartFragment0000
tidwellerin392
 
User Interface Design
User Interface DesignUser Interface Design
User Interface Design
Elie Khoury
 
HELLO WORLD 2.pptx
HELLO WORLD 2.pptxHELLO WORLD 2.pptx
HELLO WORLD 2.pptx
20CM014ROYALJAGADISH
 
i tried my best to look the exact same from the picture- but some code.pdf
i tried my best to look the exact same from the picture- but some code.pdfi tried my best to look the exact same from the picture- but some code.pdf
i tried my best to look the exact same from the picture- but some code.pdf
bolero3277
 
Corilennyg gmail-com-rsp2
Corilennyg gmail-com-rsp2Corilennyg gmail-com-rsp2
Corilennyg gmail-com-rsp2
cori0506
 
Horario
HorarioHorario
Horario
1wwefan
 

Similar to Automating UI development (20)

cssstyle.cssbody { font-family Montserrat, Arial, sa
cssstyle.cssbody {    font-family Montserrat, Arial, sacssstyle.cssbody {    font-family Montserrat, Arial, sa
cssstyle.cssbody { font-family Montserrat, Arial, sa
 
Theme01
Theme01Theme01
Theme01
 
Week ThreeExpress Holidayscssstyle.csshtml{ height 100.docx
Week ThreeExpress Holidayscssstyle.csshtml{ height 100.docxWeek ThreeExpress Holidayscssstyle.csshtml{ height 100.docx
Week ThreeExpress Holidayscssstyle.csshtml{ height 100.docx
 
Sassive Aggressive: Using Sass to Make Your Life Easier (NSWG Version)
Sassive Aggressive: Using Sass to Make Your Life Easier (NSWG Version)Sassive Aggressive: Using Sass to Make Your Life Easier (NSWG Version)
Sassive Aggressive: Using Sass to Make Your Life Easier (NSWG Version)
 
Simple Blue Blog Template XML 的副本
Simple Blue Blog Template XML 的副本Simple Blue Blog Template XML 的副本
Simple Blue Blog Template XML 的副本
 
Theme04
Theme04Theme04
Theme04
 
Yeni metin belgesi (2)
Yeni metin belgesi (2)Yeni metin belgesi (2)
Yeni metin belgesi (2)
 
JDRF: Improving Lives. Curing Type 1 Diabetes
JDRF: Improving Lives. Curing Type 1 DiabetesJDRF: Improving Lives. Curing Type 1 Diabetes
JDRF: Improving Lives. Curing Type 1 Diabetes
 
Mobile-first OOCSS, Sass & Compass at BBC Responsive News
Mobile-first OOCSS, Sass & Compass at BBC Responsive NewsMobile-first OOCSS, Sass & Compass at BBC Responsive News
Mobile-first OOCSS, Sass & Compass at BBC Responsive News
 
LessCSS Presentation @ April 2015 GTALUG Meeting
LessCSS Presentation @ April 2015 GTALUG MeetingLessCSS Presentation @ April 2015 GTALUG Meeting
LessCSS Presentation @ April 2015 GTALUG Meeting
 
AnguVeluRajamanickamArjun_Week-01 Praccontact.htmlHex Simpl.docx
AnguVeluRajamanickamArjun_Week-01 Praccontact.htmlHex Simpl.docxAnguVeluRajamanickamArjun_Week-01 Praccontact.htmlHex Simpl.docx
AnguVeluRajamanickamArjun_Week-01 Praccontact.htmlHex Simpl.docx
 
FCIP SASS Talk
FCIP SASS TalkFCIP SASS Talk
FCIP SASS Talk
 
Theme futura suicida não use como base e nem copie
Theme futura suicida não use como base e nem copieTheme futura suicida não use como base e nem copie
Theme futura suicida não use como base e nem copie
 
Theme futura suicida não use como base e nem copie
Theme futura suicida não use como base e nem copieTheme futura suicida não use como base e nem copie
Theme futura suicida não use como base e nem copie
 
Version1.0 StartHTML000000217 EndHTML000067516 StartFragment0000
Version1.0 StartHTML000000217 EndHTML000067516 StartFragment0000Version1.0 StartHTML000000217 EndHTML000067516 StartFragment0000
Version1.0 StartHTML000000217 EndHTML000067516 StartFragment0000
 
User Interface Design
User Interface DesignUser Interface Design
User Interface Design
 
HELLO WORLD 2.pptx
HELLO WORLD 2.pptxHELLO WORLD 2.pptx
HELLO WORLD 2.pptx
 
i tried my best to look the exact same from the picture- but some code.pdf
i tried my best to look the exact same from the picture- but some code.pdfi tried my best to look the exact same from the picture- but some code.pdf
i tried my best to look the exact same from the picture- but some code.pdf
 
Corilennyg gmail-com-rsp2
Corilennyg gmail-com-rsp2Corilennyg gmail-com-rsp2
Corilennyg gmail-com-rsp2
 
Horario
HorarioHorario
Horario
 

More from Stefan Baumgartner

WASM! WASI! WAGI! WAT?
WASM! WASI! WAGI! WAT?WASM! WASI! WAGI! WAT?
WASM! WASI! WAGI! WAT?
Stefan Baumgartner
 
Serverless Rust
Serverless RustServerless Rust
Serverless Rust
Stefan Baumgartner
 
What TypeScript taught me about JavaScript
What TypeScript taught me about JavaScriptWhat TypeScript taught me about JavaScript
What TypeScript taught me about JavaScript
Stefan Baumgartner
 
Real-world component libraries at scale
Real-world component libraries at scaleReal-world component libraries at scale
Real-world component libraries at scale
Stefan Baumgartner
 
Jamstack on Azure
Jamstack on AzureJamstack on Azure
Jamstack on Azure
Stefan Baumgartner
 
TypeScript's Type System
TypeScript's Type SystemTypeScript's Type System
TypeScript's Type System
Stefan Baumgartner
 
The hero's journey
The hero's journeyThe hero's journey
The hero's journey
Stefan Baumgartner
 
Sketchmine: Design Systems Tooling
Sketchmine: Design Systems ToolingSketchmine: Design Systems Tooling
Sketchmine: Design Systems Tooling
Stefan Baumgartner
 
A hero's journey in JavaScript frameworks
A hero's journey in JavaScript frameworksA hero's journey in JavaScript frameworks
A hero's journey in JavaScript frameworks
Stefan Baumgartner
 
[German] Ab mit dem Kopf!
[German] Ab mit dem Kopf![German] Ab mit dem Kopf!
[German] Ab mit dem Kopf!
Stefan Baumgartner
 
Advanced JavaScript build pipelines using Gulp.js
Advanced JavaScript build pipelines using Gulp.jsAdvanced JavaScript build pipelines using Gulp.js
Advanced JavaScript build pipelines using Gulp.js
Stefan Baumgartner
 
Speed Index, explained!
Speed Index, explained!Speed Index, explained!
Speed Index, explained!
Stefan Baumgartner
 
Plumbin Pipelines - A Gulp.js workshop
Plumbin Pipelines - A Gulp.js workshopPlumbin Pipelines - A Gulp.js workshop
Plumbin Pipelines - A Gulp.js workshop
Stefan Baumgartner
 

More from Stefan Baumgartner (13)

WASM! WASI! WAGI! WAT?
WASM! WASI! WAGI! WAT?WASM! WASI! WAGI! WAT?
WASM! WASI! WAGI! WAT?
 
Serverless Rust
Serverless RustServerless Rust
Serverless Rust
 
What TypeScript taught me about JavaScript
What TypeScript taught me about JavaScriptWhat TypeScript taught me about JavaScript
What TypeScript taught me about JavaScript
 
Real-world component libraries at scale
Real-world component libraries at scaleReal-world component libraries at scale
Real-world component libraries at scale
 
Jamstack on Azure
Jamstack on AzureJamstack on Azure
Jamstack on Azure
 
TypeScript's Type System
TypeScript's Type SystemTypeScript's Type System
TypeScript's Type System
 
The hero's journey
The hero's journeyThe hero's journey
The hero's journey
 
Sketchmine: Design Systems Tooling
Sketchmine: Design Systems ToolingSketchmine: Design Systems Tooling
Sketchmine: Design Systems Tooling
 
A hero's journey in JavaScript frameworks
A hero's journey in JavaScript frameworksA hero's journey in JavaScript frameworks
A hero's journey in JavaScript frameworks
 
[German] Ab mit dem Kopf!
[German] Ab mit dem Kopf![German] Ab mit dem Kopf!
[German] Ab mit dem Kopf!
 
Advanced JavaScript build pipelines using Gulp.js
Advanced JavaScript build pipelines using Gulp.jsAdvanced JavaScript build pipelines using Gulp.js
Advanced JavaScript build pipelines using Gulp.js
 
Speed Index, explained!
Speed Index, explained!Speed Index, explained!
Speed Index, explained!
 
Plumbin Pipelines - A Gulp.js workshop
Plumbin Pipelines - A Gulp.js workshopPlumbin Pipelines - A Gulp.js workshop
Plumbin Pipelines - A Gulp.js workshop
 

Recently uploaded

Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
Octavian Nadolu
 
“I’m still / I’m still / Chaining from the Block”
“I’m still / I’m still / Chaining from the Block”“I’m still / I’m still / Chaining from the Block”
“I’m still / I’m still / Chaining from the Block”
Claudio Di Ciccio
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
Aftab Hussain
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 
Mind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AIMind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AI
Kumud Singh
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Speck&Tech
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
Matthew Sinclair
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
DianaGray10
 
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
Neo4j
 
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
Neo4j
 
UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
DianaGray10
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
mikeeftimakis1
 
Full-RAG: A modern architecture for hyper-personalization
Full-RAG: A modern architecture for hyper-personalizationFull-RAG: A modern architecture for hyper-personalization
Full-RAG: A modern architecture for hyper-personalization
Zilliz
 
GenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizationsGenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizations
kumardaparthi1024
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems S.M.S.A.
 
Mariano G Tinti - Decoding SpaceX
Mariano G Tinti - Decoding SpaceXMariano G Tinti - Decoding SpaceX
Mariano G Tinti - Decoding SpaceX
Mariano Tinti
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
Matthew Sinclair
 
GraphRAG for Life Science to increase LLM accuracy
GraphRAG for Life Science to increase LLM accuracyGraphRAG for Life Science to increase LLM accuracy
GraphRAG for Life Science to increase LLM accuracy
Tomaz Bratanic
 

Recently uploaded (20)

Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
 
“I’m still / I’m still / Chaining from the Block”
“I’m still / I’m still / Chaining from the Block”“I’m still / I’m still / Chaining from the Block”
“I’m still / I’m still / Chaining from the Block”
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 
Mind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AIMind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AI
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
 
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
 
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
 
UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
 
Full-RAG: A modern architecture for hyper-personalization
Full-RAG: A modern architecture for hyper-personalizationFull-RAG: A modern architecture for hyper-personalization
Full-RAG: A modern architecture for hyper-personalization
 
GenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizationsGenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizations
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
 
Mariano G Tinti - Decoding SpaceX
Mariano G Tinti - Decoding SpaceXMariano G Tinti - Decoding SpaceX
Mariano G Tinti - Decoding SpaceX
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
 
GraphRAG for Life Science to increase LLM accuracy
GraphRAG for Life Science to increase LLM accuracyGraphRAG for Life Science to increase LLM accuracy
GraphRAG for Life Science to increase LLM accuracy
 

Automating UI development

  • 2. Slide about usKatrin Freihofner
 @Ka_TriN_F devone.at
  • 3. Slide about usStefan Baumgartner
 @ddprrt javascript-podcast.com
  • 4.
  • 5.
  • 6.
  • 8. Highly specialised screens … with lots of generic, flexible components
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 22.
  • 23. You might wonder …how will this affect the product?
  • 24.
  • 27. UX + design Initial idea Sketch lib
  • 28. UX + design Initial idea Angular component lib Product code Sketch lib
  • 29. UX + design Initial idea Angular component lib Product code Sketch lib Barista Design System
  • 30. UX + design Initial idea Angular component lib Product code Sketch lib Barista Design System
  • 31. UX + design Initial idea Angular component lib Product code Sketch lib Barista Design System
  • 32. UX + design Initial idea Angular component lib Product code Sketch lib Barista Design System
  • 33. UX + design Initial idea Angular component lib Product code Sketch lib Barista Design System
  • 34. UX + design Initial idea Angular component lib Product code Sketch lib Barista Design System
  • 35. UX + design Initial idea Angular component lib Product code Sketch lib Barista Design System
  • 36.
  • 37.
  • 38.
  • 42. Barista Design System Product code UX + design Sketch lib Angular component lib
  • 43. Transform Angular to Sketch Angular library Sketch library ?
  • 44. .sketch is bunch of JSON files library.sketch pages D91775B4-2C6C-4FCC-9209-6D8C930B9013.json document.json meta.json user.json
  • 45. .sketch is bunch of JSON files library.sketch pages D91775B4-2C6C-4FCC-9209-6D8C930B9013.json document.json meta.json user.json We can hack that!
  • 46. CSS equivalents in .sketch JSON button { width: 122px; height: 32px; background-color: #00f; } ShapeGroup: { frame: {x: 0, y: 0, width: 122, height: 32} layers: [ ShapePath: { points: [‘{0,0}’,‘{0,1}’,‘{1,1}’,‘{1,0}’] } ], style: { fills: [ color: { red: 0, green: 0, blue: 1, alpha: 1 } ] } }
  • 47. CSS equivalents in .sketch JSON button { width: 122px; height: 32px; background-color: #00f; } ShapeGroup: { frame: {x: 0, y: 0, width: 122, height: 32} layers: [ ShapePath: { points: [‘{0,0}’,‘{0,1}’,‘{1,1}’,‘{1,0}’] } ], style: { fills: [ color: { red: 0, green: 0, blue: 1, alpha: 1 } ] } }
  • 48. { "_class": "page", "do_objectID": "6224EB85-9573-4D33-BEE5-C57F892B94E4", "exportOptions": { "_class": "exportOptions", "exportFormats": [], "includedLayerIds": [], "layerOptions": 0, "shouldTrim": false }, "frame": { "_class": "rect", "constrainProportions": false, "height": 300, "width": 300, "x": 0, "y": 0 }, "isFlippedHorizontal": false, CSS equivalents in .sketch JSON button { width: 122px; height: 32px; background-color: #00f; }
  • 49. CSS equivalents in .sketch JSON button { width: 122px; height: 32px; background-color: #00f; }
  • 50. parsable properties export class StyleDeclaration { borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’; borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)'; borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px'; borderTopRightRadius = '0px'; borderBottomRightRadius = '0px'; borderBottomLeftRadius = '0px'; borderWidth = '0px'; boxShadow = 'none'; padding = '0px'; backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)'; fill = 'rgb(0, 0, 0)’; strokeWidth = '1px'; fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400'; letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal'; textDecoration = 'none solid rgb(0, 0, 0)'; textAlign = 'start'; textTransform = 'none'; transform = 'none'; opacity = ‘1'; display = ‘block'; visibility = 'visible'; }
  • 51. parsable properties export class StyleDeclaration { borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’; borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)'; borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px'; borderTopRightRadius = '0px'; borderBottomRightRadius = '0px'; borderBottomLeftRadius = '0px'; borderWidth = '0px'; boxShadow = 'none'; padding = '0px'; backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)'; fill = 'rgb(0, 0, 0)’; strokeWidth = '1px'; fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400'; letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal'; textDecoration = 'none solid rgb(0, 0, 0)'; textAlign = 'start'; textTransform = 'none'; transform = 'none'; opacity = ‘1'; display = ‘block'; visibility = 'visible'; }
  • 52. parsable properties export class StyleDeclaration { borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’; borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)'; borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px'; borderTopRightRadius = '0px'; borderBottomRightRadius = '0px'; borderBottomLeftRadius = '0px'; borderWidth = '0px'; boxShadow = 'none'; padding = '0px'; backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)'; fill = 'rgb(0, 0, 0)’; strokeWidth = '1px'; fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400'; letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal'; textDecoration = 'none solid rgb(0, 0, 0)'; textAlign = 'start'; textTransform = 'none'; transform = 'none'; opacity = ‘1'; display = ‘block'; visibility = 'visible'; }
  • 53. parsable properties export class StyleDeclaration { borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’; borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)'; borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px'; borderTopRightRadius = '0px'; borderBottomRightRadius = '0px'; borderBottomLeftRadius = '0px'; borderWidth = '0px'; boxShadow = 'none'; padding = '0px'; backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)'; fill = 'rgb(0, 0, 0)’; strokeWidth = '1px'; fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400'; letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal'; textDecoration = 'none solid rgb(0, 0, 0)'; textAlign = 'start'; textTransform = 'none'; transform = 'none'; opacity = ‘1'; display = ‘block'; visibility = 'visible'; }
  • 54. parsable properties export class StyleDeclaration { borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’; borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)'; borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px'; borderTopRightRadius = '0px'; borderBottomRightRadius = '0px'; borderBottomLeftRadius = '0px'; borderWidth = '0px'; boxShadow = 'none'; padding = '0px'; backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)'; fill = 'rgb(0, 0, 0)’; strokeWidth = '1px'; fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400'; letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal'; textDecoration = 'none solid rgb(0, 0, 0)'; textAlign = 'start'; textTransform = 'none'; transform = 'none'; opacity = ‘1'; display = ‘block'; visibility = 'visible'; }
  • 55. parsable properties export class StyleDeclaration { borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’; borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)'; borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px'; borderTopRightRadius = '0px'; borderBottomRightRadius = '0px'; borderBottomLeftRadius = '0px'; borderWidth = '0px'; boxShadow = 'none'; padding = '0px'; backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)'; fill = 'rgb(0, 0, 0)’; strokeWidth = '1px'; fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400'; letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal'; textDecoration = 'none solid rgb(0, 0, 0)'; textAlign = 'start'; textTransform = 'none'; transform = 'none'; opacity = ‘1'; display = ‘block'; visibility = 'visible'; }
  • 56. parsable properties export class StyleDeclaration { borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’; borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)'; borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px'; borderTopRightRadius = '0px'; borderBottomRightRadius = '0px'; borderBottomLeftRadius = '0px'; borderWidth = '0px'; boxShadow = 'none'; padding = '0px'; backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)'; fill = 'rgb(0, 0, 0)’; strokeWidth = '1px'; fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400'; letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal'; textDecoration = 'none solid rgb(0, 0, 0)'; textAlign = 'start'; textTransform = 'none'; transform = 'none'; opacity = ‘1'; display = ‘block'; visibility = 'visible'; }
  • 57. export class StyleDeclaration { borderTop = '0px none rgb(0, 0, 0)’; borderLeft = '0px none rgb(0, 0, 0)’; borderBottom = '0px none rgb(0, 0, 0)'; borderRight = '0px none rgb(0, 0, 0)'; borderColor = 'rgb(0, 0, 0)'; borderTopLeftRadius = '0px'; borderTopRightRadius = '0px'; borderBottomRightRadius = '0px'; borderBottomLeftRadius = '0px'; borderWidth = '0px'; boxShadow = 'none'; padding = '0px'; backgroundImage = ‘none'; backgroundColor = 'rgba(0, 0, 0, 0)’; color = 'rgb(0, 0, 0)'; fill = 'rgb(0, 0, 0)’; strokeWidth = '1px'; fontFamily = 'Helvetica Neue'; fontSize = '16px'; fontStyle = 'normal'; fontWeight = '400'; letterSpacing = ‘normal'; whiteSpace = ‘normal'; lineHeight = 'normal'; textDecoration = 'none solid rgb(0, 0, 0)'; textAlign = 'start'; textTransform = 'none'; transform = 'none'; opacity = ‘1'; display = ‘block'; visibility = 'visible'; } “browser stylesheet”
  • 58. CSS+HTML to Sketch <button …> + CSSStyleDeclaration <div …> + CSSStyleDeclaration <h1> + CSSStyleDeclaration … … "frame": { "_class": "rect", "constrainProportions": false, "height": 44, "width": 764, "x": 0, "y": 0 }, … .json
  • 59. Transform Angular to Sketch Angular library Sketch library ? CSSDecl jsonSketch Generator
  • 60. Generate CSS Declaration files CSS scraper
  • 61. Generate CSS Declaration files CSS scraper
  • 62. Generate CSS Declaration files CSS scraper <button …>
  • 63. Generate CSS Declaration files CSS scraper <button …> ➡ getComputedStyle()
  • 64. Generate CSS Declaration files CSS scraper <button …> ➡ getComputedStyle() ➡ getBoundingClientRect()
  • 65. Generate CSS Declaration files CSS scraper <button …> ➡ getComputedStyle() ➡ getBoundingClientRect() <div …>
  • 66. Generate CSS Declaration files CSS scraper <button …> ➡ getComputedStyle() ➡ getBoundingClientRect() <div …> ➡ getComputedStyle() ➡ getBoundingClientRect()
  • 67. Generate CSS Declaration files CSS scraper <button …> ➡ getComputedStyle() ➡ getBoundingClientRect() <div …> ➡ getComputedStyle() ➡ getBoundingClientRect() <h1> ➡ getComputedStyle() ➡ getBoundingClientRect() …
  • 68. Generate CSS Declaration files CSS scraper <button …> ➡ getComputedStyle() ➡ getBoundingClientRect() <div …> ➡ getComputedStyle() ➡ getBoundingClientRect() <h1> ➡ getComputedStyle() ➡ getBoundingClientRect() … <button …> + CSSStyleDeclaration <div …> + CSSStyleDeclaration <h1> + CSSStyleDeclaration …
  • 69. Generate CSS Declaration files CSS scraper <button …> ➡ getComputedStyle() ➡ getBoundingClientRect() <div …> ➡ getComputedStyle() ➡ getBoundingClientRect() <h1> ➡ getComputedStyle() ➡ getBoundingClientRect() …
  • 70. Generate CSS Declaration files CSS scraper
  • 71. Generate CSS Declaration files CSS scraper update!
  • 72. Generate CSS Declaration files CSS scraper update!
  • 73. Generate CSS Declaration files CSS scraper update!
  • 74. Transform angular to sketch Angular library Sketch library ? CSSDecl jsonSketch GeneratorApp CSS scraper
  • 77. A ‘pure’ example and component variants TSAngular component lib Parses AST
  • 78. A ‘pure’ example and component variants TSAngular component lib examples
  • 79. A ‘pure’ example and component variants TSAngular component lib @Component({ moduleId: module.id, template: `<button dt-button>Simple button</button>`, }) export class ButtonPureExampleComponent { } examples
  • 80. A ‘pure’ example and component variants TSAngular component lib @Component({ moduleId: module.id, template: `<button dt-button>Simple button</button>`, }) export class ButtonPureExampleComponent { } examples
  • 81. A ‘pure’ example and component variants TSAngular component lib @Component({ moduleId: module.id, template: `<button dt-button>Simple button</button>`, }) export class ButtonPureExampleComponent { } examples variants
  • 82. A ‘pure’ example and component variants TSAngular component lib @Component({ moduleId: module.id, template: `<button dt-button>Simple button</button>`, }) export class ButtonPureExampleComponent { } @Component({ selector: `button[dt-button], button[dt-icon-button]`, templateUrl: 'button.html', }) export class DtButton extends … { @Input() get variant(): ‘primary’ | ‘secondary’ { return this._variant; } } examples variants
  • 83. A ‘pure’ example and component variants TSAngular component lib @Component({ moduleId: module.id, template: `<button dt-button>Simple button</button>`, }) export class ButtonPureExampleComponent { } @Component({ selector: `button[dt-button], button[dt-icon-button]`, templateUrl: 'button.html', }) export class DtButton extends … { @Input() get variant(): ‘primary’ | ‘secondary’ { return this._variant; } } examples variants
  • 84. A ‘pure’ example and component variants TSAngular component lib @Component({ moduleId: module.id, template: `<button dt-button>Simple button</button>`, }) export class ButtonPureExampleComponent { } @Component({ selector: `button[dt-button], button[dt-icon-button]`, templateUrl: 'button.html', }) export class DtButton extends … { @Input() get variant(): ‘primary’ | ‘secondary’ { return this._variant; } } examples variants
  • 85. A ‘pure’ example and component variants TSAngular component lib @Component({ moduleId: module.id, template: `<button dt-button>Simple button</button>`, }) export class ButtonPureExampleComponent { } @Component({ selector: `button[dt-button], button[dt-icon-button]`, templateUrl: 'button.html', }) export class DtButton extends … { @Input() get variant(): ‘primary’ | ‘secondary’ { return this._variant; } } examples variants
  • 86. A ‘pure’ example and component variants TSAngular component lib examples variants
  • 87. A ‘pure’ example and component variants TSAngular component lib examples + variants
  • 88. A ‘pure’ example and component variants TSAngular component lib examples + variants
  • 89. A ‘pure’ example and component variants TSAngular component lib examples + variants
  • 90. A ‘pure’ example and component variants TSAngular component lib examples + variants
  • 91. Transform Angular to Sketch Angular library Sketch libraryCSSDecl json Sketch GeneratorApp CSS scraper Library App generator
  • 92.
  • 93.
  • 94. UX + design Initial idea Angular component lib Product code Sketch lib Barista Design System
  • 96.
  • 97.
  • 99.
  • 100.
  • 101.