diff --git a/2023/gatsby-node.js b/2023/gatsby-node.js index abbcaf4cc..87fe228a2 100644 --- a/2023/gatsby-node.js +++ b/2023/gatsby-node.js @@ -33,6 +33,11 @@ exports.createPages = ({ graphql, actions }) => { nameReading biography biographyJa + github + mastodon + homepage + twitter + pronoun } } } diff --git a/2023/package-lock.json b/2023/package-lock.json index 629fbf3cb..9934ed87f 100644 --- a/2023/package-lock.json +++ b/2023/package-lock.json @@ -8,6 +8,7 @@ "hasInstallScript": true, "license": "UNLICENSED", "dependencies": { + "@styled-icons/remix-line": "^10.46.0", "date-fns": "^2.30.0", "gatsby": "^5.12.9", "gatsby-image": "3.11.0", @@ -2102,7 +2103,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", - "dev": true, "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -2110,14 +2110,12 @@ "node_modules/@emotion/memoize": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "dev": true + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/unitless": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", - "dev": true + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, "node_modules/@eslint-community/regexpp": { "version": "4.9.1", @@ -4172,6 +4170,39 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, + "node_modules/@styled-icons/remix-line": { + "version": "10.46.0", + "resolved": "https://registry.npmjs.org/@styled-icons/remix-line/-/remix-line-10.46.0.tgz", + "integrity": "sha512-TkbtXdgcuM7VpE/51k8+sxfReFjSQpAFVnjJi8/gxwcTzjdOG7Plkgsaixi2+hiLk/Coj/+67KbntBoSevROsw==", + "dependencies": { + "@babel/runtime": "^7.19.0", + "@styled-icons/styled-icon": "^10.7.0" + }, + "funding": { + "type": "GitHub", + "url": "https://github.com/sponsors/jacobwgillespie" + }, + "peerDependencies": { + "react": "*", + "styled-components": "*" + } + }, + "node_modules/@styled-icons/remix-line/node_modules/@styled-icons/styled-icon": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/@styled-icons/styled-icon/-/styled-icon-10.7.0.tgz", + "integrity": "sha512-SCrhCfRyoY8DY7gUkpz+B0RqUg/n1Zaqrr2+YKmK/AyeNfCcoHuP4R9N4H0p/NA1l7PTU10ZkAWSLi68phnAjw==", + "dependencies": { + "@babel/runtime": "^7.19.0" + }, + "funding": { + "type": "GitHub", + "url": "https://github.com/sponsors/jacobwgillespie" + }, + "peerDependencies": { + "react": "*", + "styled-components": ">=4.1.0 <6" + } + }, "node_modules/@swc/core": { "version": "1.3.95", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.95.tgz", @@ -4570,8 +4601,7 @@ "node_modules/@types/stylis": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.2.tgz", - "integrity": "sha512-Rm17MsTpQQP5Jq4BF7CdrxJsDufoiL/q5IbJZYZmOZAJALyijgF7BzLgobXUqraNcQdqFYLYGeglDp6QzaxPpg==", - "dev": true + "integrity": "sha512-Rm17MsTpQQP5Jq4BF7CdrxJsDufoiL/q5IbJZYZmOZAJALyijgF7BzLgobXUqraNcQdqFYLYGeglDp6QzaxPpg==" }, "node_modules/@types/tmp": { "version": "0.0.33", @@ -6198,7 +6228,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7110,7 +7139,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "dev": true, "engines": { "node": ">=4" } @@ -7249,7 +7277,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "dev": true, "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -19079,7 +19106,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.0.tgz", "integrity": "sha512-VWNfYYBuXzuLS/QYEeoPgMErP26WL+dX9//rEh80B2mmlS1yRxRxuL5eax4m6ybYEUoHWlTy2XOU32767mlMkg==", - "dev": true, "dependencies": { "@emotion/is-prop-valid": "^1.2.1", "@emotion/unitless": "^0.8.0", @@ -19106,8 +19132,7 @@ "node_modules/styled-components/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/stylehacks": { "version": "5.1.1", @@ -19127,8 +19152,7 @@ "node_modules/stylis": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", - "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==", - "dev": true + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" }, "node_modules/sudo-prompt": { "version": "8.2.5", diff --git a/2023/package.json b/2023/package.json index 2496dfadc..67375420a 100644 --- a/2023/package.json +++ b/2023/package.json @@ -25,6 +25,7 @@ "*.{yml,yaml,ts,json}": "prettier" }, "dependencies": { + "@styled-icons/remix-line": "^10.46.0", "date-fns": "^2.30.0", "gatsby": "^5.12.9", "gatsby-image": "3.11.0", diff --git a/2023/src/data/types.ts b/2023/src/data/types.ts index 8f2fd8005..7f608c9a5 100644 --- a/2023/src/data/types.ts +++ b/2023/src/data/types.ts @@ -24,8 +24,11 @@ export type SpeakerType = { biographyJa: string presentations: string[] github: string + mastodon: string + homepage: string twitter: string location: string + pronoun: string } export type Session = TalkType & { diff --git a/2023/src/pages/schedule.tsx b/2023/src/pages/schedule.tsx index 248909cfd..d8cec01fc 100644 --- a/2023/src/pages/schedule.tsx +++ b/2023/src/pages/schedule.tsx @@ -65,6 +65,10 @@ const Area = styled(_Link)<{ &::before { content: ""; position: absolute; + font-family: ${({ theme }) => theme.fonts.text}; + font-weight: bold; + color: ${({ theme }) => theme.colors.base}; + font-size: 0.7em; top: -8px; left: -10px; display: inline-block; diff --git a/2023/src/templates/speaker.tsx b/2023/src/templates/speaker.tsx index 010ba52ee..4d05abaa5 100644 --- a/2023/src/templates/speaker.tsx +++ b/2023/src/templates/speaker.tsx @@ -14,6 +14,11 @@ import { enOrJa } from "../util/languages" import { EventTime } from "../components/EventTime" import { Room } from "../components/RoomLegend" import { Rooms } from "../util/misc" +import { ExternalLink } from "@styled-icons/remix-line/ExternalLink" +import { Mastodon } from "@styled-icons/remix-line/Mastodon" +import { Github } from "@styled-icons/remix-line/Github" +import { Twitter } from "@styled-icons/remix-line/Twitter" +import { Link } from "gatsby" type Props = { pageContext: { @@ -85,6 +90,88 @@ const TalkTitle = styled.h2` text-align: left; ` +type SocialLinksProps = { + speaker: SpeakerType +} + +const SocialLinkContainer = styled.ul` + &, + & > li { + list-style-type: none; + padding: 0; + margin: 0; + } + & { + display: flex; + } + & > li > a { + padding: 0.4em; + color: ${({ theme }) => theme.colors.disabledText}; + &:hover { + color: ${({ theme }) => theme.colors.primary}; + } + } + svg { + width: 1.6em; + } +` + +function SocialLinks(props: SocialLinksProps) { + const { speaker } = props + const socialLinks = [ + speaker.homepage ? ( + + + + ) : null, + speaker.github ? ( + + + + ) : null, + speaker.mastodon ? ( + + + + ) : null, + speaker.twitter ? ( + + + + ) : null, + ] + .filter(Boolean) + .map(entry =>
  • {entry}
  • ) + + if (!socialLinks.length) { + return <> + } + + return {socialLinks} +} + +const SpeakerPronounWrap = styled.em` + margin-left: 0.5em; + font-size: 0.75em; +` + +type SpeakerPronounProps = { + speaker: SpeakerType +} + +const SpeakerPronoun = ({ speaker }: SpeakerPronounProps) => { + if (!speaker.pronoun) { + return <> + } + return ( + + {"("} + {speaker.pronoun} + {")"} + + ) +} + export default function Speaker(props: Props) { const { t, i18n } = useTranslation() const { @@ -118,10 +205,12 @@ export default function Speaker(props: Props) {

    +

    {enOrJa(i18n)(speaker.biography, speaker.biographyJa)} +
    ))}