Created
September 5, 2024 22:28
-
-
Save kevmoo/f27e6a3baaa6cd9bfadaa454c7447903 to your computer and use it in GitHub Desktop.
kevmoo.com
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml"> | |
<head> | |
<title>Kevin Moore - Google Product Manager for Flutter and Dart</title> | |
<meta name="viewport" content="width=device-width"/> | |
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> | |
<meta content="Kevin Moore" property="og:title"/> | |
<meta name="description" content="Product manager at Google working on Flutter and Dart."/> | |
<meta content="https://kevmoo.com" property="og:url"/> | |
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
<link rel="preconnect" href="https://fonts.googleapis.com"> | |
<link href="https://fonts.googleapis.com/css2?family=Roboto+Slab:wght@300;400;600&display=swap" | |
rel="stylesheet"> | |
<link | |
rel="stylesheet" | |
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/all.min.css" | |
integrity="sha512-Kc323vGBEqzTmouAECnVceyQqyqdsSiqLQISBL29aUW4U/M7pSPA/gEUZQqv1cwx4OnYxTxve5UMg5GT6L4JJg==" | |
crossorigin="anonymous" | |
referrerpolicy="no-referrer" | |
/> | |
<link href="default.css" rel="stylesheet" type="text/css"/> | |
<link | |
href="https://work.j832.com/feed.xml" | |
rel="alternate" | |
type="application/atom+xml" | |
/> | |
<link href="favicon.png" rel="shortcut icon"/> | |
<script src="main.dart.js" defer></script> | |
<link rel="canonical" href="https://kevmoo.com" /> | |
</head> | |
<body> | |
<!-- Google Tag Manager (noscript) --> | |
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-KKRDXLTT" | |
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> | |
<!-- End Google Tag Manager (noscript) --> | |
<table> | |
<tr> | |
<td colspan="3"> | |
<h1>Kevin Moore</h1> | |
<p class="description"> | |
<a href="https://www.google.com/">Google</a> product manager for | |
<a href="https://flutter.dev">Flutter</a> and | |
<a href="https://dart.dev">Dart</a>. | |
</p> | |
<p class="profiles"> | |
<a href="https://github.com/kevmoo/" rel="me" title="GitHub/kevmoo"> | |
<i class="fab fa-github fa-2x"></i> | |
</a> | |
<a href="https://mastodon.social/@kevmoo" rel="me" title="mastodon.social/@kevmoo"> | |
<i class="fab fa-mastodon fa-2x"></i> | |
</a> | |
<a href="https://www.reddit.com/user/kevmoo" rel="me" title="Reddit/kevmoo"> | |
<i class="fab fa-reddit fa-2x"></i> | |
</a> | |
<a href="https://g.dev/kevmoo" rel="me" title="Google Developers"> | |
<i class="fab fa-google fa-2x"></i> | |
</a> | |
<a href="https://www.linkedin.com/in/kevmoo/" rel="me" title="LinkedIn/kevmoo"> | |
<i class="fab fa-linkedin fa-2x"></i> | |
</a> | |
<a href="https://twitter.com/kevmoo" rel="me" title="Twitter @kevmoo"> | |
<i class="fab fa-twitter fa-2x"></i> | |
</a> | |
</p> | |
</td> | |
</tr> | |
</table> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'dart:js_interop'; | |
import 'package:web/web.dart'; | |
void main() { | |
final linksTable = document.querySelector('table') as HTMLTableElement; | |
final tableBody = linksTable.createTBody(); | |
for (var entry in _entries.reversed) { | |
final link = | |
'<a href="${entry.uri}" rel="noopener" target="_blank">${entry.title}</a>'; | |
final subContent = entry.subTitle ?? ' '; | |
tableBody.insertAdjacentHTML( | |
'beforeend', | |
''' | |
<tr> | |
<td class="icon">${entry.flavor.awesome}</td> | |
<td class="details">$link<br>$subContent</td> | |
<td class="date">${entry.date.pretty}</td> | |
</tr> | |
''' | |
.toJS, | |
); | |
} | |
} | |
final _entries = [ | |
Entry( | |
title: 'Interview with Łukasz Kosman - Why do we need Flutter for Web?', | |
subTitle: 'Flutter CTO Survey 2024', | |
uri: 'https://www.youtube.com/watch?v=USTi-_KxJV0', | |
date: DateTime(2024, 5, 16), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: "What's new in Flutter", | |
subTitle: 'Google I/O', | |
uri: 'https://www.youtube.com/watch?v=lpnKWK-KEYs', | |
date: DateTime(2024, 5, 15), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Flutter, Dart, AND Wasm: Shipping a new model for web applications', | |
subTitle: 'Wasm I/O', | |
uri: 'https://www.youtube.com/watch?v=qx42r29HhcM', | |
date: DateTime(2024, 3, 14), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Writing a code generator', | |
subTitle: 'Observable Flutter #35', | |
uri: 'https://www.youtube.com/watch?v=ngUiuIdcGjk', | |
date: DateTime(2024, 2, 8), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Front-end and backend with Flutter and Firebase', | |
subTitle: 'F3 Conference', | |
uri: 'https://www.youtube.com/watch?v=wNmPWLTZC2o', | |
date: DateTime(2023, 9, 23), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Developer Platforms with Kevin Moore', | |
subTitle: 'KIRUPA', | |
uri: 'https://www.youtube.com/watch?v=p9I2Ozvtpvc', | |
date: DateTime(2023, 6, 27), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: "Evolving Flutter's support for the web", | |
subTitle: 'Google I/O', | |
uri: 'https://www.youtube.com/watch?v=PY42FysQTgw', | |
date: DateTime(2023, 5, 10), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Flutter, Dart, AND WASM-GC: A New Model for Web Applications', | |
subTitle: 'Wasm I/O', | |
uri: 'https://www.youtube.com/watch?v=Nkjc9r0WDNo', | |
date: DateTime(2023, 3, 23), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Q&A/AMA with @MatanLurey', | |
subTitle: 'Humpday Q&A/AMA', | |
uri: 'https://www.youtube.com/watch?v=Y361N1jCu50', | |
date: DateTime(2022, 9, 14), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'How Flutter enhances web apps', | |
subTitle: 'Google I/O', | |
uri: 'https://www.youtube.com/watch?v=kCnYRhkfWHY', | |
date: DateTime(2022, 5, 12), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Full Stack Dart', | |
subTitle: 'Humpday Q&A/AMA', | |
uri: 'https://www.youtube.com/watch?v=ThhjDJ8uYzU', | |
date: DateTime(2022, 3, 23), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Power-up your Flutter app with Google APIs', | |
subTitle: 'Google I/O', | |
uri: 'https://www.youtube.com/watch?v=z4MsuZiEezY', | |
date: DateTime(2021, 5, 19), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Cloud, Dart, and full-stack Flutter Q & A', | |
subTitle: 'Google I/O', | |
uri: 'https://www.youtube.com/watch?v=r8rVm4-RJJM', | |
date: DateTime(2021, 5, 19), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Building platform adaptive apps', | |
subTitle: 'Google I/O', | |
uri: 'https://www.youtube.com/watch?v=RCdeSKVt7LI', | |
date: DateTime(2021, 5, 19), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Dart in the Cloud', | |
subTitle: 'Rubber Duck Engineering', | |
uri: 'https://www.youtube.com/watch?v=SImcty5QJhM', | |
date: DateTime(2021, 7, 29), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Dart: Productive, Fast, Multi-Platform - Pick 3', | |
subTitle: 'Google I/O', | |
uri: 'https://www.youtube.com/watch?v=J5DQRPRBiFI', | |
date: DateTime(2019, 5, 9), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Null safety in Dart', | |
subTitle: 'Flutter Day 2020', | |
uri: 'https://www.youtube.com/watch?v=W4IpdomZb6g', | |
date: DateTime(2020, 7, 14), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Full Stack Dart', | |
subTitle: 'Google Cloud Platform Podcast', | |
uri: | |
'https://www.gcppodcast.com/post/episode-261-full-stack-dart-with-tony-pujals-and-kevin-moore/', | |
date: DateTime(2021, 5, 25), | |
flavor: EntryFlavor.podcast, | |
), | |
Entry( | |
title: 'Dart in the Cloud, Backend, Command Line, and Shelf', | |
subTitle: 'Flutter 101 Podcast', | |
uri: | |
'https://flutter101.dev/episodes/dart-backend-cloud-command-line-shelf-with-kevin-moore', | |
date: DateTime(2021, 7, 23), | |
flavor: EntryFlavor.podcast, | |
), | |
Entry( | |
title: 'Dart Language Funnel', | |
subTitle: 'Humpday Q&A/AMA', | |
uri: 'https://youtu.be/zkq8XYLm53Y?t=2668', | |
date: DateTime(2021, 9, 22), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Null Safety and Cloud Functions', | |
subTitle: 'Humpday Q&A/AMA', | |
uri: 'https://youtu.be/IjrzpE1dB1w?t=1220', | |
date: DateTime(2021, 3, 24), | |
flavor: EntryFlavor.youtube, | |
), | |
Entry( | |
title: 'Flutter Web', | |
subTitle: "It's All Widgets", | |
uri: 'https://itsallwidgets.com/podcast/episodes/27/kevin-moore', | |
date: DateTime(2019, 5, 23), | |
flavor: EntryFlavor.podcast, | |
), | |
]..sort(); | |
class Entry implements Comparable<Entry> { | |
Entry({ | |
required this.title, | |
this.subTitle, | |
required this.uri, | |
required this.date, | |
required this.flavor, | |
}); | |
final String title; | |
final String? subTitle; | |
final String uri; | |
final EntryFlavor flavor; | |
final DateTime date; | |
@override | |
int compareTo(Entry other) { | |
var value = date.compareTo(other.date); | |
if (value == 0) { | |
value = title.compareTo(other.title); | |
} | |
return value; | |
} | |
} | |
enum EntryFlavor { | |
calendar, | |
youtube, | |
podcast; | |
String get awesome { | |
String clazz; | |
String title; | |
switch (this) { | |
case EntryFlavor.youtube: | |
clazz = 'fab fa-youtube fa-2x'; | |
title = 'YouTube'; | |
case EntryFlavor.podcast: | |
clazz = 'fa fa-podcast fa-2x'; | |
title = 'Podcast'; | |
case EntryFlavor.calendar: | |
clazz = 'fa fa-calendar fa-2x'; | |
title = 'Future event'; | |
} | |
return '<i class="$clazz" title="$title"></i>'; | |
} | |
} | |
extension on DateTime { | |
String get pretty => '$year-${month.toString().padLeft(2, '0')}-' | |
'${day.toString().padLeft(2, '0')}'; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment