diff --git a/package.json b/package.json index e2c051e9..8862bde6 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "build": "rimraf build && tsc && vite build", "preview": "vite preview", "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'", - "fmt": "prettier --write 'src/**/*.{js,jsx,ts,tsx}'" + "fmt": "prettier --write 'src/**/*.{js,jsx,ts,tsx}'", + "typecheck": "tsc --noEmit" }, "eslintConfig": { "parser": "@typescript-eslint/parser", @@ -54,6 +55,7 @@ "markdown-it-emoji": "^2.0.0", "markdown-it-sub": "^1.0.0", "markdown-it-sup": "^1.0.0", + "preact-context-menu": "^0.1.5", "preact-i18n": "^2.4.0-preactx", "prettier": "^2.3.1", "prismjs": "^1.23.0", diff --git a/src/components/ui/Header.tsx b/src/components/ui/Header.tsx index 6a97dd3a..cb17b8c5 100644 --- a/src/components/ui/Header.tsx +++ b/src/components/ui/Header.tsx @@ -17,7 +17,7 @@ export default styled.div` flex-shrink: 0; align-items: center; - background-color: var(--primary-background); + background-color: var(--primary-header); background-size: cover !important; background-position: center !important; @@ -27,6 +27,7 @@ export default styled.div` ` } ${ props => props.placement === 'secondary' && css` + background-color: var(--secondary-header); padding: 14px; ` } `; diff --git a/src/components/ui/IconButton.tsx b/src/components/ui/IconButton.tsx new file mode 100644 index 00000000..497f287c --- /dev/null +++ b/src/components/ui/IconButton.tsx @@ -0,0 +1,43 @@ +import styled, { css } from "styled-components"; + +interface Props { + type?: 'default' | 'circle' +} + +const normal = `var(--secondary-foreground)`; +const hover = `var(--foreground)`; + +export default styled.div` + z-index: 1; + display: grid; + cursor: pointer; + place-items: center; + + fill: ${normal}; + color: ${normal}; + stroke: ${normal}; + + a { + color: ${normal}; + } + + &:hover { + fill: ${hover}; + color: ${hover}; + stroke: ${hover}; + + a { + color: ${hover}; + } + } + + ${ props => props.type === 'circle' && css` + padding: 4px; + border-radius: 50%; + background-color: var(--secondary-header); + + &:hover { + background-color: var(--primary-header); + } + ` } +`; diff --git a/src/components/ui/Modal.tsx b/src/components/ui/Modal.tsx index 65a93960..7d80cb81 100644 --- a/src/components/ui/Modal.tsx +++ b/src/components/ui/Modal.tsx @@ -2,7 +2,7 @@ import Button from "./Button"; import classNames from "classnames"; import { Children } from "../../types/Preact"; import { createPortal, useEffect } from "preact/compat"; -import styled, { keyframes } from "styled-components"; +import styled, { css, keyframes } from "styled-components"; const open = keyframes` 0% {opacity: 0;} @@ -48,6 +48,26 @@ const ModalContainer = styled.div` `; const ModalContent = styled.div<{ [key in 'attachment' | 'noBackground' | 'border']?: boolean }>` + border-radius: 8px; + text-overflow: ellipsis; + + h3 { + margin-top: 0; + } + + ${ props => !props.noBackground && css` + padding: 1.5em; + background: var(--secondary-header); + ` } + + ${ props => props.attachment && css` + border-radius: 8px 8px 0 0; + ` } + + ${ props => props.border && css` + border-radius: 10px; + border: 2px solid var(--secondary-background); + ` } `; const ModalActions = styled.div` @@ -64,7 +84,8 @@ export interface Action { text: Children; onClick: () => void; confirmation?: boolean; - style?: 'default' | 'contrast' | 'error' | 'contrast-error'; + contrast?: boolean; + error?: boolean; } interface Props { @@ -123,7 +144,9 @@ export default function Modal(props: Props) { {props.actions && ( {props.actions.map(x => ( -