diff --git a/README.md b/README.md
index 0c48213..252653c 100644
--- a/README.md
+++ b/README.md
@@ -1,40 +1,42 @@
# testnet-onboarding-app
+
React app for onboarding participants to laconicd chain with Nitro/Cosmos key attestation
## Setup for testnet-onboarding-app
1. Clone the repository
- ```
+ ```zsh
git clone git@git.vdb.to:cerc-io/testnet-onboarding-app.git
```
2. Enter the project directory
- ```
+ ```zsh
cd testnet-onboarding-app
```
3. Install dependencies
- ```
+ ```zsh
yarn
```
4. Setup .env
- Copy and update `.env`
- ```
+ ```zsh
cp .env.example .env
```
- In the `.env` file, add the WalletConnect project ID used in your [laconic-wallet](https://git.vdb.to/cerc-io/laconic-wallet) setup.
- ```
+
+ ```zsh
WALLET_CONNECT_PROJECT_ID=39bc93c...
```
5. Start the application
- ```
+ ```zsh
yarn start
```
diff --git a/config/webpack.config.js b/config/webpack.config.js
index 9287627..245f8fe 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -1,56 +1,56 @@
-const fs = require('fs');
-const path = require('path');
-const webpack = require('webpack');
-const resolve = require('resolve');
-const HtmlWebpackPlugin = require('html-webpack-plugin');
-const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');
-const InlineChunkHtmlPlugin = require('react-dev-utils/InlineChunkHtmlPlugin');
-const TerserPlugin = require('terser-webpack-plugin');
-const MiniCssExtractPlugin = require('mini-css-extract-plugin');
-const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
-const { WebpackManifestPlugin } = require('webpack-manifest-plugin');
-const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');
-const WorkboxWebpackPlugin = require('workbox-webpack-plugin');
-const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
-const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent');
-const ESLintPlugin = require('eslint-webpack-plugin');
-const paths = require('./paths');
-const modules = require('./modules');
-const getClientEnvironment = require('./env');
-const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin');
+const fs = require("fs");
+const path = require("path");
+const webpack = require("webpack");
+const resolve = require("resolve");
+const HtmlWebpackPlugin = require("html-webpack-plugin");
+const CaseSensitivePathsPlugin = require("case-sensitive-paths-webpack-plugin");
+const InlineChunkHtmlPlugin = require("react-dev-utils/InlineChunkHtmlPlugin");
+const TerserPlugin = require("terser-webpack-plugin");
+const MiniCssExtractPlugin = require("mini-css-extract-plugin");
+const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
+const { WebpackManifestPlugin } = require("webpack-manifest-plugin");
+const InterpolateHtmlPlugin = require("react-dev-utils/InterpolateHtmlPlugin");
+const WorkboxWebpackPlugin = require("workbox-webpack-plugin");
+const ModuleScopePlugin = require("react-dev-utils/ModuleScopePlugin");
+const getCSSModuleLocalIdent = require("react-dev-utils/getCSSModuleLocalIdent");
+const ESLintPlugin = require("eslint-webpack-plugin");
+const paths = require("./paths");
+const modules = require("./modules");
+const getClientEnvironment = require("./env");
+const ModuleNotFoundPlugin = require("react-dev-utils/ModuleNotFoundPlugin");
const ForkTsCheckerWebpackPlugin =
- process.env.TSC_COMPILE_ON_ERROR === 'true'
- ? require('react-dev-utils/ForkTsCheckerWarningWebpackPlugin')
- : require('react-dev-utils/ForkTsCheckerWebpackPlugin');
-const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
+ process.env.TSC_COMPILE_ON_ERROR === "true"
+ ? require("react-dev-utils/ForkTsCheckerWarningWebpackPlugin")
+ : require("react-dev-utils/ForkTsCheckerWebpackPlugin");
+const ReactRefreshWebpackPlugin = require("@pmmmwh/react-refresh-webpack-plugin");
-const createEnvironmentHash = require('./webpack/persistentCache/createEnvironmentHash');
+const createEnvironmentHash = require("./webpack/persistentCache/createEnvironmentHash");
// Source maps are resource heavy and can cause out of memory issue for large source files.
-const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false';
+const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== "false";
-const reactRefreshRuntimeEntry = require.resolve('react-refresh/runtime');
+const reactRefreshRuntimeEntry = require.resolve("react-refresh/runtime");
const reactRefreshWebpackPluginRuntimeEntry = require.resolve(
- '@pmmmwh/react-refresh-webpack-plugin'
+ "@pmmmwh/react-refresh-webpack-plugin"
);
-const babelRuntimeEntry = require.resolve('babel-preset-react-app');
+const babelRuntimeEntry = require.resolve("babel-preset-react-app");
const babelRuntimeEntryHelpers = require.resolve(
- '@babel/runtime/helpers/esm/assertThisInitialized',
+ "@babel/runtime/helpers/esm/assertThisInitialized",
{ paths: [babelRuntimeEntry] }
);
-const babelRuntimeRegenerator = require.resolve('@babel/runtime/regenerator', {
+const babelRuntimeRegenerator = require.resolve("@babel/runtime/regenerator", {
paths: [babelRuntimeEntry],
});
// Some apps do not need the benefits of saving a web request, so not inlining the chunk
// makes for a smoother build process.
-const shouldInlineRuntimeChunk = process.env.INLINE_RUNTIME_CHUNK !== 'false';
+const shouldInlineRuntimeChunk = process.env.INLINE_RUNTIME_CHUNK !== "false";
-const emitErrorsAsWarnings = process.env.ESLINT_NO_DEV_ERRORS === 'true';
-const disableESLintPlugin = process.env.DISABLE_ESLINT_PLUGIN === 'true';
+const emitErrorsAsWarnings = process.env.ESLINT_NO_DEV_ERRORS === "true";
+const disableESLintPlugin = process.env.DISABLE_ESLINT_PLUGIN === "true";
const imageInlineSizeLimit = parseInt(
- process.env.IMAGE_INLINE_SIZE_LIMIT || '10000'
+ process.env.IMAGE_INLINE_SIZE_LIMIT || "10000"
);
// Check if TypeScript is setup
@@ -58,7 +58,7 @@ const useTypeScript = fs.existsSync(paths.appTsConfig);
// Check if Tailwind config exists
const useTailwind = fs.existsSync(
- path.join(paths.appPath, 'tailwind.config.js')
+ path.join(paths.appPath, "tailwind.config.ts")
);
// Get the path to the uncompiled service worker (if it exists).
@@ -71,12 +71,12 @@ const sassRegex = /\.(scss|sass)$/;
const sassModuleRegex = /\.module\.(scss|sass)$/;
const hasJsxRuntime = (() => {
- if (process.env.DISABLE_NEW_JSX_TRANSFORM === 'true') {
+ if (process.env.DISABLE_NEW_JSX_TRANSFORM === "true") {
return false;
}
try {
- require.resolve('react/jsx-runtime');
+ require.resolve("react/jsx-runtime");
return true;
} catch (e) {
return false;
@@ -86,13 +86,13 @@ const hasJsxRuntime = (() => {
// This is the production and development configuration.
// It is focused on developer experience, fast rebuilds, and a minimal bundle.
module.exports = function (webpackEnv) {
- const isEnvDevelopment = webpackEnv === 'development';
- const isEnvProduction = webpackEnv === 'production';
+ const isEnvDevelopment = webpackEnv === "development";
+ const isEnvProduction = webpackEnv === "production";
// Variable used for enabling profiling in Production
// passed into alias object. Uses a flag if passed into the build command
const isEnvProductionProfile =
- isEnvProduction && process.argv.includes('--profile');
+ isEnvProduction && process.argv.includes("--profile");
// We will provide `paths.publicUrlOrPath` to our app
// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.
@@ -105,38 +105,38 @@ module.exports = function (webpackEnv) {
// common function to get style loaders
const getStyleLoaders = (cssOptions, preProcessor) => {
const loaders = [
- isEnvDevelopment && require.resolve('style-loader'),
+ isEnvDevelopment && require.resolve("style-loader"),
isEnvProduction && {
loader: MiniCssExtractPlugin.loader,
// css is located in `static/css`, use '../../' to locate index.html folder
// in production `paths.publicUrlOrPath` can be a relative path
- options: paths.publicUrlOrPath.startsWith('.')
- ? { publicPath: '../../' }
+ options: paths.publicUrlOrPath.startsWith(".")
+ ? { publicPath: "../../" }
: {},
},
{
- loader: require.resolve('css-loader'),
+ loader: require.resolve("css-loader"),
options: cssOptions,
},
{
// Options for PostCSS as we reference these options twice
// Adds vendor prefixing based on your specified browser support in
// package.json
- loader: require.resolve('postcss-loader'),
+ loader: require.resolve("postcss-loader"),
options: {
postcssOptions: {
// Necessary for external CSS imports to work
// https://github.com/facebook/create-react-app/issues/2677
- ident: 'postcss',
+ ident: "postcss",
config: false,
plugins: !useTailwind
? [
- 'postcss-flexbugs-fixes',
+ "postcss-flexbugs-fixes",
[
- 'postcss-preset-env',
+ "postcss-preset-env",
{
autoprefixer: {
- flexbox: 'no-2009',
+ flexbox: "no-2009",
},
stage: 3,
},
@@ -144,16 +144,16 @@ module.exports = function (webpackEnv) {
// Adds PostCSS Normalize as the reset css with default options,
// so that it honors browserslist config in package.json
// which in turn let's users customize the target behavior as per their needs.
- 'postcss-normalize',
+ "postcss-normalize",
]
: [
- 'tailwindcss',
- 'postcss-flexbugs-fixes',
+ "tailwindcss",
+ "postcss-flexbugs-fixes",
[
- 'postcss-preset-env',
+ "postcss-preset-env",
{
autoprefixer: {
- flexbox: 'no-2009',
+ flexbox: "no-2009",
},
stage: 3,
},
@@ -167,7 +167,7 @@ module.exports = function (webpackEnv) {
if (preProcessor) {
loaders.push(
{
- loader: require.resolve('resolve-url-loader'),
+ loader: require.resolve("resolve-url-loader"),
options: {
sourceMap: isEnvProduction ? shouldUseSourceMap : isEnvDevelopment,
root: paths.appSrc,
@@ -185,17 +185,17 @@ module.exports = function (webpackEnv) {
};
return {
- target: ['browserslist'],
+ target: ["browserslist"],
// Webpack noise constrained to errors and warnings
- stats: 'errors-warnings',
- mode: isEnvProduction ? 'production' : isEnvDevelopment && 'development',
+ stats: "errors-warnings",
+ mode: isEnvProduction ? "production" : isEnvDevelopment && "development",
// Stop compilation early in production
bail: isEnvProduction,
devtool: isEnvProduction
? shouldUseSourceMap
- ? 'source-map'
+ ? "source-map"
: false
- : isEnvDevelopment && 'cheap-module-source-map',
+ : isEnvDevelopment && "cheap-module-source-map",
// These are the "entry points" to our application.
// This means they will be the "root" imports that are included in JS bundle.
entry: paths.appIndexJs,
@@ -207,41 +207,42 @@ module.exports = function (webpackEnv) {
// There will be one main bundle, and one file per asynchronous chunk.
// In development, it does not produce real files.
filename: isEnvProduction
- ? 'static/js/[name].[contenthash:8].js'
- : isEnvDevelopment && 'static/js/bundle.js',
+ ? "static/js/[name].[contenthash:8].js"
+ : isEnvDevelopment && "static/js/bundle.js",
// There are also additional JS chunk files if you use code splitting.
chunkFilename: isEnvProduction
- ? 'static/js/[name].[contenthash:8].chunk.js'
- : isEnvDevelopment && 'static/js/[name].chunk.js',
- assetModuleFilename: 'static/media/[name].[hash][ext]',
+ ? "static/js/[name].[contenthash:8].chunk.js"
+ : isEnvDevelopment && "static/js/[name].chunk.js",
+ assetModuleFilename: "static/media/[name].[hash][ext]",
// webpack uses `publicPath` to determine where the app is being served from.
// It requires a trailing slash, or the file assets will get an incorrect path.
// We inferred the "public path" (such as / or /my-project) from homepage.
publicPath: paths.publicUrlOrPath,
// Point sourcemap entries to original disk location (format as URL on Windows)
devtoolModuleFilenameTemplate: isEnvProduction
- ? info =>
+ ? (info) =>
path
.relative(paths.appSrc, info.absoluteResourcePath)
- .replace(/\\/g, '/')
+ .replace(/\\/g, "/")
: isEnvDevelopment &&
- (info => path.resolve(info.absoluteResourcePath).replace(/\\/g, '/')),
+ ((info) =>
+ path.resolve(info.absoluteResourcePath).replace(/\\/g, "/")),
},
cache: {
- type: 'filesystem',
+ type: "filesystem",
version: createEnvironmentHash(env.raw),
cacheDirectory: paths.appWebpackCache,
- store: 'pack',
+ store: "pack",
buildDependencies: {
- defaultWebpack: ['webpack/lib/'],
+ defaultWebpack: ["webpack/lib/"],
config: [__filename],
- tsconfig: [paths.appTsConfig, paths.appJsConfig].filter(f =>
+ tsconfig: [paths.appTsConfig, paths.appJsConfig].filter((f) =>
fs.existsSync(f)
),
},
},
infrastructureLogging: {
- level: 'none',
+ level: "none",
},
optimization: {
minimize: isEnvProduction,
@@ -312,16 +313,16 @@ module.exports = function (webpackEnv) {
// `web` extension prefixes have been added for better support
// for React Native Web.
extensions: paths.moduleFileExtensions
- .map(ext => `.${ext}`)
- .filter(ext => useTypeScript || !ext.includes('ts')),
+ .map((ext) => `.${ext}`)
+ .filter((ext) => useTypeScript || !ext.includes("ts")),
alias: {
// Support React Native Web
// https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
- 'react-native': 'react-native-web',
+ "react-native": "react-native-web",
// Allows for better profiling with ReactDevTools
...(isEnvProductionProfile && {
- 'react-dom$': 'react-dom/profiling',
- 'scheduler/tracing': 'scheduler/tracing-profiling',
+ "react-dom$": "react-dom/profiling",
+ "scheduler/tracing": "scheduler/tracing-profiling",
}),
...(modules.webpackAliases || {}),
},
@@ -346,10 +347,10 @@ module.exports = function (webpackEnv) {
rules: [
// Handle node_modules packages that contain sourcemaps
shouldUseSourceMap && {
- enforce: 'pre',
+ enforce: "pre",
exclude: /@babel(?:\/|\\{1,2})runtime/,
test: /\.(js|mjs|jsx|ts|tsx|css)$/,
- loader: require.resolve('source-map-loader'),
+ loader: require.resolve("source-map-loader"),
},
{
// "oneOf" will traverse all following loaders until one will
@@ -360,8 +361,8 @@ module.exports = function (webpackEnv) {
// https://github.com/jshttp/mime-db
{
test: [/\.avif$/],
- type: 'asset',
- mimetype: 'image/avif',
+ type: "asset",
+ mimetype: "image/avif",
parser: {
dataUrlCondition: {
maxSize: imageInlineSizeLimit,
@@ -373,7 +374,7 @@ module.exports = function (webpackEnv) {
// A missing `test` is equivalent to a match.
{
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
- type: 'asset',
+ type: "asset",
parser: {
dataUrlCondition: {
maxSize: imageInlineSizeLimit,
@@ -384,7 +385,7 @@ module.exports = function (webpackEnv) {
test: /\.svg$/,
use: [
{
- loader: require.resolve('@svgr/webpack'),
+ loader: require.resolve("@svgr/webpack"),
options: {
prettier: false,
svgo: false,
@@ -396,9 +397,9 @@ module.exports = function (webpackEnv) {
},
},
{
- loader: require.resolve('file-loader'),
+ loader: require.resolve("file-loader"),
options: {
- name: 'static/media/[name].[hash].[ext]',
+ name: "static/media/[name].[hash].[ext]",
},
},
],
@@ -411,16 +412,16 @@ module.exports = function (webpackEnv) {
{
test: /\.(js|mjs|jsx|ts|tsx)$/,
include: paths.appSrc,
- loader: require.resolve('babel-loader'),
+ loader: require.resolve("babel-loader"),
options: {
customize: require.resolve(
- 'babel-preset-react-app/webpack-overrides'
+ "babel-preset-react-app/webpack-overrides"
),
presets: [
[
- require.resolve('babel-preset-react-app'),
+ require.resolve("babel-preset-react-app"),
{
- runtime: hasJsxRuntime ? 'automatic' : 'classic',
+ runtime: hasJsxRuntime ? "automatic" : "classic",
},
],
],
@@ -428,7 +429,7 @@ module.exports = function (webpackEnv) {
plugins: [
isEnvDevelopment &&
shouldUseReactRefresh &&
- require.resolve('react-refresh/babel'),
+ require.resolve("react-refresh/babel"),
].filter(Boolean),
// This is a feature of `babel-loader` for webpack (not Babel itself).
// It enables caching results in ./node_modules/.cache/babel-loader/
@@ -444,14 +445,14 @@ module.exports = function (webpackEnv) {
{
test: /\.(js|mjs)$/,
exclude: /@babel(?:\/|\\{1,2})runtime/,
- loader: require.resolve('babel-loader'),
+ loader: require.resolve("babel-loader"),
options: {
babelrc: false,
configFile: false,
compact: false,
presets: [
[
- require.resolve('babel-preset-react-app/dependencies'),
+ require.resolve("babel-preset-react-app/dependencies"),
{ helpers: true },
],
],
@@ -482,7 +483,7 @@ module.exports = function (webpackEnv) {
? shouldUseSourceMap
: isEnvDevelopment,
modules: {
- mode: 'icss',
+ mode: "icss",
},
}),
// Don't consider CSS imports dead code even if the
@@ -501,7 +502,7 @@ module.exports = function (webpackEnv) {
? shouldUseSourceMap
: isEnvDevelopment,
modules: {
- mode: 'local',
+ mode: "local",
getLocalIdent: getCSSModuleLocalIdent,
},
}),
@@ -519,10 +520,10 @@ module.exports = function (webpackEnv) {
? shouldUseSourceMap
: isEnvDevelopment,
modules: {
- mode: 'icss',
+ mode: "icss",
},
},
- 'sass-loader'
+ "sass-loader"
),
// Don't consider CSS imports dead code even if the
// containing package claims to have no side effects.
@@ -541,11 +542,11 @@ module.exports = function (webpackEnv) {
? shouldUseSourceMap
: isEnvDevelopment,
modules: {
- mode: 'local',
+ mode: "local",
getLocalIdent: getCSSModuleLocalIdent,
},
},
- 'sass-loader'
+ "sass-loader"
),
},
// "file" loader makes sure those assets get served by WebpackDevServer.
@@ -559,7 +560,7 @@ module.exports = function (webpackEnv) {
// Also exclude `html` and `json` extensions so they get processed
// by webpacks internal loaders.
exclude: [/^$/, /\.(js|mjs|jsx|ts|tsx)$/, /\.html$/, /\.json$/],
- type: 'asset/resource',
+ type: "asset/resource",
},
// ** STOP ** Are you adding a new loader?
// Make sure to add the new loader(s) before the "file" loader.
@@ -633,8 +634,8 @@ module.exports = function (webpackEnv) {
new MiniCssExtractPlugin({
// Options similar to the same options in webpackOptions.output
// both options are optional
- filename: 'static/css/[name].[contenthash:8].css',
- chunkFilename: 'static/css/[name].[contenthash:8].chunk.css',
+ filename: "static/css/[name].[contenthash:8].css",
+ chunkFilename: "static/css/[name].[contenthash:8].chunk.css",
}),
// Generate an asset manifest file with the following content:
// - "files" key: Mapping of all asset filenames to their corresponding
@@ -643,7 +644,7 @@ module.exports = function (webpackEnv) {
// - "entrypoints" key: Array of files which are included in `index.html`,
// can be used to reconstruct the HTML if necessary
new WebpackManifestPlugin({
- fileName: 'asset-manifest.json',
+ fileName: "asset-manifest.json",
publicPath: paths.publicUrlOrPath,
generate: (seed, files, entrypoints) => {
const manifestFiles = files.reduce((manifest, file) => {
@@ -651,7 +652,7 @@ module.exports = function (webpackEnv) {
return manifest;
}, seed);
const entrypointFiles = entrypoints.main.filter(
- fileName => !fileName.endsWith('.map')
+ (fileName) => !fileName.endsWith(".map")
);
return {
@@ -687,7 +688,7 @@ module.exports = function (webpackEnv) {
new ForkTsCheckerWebpackPlugin({
async: isEnvDevelopment,
typescript: {
- typescriptPath: resolve.sync('typescript', {
+ typescriptPath: resolve.sync("typescript", {
basedir: paths.appNodeModules,
}),
configOverwrite: {
@@ -707,7 +708,7 @@ module.exports = function (webpackEnv) {
diagnosticOptions: {
syntactic: true,
},
- mode: 'write-references',
+ mode: "write-references",
// profile: true,
},
issue: {
@@ -716,41 +717,41 @@ module.exports = function (webpackEnv) {
// '../cra-template-typescript/template/src/App.tsx'
// otherwise.
include: [
- { file: '../**/src/**/*.{ts,tsx}' },
- { file: '**/src/**/*.{ts,tsx}' },
+ { file: "../**/src/**/*.{ts,tsx}" },
+ { file: "**/src/**/*.{ts,tsx}" },
],
exclude: [
- { file: '**/src/**/__tests__/**' },
- { file: '**/src/**/?(*.){spec|test}.*' },
- { file: '**/src/setupProxy.*' },
- { file: '**/src/setupTests.*' },
+ { file: "**/src/**/__tests__/**" },
+ { file: "**/src/**/?(*.){spec|test}.*" },
+ { file: "**/src/setupProxy.*" },
+ { file: "**/src/setupTests.*" },
],
},
logger: {
- infrastructure: 'silent',
+ infrastructure: "silent",
},
}),
!disableESLintPlugin &&
new ESLintPlugin({
// Plugin options
- extensions: ['js', 'mjs', 'jsx', 'ts', 'tsx'],
- formatter: require.resolve('react-dev-utils/eslintFormatter'),
- eslintPath: require.resolve('eslint'),
+ extensions: ["js", "mjs", "jsx", "ts", "tsx"],
+ formatter: require.resolve("react-dev-utils/eslintFormatter"),
+ eslintPath: require.resolve("eslint"),
failOnError: !(isEnvDevelopment && emitErrorsAsWarnings),
context: paths.appSrc,
cache: true,
cacheLocation: path.resolve(
paths.appNodeModules,
- '.cache/.eslintcache'
+ ".cache/.eslintcache"
),
// ESLint class options
cwd: paths.appPath,
resolvePluginsRelativeTo: __dirname,
baseConfig: {
- extends: [require.resolve('eslint-config-react-app/base')],
+ extends: [require.resolve("eslint-config-react-app/base")],
rules: {
...(!hasJsxRuntime && {
- 'react/react-in-jsx-scope': 'error',
+ "react/react-in-jsx-scope": "error",
}),
},
},
diff --git a/package.json b/package.json
index 7a76c72..45843a6 100644
--- a/package.json
+++ b/package.json
@@ -33,7 +33,7 @@
"resolve": "^1.20.0",
"semver": "^7.3.5",
"stream-browserify": "^3.0.0",
- "tailwindcss": "^3.0.2",
+ "tailwindcss": "^3.4.9",
"typescript": "^4.9.5"
},
"scripts": {
@@ -66,8 +66,10 @@
"@types/node": "^16.18.90",
"@types/react": "^18.2.67",
"@types/react-dom": "^18.2.22",
+ "@types/tailwindcss": "^3.1.0",
"@typescript-eslint/eslint-plugin": "^6.13.2",
"@typescript-eslint/parser": "^6.13.2",
+ "autoprefixer": "^10.4.20",
"babel-jest": "^27.4.2",
"babel-loader": "^8.2.3",
"babel-plugin-named-asset-import": "^0.3.8",
@@ -92,7 +94,7 @@
"jest-resolve": "^27.4.2",
"jest-watch-typeahead": "^1.0.0",
"mini-css-extract-plugin": "^2.4.5",
- "postcss": "^8.4.4",
+ "postcss": "^8.4.41",
"postcss-flexbugs-fixes": "^5.0.2",
"postcss-loader": "^6.2.1",
"postcss-normalize": "^10.0.1",
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..33ad091
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/public/laconic_logo.svg b/public/laconic_logo.svg
new file mode 100644
index 0000000..ab8603a
--- /dev/null
+++ b/public/laconic_logo.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/laconic_logo_with_text.svg b/public/laconic_logo_with_text.svg
new file mode 100644
index 0000000..fdfcf05
--- /dev/null
+++ b/public/laconic_logo_with_text.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/App.tsx b/src/App.tsx
index 4737a39..d794326 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -15,6 +15,8 @@ import VerifyEmail from "./pages/VerifyEmail";
import Email from "./pages/Email";
import Thanks from "./pages/Thanks";
+import "./App.css";
+
function App() {
return (
@@ -23,19 +25,13 @@ function App() {
} />
} />
- } />
+ } />
} />
} />
}>
} />
- }
- />
- }
- />
+ } />
+ } />
}
diff --git a/src/components/CustomIcon/CustomIcon.tsx b/src/components/CustomIcon/CustomIcon.tsx
new file mode 100644
index 0000000..f887596
--- /dev/null
+++ b/src/components/CustomIcon/CustomIcon.tsx
@@ -0,0 +1,30 @@
+import React, { ComponentPropsWithoutRef } from "react";
+
+export interface CustomIconProps extends ComponentPropsWithoutRef<"svg"> {
+ size?: number | string; // width and height will both be set as the same value
+ name?: string;
+}
+
+export const CustomIcon: React.FC = ({
+ children,
+ width = 24,
+ height = 24,
+ size,
+ viewBox = "0 0 24 24",
+ name,
+ ...rest
+}: CustomIconProps) => {
+ return (
+
+ );
+};
diff --git a/src/components/CustomIcon/README.md b/src/components/CustomIcon/README.md
new file mode 100644
index 0000000..7376c3a
--- /dev/null
+++ b/src/components/CustomIcon/README.md
@@ -0,0 +1,78 @@
+# CustomIcon
+
+`CustomIcon` is a flexible and reusable React component for rendering SVG icons. It allows for easy customization of size, color, and other SVG properties.
+
+- Viewbox "0 0 24 24": From where you're exporting from, please make sure the icon is using viewBox="0 0 24 24" before downloading/exporting. Not doing so will result in incorrect icon scaling
+
+## Create a Custom Icon
+
+1. Duplicate a current icon e.g. `LaconicIcon` and rename it accordingly.
+2. Rename the function inside the new file you duplicated too
+3. Replace the markup with your SVG markup (make sure it complies with the above section's rule)
+4. Depending on the svg you pasted...
+ A. If the `