2.9.0 • Published 5 months ago

@hilma/forms v2.9.0

Weekly downloads
-
License
MIT
Repository
-
Last release
5 months ago

Hilma Forms

Table of Contents

Overview

@hilma/forms is a React component library available via npm which makes writing, validating, and styling forms as easy as possible. It is built on formik, yup and mui.

Getting Started

Installation

To install, run

npm install --save @hilma/forms

Configuration

We recommend wrapping your app with the CSSPrioritize component. If you do, your css files will have priority over Forms and mui, and you can override any of our/their styles (without using !important 😉).

index.tsx:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { CSSPrioritize } from '@hilma/forms';

ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
  <React.StrictMode>
    <CSSPrioritize>
      <App />
    </CSSPrioritize>
  </React.StrictMode>
);

Writing A Basic Form

To write a @hilma/forms form, we must use the FormProvider component (API here).

FormProvider requires two props: initialValues and onSubmit.

initialValues is an object with the starting values of all the fields whose state will be tracked in the form.

onSubmit is a function that is called with the current values when the user submits the form without any errors.

import { FormProvider } from '@hilma/forms';

const MyForm: React.FC = () =>  {
  return (
    <FormProvider
      initialValues={{
        username: "",
        password: ""
      }}
      onSubmit={(values) => alert(JSON.stringify(values, null, 2))}
    >
    </FormProvider>
  )
}

export default MyForm;

Great! Now we have a useable form. All we need is to fill it with fields.

Every field component in the Forms package takes a required name prop. This prop should be the same as one of the fields in the initial values of FormProvider.

So, since our initial values' fields are username and password, we should use two field components - one with name="username" and one with name="password".

Since we're dealing with strings, lets use FormTextInput (API here):

import { FormProvider, FormTextInput } from '@hilma/forms';

const MyForm: React.FC = () =>  {
  return (
    <FormProvider
      initialValues={{
        username: "",
        password: ""
      }}
      onSubmit={(values) => alert(JSON.stringify(values, null, 2))}
    >
      <FormTextInput name="username" label="Enter your username:" />
      <FormTextInput 
        name="password" 
        type="password" 
        label="Enter your password:" 
      />
    </FormProvider>
  )
}

export default MyForm;

Now we already have a form with two fully stylized fields, whose state is being managed by FormProvider!

But as you may notice, we are missing a way to submit...

Any button with type="submit" will do, but Forms exports a FormSubmitButton (API here) that's already styled:

import { FormProvider, FormTextInput, FormSubmitButton } from '@hilma/forms';

const MyForm: React.FC = () =>  {
  return (
    <FormProvider
      initialValues={{
        username: "",
        password: ""
      }}
      onSubmit={(values) => alert(JSON.stringify(values, null, 2))}
    >
      <FormTextInput name="username" label="Enter your username:" />
      <FormTextInput 
        name="password" 
        type="password" 
        label="Enter your password:" 
      />

      <FormSubmitButton>Submit</FormSubmitButton>
    </FormProvider>
  )
}

export default MyForm;

Form-tastic! Now when we fill in the fields and press Submit we'll get an alert with something like

{
  "username": "Bret",
  "password": "3159"
}

thanks to our onSubmit!

Styling A Form

About Styling

Forms components, along with being functional and useful, are also pre-styled. We have spent time and effort ensuring that each component is objectively beautiful.

We are, however, aware that no style is one-size-fits-all, so we provide several methods to change and override the default Forms styling. Some of these methods are global and application-wide, and some are component-specific. We list each method in the sections below.

Every single one of @hilma/forms's styling methods is designed to be simple and accessible. If you're attempting to apply your own styling to Forms components and it seems hard or unintuitive - you're probably not doing it the intended way.

Variants (Rounded VS Squircle)

By default, every Forms component is styled in an almost-square way, with slightly rounded corners. This works for most designs, but sometimes you need something a little more round or pill-shaped. For this, most Forms field components take a rounded prop, which will apply a rounder, more "pill-shaped" design.

const MyForm: React.FC = () => {
  return (
    <FormProvider initialValues={{ mood: "" }} onSubmit={...}>
      <FormTextInput 
        rounded
        name="mood"
      />
    </FormProvider>
  )
}

MUI Theme

Forms is built on MUI, so every Forms component will respond to your MUI theme. You can find out which theme values are used by which Forms components in their API documentation.

Let's take a look at how we can turn all of our Forms components' error messages to green:

index.tsx:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { CSSPrioritize } from '@hilma/forms';
import { createTheme, ThemeProvider } from '@mui/material/styles';

const theme = createTheme({
  palette: {
    error: {
      main: "green",
    }
  }
});

ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
  <React.StrictMode>
    <ThemeProvider theme={theme}>
       <CSSPrioritize>
         <App />
       </CSSPrioritize>
    </ThemeProvider>
  </React.StrictMode>
);

Forms Classnames

Note: this is the recommended way to stylize @hilma/forms.

Most often when customizing Forms components, we want to create our own unique styling, but keep it consistent across our application.

Every Forms component, component section and status effect (!implement) have an associated classname or classnames. These can be used in CSS and SASS/SCSS files to stylize the component to your choosing. If you want your styles to override those of Forms, you need to import CSSPrioritize as explained above.

These classnames are listed in each component's API reference below.

Let's take a look at how we could customize a FormTextInput using these classnames:

In our .tsx file:

const MyStyledForm: React.FC = () => {
  return (
    <FormProvider initialValues={{ feedback: "" }} onSubmit={...}>
      <FormTextInput name="feedback" />
    </FormProvider>
  )
}

In a .css or .scss file:

.Form-textInput {
  width: 100%;
  border: 'green';
}

.Form-textInput-errorMsg {
  font-size: 24px;
}

If we want to get more specific, we can pass any Forms component the containerClassName prop, which allows us to specify which instance of the component we want. (Note that className is passed to the root component and not to the container, so we can't use it for parent-child specificity).

In our .tsx file:

const MyStyledForm: React.FC = () => {
  return (
    <FormProvider 
      initialValues={{ thingOne: "", thingTwo: "" }} 
      onSubmit={...}
    >
      <FormTextInput 
        name="thingOne"
        containerClassName="thing-one"
      />
      <FormTextInput 
        name="thingTwo"
        containerClassName="thing-two"
      />
    </FormProvider>
  )
}

In a .scss file:

.thing-one {
  & .Form-textInput {
    color: yellow;
  }
}

.thing-two {
  & .Form-textInput {
    color: red;
  }
}

(Note that this can also be achieved with a .css file but it is more verbose).

Props (sx, classes, className and more)

(Read more about root components)

The default MUI styling props that are given to a Forms component are passed to its root component. This includes sx, classes, and classname. Additional props are listed in each component's API reference.

Let's take a look at giving the MuiInput inside of FormTextInput a purple background using sx.

const MyStyledForm: React.FC = () => {
  return (
    <FormProvider initialValues={{ item: "" }} onSubmit={...}>
      <FormTextInput 
        name="item" 
        sx={{ backgroundColor: "purple" }} 
      />
    </FormProvider>
  )
}

Validating A Form

Forms is built on Formik, which uses Yup for validation. Yup is an easy-to-use and easy-to-read validation library, so Forms uses it as well.

(Note: we plan on releasing custom, pre-prepared Yup schemas in the future, but for now, you'll have to write them on your own)

Yup exports a bunch of functions named like basic JavaScript types (object, string, etc), which we chain to create schemas - objects that we can use for validation.

For example, if we have a field that we want to be a required string with at least three characters:

import { string } from 'yup';

const fieldSchema = string().required().min(3);

Now we have a useable Yup schema, which will return a pre-built error message if incorrect, when validated. If we want to use our own error messages:

import { string } from 'yup';

const fieldSchema = string()
    .required("You have to fill me in!")
    .min(3, "I must be three characters or more");

Important note: in the examples above we imported Yup's string function on its own, but we don't want to do this: it's confusing and not very readable. Instead, we'll do:

import * as yup from 'yup';

const fieldSchema = yup.string().required(...) // etc.

(Since we use Babel for our projects, it will minimize the import size anyway, so it's not a concern)

Until now we have discussed what it's like to use Yup generally, but let's see how we would use it with Forms. First, let's build a schema:

import * as yup from 'yup';

const formSchema = yup.object({
  firstName: yup.string().required("You must have a name!");
});

Then, let's build our component:

import React from 'react';
import { FormProvider, FormTextInput, FormSubmitButton } from '@hilma/forms';

const MyForm: React.FC = () => {
  return (
    <FormProvider
      initialValues={{ firstName: "" }}
      onSubmit={...}
    >
      <FormTextInput name="firstName" label="Enter your name:" />
      <FormSubmitButton>Submit</FormSubmitButton>
    </FormProvider>
  );
}

Finally, let's use FormProvider's validationSchema prop to put them together:

import React from 'react';
import { FormProvider, FormTextInput, FormSubmitButton } from '@hilma/forms';
import * as yup from 'yup';

const formSchema = yup.object({
  firstName: yup.string().required("You must have a name!")
})

const MyForm: React.FC = () => {
  return (
    <FormProvider
      initialValues={{ firstName: "" }}
      onSubmit={...}
      validationSchema={formSchema}
    >
      <FormTextInput name="firstName" label="Enter your name:" />
      <FormSubmitButton>Submit</FormSubmitButton>
    </FormProvider>
  );
}

That's it! We now have a fully-functioning form, which will validate itself! If we try to press Submit while firstName is still empty, our onSubmit won't trigger, and instead we'll get a red error message that says "You must have a name!". It's really that easy!

Yup has many more useful methods and functions, and we recommend reading about them in the yup docs.

API

FormProvider

FormTextInput

FormSubmitButton

Useful Links

The MUI docs - here

The Yup docs - the README here

The Formik docs - here

0.0.0-52f842cf44f8

5 months ago

0.0.0-14d31621c0a2

5 months ago

0.0.0-b309d53bff52

5 months ago

0.0.0-77975a600b4e

5 months ago

0.0.0-40af238c8078

10 months ago

0.0.0-c0e1826eac86

6 months ago

0.0.0-24941b10c330

5 months ago

2.4.7

10 months ago

2.4.8

10 months ago

0.0.0-fd890ed29a05

6 months ago

0.0.0-2d0871f4399c

6 months ago

0.0.0-8c173dfa32fc

10 months ago

0.0.0-dfecbb482937

10 months ago

0.0.0-7f5de57c0346

10 months ago

0.0.0-e656c5b71bbb

10 months ago

0.0.0-c85572a86f7c

5 months ago

2.8.1

6 months ago

2.8.0

6 months ago

0.0.0-6a9df293f7d3

8 months ago

0.0.0-65f37b24f8e0

7 months ago

0.0.0-dbba244527db

5 months ago

0.0.0-8b90ba42a905

10 months ago

2.7.0

6 months ago

2.8.2

6 months ago

2.6.0

7 months ago

2.5.0

8 months ago

0.0.0-d7a65cb735a6

10 months ago

2.5.1

7 months ago

0.0.0-5d604f7e2dc2

7 months ago

2.9.0

6 months ago

2.7.0-release

6 months ago

0.0.0-a538009b4d41

10 months ago

0.0.0-b5591ef30357

5 months ago

0.0.0-b0bd2a072712

7 months ago

0.0.0-9c711b53a217

5 months ago

0.0.0-a3cfe6607552

10 months ago

0.0.0-eb05e58c4f61

9 months ago

2.4.5

10 months ago

2.4.6

10 months ago

2.4.6-beta.0

10 months ago

0.0.0-ZammmjWO

10 months ago

0.0.0-Ur0mVVIu

10 months ago

0.0.0-DUbquJlm

10 months ago

0.0.0-ZYn

10 months ago

2.4.1

1 year ago

2.4.3

12 months ago

2.4.2

12 months ago

2.4.4

12 months ago

0.0.0-1rfXzMgX

12 months ago

0.0.0-I1EAmxxZ

12 months ago

0.0.0-pJtKvvDc

1 year ago

0.0.0-dWOMYvmp

1 year ago

0.0.0-BFwsAvve

1 year ago

0.0.0-UnZEhr26

11 months ago

0.0.0-trtZF6V

11 months ago

0.0.0-SbRHEFdb

1 year ago

0.0.0-9nTUClmj

1 year ago

0.0.0-euDnDNeB

11 months ago

0.0.0-B7rud4ne

12 months ago

0.0.0-pbXYlcil

12 months ago

0.0.0-aoohMUDN

11 months ago

0.0.0-CpiEqF

11 months ago

0.0.0-hIsrtO9g

11 months ago

0.0.0-eJmvZIgB

11 months ago

0.0.0-zu2kCImK

11 months ago

0.0.0-GjfwV1V3

1 year ago

0.0.0-kAxskT5g

1 year ago

0.0.0-eywogQot

1 year ago

0.0.0-hwOp10DS

11 months ago

0.0.0-AFHHGW2P

1 year ago

0.0.0-bytRQHoV

1 year ago

0.0.0-2bD3U8P6

1 year ago

2.4.0

1 year ago

2.3.0

1 year ago

2.3.2

1 year ago

2.3.1

1 year ago

2.3.4

1 year ago

2.3.3

1 year ago

0.0.0-JmjiJJpo

1 year ago

0.0.0-sAuTLl7Q

1 year ago

0.0.0-WeAzGea9

1 year ago

2.4.0-beta-7

1 year ago

2.4.0-beta-6

1 year ago

2.4.0-beta-8

1 year ago

0.0.0-HmfH1KEb

1 year ago

2.4.0-beta-3

1 year ago

2.4.0-beta-2

1 year ago

2.4.0-beta-5

1 year ago

2.4.0-beta-4

1 year ago

2.4.0-beta-1

1 year ago

0.0.0-Ae9GpIXv

1 year ago

2.3.1-beta-1

1 year ago

0.0.0-sGBBxruD

1 year ago

2.3.1-beta-3

1 year ago

0.0.0-9QnZbTb8

1 year ago

2.3.1-beta-2

1 year ago

2.3.1-beta-4

1 year ago

0.0.0-wvyXfWcx

1 year ago

0.0.0-JlpZCYft

1 year ago

0.0.0-K2aphbq9

1 year ago

0.0.0-flwMvY5Z

1 year ago

0.0.0-IRgHyJFS

1 year ago

0.0.0-3SZYXWY0

1 year ago

0.0.0-kf

1 year ago

0.0.0-IvltiT

1 year ago

0.0.0-fWZHKGNG

1 year ago

2.3.1-beta

1 year ago

0.0.0-ezd0SdSN

1 year ago

0.0.0-ywzWQyhP

1 year ago

0.0.0-Ta4JfaEE

1 year ago

2.4.0-release

1 year ago

0.0.0-MkrBlVEo

1 year ago

0.0.0-E7

1 year ago

0.0.0-jn85vGCD

1 year ago

0.0.0-tpGRkbIz

1 year ago

0.0.0-SNGjVhur

1 year ago

0.0.0-HpacofiY

1 year ago

0.0.0-qDRr523H

1 year ago

0.0.0-ostacMDe

1 year ago

0.0.0-N2xkHhYj

1 year ago

2.3.2-beta.get

1 year ago

0.0.0-0bckln6y

1 year ago

0.0.0-YSg7hXm0

1 year ago

0.0.0-fcg69EZG

1 year ago

0.0.0-UWMpsVSv

1 year ago

0.0.0-ymBi3x5m

1 year ago

2.4.0-beta

1 year ago

0.0.0-PlaHz5Of

1 year ago

0.0.0-g

1 year ago

0.0.0-wyTNi7k3

1 year ago

0.0.0-8R

1 year ago

0.0.0-RR6OI7JL

1 year ago

0.0.0-8twv

1 year ago

2.4.1-beta.1

1 year ago

0.0.0-cBlT442c

1 year ago

0.0.0-LPgsgCgO

1 year ago

2.2.3-beta.1

1 year ago

2.2.3-beta.2

1 year ago

2.2.1

1 year ago

2.2.3

1 year ago

2.2.2

1 year ago

2.2.1-2

1 year ago

2.2.1-beta.3

1 year ago

2.2.1-beta.2

1 year ago

2.2.1-beta.1

1 year ago

2.2.1-beta

1 year ago

2.2.1-beta.full

1 year ago

2.2.2-beta.bold

1 year ago

2.0.2-beta.9

1 year ago

2.0.2-beta.1

1 year ago

2.0.2-beta.2

1 year ago

2.0.2-beta.3

1 year ago

2.0.2-beta.4

1 year ago

2.0.2-beta.5

1 year ago

2.0.2-beta.6

1 year ago

2.0.2-beta.7

1 year ago

2.0.2-beta.8

1 year ago

2.2.0

1 year ago

2.1.1-table

1 year ago

2.1.2-beta

1 year ago

2.1.2

1 year ago

2.1.1

1 year ago

2.1.4

1 year ago

2.1.3

1 year ago

2.1.6

1 year ago

2.1.6-beta

1 year ago

2.1.5

1 year ago

2.1.0

1 year ago

2.0.5-beta.2001

1 year ago

2.0.5-beta.2002

1 year ago

2.1.4-beta

1 year ago

2.0.3-beta.2

1 year ago

2.0.3-beta.1

1 year ago

2.0.2-beta.20

1 year ago

2.0.5-beta.2022

1 year ago

2.0.2-beta.13

1 year ago

2.0.5-beta.2023

1 year ago

2.0.2-beta.12

1 year ago

2.0.2-beta.11

1 year ago

2.0.2-beta.10

1 year ago

2.0.5-beta.2026

1 year ago

2.0.2-beta.17

1 year ago

2.0.5-beta.2027

1 year ago

2.0.2-beta.16

1 year ago

2.0.5-beta.2024

1 year ago

2.0.2-beta.15

1 year ago

2.0.5-beta.2025

1 year ago

2.0.2-beta.14

1 year ago

2.0.5-beta-bugs

1 year ago

2.1.1-bugfix.2

1 year ago

2.1.1-bugfix.1

1 year ago

2.0.5-beta.2028

1 year ago

2.0.2-beta.19

1 year ago

2.0.2-beta.18

1 year ago

2.1.7-beta

1 year ago

2.0.5-beta.2033

1 year ago

2.0.5-beta.2034

1 year ago

2.0.5-beta.2031

1 year ago

2.0.5-beta.2032

1 year ago

2.0.5-beta.2037

1 year ago

2.0.5-beta.2038

1 year ago

2.0.5-beta.2035

1 year ago

2.0.5-beta.2036

1 year ago

2.0.5-beta.2030

1 year ago

2.1.0-beta

1 year ago

2.1.6-beta.1

1 year ago

2.0.5-beta.2042

1 year ago

2.1.6-beta.2

1 year ago

2.1.6-beta.3

1 year ago

2.0.5-beta.2040

1 year ago

2.0.5-beta.2041

1 year ago

2.2.0-beta

1 year ago

2.1.2-beta-a1

1 year ago

2.0.5-beta.10

1 year ago

2.1.3-beta

1 year ago

2.1.1-beta.peer

1 year ago

2.1.1-bugfix

1 year ago

2.0.4-beta.1

1 year ago

2.0.4-beta.2

1 year ago

2.0.5-beta.9

1 year ago

2.0.5-beta.8

1 year ago

2.0.5-beta.5

1 year ago

2.0.5-beta.4

1 year ago

2.0.5-beta.7

1 year ago

2.0.5-beta.6

1 year ago

2.2.0-beta.1

1 year ago

2.0.5-beta.1

1 year ago

2.0.5-beta.3

1 year ago

2.0.5-beta.2

1 year ago

2.0.5-beta.drag

1 year ago

2.2.0-beta-1

1 year ago

2.0.5-beta.1939

1 year ago

2.0.5-beta.1948

1 year ago

2.0.5-beta.1949

1 year ago

2.0.5-beta.1942

1 year ago

2.0.5-beta.1943

1 year ago

2.0.5-beta.1940

1 year ago

2.0.5-beta.1941

1 year ago

2.0.5-beta.1946

1 year ago

2.0.5-beta.1947

1 year ago

2.0.5-beta.1944

1 year ago

2.0.5-beta.1945

1 year ago

2.0.5-beta.1950

1 year ago

2.0.5-beta.1959

1 year ago

2.0.5-beta.1953

1 year ago

2.0.5-beta.1954

1 year ago

2.0.5-beta.1951

1 year ago

2.0.5-beta.1952

1 year ago

2.0.5-beta.1957

1 year ago

2.0.5-beta.1958

1 year ago

2.0.5-beta.1955

1 year ago

2.0.5-beta.1956

1 year ago

2.0.5-beta.1960

1 year ago

2.0.5-beta.1961

1 year ago

2.0.3

1 year ago

2.0.2

1 year ago

2.0.4

1 year ago

2.0.5-beta.1964

1 year ago

2.0.5-beta.1965

1 year ago

2.0.5-beta.1962

1 year ago

2.0.5-beta.1963

1 year ago

2.0.5-beta.1968

1 year ago

2.0.5-beta.1969

1 year ago

2.0.5-beta.1966

1 year ago

2.0.1

1 year ago

2.0.5-beta.200

1 year ago

2.0.5-beta.1967

1 year ago

2.0.0

1 year ago

2.0.5-beta.1970

1 year ago

2.0.5-beta.1980

1 year ago

2.0.5-beta.1984

1 year ago

2.0.5-beta.1990

1 year ago

2.0.5-beta.126

1 year ago

2.0.5-beta.125

1 year ago

2.0.5-beta.128

1 year ago

2.0.5-beta.127

1 year ago

2.0.5-beta.129

1 year ago

2.0.5-beta.124

1 year ago

2.0.5-beta.123

1 year ago

2.0.5-beta.131

1 year ago

2.0.5-beta.130

1 year ago

2.1.5-beta

1 year ago

0.0.2-beta.23-37

2 years ago

0.0.2-beta.23-36

2 years ago

0.0.2-beta.23-39

2 years ago

0.0.2-beta.23-38

2 years ago

0.0.2-beta.23-31

2 years ago

0.0.2-beta.23-30

2 years ago

0.0.2-beta.23-33

2 years ago

0.0.2-beta.23-32

2 years ago

0.0.2-beta.23-35

2 years ago

0.0.2-beta.23-34

2 years ago

0.0.2-beta.23-28

2 years ago

0.0.2-beta.23-27

2 years ago

0.0.2-beta.23-29

2 years ago

0.0.2-beta.23-48

2 years ago

0.0.2-beta.23-47

2 years ago

0.0.2-beta.23-49

2 years ago

0.0.2-beta.23-40

2 years ago

0.0.2-beta.23-42

2 years ago

0.0.2-beta.23-41

2 years ago

0.0.2-beta.23-44

2 years ago

0.0.2-beta.23-43

2 years ago

0.0.2-beta.23-46

2 years ago

0.0.2-beta.23-45

2 years ago

0.0.2-beta.23-26

2 years ago

0.0.2-beta.23-25

2 years ago

0.0.2-beta.23-20

2 years ago

0.0.2-beta.23-22

2 years ago

0.0.2-beta.23-21

2 years ago

0.0.2-beta.23-24

2 years ago

0.0.2-beta.23-23

2 years ago

0.0.2-beta.23-19

2 years ago

0.0.2-beta.23-18

2 years ago

0.0.2-beta.23-15

2 years ago

0.0.2-beta.23-14

2 years ago

0.0.2-beta.23-17

2 years ago

0.0.2-beta.23-16

2 years ago

0.0.2-beta.20

2 years ago

0.0.2-beta.22

2 years ago

0.0.2-beta.21

2 years ago

0.0.2-beta.23

2 years ago

0.0.2-beta.23-11

2 years ago

0.0.2-beta.23-10

2 years ago

0.0.2-beta.23-13

2 years ago

0.0.2-beta.23-12

2 years ago

0.0.2-beta.23-4

2 years ago

0.0.2-beta.23-3

2 years ago

0.0.2-beta.23-2

2 years ago

0.0.2-beta.23-1

2 years ago

0.0.2-beta.7

2 years ago

0.0.2-beta.8

2 years ago

0.0.2-beta.9

2 years ago

0.0.2-beta.11

2 years ago

0.0.2-beta.10

2 years ago

0.0.2-beta.13

2 years ago

0.0.2-beta.12

2 years ago

0.0.2-beta.4

2 years ago

0.0.2-beta.15

2 years ago

0.0.2-beta.5

2 years ago

0.0.2-beta.23-9

2 years ago

0.0.2-beta.14

2 years ago

0.0.2-beta.6

2 years ago

0.0.2-beta.23-8

2 years ago

0.0.2-beta.17

2 years ago

0.0.2-beta.23-7

2 years ago

0.0.2-beta.16

2 years ago

0.0.2-beta.23-6

2 years ago

0.0.2-beta.19

2 years ago

0.0.2-beta.23-5

2 years ago

0.0.2-beta.18

2 years ago

0.0.2-beta.3

2 years ago

0.0.2-beta.2

2 years ago

0.0.2-beta.1

2 years ago

0.0.2-beta.0

2 years ago

0.0.1

2 years ago