Merge branch 'master' into 'production'

Prod deploy: Contacts page and minor fixes

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!71
This commit is contained in:
Aarni Halinen
2021-06-16 20:05:45 +00:00
63 changed files with 1863 additions and 1933 deletions
+1 -4
View File
@@ -1,9 +1,6 @@
{ {
"processors": [
"stylelint-processor-styled-components"
],
"extends": [ "extends": [
"stylelint-config-recommended", "stylelint-config-standard",
"stylelint-config-styled-components" "stylelint-config-styled-components"
], ],
"syntax": "css" "syntax": "css"
+755 -1102
View File
File diff suppressed because it is too large Load Diff
+14 -15
View File
@@ -34,40 +34,39 @@
}, },
"devDependencies": { "devDependencies": {
"@types/js-cookie": "^2.2.6", "@types/js-cookie": "^2.2.6",
"@types/react": "^17.0.5", "@types/react": "^17.0.11",
"@types/react-beautiful-dnd": "^13.0.0", "@types/react-beautiful-dnd": "^13.0.0",
"@types/react-csv": "^1.1.1", "@types/react-csv": "^1.1.1",
"@types/react-dom": "^17.0.5", "@types/react-dom": "^17.0.7",
"@types/react-jsonschema-form": "^1.7.5", "@types/react-jsonschema-form": "^1.7.5",
"@types/shortid": "^0.0.29", "@types/shortid": "^0.0.29",
"@types/styled-components": "^5.1.9", "@types/styled-components": "^5.1.10",
"@typescript-eslint/eslint-plugin": "^4.23.0", "@typescript-eslint/eslint-plugin": "^4.27.0",
"@typescript-eslint/parser": "^4.23.0", "@typescript-eslint/parser": "^4.27.0",
"babel-plugin-styled-components": "^1.12.0", "babel-plugin-styled-components": "^1.12.0",
"eslint": "^7.26.0", "eslint": "^7.28.0",
"eslint-config-airbnb-typescript": "^12.3.1", "eslint-config-airbnb-typescript": "^12.3.1",
"eslint-plugin-import": "^2.23.1", "eslint-plugin-import": "^2.23.4",
"eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-react": "^7.23.2", "eslint-plugin-react": "^7.24.0",
"eslint-plugin-react-hooks": "^4.2.0", "eslint-plugin-react-hooks": "^4.2.0",
"husky": "^6.0.0", "husky": "^6.0.0",
"next-sitemap": "^1.6.57", "next-sitemap": "^1.6.116",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"stylelint": "^13.13.1", "stylelint": "^13.13.1",
"stylelint-config-recommended": "^5.0.0", "stylelint-config-standard": "^22.0.0",
"stylelint-config-styled-components": "^0.1.1", "stylelint-config-styled-components": "^0.1.1",
"stylelint-processor-styled-components": "^1.10.0",
"testcafe": "^1.14.2", "testcafe": "^1.14.2",
"typescript": "^4.2.4" "typescript": "^4.3.2"
}, },
"dependencies": { "dependencies": {
"@next/bundle-analyzer": "^10.2.0", "@next/bundle-analyzer": "^10.2.3",
"axios": "^0.21.1", "axios": "^0.21.1",
"date-fns": "^2.21.3", "date-fns": "^2.22.1",
"fast-deep-equal": "^3.1.3", "fast-deep-equal": "^3.1.3",
"js-cookie": "^2.2.1", "js-cookie": "^2.2.1",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"next": "^10.2.0", "next": "^10.2.3",
"normalize.css": "^8.0.1", "normalize.css": "^8.0.1",
"react": "^17.0.2", "react": "^17.0.2",
"react-beautiful-dnd": "^13.1.0", "react-beautiful-dnd": "^13.1.0",
+1 -2
View File
@@ -1,6 +1,6 @@
import React, { useState } from "react"; import React, { useState } from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import AccordionIcon from "./AccordionIcon"; import AccordionIcon from "./AccordionIcon";
const Container = styled.div` const Container = styled.div`
@@ -30,7 +30,6 @@ const Container = styled.div`
font-size: 1.125rem; font-size: 1.125rem;
margin: auto; margin: auto;
} }
} }
& > div { & > div {
+1 -1
View File
@@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "../../theme/colors"; import colors from "../../theme/colors";
interface AccordionIconProps { interface AccordionIconProps {
open: boolean; open: boolean;
+1 -1
View File
@@ -1,6 +1,6 @@
import React, { ComponentProps } from "react"; import React, { ComponentProps } from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import { Link } from "@components/index"; import { Link } from "@components/index";
import AddIcon from "@components/AddIcon"; import AddIcon from "@components/AddIcon";
+1 -1
View File
@@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import HeaderLogo from "./HeaderLogo"; import HeaderLogo from "./HeaderLogo";
const Header = styled.header` const Header = styled.header`
+1 -1
View File
@@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
interface ButtonProps { interface ButtonProps {
onClick: () => void; onClick: () => void;
+2 -4
View File
@@ -1,7 +1,7 @@
import React from "react"; import React from "react";
import Image from "next/image"; import Image from "next/image";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import { Link } from "@components/index"; import { Link } from "@components/index";
import breakpoints from "@theme/breakpoints"; import breakpoints from "@theme/breakpoints";
@@ -42,7 +42,6 @@ const StyledCard = styled.article`
} }
} }
h3 { h3 {
padding: 0.5rem; padding: 0.5rem;
font-size: 1.5rem; font-size: 1.5rem;
@@ -54,7 +53,6 @@ const StyledCard = styled.article`
button { button {
cursor: pointer; cursor: pointer;
padding: 0.8rem 2rem; padding: 0.8rem 2rem;
margin: 0.5rem; margin: 0.5rem;
font-size: 0.8rem; font-size: 0.8rem;
@@ -74,7 +72,7 @@ const WrappedCard: React.FC<WrappedCardProps> = ({
}) => ( }) => (
<StyledCard {...props}> <StyledCard {...props}>
{image && ( {image && (
<Image src={image.src} alt={image.alt} layout="responsive" width={0} height={0} objectFit="scale-down" /> <Image src={image.src} alt={image.alt} layout="responsive" width={0} height={0} objectFit="scale-down" />
)} )}
<p>{startTime}</p> <p>{startTime}</p>
<h3>{title}</h3> <h3>{title}</h3>
+1 -1
View File
@@ -1,7 +1,7 @@
import React from "react"; import React from "react";
import Image from "next/image"; import Image from "next/image";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
const Card = styled.article` const Card = styled.article`
display: flex; display: flex;
+7 -6
View File
@@ -45,21 +45,22 @@ const CrossFadeImages: React.FC<CrossFadeImagesProps> = ({
const animation = keyframes` const animation = keyframes`
0% { 0% {
opacity:1; opacity: 1;
} }
${(presentationTime / TOTAL_TIME) * 100}% { ${(presentationTime / TOTAL_TIME) * 100}% {
opacity:1; opacity: 1;
} }
${(1 / len) * 100}% { ${(1 / len) * 100}% {
opacity:0; opacity: 0;
} }
${100 - ((fadeTime / TOTAL_TIME) * 100)}% { ${100 - ((fadeTime / TOTAL_TIME) * 100)}% {
opacity:0; opacity: 0;
} }
100% { 100% {
opacity:1; opacity: 1;
} }
`; `;
const delays = images.map((_, idx) => idx * SINGLE_IMAGE_TIME).reverse(); const delays = images.map((_, idx) => idx * SINGLE_IMAGE_TIME).reverse();
+1 -1
View File
@@ -1,5 +1,5 @@
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
const Divider = styled.hr` const Divider = styled.hr`
width: 98%; width: 98%;
+1 -1
View File
@@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
interface DropDownBoxProps { interface DropDownBoxProps {
onMouseEnter: () => void; onMouseEnter: () => void;
+3
View File
@@ -7,6 +7,7 @@ import breakpoints from "@theme/breakpoints";
const Columns = styled.div` const Columns = styled.div`
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
& > div > div { & > div > div {
margin-bottom: 1rem; margin-bottom: 1rem;
} }
@@ -56,9 +57,11 @@ const MarginSpace = styled.div`
const Map = styled.div` const Map = styled.div`
flex: 1; flex: 1;
@media screen and (max-width: ${breakpoints.mobile}) { @media screen and (max-width: ${breakpoints.mobile}) {
display: none; display: none;
} }
iframe { iframe {
border: none; border: none;
} }
+1 -2
View File
@@ -11,6 +11,7 @@ import BlockScroll from "./BlockScroll";
const StyledHeader = styled.header` const StyledHeader = styled.header`
display: flex; display: flex;
flex-flow: row nowrap; flex-flow: row nowrap;
@media screen and (max-width: ${breakpoints.mobile}) { @media screen and (max-width: ${breakpoints.mobile}) {
flex-flow: column nowrap; flex-flow: column nowrap;
} }
@@ -20,11 +21,9 @@ const Sticky = styled.div<{ $isHidden?: boolean; $mobileMenuOpen?: boolean }>`
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 10; z-index: 10;
padding: 0 1rem; padding: 0 1rem;
background-color: ${colors.darkBlue}; background-color: ${colors.darkBlue};
transition: all 200ms ease-out; transition: all 200ms ease-out;
height: ${(p) => (p.$mobileMenuOpen ? "100vh" : "unset")}; height: ${(p) => (p.$mobileMenuOpen ? "100vh" : "unset")};
${(p) => (p.$isHidden ? (` ${(p) => (p.$isHidden ? (`
+2 -1
View File
@@ -9,11 +9,11 @@ const Container = styled.div`
justify-content: space-between; justify-content: space-between;
position: relative; position: relative;
padding: 0; padding: 0;
min-height: 75vh; min-height: 75vh;
section { section {
padding: 2rem 6rem; padding: 2rem 6rem;
@media screen and (max-width: ${breakpoints.mobile}) { @media screen and (max-width: ${breakpoints.mobile}) {
padding: 1rem; padding: 1rem;
} }
@@ -40,6 +40,7 @@ const Container = styled.div`
color: ${colors.white}; color: ${colors.white};
background-color: ${colors.darkBlue}; background-color: ${colors.darkBlue};
a:hover { a:hover {
color: ${colors.white}; color: ${colors.white};
} }
+2 -2
View File
@@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import { Link } from "@components/index"; import { Link } from "@components/index";
interface HeroAsideItemProps { interface HeroAsideItemProps {
@@ -39,6 +39,7 @@ interface HeroAsideProps {
// TODO: Color combos // TODO: Color combos
const Aside = styled.aside<{ colors: string }>` const Aside = styled.aside<{ colors: string }>`
${(p) => p.colors} ${(p) => p.colors}
flex: 4; flex: 4;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -58,7 +59,6 @@ const Aside = styled.aside<{ colors: string }>`
line-height: 2rem; line-height: 2rem;
} }
& > p { & > p {
font-weight: 600; font-weight: 600;
margin-bottom: 2rem; margin-bottom: 2rem;
+2 -2
View File
@@ -1,5 +1,5 @@
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
const Buttons = styled.div<{ row?: boolean }>` const Buttons = styled.div<{ row?: boolean }>`
min-width: 20%; min-width: 20%;
@@ -20,7 +20,7 @@ const Buttons = styled.div<{ row?: boolean }>`
margin: 0.5rem; margin: 0.5rem;
font-size: 0.8rem; font-size: 0.8rem;
font-weight: 800; font-weight: 800;
letter-spacing: .1em; letter-spacing: 0.1em;
text-transform: uppercase; text-transform: uppercase;
border: 1px solid ${colors.lightTurquoise}; border: 1px solid ${colors.lightTurquoise};
+1 -1
View File
@@ -29,7 +29,7 @@ const Section = styled.section`
&:hover { &:hover {
color: ${colors.white}; color: ${colors.white};
text-decoration: none text-decoration: none;
} }
} }
`; `;
+1 -1
View File
@@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
const Note = styled.span` const Note = styled.span`
color: white; color: white;
+4 -4
View File
@@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
const Loader = styled((props) => ( const Loader = styled((props) => (
<div {...props}> <div {...props}>
@@ -15,9 +15,9 @@ const Loader = styled((props) => (
height: 1em; height: 1em;
@keyframes rotation { @keyframes rotation {
0% { transform: rotate(0deg) } 0% { transform: rotate(0deg); }
50% { transform: rotate(180deg) } 50% { transform: rotate(180deg); }
100% { transform: rotate(360deg) } 100% { transform: rotate(360deg); }
} }
& > div { & > div {
-2
View File
@@ -30,7 +30,6 @@ const Nav = styled.div`
flex-flow: row nowrap; flex-flow: row nowrap;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
font-size: 0.8rem; font-size: 0.8rem;
color: ${colors.lightBlue}; color: ${colors.lightBlue};
margin-left: 5rem; margin-left: 5rem;
@@ -53,7 +52,6 @@ const Nav = styled.div`
svg { svg {
width: 1.5rem; width: 1.5rem;
height: 1.5rem; height: 1.5rem;
fill: ${colors.white}; fill: ${colors.white};
color: ${colors.white}; color: ${colors.white};
} }
+1 -1
View File
@@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import { renderNavigationItems } from "./Navigation"; import { renderNavigationItems } from "./Navigation";
const Nav = styled.nav` const Nav = styled.nav`
+2 -2
View File
@@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import { Link } from "@components/index"; import { Link } from "@components/index";
interface PageLinkProps { interface PageLinkProps {
@@ -32,8 +32,8 @@ const StyledPageLink = styled.div`
margin-left: 1rem; margin-left: 1rem;
text-decoration: none; text-decoration: none;
font-weight: normal; font-weight: normal;
color: ${colors.blue1}; color: ${colors.blue1};
&:hover { &:hover {
color: ${colors.darkBlue}; color: ${colors.darkBlue};
} }
+65 -53
View File
@@ -1,17 +1,75 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import { Link } from "@components/index"; import { Link } from "@components/index";
const Section = styled.section<{ colors: string }>` type Colors = "orange1" | "lightBlue" | "darkBlue" | "blue1" | "lightTurquoise" | "sik100Blue";
${(p) => p.colors}
const textColors = (bgColor: Colors) => {
switch (bgColor) {
case "orange1": return (
`
color: ${colors.white};
background-color: ${colors[bgColor]};
a:hover {
color: ${colors.darkBlue};
}
`
);
case "sik100Blue": return (
`
background-color: ${colors[bgColor]};
color: ${colors.sik100Gold};
`
);
case "darkBlue": return (
`
background-color: ${colors[bgColor]};
color: ${colors.white};
`
);
case "lightBlue": return (
`
background-color: ${colors[bgColor]};
color: ${colors.darkBlue};
a:hover {
color: ${colors.white};
}
`
);
case "lightTurquoise": return (
`
background-color: ${colors[bgColor]};
color: ${colors.darkBlue};
a:hover {
color: ${colors.white};
}
`
);
case "blue1": return (
`
background-color: ${colors[bgColor]};
color: ${colors.white};
a:hover {
color: ${colors.darkBlue};
}
`
);
default: return "";
}
};
const Section = styled.section<{ bgColor: Colors }>`
${({ bgColor }) => textColors(bgColor)}
display: flex; display: flex;
justify-content: center; justify-content: center;
text-align: center; text-align: center;
align-items: baseline; align-items: baseline;
padding: 2rem 0; padding: 2rem 0;
border: 0.5rem colors.sik100Gold; border: 0.5rem ${colors.sik100Gold};
flex-flow: row wrap; flex-flow: row wrap;
a { a {
@@ -29,71 +87,25 @@ const Section = styled.section<{ colors: string }>`
& > h1 { & > h1 {
a { a {
text-decoration: underline;
text-decoration: underline;
} }
a:hover { a:hover {
text-decoration: none; text-decoration: none;
} }
} }
`; `;
type Colors = "orange1" | "lightBlue" | "darkBlue" | "blue1" | "lightTurquoise" | "sik100Blue";
interface CTASectionProps extends React.HTMLAttributes<HTMLDivElement> { interface CTASectionProps extends React.HTMLAttributes<HTMLDivElement> {
bgColor?: Colors; bgColor?: Colors;
link?: string; link?: string;
linkText?: string; linkText?: string;
} }
const textColors = (bgColor: Colors) => {
switch (bgColor) {
case "orange1": return `
color: ${colors.white};
background-color: ${colors[bgColor]};
a:hover {
color: ${colors.darkBlue};
}
`;
case "sik100Blue": return `
background-color: ${colors[bgColor]};
color: ${colors.sik100Gold};
`;
case "darkBlue": return `
background-color: ${colors[bgColor]};
color: ${colors.white};
`;
case "lightBlue": return `
background-color: ${colors[bgColor]};
color: ${colors.darkBlue};
a:hover {
color: ${colors.white};
}
`;
case "lightTurquoise": return `
background-color: ${colors[bgColor]};
color: ${colors.darkBlue};
a:hover {
color: ${colors.white};
}
`;
case "blue1": return `
background-color: ${colors[bgColor]};
color: ${colors.white};
a:hover {
color: ${colors.darkBlue};
}
`;
default: return "";
}
};
const CTASection: React.FC<CTASectionProps> = ({ const CTASection: React.FC<CTASectionProps> = ({
bgColor = "orange1", link, linkText, children, ...props bgColor = "orange1", link, linkText, children, ...props
}) => ( }) => (
<Section colors={textColors(bgColor)} {...props}> <Section bgColor={bgColor} {...props}>
<h1>{children}</h1> <h1>{children}</h1>
{link && ( {link && (
<Link to={link}> <Link to={link}>
-1
View File
@@ -3,7 +3,6 @@ import colors from "@theme/colors";
import breakpoints from "@theme/breakpoints"; import breakpoints from "@theme/breakpoints";
const CardSection = styled.section` const CardSection = styled.section`
h6 { h6 {
color: ${colors.orange1}; color: ${colors.orange1};
} }
@@ -4,7 +4,6 @@ import styled from "styled-components";
const StyledSection = styled.section` const StyledSection = styled.section`
display: block; display: block;
padding: 1.5rem; padding: 1.5rem;
grid-template-columns: 1fr auto; grid-template-columns: 1fr auto;
grid-template-rows: auto 1fr; grid-template-rows: auto 1fr;
grid-template-areas: grid-template-areas:
+5 -3
View File
@@ -6,10 +6,8 @@ import breakpoints from "@theme/breakpoints";
const StyledSection = styled.section` const StyledSection = styled.section`
display: grid; display: grid;
padding: 1.5rem; padding: 1.5rem;
word-break: break-word; word-break: break-word;
hyphens: auto; hyphens: auto;
grid-template-columns: 1fr 2fr 1fr; grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: 1fr auto; grid-template-rows: 1fr auto;
grid-template-areas: grid-template-areas:
@@ -45,7 +43,8 @@ const StyledSection = styled.section`
margin-top: 0; margin-top: 0;
} }
& > div, p { & > div,
p {
grid-area: content; grid-area: content;
} }
@@ -69,13 +68,16 @@ const StyledSection = styled.section`
& > aside:first-of-type { & > aside:first-of-type {
grid-area: rightaside; grid-area: rightaside;
padding-left: 1.5rem; padding-left: 1.5rem;
@media screen and (max-width: ${breakpoints.mobile}) { @media screen and (max-width: ${breakpoints.mobile}) {
padding-left: 0; padding-left: 0;
} }
} }
& > aside:nth-of-type(2) { & > aside:nth-of-type(2) {
grid-area: leftaside; grid-area: leftaside;
padding-right: 1.5rem; padding-right: 1.5rem;
@media screen and (max-width: ${breakpoints.mobile}) { @media screen and (max-width: ${breakpoints.mobile}) {
padding-left: 0; padding-left: 0;
} }
+2 -2
View File
@@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
const Container = styled.label` const Container = styled.label`
display: block; display: block;
@@ -34,7 +34,7 @@ const CustomCBoxElement = styled.span<{ checked?: boolean }>`
width: 1em; width: 1em;
background-color: ${(props) => (props.checked ? colors.blue1 : colors.grey2)}; background-color: ${(props) => (props.checked ? colors.blue1 : colors.grey2)};
&:focus &:before { &:focus &::before {
transition: box-shadow 150ms ease; transition: box-shadow 150ms ease;
content: ''; content: '';
display: block; display: block;
@@ -28,7 +28,9 @@ const CustomRadioElement = styled.span<{ checked?: boolean }>`
left: 0; left: 0;
height: 1em; height: 1em;
width: 1em; width: 1em;
background-color: ${(props) => (props.checked ? "#57b2df" : "#efece4")}; /* blue1 or grey2 */
/* blue1 or grey2 */
background-color: ${(props) => (props.checked ? "#57b2df" : "#efece4")};
border-radius: 50%; border-radius: 50%;
`; `;
@@ -1,6 +1,6 @@
import React, { ButtonHTMLAttributes } from "react"; import React, { ButtonHTMLAttributes } from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
const RemoveButton = styled.button` const RemoveButton = styled.button`
background-color: ${colors.orange1} !important; background-color: ${colors.orange1} !important;
@@ -1,7 +1,7 @@
import React, { ReactNode } from "react"; import React, { ReactNode } from "react";
import styled from "styled-components"; import styled from "styled-components";
import { Draggable } from "react-beautiful-dnd"; import { Draggable } from "react-beautiful-dnd";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import { Question, InputProps } from "./common"; import { Question, InputProps } from "./common";
import OptionsWidget from "./OptionsWidget"; import OptionsWidget from "./OptionsWidget";
import TypeWidget from "./TypeWidget"; import TypeWidget from "./TypeWidget";
@@ -12,7 +12,6 @@ const Widget = styled.div`
display: flex; display: flex;
flex-flow: row nowrap; flex-flow: row nowrap;
align-items: center; align-items: center;
background: none; background: none;
padding: 0; padding: 0;
margin: 1rem 0; margin: 1rem 0;
@@ -21,7 +20,6 @@ const Widget = styled.div`
margin-right: 8px !important; margin-right: 8px !important;
margin-top: -2px !important; margin-top: -2px !important;
} }
} }
`; `;
+1
View File
@@ -9,6 +9,7 @@ const NotFound = styled.main`
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
p { p {
text-align: center; text-align: center;
font-size: 4rem; font-size: 4rem;
+2 -2
View File
@@ -3,7 +3,7 @@ import Head from "next/head";
import { AppProps } from "next/app"; import { AppProps } from "next/app";
import styled, { createGlobalStyle } from "styled-components"; import styled, { createGlobalStyle } from "styled-components";
import { ToastContainer } from "react-toastify"; import { ToastContainer } from "react-toastify";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import breakpoints from "@theme/breakpoints"; import breakpoints from "@theme/breakpoints";
import LocaleStore from "../i18n"; import LocaleStore from "../i18n";
@@ -21,6 +21,7 @@ const GlobalCommonStyles = createGlobalStyle`
html { html {
font-family: ${fontFamily}; font-family: ${fontFamily};
/* 12px */ /* 12px */
font-size: ${fontSize * 0.75}pt; font-size: ${fontSize * 0.75}pt;
line-height: ${lineHeight}; line-height: ${lineHeight};
@@ -106,7 +107,6 @@ li {
font-weight: 600; font-weight: 600;
} }
a { a {
text-decoration: underline; text-decoration: underline;
color: ${colors.blue1}; color: ${colors.blue1};
+1 -45
View File
@@ -1,41 +1,4 @@
export type Colors = const colors = {
"sik100-gold"|
"sik100-blue"|
"dark-blue" |
"light-blue" |
"white1" |
"black1" |
"grey1" |
"grey2" |
"orange1" |
"orange2" |
"blue1" |
"light-turquoise" |
"green1" |
"sand" |
"transparent" |
"inherit";
export const ColorMapper = new Map<Colors, string>([
["sik100-gold", "#fee469"],
["sik100-blue", "#12123d"],
["dark-blue", "#002d3a"],
["light-blue", "#bfdbd9"],
["white1", "#fff"],
["black1", "#000"],
["grey1", "#d4d0c7"],
["grey2", "#efece4"],
["orange1", "#d57a2d"],
["orange2", "#dd934e"],
["blue1", "#57b2df"],
["light-turquoise", "#beddeb"],
["green1", "#c0dcd9"],
["sand", "#fdf9d7"],
["transparent", "transparent"],
["inherit", "inherit"],
]);
export const colors = {
sik100Gold: "#fee469", sik100Gold: "#fee469",
sik100Blue: "#12123d", sik100Blue: "#12123d",
darkBlue: "#002d3a", darkBlue: "#002d3a",
@@ -54,11 +17,4 @@ export const colors = {
inherit: "inherit", inherit: "inherit",
}; };
export type Colors2 = keyof typeof colors;
export const colorToClass = (color: Colors): string => (color ? `color-div__${color}` : undefined);
export const bgColorToClass = (color: Colors): string => (color ? `color-div__background_${color}` : undefined);
export const hoverColorToClass = (color: Colors): string => (color ? `color-div__${color}Hoverable` : undefined);
export const bgHoverColorToClass = (color: Colors): string => (color ? `color-div__background_${color}Hoverable` : undefined);
export default colors; export default colors;
+1
View File
@@ -22,6 +22,7 @@ const Gallery = styled.div`
@media screen and (max-width: ${breakpoints.mobile}) { @media screen and (max-width: ${breakpoints.mobile}) {
flex-flow: column; flex-flow: column;
& > div { & > div {
min-height: 100vw; min-height: 100vw;
} }
+64 -68
View File
@@ -1,7 +1,7 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { Divider, TextSection, Link } from "@components/index"; import { Divider, TextSection, Link } from "@components/index";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import ContactCard from "@components/ContactCard"; import ContactCard from "@components/ContactCard";
import BoardJson from "./board.json"; import BoardJson from "./board.json";
@@ -9,11 +9,26 @@ import HvtmkJson from "./hvtmk.json";
import MtmkJson from "./mtmk.json"; import MtmkJson from "./mtmk.json";
import OptmkJson from "./optmk.json"; import OptmkJson from "./optmk.json";
import OtmkJson from "./otmk.json"; import OtmkJson from "./otmk.json";
import PtmkJson from "./ptmk.json"; import EPtmkJson from "./eptmk.json";
import SstmkJson from "./sstmk.json"; import SstmkJson from "./sstmk.json";
import TtmkJson from "./ttmk.json"; import TtmkJson from "./ttmk.json";
import UtmkJson from "./utmk.json"; import UtmkJson from "./utmk.json";
import YtmkJson from "./ytmk.json"; import YtmkJson from "./ytmk.json";
import Others from "./others.json";
const orderedCommittees = [
BoardJson,
HvtmkJson,
MtmkJson,
OptmkJson,
OtmkJson,
EPtmkJson,
SstmkJson,
TtmkJson,
UtmkJson,
YtmkJson,
Others,
];
const blank_profile = "/img/blank_profile.png"; const blank_profile = "/img/blank_profile.png";
@@ -25,6 +40,28 @@ const BlueLink = styled(Link)`
} }
`; `;
const IndexUL = styled.ul`
padding: 0;
list-style: none;
li::before {
content: attr(data-icon);
margin-right: 4px;
}
`;
const Index: React.FC<{ committees: typeof orderedCommittees }> = ({ committees }) => (
<IndexUL>
{committees.map(({ slug, name_fi }) => (
<BlueLink to={`#${slug}`} key={slug}>
<li data-icon="»">
{name_fi}
</li>
</BlueLink>
))}
</IndexUL>
);
const Container = styled.div` const Container = styled.div`
color: ${colors.darkBlue}; color: ${colors.darkBlue};
@@ -92,74 +129,33 @@ const ContactsPageView: React.FC = () => (
Asiaa olisi, mutta kehen ottaa yhteyttä?<br /> Asiaa olisi, mutta kehen ottaa yhteyttä?<br />
Tämä sivu yrittää valottaa sen oikean ihmisen puhelinnumeroa ja sähköpostiosoitetta. Tämä sivu yrittää valottaa sen oikean ihmisen puhelinnumeroa ja sähköpostiosoitetta.
</p> </p>
<aside>
<div>
<h6>Toimikuntaluettelo</h6>
<Index committees={orderedCommittees} />
</div>
</aside>
</TextSection> </TextSection>
<TextSection> {orderedCommittees.map((json) => (
<CommitteeContainer committee={BoardJson}> <React.Fragment key={json.slug}>
<p> {(json.slug !== "board") && (
{"Hallitukseen saa yhteyden lähettämällä sähköpostia "} <Divider />
<BlueLink to="mailto:hallitus@sahkoinsinoorikilta.fi"> )}
hallitus@sahkoinsinoorikilta.fi <TextSection id={json.slug}>
</BlueLink> <CommitteeContainer committee={json}>
</p> {(json.slug === "board") && (
</CommitteeContainer> <p>
</TextSection> {"Hallitukseen saa yhteyden lähettämällä sähköpostia "}
<BlueLink to="mailto:hallitus@sahkoinsinoorikilta.fi">
<Divider /> hallitus@sahkoinsinoorikilta.fi
</BlueLink>
<TextSection> </p>
<CommitteeContainer committee={HvtmkJson} /> )}
</TextSection> </CommitteeContainer>
</TextSection>
<Divider /> </React.Fragment>
))}
<TextSection>
<CommitteeContainer committee={MtmkJson} />
</TextSection>
<Divider />
<TextSection>
<CommitteeContainer committee={OptmkJson} />
</TextSection>
<Divider />
<TextSection>
<CommitteeContainer committee={OtmkJson} />
</TextSection>
<Divider />
<TextSection id="eptmk">
<CommitteeContainer committee={PtmkJson} />
</TextSection>
<Divider />
<TextSection>
<CommitteeContainer committee={SstmkJson} />
</TextSection>
<Divider />
<TextSection id="ttmk">
<CommitteeContainer committee={TtmkJson} />
</TextSection>
<Divider />
<TextSection>
<CommitteeContainer committee={UtmkJson} />
</TextSection>
<Divider />
<TextSection>
<CommitteeContainer committee={YtmkJson} />
</TextSection>
<Divider />
</> </>
); );
+160 -159
View File
@@ -1,160 +1,161 @@
{ {
"name_fi": "Hallitus", "slug": "board",
"name_en": "Board", "name_fi": "Hallitus",
"roles": [ "name_en": "Board",
{ "roles": [
"name_fi": "Puheenjohtaja", {
"name_en": "Chairman of the Board", "name_fi": "Puheenjohtaja",
"representatives": [ "name_en": "Chairman of the Board",
{ "representatives": [
"name": "Johannes Ora", {
"image": "https://static.sahkoinsinoorikilta.fi/img/board/chairman.jpg" "name": "Johannes Ora",
} "image": "https://static.sahkoinsinoorikilta.fi/img/board/chairman.jpg"
] }
}, ]
{ },
"name_fi": "Sihteeri", {
"name_en": "Secretary", "name_fi": "Sihteeri",
"representatives": [ "name_en": "Secretary",
{ "representatives": [
"name": "Salla Lyytikäinen", {
"phone_number": null, "name": "Salla Lyytikäinen",
"email": null, "phone_number": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/secretary.jpg" "email": null,
} "image": "https://static.sahkoinsinoorikilta.fi/img/board/secretary.jpg"
] }
}, ]
{ },
"name_fi": "Rahastonhoitaja", {
"name_en": "Treasurer", "name_fi": "Rahastonhoitaja",
"representatives": [ "name_en": "Treasurer",
{ "representatives": [
"name": "Santeri Huhtala", {
"phone_number": null, "name": "Santeri Huhtala",
"email": null, "phone_number": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/treasurer.jpg" "email": null,
} "image": "https://static.sahkoinsinoorikilta.fi/img/board/treasurer.jpg"
] }
}, ]
{ },
"name_fi": "Fuksitoimikunnan Puheenjohtaja", {
"name_en": "", "name_fi": "Fuksitoimikunnan Puheenjohtaja",
"representatives": [ "name_en": "",
{ "representatives": [
"name": "Toni Ojala", {
"phone_number": null, "name": "Toni Ojala",
"email": null, "phone_number": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/captain1.jpg" "email": null,
} "image": "https://static.sahkoinsinoorikilta.fi/img/board/captain1.jpg"
] }
}, ]
{ },
"name_fi": "Fuksitoimikunnan puheenjohtajan adjutantti", {
"name_en": "", "name_fi": "Fuksitoimikunnan puheenjohtajan adjutantti",
"representatives": [ "name_en": "",
{ "representatives": [
"name": "Toni Lyttinen", {
"phone_number": null, "name": "Toni Lyttinen",
"email": null, "phone_number": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/captain2.jpg" "email": null,
} "image": "https://static.sahkoinsinoorikilta.fi/img/board/captain2.jpg"
] }
}, ]
{ },
"name_fi": "Hovimestari", {
"name_en": "", "name_fi": "Hovimestari",
"representatives": [ "name_en": "",
{ "representatives": [
"name": "Eveliina Ahonen", {
"phone_number": null, "name": "Eveliina Ahonen",
"email": null, "phone_number": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/ceremonies.jpg" "email": null,
} "image": "https://static.sahkoinsinoorikilta.fi/img/board/ceremonies.jpg"
] }
}, ]
{ },
"name_fi": "Hovineuvos", {
"name_en": "", "name_fi": "Hovineuvos",
"representatives": [ "name_en": "",
{ "representatives": [
"name": "Melisa Dönmez", {
"phone_number": null, "name": "Melisa Dönmez",
"email": null, "phone_number": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/court_cancelor.jpg" "email": null,
} "image": "https://static.sahkoinsinoorikilta.fi/img/board/court_cancelor.jpg"
] }
}, ]
{ },
"name_fi": "ISOvastaava", {
"name_en": "", "name_fi": "ISOvastaava",
"representatives": [ "name_en": "",
{ "representatives": [
"name": "Heidi Mäkitalo", {
"phone_number": null, "name": "Heidi Mäkitalo",
"email": null, "phone_number": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/isocoordinator.jpg" "email": null,
} "image": "https://static.sahkoinsinoorikilta.fi/img/board/isocoordinator.jpg"
] }
}, ]
{ },
"name_fi": "Hyvinvointimestari", {
"name_en": "", "name_fi": "Hyvinvointimestari",
"representatives": [ "name_en": "",
{ "representatives": [
"name": "Sauli Norja", {
"phone_number": null, "name": "Sauli Norja",
"email": null, "phone_number": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/wellbeing.jpg" "email": null,
} "image": "https://static.sahkoinsinoorikilta.fi/img/board/wellbeing.jpg"
] }
}, ]
{ },
"name_fi": "Opintomestari", {
"name_en": "", "name_fi": "Opintomestari",
"representatives": [ "name_en": "",
{ "representatives": [
"name": "Simo Hakanummi", {
"phone_number": null, "name": "Simo Hakanummi",
"email": null, "phone_number": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/studies.jpg" "email": null,
} "image": "https://static.sahkoinsinoorikilta.fi/img/board/studies.jpg"
] }
}, ]
{ },
"name_fi": "Teknologiamestari", {
"name_en": "", "name_fi": "Teknologiamestari",
"representatives": [ "name_en": "",
{ "representatives": [
"name": "Oskari Ponkala", {
"phone_number": null, "name": "Oskari Ponkala",
"email": null, "phone_number": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/technology.jpg" "email": null,
} "image": "https://static.sahkoinsinoorikilta.fi/img/board/technology.jpg"
] }
}, ]
{ },
"name_fi": "Ulkomestari", {
"name_en": "", "name_fi": "Ulkomestari",
"representatives": [ "name_en": "",
{ "representatives": [
"name": "Oliver Hiekkamies", {
"phone_number": null, "name": "Oliver Hiekkamies",
"email": null, "phone_number": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/external.jpg" "email": null,
} "image": "https://static.sahkoinsinoorikilta.fi/img/board/external.jpg"
] }
}, ]
{ },
"name_fi": "Yrityssuhdemestari", {
"name_en": "", "name_fi": "Yrityssuhdemestari",
"representatives": [ "name_en": "",
{ "representatives": [
"name": "Otto Julkunen", {
"phone_number": null, "name": "Otto Julkunen",
"email": null, "phone_number": null,
"image": "https://static.sahkoinsinoorikilta.fi/img/board/corporate.jpg" "email": null,
} "image": "https://static.sahkoinsinoorikilta.fi/img/board/corporate.jpg"
] }
} ]
] }
} ]
}
+52
View File
@@ -0,0 +1,52 @@
{
"slug": "eptmk",
"name_fi": "Elepajatoimikunta",
"name_en": "",
"roles": [
{
"name_fi": "Pajavastaava",
"name_en": "",
"representatives": [
{
"name": "Karl Lipping"
}
]
},
{
"name_fi": "Pajakisälli",
"name_en": "",
"representatives": [
{
"name": "Tommi Sytelä"
},
{
"name": "Eerikki Eskola"
},
{
"name": "Arkadii Kolchin"
},
{
"name": "Samu Nyman"
},
{
"name": "Konsta Langi"
},
{
"name": "Johannes Viirimäki"
},
{
"name": "Justus Ojala"
},
{
"name": "Ville Tujunen"
},
{
"name": "Antti Tarkka"
},
{
"name": "Pyry Vaara"
}
]
}
]
}
+78 -51
View File
@@ -1,55 +1,82 @@
{ {
"name_fi": "Hyvinvointitoimikunta", "slug": "hvtmk",
"name_en": "Committee of Wellbeing", "name_fi": "Hyvinvointitoimikunta",
"roles": [ "name_en": "Committee of Wellbeing",
"roles": [
{
"name_fi": "Hyvinvointimestari",
"name_en": "Master of Wellbeing",
"representatives": [
{ {
"name_fi": "Hyvinvointimestari", "name": "Sauli Norja"
"name_en": "Master of Wellbeing",
"representatives": [
{ "name": "Sauli Norja" }
]
},
{
"name_fi": "Kulttuurivastaava",
"name_en": "Culture Representative",
"representatives": [
{ "name": "Juha Anttila" },
{ "name": "Aino Suomi" },
{ "name": "Nestori Yrjönkoski" }
]
},
{
"name_fi": "Liikuntavastaava",
"name_en": "Sports Representative",
"representatives": [
{ "name": "Elmeri Pälikkö" },
{ "name": "Joel Wickström" }
]
},
{
"name_fi": "Kiltahuonevastaava",
"name_en": "Guild Room Representative",
"representatives": [
{ "name": "Ilari Ojakorpi" }
]
},
{
"name_fi": "Kiltapäiväkerhovastaava",
"name_en": "",
"representatives": [
{ "name": "Samuel Laine" },
{ "name": "Aleksanteri Vesala" }
]
},
{
"name_fi": "Retkivastaava",
"name_en": "",
"representatives": [
{ "name": "Jarno Mustonen" },
{ "name": "Suvi Karanta" },
{ "name": "Jesse Räisänen" },
{ "name": "Mikko Suhonen" }
]
} }
] ]
},
{
"name_fi": "Kulttuurivastaava",
"name_en": "Culture Representative",
"representatives": [
{
"name": "Juha Anttila"
},
{
"name": "Aino Suomi"
},
{
"name": "Nestori Yrjönkoski"
}
]
},
{
"name_fi": "Liikuntavastaava",
"name_en": "Sports Representative",
"representatives": [
{
"name": "Elmeri Pälikkö"
},
{
"name": "Joel Wickström"
}
]
},
{
"name_fi": "Kiltahuonevastaava",
"name_en": "Guild Room Representative",
"representatives": [
{
"name": "Ilari Ojakorpi"
}
]
},
{
"name_fi": "Kiltapäiväkerhovastaava",
"name_en": "",
"representatives": [
{
"name": "Samuel Laine"
},
{
"name": "Aleksanteri Vesala"
}
]
},
{
"name_fi": "Retkivastaava",
"name_en": "",
"representatives": [
{
"name": "Jarno Mustonen"
},
{
"name": "Suvi Karanta"
},
{
"name": "Jesse Räisänen"
},
{
"name": "Mikko Suhonen"
}
]
}
]
} }
+132 -85
View File
@@ -1,89 +1,136 @@
{ {
"name_fi": "Mediatoimikunta", "slug": "mtmk",
"name_en": "Media Committee", "name_fi": "Mediatoimikunta",
"roles": [ "name_en": "Media Committee",
"roles": [
{
"name_fi": "Puheenjohtaja, Päätoimittaja",
"name_en": "Chair, Editor in Chief",
"representatives": [
{ {
"name_fi": "Puheenjohtaja, Päätoimittaja", "name": "Sasu Saalasti",
"name_en": "Chair, Editor in Chief", "phone_number": null,
"representatives": [ "email": null,
{ "image": null
"name": "Sasu Saalasti",
"phone_number": null,
"email": null,
"image": null
}
]
},
{
"name_fi": "Mediamestari",
"name_en": "Master of Media",
"representatives": [
{ "name": "Salla Lyytikäinen" }
]
},
{
"name_fi": "Toimittaja",
"name_en": "Journalist",
"representatives": [
{ "name": "Tuukka Syrjänen" },
{ "name": "Ilmari Kasvi" },
{ "name": "Elias Hirvonen" },
{ "name": "Miika Koskela" },
{ "name": "Taneli Myllykangas" },
{ "name": "Emmaleena Ahonen" },
{ "name": "Ville-Pekka Laakkonen" },
{ "name": "Sofia Öhman" },
{ "name": "Nestori Yrjönkoski" },
{ "name": "Jami Hyytiäinen" },
{ "name": "Aleksanteri Vesala" }
]
},
{
"name_fi": "Toimittaja & Valokuvaaja",
"name_en": "Journalist & Photographer",
"representatives": [
{ "name": "Kiia Einola" }
]
},
{
"name_fi": "Taittaja",
"name_en": "Layout Artist",
"representatives": [
{ "name": "Aino Suomi" },
{ "name": "Olli Komulainen" },
{ "name": "Emilia Kortelainen" }
]
},
{
"name_fi": "Taittaja & Valokuvaaja",
"name_en": "Layout Artist & Photographer",
"representatives": [
{ "name": "Jonna Tammikivi" }
]
},
{
"name_fi": "Valokuvaaja",
"name_en": "Photographer",
"representatives": [
{ "name": "Suvi Karanta" },
{ "name": "Mikko Haaparanta" },
{ "name": "Johannes Viirimäki" }
]
},
{
"name_fi": "Valokuvaaja & Graafikko",
"name_en": "Photographer & Graphic Artist",
"representatives": [
{ "name": "Kalle Petäjäaho" },
{ "name": "Maria Pöllä" }
]
},
{
"name_fi": "Videokuvaaja",
"name_en": "Videographer",
"representatives": [
{ "name": "Aaro Rasilainen" }
]
} }
] ]
},
{
"name_fi": "Mediamestari",
"name_en": "Master of Media",
"representatives": [
{
"name": "Salla Lyytikäinen"
}
]
},
{
"name_fi": "Toimittaja",
"name_en": "Journalist",
"representatives": [
{
"name": "Tuukka Syrjänen"
},
{
"name": "Ilmari Kasvi"
},
{
"name": "Elias Hirvonen"
},
{
"name": "Miika Koskela"
},
{
"name": "Taneli Myllykangas"
},
{
"name": "Emmaleena Ahonen"
},
{
"name": "Ville-Pekka Laakkonen"
},
{
"name": "Sofia Öhman"
},
{
"name": "Nestori Yrjönkoski"
},
{
"name": "Jami Hyytiäinen"
},
{
"name": "Aleksanteri Vesala"
}
]
},
{
"name_fi": "Toimittaja & Valokuvaaja",
"name_en": "Journalist & Photographer",
"representatives": [
{
"name": "Kiia Einola"
}
]
},
{
"name_fi": "Taittaja",
"name_en": "Layout Artist",
"representatives": [
{
"name": "Aino Suomi"
},
{
"name": "Olli Komulainen"
},
{
"name": "Emilia Kortelainen"
}
]
},
{
"name_fi": "Taittaja & Valokuvaaja",
"name_en": "Layout Artist & Photographer",
"representatives": [
{
"name": "Jonna Tammikivi"
}
]
},
{
"name_fi": "Valokuvaaja",
"name_en": "Photographer",
"representatives": [
{
"name": "Suvi Karanta"
},
{
"name": "Mikko Haaparanta"
},
{
"name": "Johannes Viirimäki"
}
]
},
{
"name_fi": "Valokuvaaja & Graafikko",
"name_en": "Photographer & Graphic Artist",
"representatives": [
{
"name": "Kalle Petäjäaho"
},
{
"name": "Maria Pöllä"
}
]
},
{
"name_fi": "Videokuvaaja",
"name_en": "Videographer",
"representatives": [
{
"name": "Aaro Rasilainen"
}
]
}
]
} }
+42 -27
View File
@@ -1,31 +1,46 @@
{ {
"name_fi": "Opintotoimikunta", "slug": "optmk",
"name_en": "Study Committee", "name_fi": "Opintotoimikunta",
"roles": [ "name_en": "Study Committee",
"roles": [
{
"name_fi": "Opintomestari",
"name_en": "Master of Studies",
"representatives": [
{ {
"name_fi": "Opintomestari", "name": "Simo Hakanummi"
"name_en": "Master of Studies",
"representatives": [
{ "name": "Simo Hakanummi" }
]
},
{
"name_fi": "Opintovastaava",
"name_en": "Study Coordinator",
"representatives": [
{ "name": "Miina-Maija Simonen" },
{ "name": "Tomi Valkonen" },
{ "name": "Leo Lahti" },
{ "name": "Ville-Pekka Laakkonen" },
{ "name": "Samu Nyman" }
]
},
{
"name_fi": "Abimarkkinointi Vastaava",
"name_en": "",
"representatives": [
{ "name": "Iikka Huttu" }
]
} }
] ]
},
{
"name_fi": "Opintovastaava",
"name_en": "Study Coordinator",
"representatives": [
{
"name": "Miina-Maija Simonen"
},
{
"name": "Tomi Valkonen"
},
{
"name": "Leo Lahti"
},
{
"name": "Ville-Pekka Laakkonen"
},
{
"name": "Samu Nyman"
}
]
},
{
"name_fi": "Abimarkkinointi Vastaava",
"name_en": "",
"representatives": [
{
"name": "Iikka Huttu"
}
]
}
]
} }
+61
View File
@@ -0,0 +1,61 @@
{
"slug": "others",
"name_fi": "Muut",
"name_en": "Other officials",
"roles": [
{
"name_fi": "Kiltapatruuna",
"name_en": "Guild elder",
"representatives": [
{
"name": "Erna Virtanen",
"phone_number": null,
"email": null
},
{
"name": "Emmaleena Ahonen",
"phone_number": null,
"email": null
}
]
},
{
"name_fi": "TEK-yhdyshenkilö",
"name_en": "TEK contact person",
"representatives": [
{
"name": "Mikael Liimatainen",
"phone_number": null,
"email": null
}
]
},
{
"name_fi": "Sklubi-yhdyshenkilö",
"name_en": "Sklubi contact person",
"representatives": [
{
"name": "Ella Eilola",
"phone_number": null,
"email": null
}
]
},
{
"name_fi": "Arkistonhoitaja",
"name_en": "Archivist",
"representatives": [
{
"name": "Antti Mäki",
"phone_number": null,
"email": null
},
{
"name": "Jonna Tammikivi",
"phone_number": null,
"email": null
}
]
}
]
}
+111 -62
View File
@@ -1,66 +1,115 @@
{ {
"name_fi": "Ohjelmatoimikunta", "slug": "otmk",
"name_en": "Entertainment Committee", "name_fi": "Ohjelmatoimikunta",
"roles": [ "name_en": "Entertainment Committee",
"roles": [
{
"name_fi": "Hovimestari",
"name_en": "Master of Ceremonies",
"representatives": [
{ {
"name_fi": "Hovimestari", "name": "Eveliina Ahonen"
"name_en": "Master of Ceremonies",
"representatives": [
{ "name": "Eveliina Ahonen" }
]
},
{
"name_fi": "Hovineuvos",
"name_en": "Court Counsellor",
"representatives": [
{ "name": "Melisa Dönmez" }
]
},
{
"name_fi": "Emäntä",
"name_en": "",
"representatives": [
{ "name": "Oona Karjalainen" },
{ "name": "Emilia Kortelainen" },
{ "name": "Venla Vastamäki" }
]
},
{
"name_fi": "Isäntä",
"name_en": "",
"representatives": [
{ "name": "Henry Jaakkola" },
{ "name": "Sakke Kangas" },
{ "name": "Otto Torkkeli" },
{ "name": "Tommi Oinonen" },
{ "name": "Eero Ketonen" }
]
},
{
"name_fi": "Lukkari",
"name_en": "",
"representatives": [
{ "name": "Tuomo Leino" },
{ "name": "Jami Hyytiäinen" },
{ "name": "Tuomas Pajunpää" },
{ "name": "Samuel Laine" },
{ "name": "Toni Miilunpalo" },
{ "name": "Ville Kaakinen"},
{ "name": "Eero Torpo"},
{ "name": "Sauli Norja"}
]
},
{
"name_fi": "Lukkarikisällit",
"name_en": "",
"representatives": [
{ "name": "Jesse Räisänen" },
{ "name": "Eino Laakso" },
{ "name": "Sakari Harjunpää" },
{ "name": "Niilo Ojala" },
{ "name": "Iikka Huttu" },
{ "name": "Akseli Järvinen" }
]
} }
] ]
},
{
"name_fi": "Hovineuvos",
"name_en": "Court Counsellor",
"representatives": [
{
"name": "Melisa Dönmez"
}
]
},
{
"name_fi": "Emäntä",
"name_en": "",
"representatives": [
{
"name": "Oona Karjalainen"
},
{
"name": "Emilia Kortelainen"
},
{
"name": "Venla Vastamäki"
}
]
},
{
"name_fi": "Isäntä",
"name_en": "",
"representatives": [
{
"name": "Henry Jaakkola"
},
{
"name": "Sakke Kangas"
},
{
"name": "Otto Torkkeli"
},
{
"name": "Tommi Oinonen"
},
{
"name": "Eero Ketonen"
}
]
},
{
"name_fi": "Lukkari",
"name_en": "",
"representatives": [
{
"name": "Tuomo Leino"
},
{
"name": "Jami Hyytiäinen"
},
{
"name": "Tuomas Pajunpää"
},
{
"name": "Samuel Laine"
},
{
"name": "Toni Miilunpalo"
},
{
"name": "Ville Kaakinen"
},
{
"name": "Eero Torpo"
},
{
"name": "Sauli Norja"
}
]
},
{
"name_fi": "Lukkarikisällit",
"name_en": "",
"representatives": [
{
"name": "Jesse Räisänen"
},
{
"name": "Eino Laakso"
},
{
"name": "Sakari Harjunpää"
},
{
"name": "Niilo Ojala"
},
{
"name": "Iikka Huttu"
},
{
"name": "Akseli Järvinen"
}
]
}
]
} }
-29
View File
@@ -1,29 +0,0 @@
{
"name_fi": "Elepajatoimikunta",
"name_en": "",
"roles": [
{
"name_fi": "Pajavastaava",
"name_en": "",
"representatives": [
{ "name": "Karl Lipping" }
]
},
{
"name_fi": "Pajakisälli",
"name_en": "",
"representatives": [
{ "name": "Tommi Sytelä" },
{ "name": "Eerikki Eskola" },
{ "name": "Arkadii Kolchin" },
{ "name": "Samu Nyman" },
{ "name": "Konsta Langi" },
{ "name": "Johannes Viirimäki" },
{ "name": "Justus Ojala" },
{ "name": "Ville Tujunen" },
{ "name": "Antti Tarkka" },
{ "name": "Pyry Vaara" }
]
}
]
}
+88 -67
View File
@@ -1,70 +1,91 @@
{ {
"name_fi": "SIK100-toimikunta", "slug": "sstmk",
"name_en": "", "name_fi": "SIK100-toimikunta",
"roles": [ "name_en": "",
"roles": [
{
"name_fi": "Puheenjohtaja",
"name_en": "",
"representatives": [
{ {
"name_fi": "Puheenjohtaja", "name": "Erna Virtanen"
"name_en": "",
"representatives": [
{ "name": "Erna Virtanen" }
]
},
{
"name_fi": "Webivastaava",
"name_en": "",
"representatives": [
{ "name": "Jaakko Koskela" }
]
},
{
"name_fi": "Markkinointivastaava",
"name_en": "",
"representatives": [
{ "name": "Sasu Saalasti" }
]
},
{
"name_fi": "Yritysvastaava",
"name_en": "",
"representatives": [
{ "name": "Juuli Leppänen" }
]
},
{
"name_fi": "Seminaarivastaava",
"name_en": "",
"representatives": [
{ "name": "Sini Huhtinen" }
]
},
{
"name_fi": "Kevätkarnevaalimajuri",
"name_en": "",
"representatives": [
{ "name": "Olli Komulainen" }
]
},
{
"name_fi": "PoTa100-pääjuhlatirehtööri",
"name_en": "",
"representatives": [
{ "name": "Emmaleena Ahonen" },
{ "name": "Jonna Tammikivi" }
]
},
{
"name_fi": "PoTa100-jatkokuvernööri",
"name_en": "",
"representatives": [
{ "name": "Mikael Liimatainen" }
]
},
{
"name_fi": "PoTa100-sillistirehtööri",
"name_en": "",
"representatives": [
{ "name": "Tuomo Leino" }
]
} }
] ]
} },
{
"name_fi": "Webivastaava",
"name_en": "",
"representatives": [
{
"name": "Jaakko Koskela"
}
]
},
{
"name_fi": "Markkinointivastaava",
"name_en": "",
"representatives": [
{
"name": "Sasu Saalasti"
}
]
},
{
"name_fi": "Yritysvastaava",
"name_en": "",
"representatives": [
{
"name": "Juuli Leppänen"
}
]
},
{
"name_fi": "Seminaarivastaava",
"name_en": "",
"representatives": [
{
"name": "Sini Huhtinen"
}
]
},
{
"name_fi": "Kevätkarnevaalimajuri",
"name_en": "",
"representatives": [
{
"name": "Olli Komulainen"
}
]
},
{
"name_fi": "PoTa100-pääjuhlatirehtööri",
"name_en": "",
"representatives": [
{
"name": "Emmaleena Ahonen"
},
{
"name": "Jonna Tammikivi"
}
]
},
{
"name_fi": "PoTa100-jatkokuvernööri",
"name_en": "",
"representatives": [
{
"name": "Mikael Liimatainen"
}
]
},
{
"name_fi": "PoTa100-sillistirehtööri",
"name_en": "",
"representatives": [
{
"name": "Tuomo Leino"
}
]
}
]
}
+51 -31
View File
@@ -1,35 +1,55 @@
{ {
"name_fi": "Teknologiatoimikunta", "slug": "ttmk",
"name_en": "", "name_fi": "Teknologiatoimikunta",
"roles": [ "name_en": "",
"roles": [
{
"name_fi": "Teknologiamestari",
"name_en": "",
"representatives": [
{ {
"name_fi": "Teknologiamestari", "name": "Oskari Ponkala"
"name_en": "",
"representatives": [
{ "name": "Oskari Ponkala" }
]
},
{
"name_fi": "Tekniikkavastaava",
"name_en": "",
"representatives": [
{ "name": "Antti Mäki" }
]
},
{
"name_fi": "Web-Kisälli",
"name_en": "",
"representatives": [
{ "name": "Ilari Ojakorpi" },
{ "name": "Leo Lahti" },
{ "name": "Jyri Korhonen" },
{ "name": "Tuukka Syrjänen" },
{ "name": "Emmaleena Ahonen" },
{ "name": "Mikko Suhonen" },
{ "name": "Jaakko Koskela" },
{ "name": "Justus Ojala" }
]
} }
] ]
},
{
"name_fi": "Tekniikkavastaava",
"name_en": "",
"representatives": [
{
"name": "Antti Mäki"
}
]
},
{
"name_fi": "Web-Kisälli",
"name_en": "",
"representatives": [
{
"name": "Ilari Ojakorpi"
},
{
"name": "Leo Lahti"
},
{
"name": "Jyri Korhonen"
},
{
"name": "Tuukka Syrjänen"
},
{
"name": "Emmaleena Ahonen"
},
{
"name": "Mikko Suhonen"
},
{
"name": "Jaakko Koskela"
},
{
"name": "Justus Ojala"
}
]
}
]
} }
+54 -39
View File
@@ -1,43 +1,58 @@
{ {
"name_fi": "Ulkotoimikunta", "slug": "utmk",
"name_en": "External Affairs Committeee", "name_fi": "Ulkotoimikunta",
"roles": [ "name_en": "External Affairs Committeee",
"roles": [
{
"name_fi": "Ulkomestari",
"name_en": "Master of External Affairs",
"representatives": [
{ {
"name_fi": "Ulkomestari", "name": "Oliver Hiekkamies"
"name_en": "Master of External Affairs",
"representatives": [
{ "name": "Oliver Hiekkamies" }
]
},
{
"name_fi": "Kv-ISOvastaava",
"name_en": "International Tutor Coordinator",
"representatives": [
{ "name": "Elias Hirvonen" }
]
},
{
"name_fi": "International Helper",
"name_en": "International Helper",
"representatives": [
{ "name": "Ville-Pekka Laakkonen" }
]
},
{
"name_fi": "Ulkosuhdevastaava",
"name_en": "Apprentice of External Affairs",
"representatives": [
{ "name": "Leo Müller" },
{ "name": "Eino Tyrvänen" },
{ "name": "Pekka Aho" }
]
},
{
"name_fi": "Ulkowanhus",
"name_en": "",
"representatives": [
{ "name": "Jyri Korhonen" }
]
} }
] ]
},
{
"name_fi": "Kv-ISOvastaava",
"name_en": "International Tutor Coordinator",
"representatives": [
{
"name": "Elias Hirvonen"
}
]
},
{
"name_fi": "International Helper",
"name_en": "International Helper",
"representatives": [
{
"name": "Ville-Pekka Laakkonen"
}
]
},
{
"name_fi": "Ulkosuhdevastaava",
"name_en": "Apprentice of External Affairs",
"representatives": [
{
"name": "Leo Müller"
},
{
"name": "Eino Tyrvänen"
},
{
"name": "Pekka Aho"
}
]
},
{
"name_fi": "Ulkowanhus",
"name_en": "",
"representatives": [
{
"name": "Jyri Korhonen"
}
]
}
]
} }
+48 -29
View File
@@ -1,33 +1,52 @@
{ {
"name_fi": "Yrityssuhdetoimikunta", "slug": "ytmk",
"name_en": "Corporate Relations Committee", "name_fi": "Yrityssuhdetoimikunta",
"roles": [ "name_en": "Corporate Relations Committee",
"roles": [
{
"name_fi": "Yrityssuhdemestari",
"name_en": "Master of Corporate Relations",
"representatives": [
{ {
"name_fi": "Yrityssuhdemestari", "name": "Otto Julkunen"
"name_en": "Master of Corporate Relations",
"representatives": [
{ "name": "Otto Julkunen" }
]
},
{
"name_fi": "Excursiopäävastaava",
"name_en": "Head of Excursions",
"representatives": [
{ "name": "Henry Gustafsson" }
]
},
{
"name_fi": "Yrityssuhdevastaava",
"name_en": "Apprentice of Corporate Relations",
"representatives": [
{ "name": "Iikka Huttu" },
{ "name": "Arkadii Kolchin" },
{ "name": "Oskari Luukkonen" },
{ "name": "Niilo Ojala" },
{ "name": "Emma Reinikainen" },
{ "name": "Melina Sundell" },
{ "name": "Elma Tuohimetsä" }
]
} }
] ]
},
{
"name_fi": "Excursiopäävastaava",
"name_en": "Head of Excursions",
"representatives": [
{
"name": "Henry Gustafsson"
}
]
},
{
"name_fi": "Yrityssuhdevastaava",
"name_en": "Apprentice of Corporate Relations",
"representatives": [
{
"name": "Iikka Huttu"
},
{
"name": "Arkadii Kolchin"
},
{
"name": "Oskari Luukkonen"
},
{
"name": "Niilo Ojala"
},
{
"name": "Emma Reinikainen"
},
{
"name": "Melina Sundell"
},
{
"name": "Elma Tuohimetsä"
}
]
}
]
} }
+1
View File
@@ -12,6 +12,7 @@ interface JobAdListProps {
const List = styled.ul` const List = styled.ul`
padding: 0; padding: 0;
li { li {
margin: 1rem 0; margin: 1rem 0;
list-style: none; list-style: none;
+1
View File
@@ -22,6 +22,7 @@ const StyledTextSection = styled(TextSection)`
& > h1 { & > h1 {
color: ${colors.darkBlue}; color: ${colors.darkBlue};
p { p {
color: ${colors.orange1}; color: ${colors.orange1};
} }
+1
View File
@@ -19,6 +19,7 @@ const StyledTextSection = styled(TextSection)`
& > h1 { & > h1 {
color: ${colors.darkBlue}; color: ${colors.darkBlue};
p { p {
color: ${colors.orange1}; color: ${colors.orange1};
} }
+1 -1
View File
@@ -14,7 +14,7 @@ const EMAIL_LINK_MAILTO = `mailto:${EMAIL_LINK}`;
const ImageContainer = styled.div` const ImageContainer = styled.div`
width: 100%; width: 100%;
display: block display: block;
`; `;
const FreshmenPageView: React.FC = () => ( const FreshmenPageView: React.FC = () => (
+3 -1
View File
@@ -11,7 +11,7 @@ import {
} from "@components/index"; } from "@components/index";
import Event from "@models/Event"; import Event from "@models/Event";
import Post from "@models/Feed"; import Post from "@models/Feed";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import FullWidthSection from "@components/Sections/FullWidthSection"; import FullWidthSection from "@components/Sections/FullWidthSection";
import noop from "@utils/noop"; import noop from "@utils/noop";
@@ -42,6 +42,7 @@ const cardTimeOpts: Intl.DateTimeFormatOptions = {
const SponsorReel = styled.div` const SponsorReel = styled.div`
text-align: center; text-align: center;
& > div { & > div {
display: flex; display: flex;
flex-flow: row wrap; flex-flow: row wrap;
@@ -54,6 +55,7 @@ const SponsorReel = styled.div`
min-width: 200px; min-width: 200px;
} }
} }
a { a {
color: ${colors.blue1}; color: ${colors.blue1};
text-decoration: underline; text-decoration: underline;
+3 -1
View File
@@ -30,16 +30,18 @@ const Column = styled.div`
section:last-of-type { section:last-of-type {
background-color: ${colors.lightBlue}; background-color: ${colors.lightBlue};
p { p {
a { a {
font-weight: normal; font-weight: normal;
} }
} }
} }
ul { ul {
list-style: none; list-style: none;
li:before { li::before {
content: attr(data-icon); content: attr(data-icon);
margin-right: 4px; margin-right: 4px;
} }
@@ -22,6 +22,7 @@ const Gallery = styled.div`
@media screen and (max-width: ${breakpoints.mobile}) { @media screen and (max-width: ${breakpoints.mobile}) {
flex-flow: column; flex-flow: column;
& > div { & > div {
min-height: 100vw; min-height: 100vw;
} }
+2 -1
View File
@@ -5,7 +5,7 @@ import { SignupForm } from "@models/Signup";
import Checkboxes from "@components/Widgets/Checkbox/Checkboxes"; import Checkboxes from "@components/Widgets/Checkbox/Checkboxes";
import RadioButtonWidget from "@components/Widgets/RadioButton/RadioButtonWidget"; import RadioButtonWidget from "@components/Widgets/RadioButton/RadioButtonWidget";
import { TextSection, ChangeLanguageButton } from "@components/index"; import { TextSection, ChangeLanguageButton } from "@components/index";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import FormWrapper from "@views/common/FormWrapper"; import FormWrapper from "@views/common/FormWrapper";
import Loader from "@components/Loader"; import Loader from "@components/Loader";
import { buildFormSchema, buildUISchema } from "./FormUtils"; import { buildFormSchema, buildUISchema } from "./FormUtils";
@@ -32,6 +32,7 @@ const StyledSection = styled(TextSection)`
& > aside { & > aside {
justify-content: start; justify-content: start;
li { li {
padding-bottom: 0.3rem; padding-bottom: 0.3rem;
} }
+1 -1
View File
@@ -1,7 +1,7 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { ISubmitEvent, IChangeEvent, ErrorSchema } from "react-jsonschema-form"; import { ISubmitEvent, IChangeEvent, ErrorSchema } from "react-jsonschema-form";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import Event from "@models/Event"; import Event from "@models/Event";
import Post from "@models/Feed"; import Post from "@models/Feed";
import { SignupForm } from "@models/Signup"; import { SignupForm } from "@models/Signup";
+1 -1
View File
@@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { colors } from "@theme/colors"; import colors from "@theme/colors";
import AdminPageWrapper from "@views/common/AdminPageWrapper"; import AdminPageWrapper from "@views/common/AdminPageWrapper";
const Main = styled.div` const Main = styled.div`
+1 -2
View File
@@ -53,8 +53,7 @@ const FormStyleWrapper = styled(Form)`
input[type="email"], input[type="email"],
input[type="number"], input[type="number"],
textarea, textarea,
select select {
{
display: block; display: block;
width: 100%; width: 100%;
} }
+16 -7
View File
@@ -22,10 +22,13 @@ const DotPulse = styled.div`
0% { 0% {
box-shadow: 9984px 0 0 -5px ${colors.white}; box-shadow: 9984px 0 0 -5px ${colors.white};
} }
30% { 30% {
box-shadow: 9984px 0 0 2px ${colors.white}; box-shadow: 9984px 0 0 2px ${colors.white};
} }
60%, 100% {
60%,
100% {
box-shadow: 9984px 0 0 -5px ${colors.white}; box-shadow: 9984px 0 0 -5px ${colors.white};
} }
} }
@@ -34,10 +37,13 @@ const DotPulse = styled.div`
0% { 0% {
box-shadow: 9999px 0 0 -5px ${colors.white}; box-shadow: 9999px 0 0 -5px ${colors.white};
} }
30% { 30% {
box-shadow: 9999px 0 0 2px ${colors.white}; box-shadow: 9999px 0 0 2px ${colors.white};
} }
60%, 100% {
60%,
100% {
box-shadow: 9999px 0 0 -5px ${colors.white}; box-shadow: 9999px 0 0 -5px ${colors.white};
} }
} }
@@ -46,17 +52,19 @@ const DotPulse = styled.div`
0% { 0% {
box-shadow: 10014px 0 0 -5px ${colors.white}; box-shadow: 10014px 0 0 -5px ${colors.white};
} }
30% { 30% {
box-shadow: 10014px 0 0 2px ${colors.white}; box-shadow: 10014px 0 0 2px ${colors.white};
} }
60%, 100% {
60%,
100% {
box-shadow: 10014px 0 0 -5px ${colors.white}; box-shadow: 10014px 0 0 -5px ${colors.white};
} }
} }
display: inline-block; display: inline-block;
margin-left: 1.5rem; margin-left: 1.5rem;
position: relative; position: relative;
left: -9999px; left: -9999px;
width: 10px; width: 10px;
@@ -66,9 +74,10 @@ const DotPulse = styled.div`
color: ${colors.white}; color: ${colors.white};
box-shadow: 9999px 0 0 -5px ${colors.white}; box-shadow: 9999px 0 0 -5px ${colors.white};
animation: dotPulse 1.5s infinite linear; animation: dotPulse 1.5s infinite linear;
animation-delay: .25s; animation-delay: 0.25s;
&::before, &::after { &::before,
&::after {
content: ''; content: '';
display: inline-block; display: inline-block;
position: absolute; position: absolute;
@@ -89,7 +98,7 @@ const DotPulse = styled.div`
&::after { &::after {
box-shadow: 10014px 0 0 -5px ${colors.white}; box-shadow: 10014px 0 0 -5px ${colors.white};
animation: dotPulseAfter 1.5s infinite linear; animation: dotPulseAfter 1.5s infinite linear;
animation-delay: .5s; animation-delay: 0.5s;
} }
`; `;
+2 -1
View File
@@ -7,7 +7,8 @@ const MarkdownStyles = styled(ReactMarkdown)`
color: ${colors.black}; color: ${colors.black};
} }
h1, h3 { h1,
h3 {
color: ${colors.orange2}; color: ${colors.orange2};
} }