diff --git a/app/ide-desktop/lib/dashboard/src/authentication/src/dashboard/components/templates.tsx b/app/ide-desktop/lib/dashboard/src/authentication/src/dashboard/components/templates.tsx
new file mode 100644
index 0000000000000..01cb40de01ddb
--- /dev/null
+++ b/app/ide-desktop/lib/dashboard/src/authentication/src/dashboard/components/templates.tsx
@@ -0,0 +1,133 @@
+/** @file Renders the list of templates from which a project can be created. */
+import * as svg from '../../components/svg'
+
+// =================
+// === Constants ===
+// =================
+
+/**
+ * Dash border spacing is not supported by native CSS.
+ * Therefore, use a background image to create the border.
+ * It is essentially an SVG image that was generated by the website.
+ * @see {@link https://kovart.github.io/dashed-border-generator}
+ */
+const BORDER = `url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='16' ry='16' stroke='%233e515f' stroke-width='4' stroke-dasharray='15%2c 15' stroke-dashoffset='0' stroke-linecap='butt'/%3e%3c/svg%3e")`
+
+// =================
+// === Templates ===
+// =================
+
+/** Template metadata. */
+interface Template {
+ title: string
+ description: string
+ id: string
+}
+
+/** All templates for creating projects that have contents. */
+const TEMPLATES: Template[] = [
+ {
+ title: 'Colorado COVID',
+ id: 'Colorado_COVID',
+ description: 'Learn to glue multiple spreadsheets to analyses all your data at once.',
+ },
+ {
+ title: 'KMeans',
+ id: 'Kmeans',
+ description: 'Learn where to open a coffee shop to maximize your income.',
+ },
+ {
+ title: 'NASDAQ Returns',
+ id: 'NASDAQ_Returns',
+ description: 'Learn how to clean your data to prepare it for advanced analysis.',
+ },
+ {
+ title: 'Restaurants',
+ id: 'Orders',
+ description: 'Learn how to clean your data to prepare it for advanced analysis.',
+ },
+ {
+ title: 'Github Stars',
+ id: 'Stargazers',
+ description: 'Learn how to clean your data to prepare it for advanced analysis.',
+ },
+]
+
+// =======================
+// === TemplatesRender ===
+// =======================
+
+/** Render all templates, and a button to create an empty project. */
+interface TemplatesRenderProps {
+ // Later this data may be requested and therefore needs to be passed dynamically.
+ templates: Template[]
+ onTemplateClick: (name?: string | null) => void
+}
+
+function TemplatesRender(props: TemplatesRenderProps) {
+ const { templates, onTemplateClick } = props
+
+ /** The action button for creating an empty project. */
+ const CreateEmptyTemplate = (
+
+ )
+
+ return (
+ <>
+ {CreateEmptyTemplate}
+ {templates.map(template => (
+
{
+ onTemplateClick(template.id)
+ }}
+ >
+
+
+
{template.title}
+
+ {template.description}
+
+
+
+
+ ))}
+ >
+ )
+}
+
+// =================
+// === Templates ===
+// =================
+
+/** The `TemplatesRender`'s container. */
+interface TemplatesProps {
+ onTemplateClick: (name?: string | null) => void
+}
+
+function Templates(props: TemplatesProps) {
+ const { onTemplateClick } = props
+ return (
+
+ )
+}
+export default Templates
diff --git a/app/ide-desktop/lib/dashboard/src/tailwind.css b/app/ide-desktop/lib/dashboard/src/tailwind.css
index 7de975659e94f..6d55769518cd8 100644
--- a/app/ide-desktop/lib/dashboard/src/tailwind.css
+++ b/app/ide-desktop/lib/dashboard/src/tailwind.css
@@ -69,5 +69,9 @@ body {
.dasharray-100 {
stroke-dasharray: calc(12 * 6.2832) 0;
}
+
+ .border-dashed-custom {
+ background-image: url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='16' ry='16' stroke='%233e515f' stroke-width='4' stroke-dasharray='15%2c 15' stroke-dashoffset='0' stroke-linecap='butt'/%3e%3c/svg%3e");
+ }
}
}