@tempots/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +1 -0
  2. package/components/Box/Box.d.ts +8 -0
  3. package/components/Box/Box.js +8 -0
  4. package/components/Button/Button.d.ts +12 -0
  5. package/components/Button/Button.js +19 -0
  6. package/components/Control/Control.d.ts +8 -0
  7. package/components/Control/Control.js +16 -0
  8. package/components/Field/Field.d.ts +11 -0
  9. package/components/Field/Field.js +37 -0
  10. package/components/Field/field-layout.d.ts +1 -0
  11. package/components/Field/field-layout.js +1 -0
  12. package/components/Fieldset/Fieldset.d.ts +8 -0
  13. package/components/Fieldset/Fieldset.js +12 -0
  14. package/components/Fieldset/fieldset-context.d.ts +7 -0
  15. package/components/Fieldset/fieldset-context.js +3 -0
  16. package/components/Group/Group.d.ts +13 -0
  17. package/components/Group/Group.js +28 -0
  18. package/components/Input/BaseInput.d.ts +10 -0
  19. package/components/Input/BaseInput.js +17 -0
  20. package/components/Input/FloatInput.d.ts +10 -0
  21. package/components/Input/FloatInput.js +14 -0
  22. package/components/Input/IntInput.d.ts +9 -0
  23. package/components/Input/IntInput.js +25 -0
  24. package/components/Input/NativeSelect.d.ts +11 -0
  25. package/components/Input/NativeSelect.js +27 -0
  26. package/components/Input/TextInput.d.ts +7 -0
  27. package/components/Input/TextInput.js +9 -0
  28. package/components/Input/UnitInput.d.ts +10 -0
  29. package/components/Input/UnitInput.js +14 -0
  30. package/components/Popover/Popover.d.ts +9 -0
  31. package/components/Popover/Popover.js +35 -0
  32. package/components/Popover/UnstyledPopover.d.ts +19 -0
  33. package/components/Popover/UnstyledPopover.js +97 -0
  34. package/components/Popover/index.d.ts +2 -0
  35. package/components/Popover/index.js +2 -0
  36. package/components/SegmentedControl/SegmentedControl.d.ts +9 -0
  37. package/components/SegmentedControl/SegmentedControl.js +16 -0
  38. package/components/Stack/Stack.d.ts +11 -0
  39. package/components/Stack/Stack.js +18 -0
  40. package/components/StyleProvider/StyleProvider.d.ts +37 -0
  41. package/components/StyleProvider/StyleProvider.js +103 -0
  42. package/components/Tooltip/index.d.ts +5 -0
  43. package/components/Tooltip/index.js +31 -0
  44. package/components/styling/Sizing.d.ts +10 -0
  45. package/components/styling/Sizing.js +5 -0
  46. package/components/styling/Spacing.d.ts +28 -0
  47. package/components/styling/Spacing.js +49 -0
  48. package/components/styling/Sx.d.ts +6 -0
  49. package/components/styling/Sx.js +6 -0
  50. package/index.d.ts +24 -0
  51. package/index.js +20 -0
  52. package/package.json +46 -0
  53. package/styles/color.d.ts +1 -0
  54. package/styles/color.js +1 -0
  55. package/styles/reset.d.ts +1 -0
  56. package/styles/reset.js +283 -0
  57. package/styles/side.d.ts +1 -0
  58. package/styles/side.js +1 -0
  59. package/styles/size.d.ts +5 -0
  60. package/styles/size.js +44 -0
  61. package/styles/sx.d.ts +9 -0
  62. package/styles/sx.js +28 -0
  63. package/styles/ui-styles.d.ts +67 -0
  64. package/styles/ui-styles.js +118 -0
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@tempots/dom/jsx-runtime";
2
+ import { Consumer, Signal } from '@tempots/dom';
3
+ import { StyleMarker } from '../StyleProvider/StyleProvider';
4
+ import { Sx } from '../styling/Sx';
5
+ export const Stack = (props) => {
6
+ const { children, align, justify, spacing } = props;
7
+ return (_jsx(Consumer, { mark: StyleMarker, children: ({ styles }) => {
8
+ return (_jsxs("div", { children: [_jsx(Sx, { sx: {
9
+ display: 'flex',
10
+ flexDirection: 'column',
11
+ alignItems: align ?? Signal.of('normal'),
12
+ justifyContent: justify,
13
+ gap: (spacing ?? Signal.of('md')).combine(styles, (sp, st) => {
14
+ return (typeof sp === 'number' ? sp : st.styles.spacing[sp]);
15
+ })
16
+ } }), children] }));
17
+ } }));
18
+ };
@@ -0,0 +1,37 @@
1
+ import { type JSX, Prop, type Signal } from '@tempots/dom';
2
+ import { type Size } from '../../styles/size';
3
+ import { type UIStyles } from '../../styles/ui-styles';
4
+ export interface Styles {
5
+ components: UIComponentStyles;
6
+ styles: UIStyles;
7
+ }
8
+ export interface UITheme {
9
+ styles: Signal<Styles>;
10
+ isLight: Prop<boolean>;
11
+ }
12
+ export interface StyleProviderProps {
13
+ children?: JSX.Element;
14
+ }
15
+ export declare const StyleMarker: symbol;
16
+ export declare const StyleProvider: ({ children }: StyleProviderProps) => JSX.DOMNode;
17
+ export type ComponentClasses<T> = (options: T) => string;
18
+ export interface UIComponentStyles {
19
+ button: {
20
+ root: ComponentClasses<ButtonStyles>;
21
+ content: ComponentClasses<ButtonStyles>;
22
+ };
23
+ control: {
24
+ root: ComponentClasses<ControlStyles>;
25
+ };
26
+ }
27
+ export type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'danger';
28
+ export interface ButtonStyles {
29
+ size: Size | number;
30
+ compact: boolean;
31
+ variant: ButtonVariant;
32
+ }
33
+ export interface ControlStyles {
34
+ size: Size;
35
+ spacing: Size;
36
+ }
37
+ export declare const defaultComponentStyle: ({ font, border, spacing, background, control }: UIStyles) => UIComponentStyles;
@@ -0,0 +1,103 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@tempots/dom/jsx-runtime";
2
+ import { css } from '@emotion/css';
3
+ import { Portal, Prop, OnRemove, Provider, makeProviderMark, When } from '@tempots/dom';
4
+ import { resetCss } from '../../styles/reset';
5
+ import { getRadiusSize, getSize } from '../../styles/size';
6
+ import { defaultDarkStyles, defaultLightStyles } from '../../styles/ui-styles';
7
+ import { Sx } from '../styling/Sx';
8
+ export const StyleMarker = makeProviderMark();
9
+ const counter = Prop.of(0);
10
+ export const StyleProvider = ({ children }) => {
11
+ const isLight = Prop.of(true);
12
+ const styles = isLight.map(v => {
13
+ if (v) {
14
+ return {
15
+ components: defaultComponentStyle(defaultLightStyles),
16
+ styles: defaultLightStyles
17
+ };
18
+ }
19
+ else {
20
+ return {
21
+ components: defaultComponentStyle(defaultDarkStyles),
22
+ styles: defaultDarkStyles
23
+ };
24
+ }
25
+ });
26
+ counter.update(v => v + 1);
27
+ return (_jsxs(Provider, { value: { styles, isLight }, mark: StyleMarker, children: [_jsx(Sx, { sx: { backgroundColor: styles.map(v => v.styles.background.color) } }), _jsx(When, { is: counter.map(v => v > 0), children: _jsx(Portal, { selector: "head", children: _jsx("style", { children: resetCss }) }) }), children, _jsx(OnRemove, { clear: () => { counter.update(v => v - 1); } })] }));
28
+ };
29
+ export const defaultComponentStyle = ({ font, border, spacing, background, control }) => {
30
+ return {
31
+ button: {
32
+ root: ({ size, variant, compact }) => {
33
+ const obj = {
34
+ alignContent: 'center',
35
+ display: 'inline-flex',
36
+ alignItems: 'center',
37
+ fontWeight: 500,
38
+ fontSize: getSize(size, 'md', font.size),
39
+ borderRadius: getRadiusSize('md', 'sm', border.radius),
40
+ border: `1px solid ${control.borderColor}`,
41
+ backgroundColor: background.color,
42
+ color: font.color,
43
+ padding: `0 ${spacing.md / (compact ? 2 : 1)}px`,
44
+ textShadow: control.accentTextShadow,
45
+ boxShadow: control.shadow,
46
+ // minWidth: getSize(size, 'md', control.height),
47
+ height: getSize(size, 'md', control.height),
48
+ cursor: 'pointer',
49
+ fontFamily: font.family.control
50
+ };
51
+ obj[':hover:not([disabled])'] = {
52
+ backgroundColor: background.inverseColor,
53
+ color: font.inverseColor
54
+ };
55
+ obj[':focus'] = {
56
+ outline: `2px solid ${control.focusColor}`,
57
+ outlineOffset: 0.5
58
+ };
59
+ obj[':active:not([disabled])'] = {
60
+ transform: 'translateY(2px)'
61
+ };
62
+ obj[':disabled'] = {
63
+ cursor: 'not-allowed',
64
+ backgroundColor: background.mutedColor,
65
+ color: font.mutedColor
66
+ };
67
+ return css(obj);
68
+ },
69
+ content: ({ size, variant, compact }) => {
70
+ return css({
71
+ minWidth: '1.25em',
72
+ margin: '0 auto'
73
+ });
74
+ }
75
+ },
76
+ control: {
77
+ root: ({ size, spacing: sp }) => {
78
+ const obj = {
79
+ display: 'inline-flex',
80
+ alignItems: 'center',
81
+ flexDirection: 'row',
82
+ gap: getSize(sp, 'md', spacing),
83
+ overflow: 'hidden',
84
+ lineHeight: getSize(size, 'md', control.height),
85
+ height: getSize(size, 'md', control.height),
86
+ fontWeight: 500,
87
+ padding: '0 2px',
88
+ fontSize: getSize(size, 'md', font.size),
89
+ fontFamily: font.family.control,
90
+ borderRadius: getRadiusSize('md', 'sm', border.radius),
91
+ border: `1px solid ${control.borderColor}`,
92
+ backgroundColor: background.color,
93
+ color: font.color,
94
+ ':focus-within': {
95
+ outline: `2px solid ${control.focusColor}`,
96
+ outlineOffset: 0.5
97
+ }
98
+ };
99
+ return css(obj);
100
+ }
101
+ }
102
+ };
103
+ };
@@ -0,0 +1,5 @@
1
+ import { type JSX } from '@tempots/dom';
2
+ export interface TooltipProps {
3
+ children?: JSX.DOMNode;
4
+ }
5
+ export declare function Tooltip({ children }: TooltipProps): JSX.DOMNode;
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "@tempots/dom/jsx-runtime";
2
+ import { Consumer, Signal, Attribute } from '@tempots/dom';
3
+ import { UnstyledPopover } from '../Popover';
4
+ import { onTargetOverMount } from '../Popover/UnstyledPopover';
5
+ import { StyleMarker } from '../StyleProvider/StyleProvider';
6
+ import { Sx } from '../styling/Sx';
7
+ const ARROW_SIZE = 8;
8
+ export function Tooltip({ children }) {
9
+ return (_jsx(_Fragment, { children: _jsx(Consumer, { mark: StyleMarker, children: ({ styles }) => {
10
+ const at = styles.at('styles').at;
11
+ return (_jsxs(UnstyledPopover, { onTargetMount: onTargetOverMount, placement: Signal.of('top'), arrow: _jsx("div", { children: _jsx(Sx, { sx: {
12
+ backgroundColor: at('background').at('inverseColor'),
13
+ boxShadow: at('shadow').at('md'),
14
+ marginTop: -ARROW_SIZE / 2,
15
+ transform: 'rotate(45deg)',
16
+ width: ARROW_SIZE,
17
+ height: ARROW_SIZE
18
+ } }) }), children: [_jsx(Attribute, { name: "role", value: Signal.of('tooltip') }), _jsx(Sx, { sx: {
19
+ maxWidth: '200px',
20
+ height: 'auto',
21
+ lineHeight: '1em',
22
+ textAlign: 'center',
23
+ whiteSpace: 'normal',
24
+ backgroundColor: at('background').at('inverseColor'),
25
+ color: at('font').at('inverseColor'),
26
+ padding: at('spacing').map(v => `${v.xs}px ${v.md}px`),
27
+ borderRadius: at('border').at('radius').at('sm'),
28
+ boxShadow: at('shadow').at('md')
29
+ } }), children] }));
30
+ } }) }));
31
+ }
@@ -0,0 +1,10 @@
1
+ import { type JSX } from '@tempots/dom';
2
+ export interface SizingProps {
3
+ width?: JSX.VValue<string> | JSX.VValue<number>;
4
+ height?: JSX.VValue<string> | JSX.VValue<number>;
5
+ minWidth?: JSX.VValue<string> | JSX.VValue<number>;
6
+ minHeight?: JSX.VValue<string> | JSX.VValue<number>;
7
+ maxWidth?: JSX.VValue<string> | JSX.VValue<number>;
8
+ maxHeight?: JSX.VValue<string> | JSX.VValue<number>;
9
+ }
10
+ export declare const Sizing: ({ width, height, maxHeight, maxWidth, minHeight, minWidth }: SizingProps) => JSX.DOMNode;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx } from "@tempots/dom/jsx-runtime";
2
+ import { Sx } from './Sx';
3
+ export const Sizing = ({ width, height, maxHeight, maxWidth, minHeight, minWidth }) => {
4
+ return _jsx(Sx, { sx: { width, height, maxHeight, maxWidth, minHeight, minWidth } }); // TODO any
5
+ };
@@ -0,0 +1,28 @@
1
+ import { type JSX } from '@tempots/dom';
2
+ import { type Size } from '../../styles/size';
3
+ export type Space = JSX.VValue<Size> | JSX.VValue<number>;
4
+ export interface SpacingProps {
5
+ m?: Space;
6
+ mt?: Space;
7
+ mr?: Space;
8
+ mb?: Space;
9
+ ml?: Space;
10
+ mh?: Space;
11
+ mv?: Space;
12
+ ms?: Space;
13
+ me?: Space;
14
+ mis?: Space;
15
+ mie?: Space;
16
+ p?: Space;
17
+ pt?: Space;
18
+ pr?: Space;
19
+ pb?: Space;
20
+ pl?: Space;
21
+ ph?: Space;
22
+ pv?: Space;
23
+ ps?: Space;
24
+ pe?: Space;
25
+ pis?: Space;
26
+ pie?: Space;
27
+ }
28
+ export declare const Spacing: (props: SpacingProps) => JSX.DOMNode;
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx } from "@tempots/dom/jsx-runtime";
2
+ import { Signal, ClassName, Consumer } from '@tempots/dom';
3
+ import { getSizeOrNull } from '../../styles/size';
4
+ import { objectOfPropertiesToSignalOfObject, sxToClassProp } from '../../styles/sx';
5
+ import { StyleMarker } from '../StyleProvider/StyleProvider';
6
+ const map = {
7
+ m: ['margin'],
8
+ mt: ['marginTop'],
9
+ mr: ['marginRight'],
10
+ mb: ['marginBottom'],
11
+ ml: ['marginLeft'],
12
+ ms: ['marginBlockStart'],
13
+ me: ['marginBlockEnd'],
14
+ mis: ['marginInlineStart'],
15
+ mie: ['marginInlineEnd'],
16
+ p: ['padding'],
17
+ pt: ['paddingTop'],
18
+ pr: ['paddingRight'],
19
+ pb: ['paddingBottom'],
20
+ pl: ['paddingLeft'],
21
+ ps: ['paddingBlockStart'],
22
+ pe: ['paddingBlockEnd'],
23
+ pis: ['paddingInlineStart'],
24
+ pie: ['paddingInlineEnd'],
25
+ mh: ['marginStart', 'marginEnd'],
26
+ mv: ['marginTop', 'marginBottom'],
27
+ ph: ['paddingStart', 'paddingEnd'],
28
+ pv: ['paddingTop', 'paddingBottom']
29
+ };
30
+ export const Spacing = (props) => {
31
+ return (_jsx(Consumer, { mark: StyleMarker, children: (theme) => {
32
+ const keys = Object.keys(props).filter(k => k !== 'children');
33
+ if (keys.length === 0)
34
+ return null;
35
+ const sx = keys.reduce((acc, k) => {
36
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
+ const s = Signal.wrap(props[k]).combine(theme.styles, (s, { styles: { spacing } }) => [s, spacing]);
38
+ for (const kk of map[k]) {
39
+ if (acc[kk] == null) {
40
+ continue;
41
+ }
42
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
+ acc[kk] = s.map(([v, spacing]) => getSizeOrNull(v, spacing));
44
+ }
45
+ return acc;
46
+ }, {});
47
+ return _jsx(ClassName, { value: sxToClassProp(objectOfPropertiesToSignalOfObject(sx)) });
48
+ } }));
49
+ };
@@ -0,0 +1,6 @@
1
+ import { type JSX } from '@tempots/dom';
2
+ import { type SX } from '../../styles/sx';
3
+ export interface SxProps {
4
+ sx?: SX;
5
+ }
6
+ export declare const Sx: ({ sx }: SxProps) => JSX.DOMNode;
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "@tempots/dom/jsx-runtime";
2
+ import { ClassName } from '@tempots/dom';
3
+ import { sxToClassProp } from '../../styles/sx';
4
+ export const Sx = ({ sx }) => {
5
+ return sx != null ? _jsx(ClassName, { value: sxToClassProp(sx) }) : null;
6
+ };
package/index.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ export { Box, type BoxProps } from './components/Box/Box';
2
+ export { Button, type ButtonProps } from './components/Button/Button';
3
+ export { Control, type ControlProps } from './components/Control/Control';
4
+ export { Sizing, type SizingProps } from './components/styling/Sizing';
5
+ export { Spacing, type SpacingProps, type Space } from './components/styling/Spacing';
6
+ export { Stack, type StackProps, type AlignItems, type JustifyContent } from './components/Stack/Stack';
7
+ export { Group, type GroupProps, type Position } from './components/Group/Group';
8
+ export { Sx, type SxProps as ElSxProps } from './components/styling/Sx';
9
+ export { Field, type FieldProps } from './components/Field/Field';
10
+ export type { FieldLayout } from './components/Field/field-layout';
11
+ export { Fieldset, type FieldsetProps } from './components/Fieldset/Fieldset';
12
+ export { FloatInput, type FloatInputProps, BaseFloatInput } from './components/Input/FloatInput';
13
+ export { IntInput, type IntInputProps, BaseIntInput } from './components/Input/IntInput';
14
+ export { SegmentedControl, type SegmentedControlProps } from './components/SegmentedControl/SegmentedControl';
15
+ export { NativeSelect, type NativeSelectProps } from './components/Input/NativeSelect';
16
+ export { Popover, type PopoverProps, type Placement, type OpenStrategy, UnstyledPopover, type UnstyledPopoverProps } from './components/Popover';
17
+ export type { Side } from './styles/side';
18
+ export type { Size } from './styles/size';
19
+ export type { SX } from './styles/sx';
20
+ export { TextInput, type TextInputProps, BaseTextInput } from './components/Input/TextInput';
21
+ export { Tooltip, type TooltipProps } from './components/Tooltip';
22
+ export { type UIStyles, defaultLightStyles as defaultStyles, type Heading } from './styles/ui-styles';
23
+ export { UnitInput, type UnitInputProps } from './components/Input/UnitInput';
24
+ export { StyleMarker, StyleProvider, type StyleProviderProps, type UITheme, type UIComponentStyles, defaultComponentStyle } from './components/StyleProvider/StyleProvider';
package/index.js ADDED
@@ -0,0 +1,20 @@
1
+ export { Box } from './components/Box/Box';
2
+ export { Button } from './components/Button/Button';
3
+ export { Control } from './components/Control/Control';
4
+ export { Sizing } from './components/styling/Sizing';
5
+ export { Spacing } from './components/styling/Spacing';
6
+ export { Stack } from './components/Stack/Stack';
7
+ export { Group } from './components/Group/Group';
8
+ export { Sx } from './components/styling/Sx';
9
+ export { Field } from './components/Field/Field';
10
+ export { Fieldset } from './components/Fieldset/Fieldset';
11
+ export { FloatInput, BaseFloatInput } from './components/Input/FloatInput';
12
+ export { IntInput, BaseIntInput } from './components/Input/IntInput';
13
+ export { SegmentedControl } from './components/SegmentedControl/SegmentedControl';
14
+ export { NativeSelect } from './components/Input/NativeSelect';
15
+ export { Popover, UnstyledPopover } from './components/Popover';
16
+ export { TextInput, BaseTextInput } from './components/Input/TextInput';
17
+ export { Tooltip } from './components/Tooltip';
18
+ export { defaultLightStyles as defaultStyles } from './styles/ui-styles';
19
+ export { UnitInput } from './components/Input/UnitInput';
20
+ export { StyleMarker, StyleProvider, defaultComponentStyle } from './components/StyleProvider/StyleProvider';
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@tempots/ui",
3
+ "version": "0.1.0",
4
+ "main": "index.js",
5
+ "types": "index.d.ts",
6
+ "scripts": {
7
+ "watch": "tsc --watch",
8
+ "build": "tsc",
9
+ "test": "jest",
10
+ "test:watch": "jest --watch",
11
+ "coverage": "jest --coverage",
12
+ "npm:prep": "yarn build && cp README.md package.json dist",
13
+ "npm:publish": "yarn npm:prep && (cd dist && yarn publish --access public)"
14
+ },
15
+ "dependencies": {
16
+ "@emotion/css": "^11.10.6",
17
+ "@floating-ui/dom": "^1.2.6",
18
+ "@tempots/dom": "^5.0.2",
19
+ "@tempots/std": "^0.9.7"
20
+ },
21
+ "devDependencies": {
22
+ "@happy-dom/jest-environment": "^9.1.7",
23
+ "@types/jest": "^29.5.0",
24
+ "@types/node": "^18.15.11",
25
+ "@typescript-eslint/eslint-plugin": "^5.43.0",
26
+ "eslint": "^8.0.1",
27
+ "eslint-config-standard-with-typescript": "^34.0.1",
28
+ "eslint-plugin-import": "^2.25.2",
29
+ "eslint-plugin-n": "^15.0.0",
30
+ "eslint-plugin-promise": "^6.0.0",
31
+ "happy-dom": "^9.1.0",
32
+ "jest": "^29.5.0",
33
+ "ts-jest": "^29.1.0",
34
+ "typescript": "^5.0.3"
35
+ },
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/fponticelli/tempots-ui.git"
39
+ },
40
+ "author": "Franco Ponticelli",
41
+ "license": "Apache-2.0",
42
+ "bugs": {
43
+ "url": "https://github.com/fponticelli/tempots-ui/issues"
44
+ },
45
+ "homepage": "https://github.com/fponticelli/tempots-ui#readme"
46
+ }
@@ -0,0 +1 @@
1
+ export type Color = 'blue' | 'green' | 'red' | 'yellow' | 'orange' | 'purple' | 'pink' | 'gray' | 'black';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export declare const resetCss = "\n html {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n font-family: system-ui, sans-serif;\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n -moz-osx-font-smoothing: grayscale;\n touch-action: manipulation;\n }\n\n body {\n position: relative;\n min-height: 100%;\n font-feature-settings: 'kern';\n }\n\n *,\n *::before,\n *::after {\n border-width: 0;\n border-style: solid;\n box-sizing: border-box;\n }\n\n main {\n display: block;\n }\n\n hr {\n border-top-width: 1px;\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n }\n\n pre,\n code,\n kbd,\n samp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 1em;\n }\n\n a {\n background-color: transparent;\n color: inherit;\n text-decoration: inherit;\n }\n\n abbr[title] {\n border-bottom: none;\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n\n b,\n strong {\n font-weight: bold;\n }\n\n small {\n font-size: 80%;\n }\n\n sub,\n sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n\n sub {\n bottom: -0.25em;\n }\n\n sup {\n top: -0.5em;\n }\n\n img {\n border-style: none;\n }\n\n button,\n input,\n optgroup,\n select,\n textarea {\n font-family: inherit;\n font-size: 100%;\n line-height: 1.15;\n margin: 0;\n }\n\n button,\n input {\n overflow: visible;\n }\n\n button,\n select {\n text-transform: none;\n }\n\n button::-moz-focus-inner,\n [type='button']::-moz-focus-inner,\n [type='reset']::-moz-focus-inner,\n [type='submit']::-moz-focus-inner {\n border-style: none;\n padding: 0;\n }\n\n fieldset {\n padding: 0.35em 0.75em 0.625em;\n }\n\n legend {\n box-sizing: border-box;\n color: inherit;\n display: table;\n max-width: 100%;\n padding: 0;\n white-space: normal;\n }\n\n progress {\n vertical-align: baseline;\n }\n\n textarea {\n overflow: auto;\n }\n\n [type='checkbox'],\n [type='radio'] {\n box-sizing: border-box;\n padding: 0;\n }\n\n [type='number']::-webkit-inner-spin-button,\n [type='number']::-webkit-outer-spin-button {\n -webkit-appearance: none !important;\n }\n\n input[type='number'] {\n -moz-appearance: textfield;\n }\n\n [type='search'] {\n -webkit-appearance: textfield;\n outline-offset: -2px;\n }\n\n [type='search']::-webkit-search-decoration {\n -webkit-appearance: none !important;\n }\n\n ::-webkit-file-upload-button {\n -webkit-appearance: button;\n font: inherit;\n }\n\n details {\n display: block;\n }\n\n summary {\n display: list-item;\n }\n\n template {\n display: none;\n }\n\n [hidden] {\n display: none !important;\n }\n\n body,\n blockquote,\n dl,\n dd,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n hr,\n figure,\n p,\n pre {\n margin: 0;\n }\n\n button {\n background: transparent;\n padding: 0;\n }\n\n fieldset {\n margin: 0;\n padding: 0;\n }\n\n ol,\n ul {\n margin: 0;\n padding: 0;\n }\n\n textarea {\n resize: vertical;\n }\n\n button,\n [role='button'] {\n cursor: pointer;\n }\n\n button::-moz-focus-inner {\n border: 0 !important;\n }\n\n table {\n border-collapse: collapse;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n\n button,\n input,\n optgroup,\n select,\n textarea {\n padding: 0;\n line-height: inherit;\n color: inherit;\n }\n\n img,\n svg,\n video,\n canvas,\n audio,\n iframe,\n embed,\n object {\n display: block;\n }\n\n img,\n video {\n max-width: 100%;\n height: auto;\n }\n\n [data-js-focus-visible]\n :focus:not([data-focus-visible-added]):not([data-focus-visible-disabled]) {\n outline: none;\n box-shadow: none;\n }\n\n select::-ms-expand {\n display: none;\n }\n";