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 ? (
+
+