From 5362034c95d58c656b048ed43f4806d0fbe4aef6 Mon Sep 17 00:00:00 2001 From: cohitre Date: Tue, 27 Feb 2024 10:22:59 -0800 Subject: [PATCH 1/4] Updating @usewaypoint/block-divider --- packages/block-divider/.npmignore | 1 - packages/block-divider/package-lock.json | 4 +- packages/block-divider/package.json | 2 +- .../__snapshots__/index.spec.tsx.snap} | 0 .../Divider.spec.tsx => src/index.spec.tsx} | 4 +- packages/block-divider/src/index.tsx | 54 ++++++++++--------- packages/block-divider/tsconfig.build.json | 2 +- 7 files changed, 35 insertions(+), 32 deletions(-) rename packages/block-divider/{tests/__snapshots__/Divider.spec.tsx.snap => src/__snapshots__/index.spec.tsx.snap} (100%) rename packages/block-divider/{tests/Divider.spec.tsx => src/index.spec.tsx} (80%) diff --git a/packages/block-divider/.npmignore b/packages/block-divider/.npmignore index 564b640..2433ea5 100644 --- a/packages/block-divider/.npmignore +++ b/packages/block-divider/.npmignore @@ -5,5 +5,4 @@ .prettierrc jest.config.ts src -tests tsconfig.json \ No newline at end of file diff --git a/packages/block-divider/package-lock.json b/packages/block-divider/package-lock.json index f319b12..fafa42c 100644 --- a/packages/block-divider/package-lock.json +++ b/packages/block-divider/package-lock.json @@ -1,12 +1,12 @@ { "name": "@usewaypoint/block-divider", - "version": "0.0.2", + "version": "0.0.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@usewaypoint/block-divider", - "version": "0.0.2", + "version": "0.0.3", "license": "MIT", "devDependencies": { "@testing-library/react": "^14.2.1" diff --git a/packages/block-divider/package.json b/packages/block-divider/package.json index ffba17e..d82998b 100644 --- a/packages/block-divider/package.json +++ b/packages/block-divider/package.json @@ -1,6 +1,6 @@ { "name": "@usewaypoint/block-divider", - "version": "0.0.2", + "version": "0.0.3", "description": "@usewaypoint/document compatible Divider component", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/block-divider/tests/__snapshots__/Divider.spec.tsx.snap b/packages/block-divider/src/__snapshots__/index.spec.tsx.snap similarity index 100% rename from packages/block-divider/tests/__snapshots__/Divider.spec.tsx.snap rename to packages/block-divider/src/__snapshots__/index.spec.tsx.snap diff --git a/packages/block-divider/tests/Divider.spec.tsx b/packages/block-divider/src/index.spec.tsx similarity index 80% rename from packages/block-divider/tests/Divider.spec.tsx rename to packages/block-divider/src/index.spec.tsx index 087c3b6..1944e48 100644 --- a/packages/block-divider/tests/Divider.spec.tsx +++ b/packages/block-divider/src/index.spec.tsx @@ -2,11 +2,11 @@ import React from 'react'; import { render } from '@testing-library/react'; -import { Divider } from '../src'; +import { Divider } from '.'; describe('Divider', () => { it('renders with default values', () => { - expect(render().asFragment()).toMatchSnapshot(); + expect(render().asFragment()).toMatchSnapshot(); }); it('renders with props', () => { diff --git a/packages/block-divider/src/index.tsx b/packages/block-divider/src/index.tsx index c02964f..efcf854 100644 --- a/packages/block-divider/src/index.tsx +++ b/packages/block-divider/src/index.tsx @@ -1,28 +1,35 @@ import React, { CSSProperties } from 'react'; import { z } from 'zod'; -function zColor() { - return z.string().regex(/^#[0-9a-fA-F]{6}$/); -} +const COLOR_SCHEMA = z + .string() + .regex(/^#[0-9a-fA-F]{6}$/) + .nullable() + .optional(); + +const PADDING_SCHEMA = z + .object({ + top: z.number(), + bottom: z.number(), + right: z.number(), + left: z.number(), + }) + .optional() + .nullable(); + +const getPadding = (padding: z.infer) => + padding ? `${padding.top}px ${padding.right}px ${padding.bottom}px ${padding.left}px` : undefined; export const DividerPropsSchema = z.object({ style: z .object({ - backgroundColor: zColor().optional().nullable(), - padding: z - .object({ - top: z.number(), - bottom: z.number(), - right: z.number(), - left: z.number(), - }) - .optional() - .nullable(), + backgroundColor: COLOR_SCHEMA, + padding: PADDING_SCHEMA, }) .optional(), props: z .object({ - lineColor: zColor().optional().nullable(), + lineColor: COLOR_SCHEMA, lineHeight: z.number().optional().nullable(), }) .optional(), @@ -30,13 +37,18 @@ export const DividerPropsSchema = z.object({ export type DividerProps = z.infer; +export const DividerPropsDefaults = { + lineHeight: 1, + lineColor: '#333333', +}; + export function Divider({ style, props }: DividerProps) { const st: CSSProperties = { - padding: getPadding(style), + padding: getPadding(style?.padding), backgroundColor: style?.backgroundColor ?? undefined, }; - const borderTopWidth = props?.lineHeight ?? 1; - const borderTopColor = props?.lineColor ?? '#333333'; + const borderTopWidth = props?.lineHeight ?? DividerPropsDefaults.lineHeight; + const borderTopColor = props?.lineColor ?? DividerPropsDefaults.lineColor; return (

); } - -function getPadding(style: DividerProps['style']) { - const value = style?.padding; - if (!value) { - return undefined; - } - return `${value.top}px ${value.right}px ${value.bottom}px ${value.left}px`; -} diff --git a/packages/block-divider/tsconfig.build.json b/packages/block-divider/tsconfig.build.json index 9dabb8e..174bf40 100644 --- a/packages/block-divider/tsconfig.build.json +++ b/packages/block-divider/tsconfig.build.json @@ -1,4 +1,4 @@ { "extends": "./tsconfig.json", - "exclude": ["tests/**/*.spec.ts", "tests/**/*.spec.tsx", "jest.config.ts"] + "exclude": ["src/**/*.spec.ts", "src/**/*.spec.tsx", "jest.config.ts"] } From b8ea2e2ebe32fd93eed2f120831ee417f9b00531 Mon Sep 17 00:00:00 2001 From: cohitre Date: Tue, 27 Feb 2024 10:24:55 -0800 Subject: [PATCH 2/4] Updating @usewaypoint/block-heading --- packages/block-heading/.npmignore | 1 - packages/block-heading/package-lock.json | 4 +- packages/block-heading/package.json | 2 +- .../__snapshots__/index.spec.tsx.snap} | 4 +- .../Heading.spec.tsx => src/index.spec.tsx} | 16 +- packages/block-heading/src/index.tsx | 172 ++++++++++-------- .../tests/HeadingPropsSchema.spec.tsx | 155 ---------------- packages/block-heading/tsconfig.build.json | 2 +- 8 files changed, 99 insertions(+), 257 deletions(-) rename packages/block-heading/{tests/__snapshots__/Heading.spec.tsx.snap => src/__snapshots__/index.spec.tsx.snap} (96%) rename packages/block-heading/{tests/Heading.spec.tsx => src/index.spec.tsx} (63%) delete mode 100644 packages/block-heading/tests/HeadingPropsSchema.spec.tsx diff --git a/packages/block-heading/.npmignore b/packages/block-heading/.npmignore index 564b640..2433ea5 100644 --- a/packages/block-heading/.npmignore +++ b/packages/block-heading/.npmignore @@ -5,5 +5,4 @@ .prettierrc jest.config.ts src -tests tsconfig.json \ No newline at end of file diff --git a/packages/block-heading/package-lock.json b/packages/block-heading/package-lock.json index fd614d4..c5c1522 100644 --- a/packages/block-heading/package-lock.json +++ b/packages/block-heading/package-lock.json @@ -1,12 +1,12 @@ { "name": "@usewaypoint/block-heading", - "version": "0.0.1", + "version": "0.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@usewaypoint/block-heading", - "version": "0.0.1", + "version": "0.0.2", "license": "MIT", "devDependencies": { "@testing-library/react": "^14.2.1" diff --git a/packages/block-heading/package.json b/packages/block-heading/package.json index c1f8f6a..29d1d57 100644 --- a/packages/block-heading/package.json +++ b/packages/block-heading/package.json @@ -1,6 +1,6 @@ { "name": "@usewaypoint/block-heading", - "version": "0.0.1", + "version": "0.0.2", "description": "@usewaypoint/document compatible Heading component", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/block-heading/tests/__snapshots__/Heading.spec.tsx.snap b/packages/block-heading/src/__snapshots__/index.spec.tsx.snap similarity index 96% rename from packages/block-heading/tests/__snapshots__/Heading.spec.tsx.snap rename to packages/block-heading/src/__snapshots__/index.spec.tsx.snap index b46a0a1..04979b5 100644 --- a/packages/block-heading/tests/__snapshots__/Heading.spec.tsx.snap +++ b/packages/block-heading/src/__snapshots__/index.spec.tsx.snap @@ -4,9 +4,7 @@ exports[`Heading renders with default values 1`] = `

- Hello! -

+ />
`; diff --git a/packages/block-heading/tests/Heading.spec.tsx b/packages/block-heading/src/index.spec.tsx similarity index 63% rename from packages/block-heading/tests/Heading.spec.tsx rename to packages/block-heading/src/index.spec.tsx index 3c8c931..e11f61e 100644 --- a/packages/block-heading/tests/Heading.spec.tsx +++ b/packages/block-heading/src/index.spec.tsx @@ -2,23 +2,11 @@ import React from 'react'; import { render } from '@testing-library/react'; -import { Heading } from '../src'; +import { Heading } from '.'; describe('Heading', () => { it('renders with default values', () => { - const style = { - backgroundColor: null, - color: null, - fontFamily: null, - fontWeight: 'bold' as const, - padding: null, - textAlign: null, - }; - const props = { - text: 'Hello!', - level: 'h2' as const, - }; - expect(render().asFragment()).toMatchSnapshot(); + expect(render().asFragment()).toMatchSnapshot(); }); it('renders with style', () => { diff --git a/packages/block-heading/src/index.tsx b/packages/block-heading/src/index.tsx index 78f7d73..97a6f13 100644 --- a/packages/block-heading/src/index.tsx +++ b/packages/block-heading/src/index.tsx @@ -1,69 +1,112 @@ import React, { CSSProperties } from 'react'; import { z } from 'zod'; -function zColor() { - return z.string().regex(/^#[0-9a-fA-F]{6}$/); -} +const COLOR_SCHEMA = z + .string() + .regex(/^#[0-9a-fA-F]{6}$/) + .nullable() + .optional(); + +const PADDING_SCHEMA = z + .object({ + top: z.number(), + bottom: z.number(), + right: z.number(), + left: z.number(), + }) + .optional() + .nullable(); + +const getPadding = (padding: z.infer) => + padding ? `${padding.top}px ${padding.right}px ${padding.bottom}px ${padding.left}px` : undefined; + +const FONT_FAMILY_SCHEMA = z + .enum([ + 'MODERN_SANS', + 'BOOK_SANS', + 'ORGANIC_SANS', + 'GEOMETRIC_SANS', + 'HEAVY_SANS', + 'ROUNDED_SANS', + 'MODERN_SERIF', + 'BOOK_SERIF', + 'MONOSPACE', + ]) + .nullable() + .optional(); -const FONT_FAMILY_NAMES = [ - 'MODERN_SANS', - 'BOOK_SANS', - 'ORGANIC_SANS', - 'GEOMETRIC_SANS', - 'HEAVY_SANS', - 'ROUNDED_SANS', - 'MODERN_SERIF', - 'BOOK_SERIF', - 'MONOSPACE', -] as const; +function getFontFamily(fontFamily: z.infer) { + switch (fontFamily) { + case 'MODERN_SANS': + return '"Helvetica Neue", "Arial Nova", "Nimbus Sans", Arial, sans-serif'; + case 'BOOK_SANS': + return 'Optima, Candara, "Noto Sans", source-sans-pro, sans-serif'; + case 'ORGANIC_SANS': + return 'Seravek, "Gill Sans Nova", Ubuntu, Calibri, "DejaVu Sans", source-sans-pro, sans-serif'; + case 'GEOMETRIC_SANS': + return 'Avenir, "Avenir Next LT Pro", Montserrat, Corbel, "URW Gothic", source-sans-pro, sans-serif'; + case 'HEAVY_SANS': + return 'Bahnschrift, "DIN Alternate", "Franklin Gothic Medium", "Nimbus Sans Narrow", sans-serif-condensed, sans-serif'; + case 'ROUNDED_SANS': + return 'ui-rounded, "Hiragino Maru Gothic ProN", Quicksand, Comfortaa, Manjari, "Arial Rounded MT Bold", Calibri, source-sans-pro, sans-serif'; + case 'MODERN_SERIF': + return 'Charter, "Bitstream Charter", "Sitka Text", Cambria, serif'; + case 'BOOK_SERIF': + return '"Iowan Old Style", "Palatino Linotype", "URW Palladio L", P052, serif'; + case 'MONOSPACE': + return '"Nimbus Mono PS", "Courier New", "Cutive Mono", monospace'; + } + return undefined; +} export const HeadingPropsSchema = z.object({ - props: z.object({ - text: z.string().default('Hello world'), - level: z.enum(['h1', 'h2', 'h3']).default('h2'), - }), - style: z.object({ - color: zColor().optional().nullish().default(null), - backgroundColor: zColor().optional().nullish().default(null), - fontFamily: z.enum(FONT_FAMILY_NAMES).optional().nullish().default(null), - fontWeight: z.enum(['bold', 'normal']).optional().nullish().default('bold'), - textAlign: z.enum(['left', 'center', 'right']).optional().nullish().default(null), - padding: z - .object({ - top: z.number(), - bottom: z.number(), - right: z.number(), - left: z.number(), - }) - .optional() - .nullish() - .default(null), - }), + props: z + .object({ + text: z.string().optional().nullable(), + level: z.enum(['h1', 'h2', 'h3']).optional().nullable(), + }) + .optional() + .nullable(), + style: z + .object({ + color: COLOR_SCHEMA, + backgroundColor: COLOR_SCHEMA, + fontFamily: FONT_FAMILY_SCHEMA, + fontWeight: z.enum(['bold', 'normal']).optional().nullable(), + textAlign: z.enum(['left', 'center', 'right']).optional().nullable(), + padding: PADDING_SCHEMA, + }) + .optional() + .nullable(), }); export type HeadingProps = z.infer; -export function Heading({ - props: { text, level }, - style: { color, backgroundColor, fontFamily, fontWeight, textAlign, padding }, -}: HeadingProps) { - const style: CSSProperties = { - color: color ?? undefined, - backgroundColor: backgroundColor ?? undefined, - fontWeight: fontWeight ?? undefined, - textAlign: textAlign ?? undefined, +export const HeadingPropsDefaults = { + level: 'h2', + text: '', +} as const; + +export function Heading({ props, style }: HeadingProps) { + const level = props?.level ?? HeadingPropsDefaults.level; + const text = props?.text ?? HeadingPropsDefaults.text; + const hStyle: CSSProperties = { + color: style?.color ?? undefined, + backgroundColor: style?.backgroundColor ?? undefined, + fontWeight: style?.fontWeight ?? 'bold', + textAlign: style?.textAlign ?? undefined, margin: 0, - fontFamily: getFontFamily(fontFamily), + fontFamily: getFontFamily(style?.fontFamily), fontSize: getFontSize(level), - padding: getPadding(padding), + padding: getPadding(style?.padding), }; switch (level) { case 'h1': - return

{text}

; + return

{text}

; case 'h2': - return

{text}

; + return

{text}

; case 'h3': - return

{text}

; + return

{text}

; } } @@ -77,34 +120,3 @@ function getFontSize(level: 'h1' | 'h2' | 'h3') { return 20; } } - -function getPadding(value: HeadingProps['style']['padding']) { - if (!value) { - return undefined; - } - return `${value.top}px ${value.right}px ${value.bottom}px ${value.left}px`; -} - -function getFontFamily(value: HeadingProps['style']['fontFamily']) { - switch (value) { - case 'MODERN_SANS': - return '"Helvetica Neue", "Arial Nova", "Nimbus Sans", Arial, sans-serif'; - case 'BOOK_SANS': - return 'Optima, Candara, "Noto Sans", source-sans-pro, sans-serif'; - case 'ORGANIC_SANS': - return 'Seravek, "Gill Sans Nova", Ubuntu, Calibri, "DejaVu Sans", source-sans-pro, sans-serif'; - case 'GEOMETRIC_SANS': - return 'Avenir, "Avenir Next LT Pro", Montserrat, Corbel, "URW Gothic", source-sans-pro, sans-serif'; - case 'HEAVY_SANS': - return 'Bahnschrift, "DIN Alternate", "Franklin Gothic Medium", "Nimbus Sans Narrow", sans-serif-condensed, sans-serif'; - case 'ROUNDED_SANS': - return 'ui-rounded, "Hiragino Maru Gothic ProN", Quicksand, Comfortaa, Manjari, "Arial Rounded MT Bold", Calibri, source-sans-pro, sans-serif'; - case 'MODERN_SERIF': - return 'Charter, "Bitstream Charter", "Sitka Text", Cambria, serif'; - case 'BOOK_SERIF': - return '"Iowan Old Style", "Palatino Linotype", "URW Palladio L", P052, serif'; - case 'MONOSPACE': - return '"Nimbus Mono PS", "Courier New", "Cutive Mono", monospace'; - } - return undefined; -} diff --git a/packages/block-heading/tests/HeadingPropsSchema.spec.tsx b/packages/block-heading/tests/HeadingPropsSchema.spec.tsx deleted file mode 100644 index d008746..0000000 --- a/packages/block-heading/tests/HeadingPropsSchema.spec.tsx +++ /dev/null @@ -1,155 +0,0 @@ -import { HeadingPropsSchema } from '../src'; - -describe('HeadingPropsSchema', () => { - describe('style', () => { - it('allows empty objects', () => { - const p = HeadingPropsSchema.shape.style; - expect(p.parse({})).toEqual({ - backgroundColor: null, - color: null, - fontFamily: null, - fontWeight: 'bold', - padding: null, - textAlign: null, - }); - }); - - describe('.color', () => { - const p = HeadingPropsSchema.shape.style.shape.color; - it('allows hex strings', () => { - expect(p.parse('#000111')).toEqual('#000111'); - expect(p.parse('#fff111')).toEqual('#fff111'); - expect(p.parse('#FAFAFA')).toEqual('#FAFAFA'); - }); - - it('is optional', () => { - expect(p.safeParse(null)).toEqual({ success: true, data: null }); - expect(p.safeParse(undefined)).toEqual({ success: true, data: null }); - }); - - it('rejects non-hex values', () => { - expect(p.safeParse(100).success).toEqual(false); - expect(p.safeParse({ name: 'ok' }).success).toEqual(false); - - expect(p.safeParse('#000e111').success).toEqual(false); - expect(p.safeParse('#ffef111').success).toEqual(false); - expect(p.safeParse('#LLL111').success).toEqual(false); - expect(p.safeParse('#FFF').success).toEqual(false); - expect(p.safeParse('red').success).toEqual(false); - expect(p.safeParse('').success).toEqual(false); - }); - }); - - describe('.backgroundColor', () => { - const p = HeadingPropsSchema.shape.style.shape.backgroundColor; - it('allows hex strings', () => { - expect(p.parse('#000111')).toEqual('#000111'); - expect(p.parse('#fff111')).toEqual('#fff111'); - expect(p.parse('#FAFAFA')).toEqual('#FAFAFA'); - }); - - it('is optional', () => { - expect(p.safeParse(null)).toEqual({ success: true, data: null }); - expect(p.safeParse(undefined)).toEqual({ success: true, data: null }); - }); - - it('rejects non-hex values', () => { - expect(p.safeParse(100).success).toEqual(false); - expect(p.safeParse({ name: 'ok' }).success).toEqual(false); - - expect(p.safeParse('#000e111').success).toEqual(false); - expect(p.safeParse('#ffef111').success).toEqual(false); - expect(p.safeParse('#LLL111').success).toEqual(false); - expect(p.safeParse('#FFF').success).toEqual(false); - expect(p.safeParse('red').success).toEqual(false); - expect(p.safeParse('').success).toEqual(false); - }); - }); - - describe('.fontFamily', () => { - const p = HeadingPropsSchema.shape.style.shape.fontFamily; - it('is optional', () => { - expect(p.safeParse(null)).toEqual({ success: true, data: null }); - expect(p.safeParse(undefined)).toEqual({ success: true, data: null }); - }); - - it('rejects non-string values', () => { - expect(p.safeParse(100).success).toEqual(false); - expect(p.safeParse({ name: 'ok' }).success).toEqual(false); - }); - - it('rejects non-string values', () => { - expect(p.safeParse(100).success).toEqual(false); - expect(p.safeParse({ name: 'ok' }).success).toEqual(false); - }); - }); - - describe('.fontWeight', () => { - const p = HeadingPropsSchema.shape.style.shape.fontWeight; - it('defaults to bold', () => { - expect(p.parse(null)).toEqual(null); - expect(p.parse(undefined)).toEqual('bold'); - }); - - it('rejects invalid values', () => { - expect(p.safeParse(100).success).toEqual(false); - expect(p.safeParse('pretty big').success).toEqual(false); - expect(p.safeParse({ name: 'ok' }).success).toEqual(false); - }); - - it('allows enum values', () => { - expect(p.parse('bold')).toEqual('bold'); - expect(p.parse('normal')).toEqual('normal'); - }); - }); - - describe('.textAlign', () => { - const p = HeadingPropsSchema.shape.style.shape.textAlign; - it('is optional', () => { - expect(p.safeParse(null)).toEqual({ success: true, data: null }); - expect(p.safeParse(undefined)).toEqual({ success: true, data: null }); - }); - - it('rejects invalid values', () => { - expect(p.safeParse(100).success).toEqual(false); - expect(p.safeParse('alignment').success).toEqual(false); - expect(p.safeParse({ name: 'ok' }).success).toEqual(false); - }); - - it('allows enum values', () => { - expect(p.parse('left')).toEqual('left'); - expect(p.parse('center')).toEqual('center'); - expect(p.parse('right')).toEqual('right'); - }); - }); - - describe('.padding', () => { - const fontFamily = HeadingPropsSchema.shape.style.shape.padding; - it('is optional', () => { - expect(fontFamily.safeParse(null)).toEqual({ success: true, data: null }); - expect(fontFamily.safeParse(undefined)).toEqual({ success: true, data: null }); - }); - - it('rejects non-string values', () => { - expect(fontFamily.safeParse(100).success).toEqual(false); - expect(fontFamily.safeParse({ name: 'ok' }).success).toEqual(false); - }); - - it('receives an object', () => { - const VALUE = { top: 10, bottom: 10, right: 10, left: 10 }; - expect(fontFamily.parse(VALUE)).toEqual(VALUE); - }); - }); - }); - - describe('props', () => { - const p = HeadingPropsSchema.shape.props; - it('defaults to level h2', () => { - expect(p.parse({ text: 'hello' })).toEqual({ text: 'hello', level: 'h2' }); - }); - - it('allows level enums', () => { - expect(p.parse({ text: 'hello', level: 'h1' })).toEqual({ text: 'hello', level: 'h1' }); - }); - }); -}); diff --git a/packages/block-heading/tsconfig.build.json b/packages/block-heading/tsconfig.build.json index 9dabb8e..174bf40 100644 --- a/packages/block-heading/tsconfig.build.json +++ b/packages/block-heading/tsconfig.build.json @@ -1,4 +1,4 @@ { "extends": "./tsconfig.json", - "exclude": ["tests/**/*.spec.ts", "tests/**/*.spec.tsx", "jest.config.ts"] + "exclude": ["src/**/*.spec.ts", "src/**/*.spec.tsx", "jest.config.ts"] } From bf355bb974ad74b38cc0b4d270456f4e2537fa3c Mon Sep 17 00:00:00 2001 From: cohitre Date: Tue, 27 Feb 2024 10:25:27 -0800 Subject: [PATCH 3/4] Adding @usewaypoint/block-html --- packages/block-html/.npmignore | 8 + packages/block-html/LICENSE | 19 + packages/block-html/README.md | 3 + packages/block-html/package-lock.json | 1186 +++++++++++++++++ packages/block-html/package.json | 22 + .../src/__snapshots__/index.spec.tsx.snap | 7 + packages/block-html/src/index.spec.tsx | 11 + packages/block-html/src/index.tsx | 98 ++ packages/block-html/tsconfig.build.json | 4 + packages/block-html/tsconfig.json | 9 + 10 files changed, 1367 insertions(+) create mode 100644 packages/block-html/.npmignore create mode 100644 packages/block-html/LICENSE create mode 100644 packages/block-html/README.md create mode 100644 packages/block-html/package-lock.json create mode 100644 packages/block-html/package.json create mode 100644 packages/block-html/src/__snapshots__/index.spec.tsx.snap create mode 100644 packages/block-html/src/index.spec.tsx create mode 100644 packages/block-html/src/index.tsx create mode 100644 packages/block-html/tsconfig.build.json create mode 100644 packages/block-html/tsconfig.json diff --git a/packages/block-html/.npmignore b/packages/block-html/.npmignore new file mode 100644 index 0000000..2433ea5 --- /dev/null +++ b/packages/block-html/.npmignore @@ -0,0 +1,8 @@ +.editorconfig +.envrc +.eslintignore +.eslintrc.json +.prettierrc +jest.config.ts +src +tsconfig.json \ No newline at end of file diff --git a/packages/block-html/LICENSE b/packages/block-html/LICENSE new file mode 100644 index 0000000..5a09b83 --- /dev/null +++ b/packages/block-html/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2024 Carlos Rodriguez-Rosario + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/block-html/README.md b/packages/block-html/README.md new file mode 100644 index 0000000..d40817c --- /dev/null +++ b/packages/block-html/README.md @@ -0,0 +1,3 @@ +# @usewaypoint/block-html + +HTML component for use with the EmailBuilder package. diff --git a/packages/block-html/package-lock.json b/packages/block-html/package-lock.json new file mode 100644 index 0000000..a5c7143 --- /dev/null +++ b/packages/block-html/package-lock.json @@ -0,0 +1,1186 @@ +{ + "name": "@usewaypoint/block-html", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@usewaypoint/block-html", + "version": "0.0.1", + "license": "MIT", + "devDependencies": { + "@testing-library/react": "^14.2.1" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "zod": "^1 || ^2 || ^3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/react": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.2.1.tgz", + "integrity": "sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.58.tgz", + "integrity": "sha512-TaGvMNhxvG2Q0K0aYxiKfNDS5m5ZsoIBBbtfUorxdH4NGSXIlYvZxLJI+9Dd3KjeB3780bciLyAb7ylO8pLhPw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.19", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", + "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", + "dev": true + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dev": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/side-channel": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/packages/block-html/package.json b/packages/block-html/package.json new file mode 100644 index 0000000..b05239f --- /dev/null +++ b/packages/block-html/package.json @@ -0,0 +1,22 @@ +{ + "name": "@usewaypoint/block-html", + "version": "0.0.1", + "description": "@usewaypoint/document compatible HTML component", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "carlos@usewaypoint.com", + "license": "MIT", + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "zod": "^1 || ^2 || ^3" + }, + "devDependencies": { + "@testing-library/react": "^14.2.1" + } +} diff --git a/packages/block-html/src/__snapshots__/index.spec.tsx.snap b/packages/block-html/src/__snapshots__/index.spec.tsx.snap new file mode 100644 index 0000000..276c7d6 --- /dev/null +++ b/packages/block-html/src/__snapshots__/index.spec.tsx.snap @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`block-html renders with default values 1`] = ` + +
+ +`; diff --git a/packages/block-html/src/index.spec.tsx b/packages/block-html/src/index.spec.tsx new file mode 100644 index 0000000..64301e1 --- /dev/null +++ b/packages/block-html/src/index.spec.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +import { render } from '@testing-library/react'; + +import { Html } from '.'; + +describe('block-html', () => { + it('renders with default values', () => { + expect(render().asFragment()).toMatchSnapshot(); + }); +}); diff --git a/packages/block-html/src/index.tsx b/packages/block-html/src/index.tsx new file mode 100644 index 0000000..00eb666 --- /dev/null +++ b/packages/block-html/src/index.tsx @@ -0,0 +1,98 @@ +import React, { CSSProperties } from 'react'; +import { z } from 'zod'; + +const FONT_FAMILY_SCHEMA = z + .enum([ + 'MODERN_SANS', + 'BOOK_SANS', + 'ORGANIC_SANS', + 'GEOMETRIC_SANS', + 'HEAVY_SANS', + 'ROUNDED_SANS', + 'MODERN_SERIF', + 'BOOK_SERIF', + 'MONOSPACE', + ]) + .nullable() + .optional(); + +function getFontFamily(fontFamily: z.infer) { + switch (fontFamily) { + case 'MODERN_SANS': + return '"Helvetica Neue", "Arial Nova", "Nimbus Sans", Arial, sans-serif'; + case 'BOOK_SANS': + return 'Optima, Candara, "Noto Sans", source-sans-pro, sans-serif'; + case 'ORGANIC_SANS': + return 'Seravek, "Gill Sans Nova", Ubuntu, Calibri, "DejaVu Sans", source-sans-pro, sans-serif'; + case 'GEOMETRIC_SANS': + return 'Avenir, "Avenir Next LT Pro", Montserrat, Corbel, "URW Gothic", source-sans-pro, sans-serif'; + case 'HEAVY_SANS': + return 'Bahnschrift, "DIN Alternate", "Franklin Gothic Medium", "Nimbus Sans Narrow", sans-serif-condensed, sans-serif'; + case 'ROUNDED_SANS': + return 'ui-rounded, "Hiragino Maru Gothic ProN", Quicksand, Comfortaa, Manjari, "Arial Rounded MT Bold", Calibri, source-sans-pro, sans-serif'; + case 'MODERN_SERIF': + return 'Charter, "Bitstream Charter", "Sitka Text", Cambria, serif'; + case 'BOOK_SERIF': + return '"Iowan Old Style", "Palatino Linotype", "URW Palladio L", P052, serif'; + case 'MONOSPACE': + return '"Nimbus Mono PS", "Courier New", "Cutive Mono", monospace'; + } + return undefined; +} + +const COLOR_SCHEMA = z + .string() + .regex(/^#[0-9a-fA-F]{6}$/) + .nullable() + .optional(); + +const PADDING_SCHEMA = z + .object({ + top: z.number(), + bottom: z.number(), + right: z.number(), + left: z.number(), + }) + .optional() + .nullable(); + +const getPadding = (padding: z.infer) => + padding ? `${padding.top}px ${padding.right}px ${padding.bottom}px ${padding.left}px` : undefined; + +export const HtmlPropsSchema = z.object({ + style: z + .object({ + color: COLOR_SCHEMA, + backgroundColor: COLOR_SCHEMA, + fontFamily: FONT_FAMILY_SCHEMA, + fontSize: z.number().min(0), + textAlign: z.enum(['left', 'right', 'center']).optional().nullable().default(null), + padding: PADDING_SCHEMA, + }) + .optional() + .nullable(), + props: z + .object({ + contents: z.string(), + }) + .optional() + .nullable(), +}); + +export type HtmlProps = z.infer; + +export function Html({ style, props }: HtmlProps) { + const children = props?.contents; + const cssStyle: CSSProperties = { + color: style?.color ?? undefined, + backgroundColor: style?.backgroundColor ?? undefined, + fontFamily: getFontFamily(style?.fontFamily), + fontSize: style?.fontSize ?? undefined, + textAlign: style?.textAlign ?? undefined, + padding: getPadding(style?.padding), + }; + if (!children) { + return
; + } + return
; +} diff --git a/packages/block-html/tsconfig.build.json b/packages/block-html/tsconfig.build.json new file mode 100644 index 0000000..174bf40 --- /dev/null +++ b/packages/block-html/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["src/**/*.spec.ts", "src/**/*.spec.tsx", "jest.config.ts"] +} diff --git a/packages/block-html/tsconfig.json b/packages/block-html/tsconfig.json new file mode 100644 index 0000000..efac89d --- /dev/null +++ b/packages/block-html/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "target": "es2015", + "module": "esnext", + "outDir": "dist" + }, + "exclude": ["dist"] +} From 8217401870e99c61cff57f6505361fcbde8a63d6 Mon Sep 17 00:00:00 2001 From: cohitre Date: Tue, 27 Feb 2024 10:28:42 -0800 Subject: [PATCH 4/4] Making divider props nullable --- packages/block-divider/src/index.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/block-divider/src/index.tsx b/packages/block-divider/src/index.tsx index efcf854..776a0d5 100644 --- a/packages/block-divider/src/index.tsx +++ b/packages/block-divider/src/index.tsx @@ -26,13 +26,15 @@ export const DividerPropsSchema = z.object({ backgroundColor: COLOR_SCHEMA, padding: PADDING_SCHEMA, }) - .optional(), + .optional() + .nullable(), props: z .object({ lineColor: COLOR_SCHEMA, lineHeight: z.number().optional().nullable(), }) - .optional(), + .optional() + .nullable(), }); export type DividerProps = z.infer;