Prototyping with HTML

Let's generate a React.js component for displaying a collection of tasks.

kretes generate component TaskCollection
kretes can be abbreviated to just ks, generate to just g and component to just comp i.e. the command ks g comp TaskCollection will also work

This command will create a file in app/components/. Open the TaskCollection.tsx and replace the following content:

import React from 'react';

export const TaskCollection: React.FC<{}> = () => {
  return (
    <div></div>
  )
}

with this:

import React from 'react';

export const TaskCollection: React.FC<{}> = () => {
  return (
    <ul>
      <li>
        <input type="checkbox" />
        <label>Learn Kretes</label>
      </li>
      <li>
        <input type="checkbox" />
        <label>Build a web application</label>
      </li>
      <li>
        <input type="checkbox" />
        <label>Show your app to the world</label>
      </li>
    </ul>
  )
}

It is a list (<ul>) of three elements (<li>) where each represent a task containing a checkbox and a label.

Go to app/components/App.tsx and import newly created TaskCollection component so that the App.tsx content looks as shown below:

import React from 'react';

import { TaskCollection } from '@/components';

const App: React.FC<{}> = () => {
  return (
    <main>
<TaskCollection />
</main> ); } export { App };
@/[directory name] is an alias for conveniently refer to files in the app folder of your project without using relative paths, such as ../ or ../...

A task manager also needs a way to enter tasks. We will use another component for that, let's call it TaskInput.

kretes generate component TaskInput

Our component needs to combine an input field for entering the actual task with a button for submitting the new task. This will constitute a form. This form is static because nothing happens when the button is clicked as we are only concerned with how it's displayed in the UI at this point

import React from 'react';

export const TaskInput: React.FC<{}> = ({}) => {
  return (
    <form>
      <input
        placeholder="Add new item..."
        type="text"
      />
      <button type="submit">Add</button>
    </form>
  );
}

Let's add it to App right above the TaskCollection component:

import React from 'react';

import { TaskCollection, TaskInput } from '@/components';

const App: React.FC<{}> = () => {
  return (
    <main>
<TaskInput />
<TaskCollection /> </main> ); } export { App };

Optionally, we can add yet another component for the header section, let's call it Hero:

kretes generate component Hero

As before, this will create the Hero.tsx file in app/components/. Let's open it and change its content as follows:

import React from 'react';

export const Hero: React.FC<{}> = () => {
  return (
    <header>
      <h1>Taski.app</h1>
      <h3>A task manager with <u>Kretes</u></h3>
    </header>
  )
}

Let's add it to App as before, right above the <main> tag. As React.js requires one root element per component, we need to wrap the content into a Fragment. The <> .. </> is a convenience shortcut for that.

import React from 'react';

import { TaskCollection, TaskInput, Hero } from '@/components';

const App: React.FC<{}> = () => {
  return (
    <>
<Hero />
<main> <TaskInput /> <TaskCollection /> </main> </> ); } export { App };

Start the application

kretes start

Navigate to localhost:5544 to see the result. There should be a single task that we statically defined in the TaskCollection component.

Result

By default Kretes includes a MVP.css. It's a minimalist stylesheet for HTML elements. You don't need to use CSS to have a coherent look'n'feel for the most HTML elements.

Taski.app

The MVP.css is defined as a <link> reference in the <project root>/site/index.html. Later on, we will replace it with Tailwind CSS to show a CSS integration in Kretes. You can, however, use any CSS approach you like.

Found a mistake?