(false);
40 | const [panels, setPanels] = useState([]);
41 | const classes = useStyles({});
42 |
43 | useEffect(() => {
44 | talks.forEach(talk => {
45 | if (!panels.includes(talk.type)) {
46 | setPanels([...panels, talk.type]);
47 | }
48 | });
49 | if (!expanded) setExpanded(panels[0]);
50 | });
51 |
52 | const panelName = (id: string) => {
53 | return TALK_TYPES.find(type => type.id === id).titlePlural;
54 | };
55 |
56 | const handleChange = (panel: string) => (
57 | event: React.ChangeEvent<{}>,
58 | isExpanded: boolean
59 | ) => {
60 | setExpanded(isExpanded ? panel : false);
61 | };
62 |
63 | return (
64 |
65 | {panels.map(panel => (
66 |
71 | }
73 | aria-controls={`panel${panel}-content`}
74 | id={`panel${panel}-header`}
75 | >
76 |
77 | {panelName(panel)}
78 |
79 |
80 |
81 | talk.type === panel)} />
82 |
83 |
84 | ))}
85 |
86 | );
87 | };
88 |
89 | export default TalkAccordion;
90 |
--------------------------------------------------------------------------------
/src/app/public/stacks/jasmine.svg:
--------------------------------------------------------------------------------
1 |
2 |
17 |
--------------------------------------------------------------------------------
/src/app/public/stacks/c++.svg:
--------------------------------------------------------------------------------
1 |
2 |
13 |
--------------------------------------------------------------------------------
/src/app/public/stacks/nextjs.svg:
--------------------------------------------------------------------------------
1 |
2 |
7 |
--------------------------------------------------------------------------------
/src/app/public/stacks/design.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
58 |
--------------------------------------------------------------------------------
/src/app/public/stacks/html5.svg:
--------------------------------------------------------------------------------
1 |
2 |
16 |
--------------------------------------------------------------------------------
/src/app/components/TalkCoverImage.tsx:
--------------------------------------------------------------------------------
1 | import { makeStyles, createStyles, Theme } from "@material-ui/core";
2 | import { TalkBasic } from "../schema";
3 | import { useStores } from "../stores/useStores";
4 | import { observer } from "mobx-react-lite";
5 |
6 | const useStyles = makeStyles((theme: Theme) =>
7 | createStyles({
8 | coverImage: {
9 | position: "absolute",
10 | top: 0,
11 | left: 0,
12 | zIndex: 0,
13 | width: "100%"
14 | },
15 | coverImageInner: {
16 | height: "100vh",
17 | maxHeight: `calc(95vh - 48px)`,
18 | position: "relative",
19 | backgroundSize: "cover",
20 | backgroundPosition: "center",
21 | transition: theme.transitions.create("opacity"),
22 | opacity: 0.5
23 | },
24 | coverImageInnerActive: {
25 | opacity: 1
26 | },
27 | shadowLR: {
28 | display: "block",
29 | position: "absolute",
30 | top: 0,
31 | left: 0,
32 | width: "100%",
33 | maxWidth: "80rem",
34 | height: "100%",
35 | zIndex: 2,
36 | opacity: 1,
37 | transition: theme.transitions.create("opacity", { duration: 1200 }),
38 | background:
39 | "linear-gradient(90deg, rgba(18,18,18,1) 0%, rgba(18,18,18,0.9) 50%, rgba(18,18,18,0.75) 70%, rgba(18,18,18,0) 100%)"
40 | },
41 | shadowLRActive: {
42 | opacity: 0.9
43 | },
44 | shadowBT: {
45 | display: "block",
46 | position: "absolute",
47 | bottom: 0,
48 | left: 0,
49 | width: "100%",
50 | height: theme.spacing(24),
51 | zIndex: 2,
52 | background:
53 | "linear-gradient(0deg, rgba(18,18,18,1) 0%, rgba(18,18,18,0.70) 50%, rgba(18,18,18,0) 100%)"
54 | }
55 | })
56 | );
57 |
58 | interface Props {
59 | talk: TalkBasic;
60 | }
61 |
62 | const HubCoverImage = observer(({ talk }: Props) => {
63 | const classes = useStyles({});
64 | const { userStore } = useStores();
65 |
66 | const innerClasses = () => {
67 | if (userStore.isAboutToPlayTalk) {
68 | return `${classes.coverImageInner} ${classes.coverImageInnerActive}`;
69 | }
70 | return classes.coverImageInner;
71 | };
72 |
73 | const shadowLRClasses = () => {
74 | if (userStore.isAboutToPlayTalk) {
75 | return `${classes.shadowLR} ${classes.shadowLRActive}`;
76 | }
77 | return classes.shadowLR;
78 | };
79 |
80 | return (
81 |
93 | );
94 | });
95 |
96 | export default HubCoverImage;
97 |
--------------------------------------------------------------------------------
/src/app/public/stacks/handlebars.svg:
--------------------------------------------------------------------------------
1 |
2 |
7 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hero35",
3 | "description": "Official repo of https://hero35.com",
4 | "repository": "https://github.com/mavropalias/heroes.git",
5 | "engines": {
6 | "node": "10"
7 | },
8 | "dependencies": {
9 | "@material-ui/core": "^4.9.8",
10 | "@material-ui/icons": "^4.9.1",
11 | "@types/next": "^9.0.0",
12 | "@zeit/next-css": "^1.0.1",
13 | "algoliasearch": "^3.35.1",
14 | "firebase": "^7.13.2",
15 | "firebase-admin": "^8.10.0",
16 | "firebase-functions": "^3.6.0",
17 | "isomorphic-unfetch": "^3.0.0",
18 | "mailchimp-api-v3": "^1.13.1",
19 | "mobx": "^5.15.4",
20 | "mobx-react-lite": "^1.5.2",
21 | "next": "9.3.4",
22 | "nprogress": "^0.2.0",
23 | "react": "^16.13.1",
24 | "react-dom": "^16.13.1",
25 | "react-firebaseui": "^4.1.0",
26 | "react-instantsearch": "^6.4.0",
27 | "react-instantsearch-dom": "^6.4.0",
28 | "react-on-screen": "^2.1.1",
29 | "react-virtualized-auto-sizer": "^1.0.2",
30 | "react-youtube": "7.9.0",
31 | "uuid": "^3.4.0"
32 | },
33 | "devDependencies": {
34 | "@babel/cli": "^7.8.4",
35 | "@babel/core": "^7.9.0",
36 | "@babel/plugin-proposal-class-properties": "^7.8.3",
37 | "@babel/plugin-proposal-decorators": "^7.8.3",
38 | "@babel/preset-env": "^7.9.0",
39 | "@firebase/app-types": "^0.6.0",
40 | "@types/algoliasearch": "^3.34.10",
41 | "@types/express": "^4.17.4",
42 | "@types/node": "^13.11.0",
43 | "@types/react": "^16.9.32",
44 | "@types/react-dom": "^16.9.6",
45 | "@zeit/next-bundle-analyzer": "^0.1.2",
46 | "cpx": "^1.5.0",
47 | "firebase-tools": "^7.12.1",
48 | "prettier": "^1.19.1",
49 | "rimraf": "^3.0.2",
50 | "typescript": "^3.8.3"
51 | },
52 | "scripts": {
53 | "dev": "source .env && npm run clean && next \"src/app\" -p 3500",
54 | "preserve": "npm run clean && npm run build-public && npm run build-funcs && npm run build-app && npm run build-app-static && npm run copy-deps && npm run install-deps",
55 | "serve": "NODE_ENV=production node_modules/.bin/firebase serve",
56 | "deploy": "node_modules/.bin/firebase deploy",
57 | "clean": "rimraf \"dist/functions\" && rimraf \"dist/public\"",
58 | "build-public": "cpx \"src/app/public/**/*.*\" \"dist/public\" && cpx \"src/functions/public/**/*.*\" \"dist/public\"",
59 | "build-app-static": "cpx \"dist/functions/next/static/**/*.*\" \"dist/public/_next/static\" -C",
60 | "build-app": "next build \"src/app\"",
61 | "build-funcs": "./node_modules/.bin/tsc --project src/functions",
62 | "copy-deps": "cpx \"*{package.json,package-lock.json}\" \"dist/functions\"",
63 | "install-deps": "cd \"dist/functions\" && npm ci",
64 | "analyze": "BUNDLE_ANALYZE=both npm run build-app",
65 | "analyze:server": "BUNDLE_ANALYZE=server npm run build-app",
66 | "analyze:browser": "BUNDLE_ANALYZE=browser npm run build-app"
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/src/app/public/stacks/python.svg:
--------------------------------------------------------------------------------
1 |
2 |
18 |
--------------------------------------------------------------------------------
/src/app/public/stacks/wordpress.svg:
--------------------------------------------------------------------------------
1 |
2 |
7 |
--------------------------------------------------------------------------------