Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Jetpack Compose + design systems
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
François Blavoet
May 03, 2022
Programming
450
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Jetpack Compose + design systems
François Blavoet
May 03, 2022
More Decks by François Blavoet
See All by François Blavoet
Accessibility made Easy
francois_blavoet
0
140
Vectorial Victories - Android Makers 2018 - Paris
francois_blavoet
0
850
New York Accessibility Hackathon - Accessibility on Android
francois_blavoet
1
130
SVG
francois_blavoet
0
140
And then my phone became smarter - A journey into the Awareness API - MobileEra 2016
francois_blavoet
0
740
And then my phone became smarter - A journey into the Awareness API
francois_blavoet
2
1.5k
Let's Sprinkle some #PerfMatters on your ViewGroups - Droidcon Turin 2016
francois_blavoet
10
1.6k
Let's Sprinkle some #PerfMatters on your ViewGroups - Droidcon Paris 2015
francois_blavoet
13
1.7k
Other Decks in Programming
See All in Programming
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.5k
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
550
App Intentsのビルドプロセスを支える技術
kntkymt
0
460
The Rails Doctrine Decade
koic
2
400
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
7
5k
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
160
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
320
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
270
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
110
スマート反転とウェブアクセシビリティ
camiha
0
220
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
170
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
700
Featured
See All Featured
Darren the Foodie - Storyboard
khoart
PRO
4
4k
Building an army of robots
kneath
307
47k
Paper Plane (Part 1)
katiecoart
PRO
2
11k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
290
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
How to build a perfect <img>
jonoalderson
1
6k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Product Roadmaps are Hard
iamctodd
55
13k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
450
Transcript
Jetpack Compose + Design Systems François Blavoet
Jetpack Compose • Compose is the future of Android UI
development • When is the best time to start adopting it ?
Design systems What is a Design system ? -> it
is a complete set of standards intended to manage design at scale using reusable components and patterns.
Design systems @GET("/addresses") fun getAddresses(): Single<GetAddressesResponse> @PUT("/addresses/{address_id}") fun updateAddress(@Path("address_id") id:
String, @Body body: Map<String, Any>): Single<AddressResponse>
Let’s have a look at one component
Let’s have a look at one component
Let’s have a look at one component
Let’s have a look at one component
Let’s have a look at one component Row.Content { leading(
label = "Order Changes Preferences", label2 = "Suggest replacements ...", ) trailing( label = "Edit", option = Row.TrailingOption.Clickable(onPreferenceClick) ) }
Let’s have a look at one component Row.Content { leading(
label = "Tue Jun 2, 4–5pm", option = LeadingOption.Icon(Icon.Time), ) }
One design system
Material Design
Material Design Button( onClick: () -> Unit, modifier: Modifier =
Modifier, enabled: Boolean = true, interactionSource: MutableInteractionSource = remember {..}, elevation: ButtonElevation? = ButtonDefaults.elevation(), shape: Shape = MaterialTheme.shapes.small, border: BorderStroke? = null, colors: ButtonColors = ButtonDefaults.buttonColors(), contentPadding: PaddingValues = ButtonDefaults.ContentPadding, content: @Composable RowScope.() -> Unit, )
Material Design?
Material Design? ?
None
Let’s implement our own system
Atoms
Atoms Requirements: • Day/night • Customizable for white label apps
• As easy to use as possible • Have an abstract representation outside of the composition
Atoms interface ColorSpec { @Composable fun value(): Color }
Atoms interface ColorSpec { @Composable fun value(): Color companion object
{ val SystemGrayscale70: ColorSpec = … val SystemGrayscale50: ColorSpec = … … } }
Atoms interface ColorSpec { @Composable fun value(): Color companion object
{ val SystemGrayscale70: ColorSpec = … val SystemGrayscale50: ColorSpec = … … fun fromColor(color: Color): ColorSpec { return StaticColor(color) } } }
Atoms @Composable fun DesignTheme( configuration: ThemeConfig? = null, content: @Composable
() -> Unit, ) { … } object DesignTheme { val colors: Colors @Composable @ReadOnlyComposable get() = LocalColors.current }
Atoms
Atoms interface IconSlot { @Composable fun Content(contentColor: Color) }
Atoms interface IconSlot { @Composable fun Content(contentColor: Color) companion object
{ fun fromResource( @DrawableRes res: Int, contentDescription: TextSpec?, ): IconSlot { return ResIcon(res, contentDescription) } } }
Atoms enum class Icons(@DrawableRes internal val resId: Int) : IconSlot
{ Accessibility(R.drawable.cp_accessibility), Account(R.drawable.cp_account), Add(R.drawable.cp_add), … }
Molecules
Molecules data class PillSpec( val label: TextSpec, val onClick: (()
-> Unit)?, val selected: Boolean = false, ) @Composable fun Pill( spec: PillSpec, modifier: Modifier = Modifier, )
Molecules data class PillSpec( val label: TextSpec, val onClick: (()
-> Unit)?, val selected: Boolean = false, ) @Composable fun Pill( spec: PillSpec, modifier: Modifier = Modifier, ) @Composable fun BasePill( selected: Boolean, onClick: (() -> Unit)?, modifier: Modifier = Modifier, … content: @Composable BoxScope.(contentColor: Color) -> Unit, )
Going Further import androidx.compose.material.Text @Composable fun Text( text: AnnotatedString, modifier:
Modifier = Modifier, style: TextStyle = LocalTextStyle.current, … ) {
Going Further import com.instacart.compote.foundation.Text @Composable fun Text( text: RichTextSpec, modifier:
Modifier = Modifier, style: TextStyle = TextStyleSpec.Default, … )
33
Thank you! François Blavoet