Compare commits

..

369 Commits

Author SHA1 Message Date
Kamran Ahmed
7c5d28b68b Add sponsor ad 2021-09-01 22:15:55 +02:00
Larah Armstrong
2f8c0c5748 Update what-is-internet.md (#190) 2021-02-02 09:36:38 +04:00
Kamran Ahmed
5e08af99b2 Update year 2021-01-08 14:41:49 +04:00
Yago Azedias
2882815313 Updating year to 2021 (#228) 2021-01-07 11:27:51 +04:00
Kamran Ahmed
e093f98a42 Add funding info 2020-11-23 01:19:34 +04:00
Kamran Ahmed
d3f8e0517b Add transport protocols video 2020-11-22 00:50:00 +04:00
Kamran Ahmed
efc874163b Add link to tcp/ip model video 2020-11-07 02:36:29 +04:00
Kamran Ahmed
3e8abbed13 Add sponsor and youtube link 2020-10-25 01:07:02 +04:00
Kamran Ahmed
244d336d8e Add link to osi model video 2020-10-24 23:34:57 +04:00
Kamran Ahmed
9d24b98f67 Add video for seal and freeze objects in JavaScript 2020-10-16 21:34:07 +04:00
Kamran Ahmed
007bd7feb0 Remove roadmaps from top nav 2020-10-16 15:17:03 +04:00
Kamran Ahmed
7619945028 Add http caching video link 2020-10-06 00:16:12 +04:00
Peter Thaleikis
3265f9729d Fixing missing 'mailto:' and broken link in Terms (#204)
* Fixing missing 'mailto:'

* Fixing broken link in Terms
2020-10-04 15:35:58 +04:00
Kamran Ahmed
4591ad2336 Add video for CDN 2020-09-26 22:01:22 +04:00
Kamran Ahmed
163e03f578 Update DBA roadmap 2020-09-21 23:42:07 +04:00
Kamran Ahmed
2215174c20 Update the DBA roadmap 2020-09-19 18:19:09 +04:00
Kamran Ahmed
aa52e08ac4 Add load balancers video link 2020-09-19 12:07:30 +04:00
lesovsky
96acb6c93e Add PostgreSQL DBA roadmap. 2020-09-09 08:36:15 +05:00
Kamran Ahmed
69ebd50a90 Add video link for dns records 2020-08-31 16:05:53 +05:00
Kamran Ahmed
e2eaf7d19c Add link to DNS video 2020-08-17 03:13:08 +04:00
Kamran Ahmed
da7ba5bf4c Add link to system design video 2020-08-09 09:18:44 +04:00
Kamran Ahmed
0d17cf145c Update URL for fetch api video 2020-08-02 22:20:27 +04:00
Kamran Ahmed
8a7f7a4a83 Update banner and new video link 2020-08-02 22:10:42 +04:00
Kamran Ahmed
7d3255576b Add video link for system design 2020-07-27 14:51:30 +04:00
Kamran Ahmed
97529cbf54 chore: trigger build 2020-07-26 13:31:58 +04:00
Kamran Ahmed
52af178a19 Update guide URL and add images 2020-07-26 12:19:16 +04:00
Ebrahim Bharmal
f0425fd964 Adding guide for forward and reverse proxy servers (#185)
* Add files via upload

* Update forward&reverse_proxy.md

* Update forward&reverse_proxy.md

* Update forward&reverse_proxy.md

Checking links

* Update forward&reverse_proxy.md

Updated all links. Now images show up properly

* Update forward&reverse_proxy.md

Updated headings. Made changes to the format.

* Update forward&reverse_proxy.md

Changes made againnnnnn

* Update forward&reverse_proxy.md

Updated structure. Added more content.

* Update forward&reverse_proxy.md

* Update forward&reverse_proxy.md

Added table of contents

* Update forward&reverse_proxy.md

Corrected some lines

* Update forward&reverse_proxy.md

Updated final version: Fixed spelling mistakes and errors

* Added picture of ebrahimbharmal007

Contributing to guides: forward&reverse_proxy.md

* Updated authors.json: add author ebrahimbharmal007

Added ebrahimbharmal007 in authors.json for submitting guide forward&reverse_proxy.md

* Updated guides.json

Added meta data for guide forward&reverse_proxy.md by ebrahimbharmal007
2020-07-26 12:06:29 +04:00
Kamran Ahmed
570d6a04b1 Add promises video link 2020-07-21 01:02:45 +04:00
Kamran Ahmed
1e677183aa Add react roadmap 2020-07-18 15:59:04 +04:00
Kamran Ahmed
14a29b4634 Add react map files 2020-07-18 04:13:19 +04:00
Kamran Ahmed
bc66a805e3 Add react roadmap 2020-07-18 04:12:33 +04:00
Kamran Ahmed
f6c10d7344 Fix invalid links for the videos 2020-07-18 00:43:47 +04:00
Kamran Ahmed
4e96943374 Add links to podcast and watch in footer 2020-07-17 15:44:47 +04:00
Kamran Ahmed
1235459d7a Add post on ci/cd 2020-07-17 15:39:48 +04:00
Kamran Ahmed
0d35fe0364 Add webstorm project history image 2020-07-17 15:26:57 +04:00
Kamran Ahmed
76d6fab581 Add guide on single sign on 2020-07-17 15:19:19 +04:00
Kamran Ahmed
da39147539 Add youtube videos page 2020-07-17 15:14:28 +04:00
lincarters
9e230a01a2 Update resources.md
Spelling fix
2020-07-16 14:58:47 +04:00
Kamran Ahmed
4c3452926a Fix image URL for oauth 2020-07-02 16:48:30 +04:00
Kamran Ahmed
b36c5b3c26 Add oauth post 2020-07-02 15:31:04 +04:00
Kamran Ahmed
95fe79a0f1 Add podcasts menu 2020-06-22 01:58:52 +04:00
Kamran Ahmed
850a9ffc9d Add podcasts page 2020-06-22 01:52:29 +04:00
Kamran Ahmed
2b8d18d880 Refactor deployment action 2020-06-22 00:25:22 +04:00
Kamran Ahmed
9b551a69a7 Fix deployment step failing 2020-06-22 00:20:21 +04:00
Kamran Ahmed
cdb9201b2f Refactor build steps 2020-06-22 00:14:16 +04:00
Kamran Ahmed
ab15d91614 Add deployment github action 2020-06-22 00:06:44 +04:00
Kamran Ahmed
9d2fdfa7cf Add support for environment variables 2020-06-21 23:38:38 +04:00
Kamran Ahmed
bcad685e27 Update contribution guides 2020-06-21 23:01:47 +04:00
Kamran Ahmed
74ae339fe1 Add JWT Authentication guide 2020-06-20 23:16:04 +04:00
Kamran Ahmed
5811fd8832 feat: add png for android roadmap 2020-06-11 19:58:34 +04:00
Kamran Ahmed
6c710a92c1 Add token authentication guide 2020-06-04 12:41:21 +04:00
Kamran Ahmed
51f068085d Update android roadmap 2020-05-30 02:46:13 +04:00
Kamran Ahmed
1795bc1495 Update twitter URL 2020-05-26 23:00:41 +04:00
Kamran Ahmed
d4ef930187 Add community badge 2020-05-26 22:39:09 +04:00
Kamran Ahmed
54fae335c2 Update twitter URL 2020-05-26 18:57:32 +04:00
Kamran Ahmed
0f886e9def Create SVG for android roadmap 2020-05-26 14:27:42 +04:00
Kamran Ahmed
3f299cdd8b Create SVG for android roadmap 2020-05-26 14:16:53 +04:00
Kamran Ahmed
7fccd6b399 Fix typos and minor alignment fixes 2020-05-26 13:28:07 +04:00
Kamran Ahmed
f75512e96a Add android developer roadmap 2020-05-26 13:23:06 +04:00
Kamran Ahmed
32ff9a700b Add android developer roadmap 2020-05-26 04:11:58 +04:00
Kamran Ahmed
6976202171 Replace homepage with roadmaps page 2020-05-25 22:34:16 +04:00
Kamran Ahmed
cf1cca7cb3 Add guide on session based authentication 2020-05-25 22:29:52 +04:00
Kamran Ahmed
2236c3f93c Add basic authentication guide 2020-05-19 01:22:07 +04:00
Kamran Ahmed
4f067504a2 Add character encodings post 2020-05-14 02:52:15 +04:00
Kamran Ahmed
42747f4f97 Add unfamiliar codebase post 2020-05-04 23:32:17 +04:00
Kamran Ahmed
1d952f75f8 Add unfamiliar codebase post 2020-05-04 23:29:26 +04:00
Peter Thaleikis
9e61ef5dd1 Add guide "Why “build it and they will come” alone won’t work anymore" 2020-05-04 23:09:40 +04:00
Kamran Ahmed
c7770cc64c Add dhcp illustration 2020-04-28 13:16:11 +04:00
Kamran Ahmed
af7e25dc92 Fix github buttons width 2020-04-28 11:13:22 +04:00
Kamran Ahmed
cf3365e778 feat: add carbon 2020-04-24 22:45:23 +04:00
Kamran Ahmed
bd69872059 feat: add guide SSL/TLS/HTTPS/SSH 2020-04-24 20:45:32 +04:00
Jefferson Ye
746ee3d548 Small grammar fix, "ambition" to "ambitious" 2020-04-22 13:37:48 +04:00
Kamran Ahmed
73c55a0eaa Add scaling databases post 2020-04-03 12:01:15 +04:00
Kamran Ahmed
299d0f3ada Add guide for asymptotic notation 2020-04-03 11:41:12 +04:00
Kamran Ahmed
98097f939a Update youtube URL 2020-03-30 01:51:09 +04:00
Kamran Ahmed
f4904da3f8 Update github link in page nav 2020-03-28 20:35:58 +04:00
Kamran Ahmed
465c00b4d5 Update dependencies and add github link in nav 2020-03-28 20:23:17 +04:00
Myles Webster
69c54e5dfe fix incorrect link for resource in FE dev roadmap 2020-03-25 18:29:44 +04:00
Kamran Ahmed
6f4898c216 Add illustrations for some topics 2020-03-23 22:33:39 +04:00
Kamran Ahmed
b8cc07c29e Update channel link 2020-03-15 16:13:36 +04:00
Kamran Ahmed
eae0ad3ecb Update alignment for share links 2020-03-14 12:49:26 +04:00
Kamran Ahmed
56bf52e641 Add hackernews share url 2020-03-14 12:48:11 +04:00
Kamran Ahmed
689f24e0f1 Add random numbers guide 2020-03-14 12:37:31 +04:00
Kamran Ahmed
63d66b3f4e Add big-o-notation guide 2020-03-14 02:40:57 +04:00
Kamran Ahmed
4930c00f78 Update roadmap pdfs 2020-03-14 01:54:46 +04:00
Kamran Ahmed
5745fc56bf Update pdfs for the roadmaps 2020-03-14 01:45:05 +04:00
Kamran Ahmed
55d5ced587 Type updates and banner change 2020-03-14 01:37:27 +04:00
Kamran Ahmed
018be76895 Add youtube banner 2020-03-14 01:02:04 +04:00
Kamran Ahmed
b268106684 Add youtube banner 2020-03-14 01:00:06 +04:00
Kamran Ahmed
56e2108be2 Add resources link in SSG 2020-03-03 00:18:32 +04:00
Kamran Ahmed
9dfbceda7c Update forntend resources 2020-03-03 00:10:33 +04:00
Kamran Ahmed
c698265f42 Add frontend resources 2020-03-03 00:06:25 +04:00
Kamran Ahmed
752d4614b8 Add resources to frontend 2020-03-02 10:52:48 +04:00
Kamran Ahmed
d73e08f8f6 Add resources setup 2020-03-01 10:27:15 +04:00
Kamran Ahmed
cf648924cf Add resources pages and new guide 2020-02-29 17:49:04 +04:00
Kamran Ahmed
2d15290566 Add menu items for resources and project ideas 2020-02-28 19:58:29 +04:00
Kamran Ahmed
06dd1934f3 Fix typo 2020-02-27 10:46:06 +04:00
Christoph Geschwind
316ada1259 Update levels-of-seniority.md
Fixes a tiny typo, at least I think it does.

Thanks for the great article!
2020-02-27 10:46:06 +04:00
Sohail Ahmad
30d2f15433 Fix typo ('compabitility' -> 'compatibility') 2020-02-26 20:27:31 +04:00
Kamran Ahmed
4ac1319d8d Update sponsor banner text 2020-02-22 21:44:05 +04:00
Andrew Petro
4e924981c1 fix: diction and typo ("its", "simplest") 2020-02-11 12:50:29 +04:00
Andrew Petro
fdf3fd050b fix: use "its" rather than "it's" when appropriate
Use "its" for the possessive, rather than "it's" (contraction of for "it is").
2020-02-11 12:50:29 +04:00
Will 保哥
79afd0a6a8 Update history-of-javascript.md
Add a space in a paragraph.
2020-02-11 12:47:13 +04:00
Will 保哥
03e35ee928 Update history-of-javascript.md
Typos: ECMASript -> ECMAScript
2020-02-11 12:44:15 +04:00
Curtis Gibby
eaaedb8034 Update name of Dunning–Kruger effect 2020-02-07 22:46:13 +04:00
Kamran Ahmed
84e87a501e Add do logo 2020-02-04 02:00:27 +04:00
Kamran Ahmed
8fca669787 Add do logo 2020-02-04 01:57:27 +04:00
Kamran Ahmed
3c1d41119f Add sponsor information 2020-02-01 18:05:57 +04:00
Kamran Ahmed
495fd37eae Add sponsor information 2020-02-01 17:55:54 +04:00
Kamran Ahmed
4cfeb1c372 Add pdfs for roadmaps 2020-02-01 17:23:53 +04:00
Kamran Ahmed
91a47faec0 Add sponsor information 2020-02-01 17:08:34 +04:00
Kamran Ahmed
8c03aedea1 Add sponsor banner 2020-02-01 13:33:14 +05:00
Kamran Ahmed
9a515f85c1 Hide sponsors nav item on mobile 2020-02-01 08:07:42 +05:00
Kamran Ahmed
0a2468aad2 Make frontend roadmap summary 2020-01-29 13:53:39 +05:00
Kamran Ahmed
fc2eb36d58 Resolve merge conflicts 2020-01-29 12:49:49 +05:00
Kamran Ahmed
3c5ea2131d Add detailed version for frontend roadmap 2020-01-29 12:48:18 +05:00
Kamran Ahmed
75e1f67ee8 Use on heading per page 2020-01-29 11:28:20 +05:00
Kamran Ahmed
b40894cfdc SEO optimization through titles/descriptions 2020-01-29 11:14:34 +05:00
Kamran Ahmed
4fb2e1f46d Fix SEO titles and keywords 2020-01-29 10:42:52 +05:00
Kamran Ahmed
8eccfd22e3 Update copy 2020-01-29 09:43:24 +05:00
Kamran Ahmed
d84800fcaf feat: detailed roadmap preparation 2020-01-28 17:48:22 +05:00
Kamran Ahmed
bb3260f4b7 Update contribution guidelines 2020-01-27 13:09:16 +05:00
Kamran Ahmed
9a2e1fd673 Add contribution guide for writing roadmap 2020-01-27 12:41:02 +05:00
Kamran Ahmed
3f599fab35 Remove gads 2020-01-22 12:13:25 +04:00
Kamran Ahmed
cdc710123f Add codefund 2020-01-22 12:11:24 +04:00
Kamran Ahmed
bb43c8eba6 Update sponsors info 2020-01-21 10:42:34 +04:00
Kamran Ahmed
c01d595546 Update sponsors info 2020-01-21 00:27:46 +04:00
Kamran Ahmed
77a66fd25d Add sponsors page 2020-01-21 00:20:25 +04:00
Kamran Ahmed
a93ac86766 Update sitemap 2020-01-20 11:24:36 +04:00
Kamran Ahmed
4044dbea91 Update sitemap path 2020-01-20 11:24:02 +04:00
Kamran Ahmed
3fc9ffe8b4 Update copy on sponsors page 2020-01-20 11:17:37 +04:00
Kamran Ahmed
880475f6de Add sponsors page 2020-01-20 10:58:39 +04:00
Kamran Ahmed
a26945288b Rename storage directory 2020-01-18 22:47:48 +04:00
Kamran Ahmed
b97ae52a1b Add PDF for devops roadmap 2020-01-18 16:56:27 +04:00
Kamran Ahmed
76ddeeedb2 Add devops roadmap 2020 update 2020-01-18 16:30:03 +04:00
Kamran Ahmed
00b7fe6e7f fix: electro misspelling and color for legend 2020-01-18 11:00:51 +04:00
Kamran Ahmed
c43442f127 Merge branch 'master' of github.com:kamranahmedse/roadmap.sh 2020-01-18 10:45:12 +04:00
Kamran Ahmed
68c62d218d feat: update 2020-01-18 10:44:58 +04:00
Kamran Ahmed
47b10a1a1a Fix broken logo in readme 2020-01-18 01:12:41 +04:00
Kamran Ahmed
1fd135d1c1 Move static to public and update paths 2020-01-18 01:08:47 +04:00
Kamran Ahmed
61bdc80f5a Update dependencies 2020-01-18 01:05:13 +04:00
Kamran Ahmed
4fbefd5ae9 Update site meta and title update for post 2020-01-18 00:56:49 +04:00
Jesse Li
835476ed31 Update PULL_REQUEST_TEMPLATE.md 2020-01-17 21:39:27 +04:00
Jesse Li
83745ae1b4 Add Guide: BitTorrent client 2020-01-17 21:39:27 +04:00
Kamran Ahmed
9465cfb5c2 feat: update author meta 2020-01-17 19:32:50 +04:00
Kamran Ahmed
4edd398770 chore: add contribution docs for writing guides 2020-01-17 19:29:04 +04:00
Kamran Ahmed
21b3b7cbdf fix: invalid canonicalization 2020-01-17 19:18:47 +04:00
Kamran Ahmed
ae6763bf83 Fix search engines section in backend 2020-01-12 10:31:22 +04:00
Kamran Ahmed
be5a61b697 Fix typo in backend roadmap 2020-01-12 00:44:15 +04:00
Kamran Ahmed
8e25dca636 Update PDF files and add 2020 version 2020-01-12 00:09:33 +04:00
Kamran Ahmed
b91d404f17 Merge branch 'master' of github.com:kamranahmedse/roadmap.sh 2020-01-10 18:55:00 +04:00
Kamran Ahmed
80f2cb8cbc Fix typos in frontend roadmap 2020-01-10 18:54:47 +04:00
Kamran Ahmed
2dc3d4fd24 Fix typos in frontend 2020-01-10 18:52:16 +04:00
Joshua Mamawag
2432ff9fd4 Fix typos and punctuations 2020-01-10 17:49:42 +04:00
Kamran Ahmed
8f1f8846c9 Update badges 2020-01-04 18:34:19 +04:00
Kamran Ahmed
7dac8665a0 Update badges 2020-01-04 18:33:21 +04:00
Kamran Ahmed
f0181ff08f Add PDFs for roadmaps 2020-01-04 18:01:21 +04:00
Kamran Ahmed
0ad95c2dd0 Update links 2020-01-04 17:57:50 +04:00
Kamran Ahmed
d184e93519 Add PDF for frontend roadmap 2020-01-04 17:41:03 +04:00
Kamran Ahmed
4ef31700a5 Update frontend and intro maps for 2020 2020-01-04 17:39:39 +04:00
Kamran Ahmed
087f4e5c25 Add license and github templates 2020-01-04 17:38:43 +04:00
Kamran Ahmed
c5ae26458a Update roadmaps for 2020 2020-01-04 17:35:41 +04:00
Kamran Ahmed
0c6de5d89b Add contribution guide 2020-01-02 09:59:41 +04:00
Kamran Ahmed
124d113162 Update sitemap and roadmaps 2020-01-02 09:54:52 +04:00
Kamran Ahmed
c88b0f3b1a Update sitemap, roadmap meta 2020-01-02 09:49:01 +04:00
Kamran Ahmed
06d72599d9 Resolve merge conflicts 2020-01-02 09:42:48 +04:00
Kamran Ahmed
eb9cd6cdcc Update dependencies 2020-01-02 09:40:55 +04:00
Kamran Ahmed
c7589b8325 Update summary pages for roadmaps 2019-12-06 18:18:33 +04:00
Kamran Ahmed
4c07ac509b Add SVG for the logo 2019-12-06 15:47:40 +04:00
Kamran Ahmed
1240b6b1bc Fix typos in guide 2019-12-04 01:02:58 +04:00
Kamran Ahmed
ad05c49570 Fix - Breaking build 2019-12-03 18:09:47 +04:00
Kamran Ahmed
c01a854a5a Fix - Duplicated meta tags on pages 2019-12-03 17:54:34 +04:00
Kamran Ahmed
7b1dde1d62 Fix Typos in Guide 2019-12-03 17:34:20 +04:00
Kamran Ahmed
56b0275b06 Update the conclusion on guide 2019-12-03 17:22:19 +04:00
Kamran Ahmed
7a0d784d81 Update twitter card image 2019-12-03 17:03:12 +04:00
Kamran Ahmed
2c9eb1f9ee Make twitter card logo square 2019-12-03 16:58:58 +04:00
Kamran Ahmed
e4ca1c9598 Add guide: Levels of Seniority 2019-12-03 16:40:31 +04:00
Kamran Ahmed
2b8e06d651 Add senior section 2019-12-03 02:55:56 +04:00
Kamran Ahmed
56088a838c Add section for mid-level developers 2019-12-03 01:30:00 +04:00
Kamran Ahmed
542d82c2dc Developer seniority junior section 2019-12-03 00:12:51 +04:00
Kamran Ahmed
980322bae0 Add Guide: Developer seniority 2019-12-02 17:08:49 +04:00
Kamran Ahmed
56fbe9a685 Add Guide: history of JavaScript 2019-12-02 13:06:35 +04:00
Kamran Ahmed
6939240d59 Add junior frontend landscape 2019-12-02 12:20:06 +04:00
Kamran Ahmed
4caaee3da5 Update badges 2019-12-02 03:31:25 +04:00
Kamran Ahmed
e829af3e62 Update summary 2019-12-02 02:13:21 +04:00
Kamran Ahmed
7ba0fa9004 Update meta 2019-12-02 02:12:26 +04:00
Kamran Ahmed
74433cd0d3 Sticky sidebar 2019-12-02 02:11:49 +04:00
Kamran Ahmed
dec3e992b3 Update frontend roadmap summary 2019-12-02 01:58:31 +04:00
Kamran Ahmed
7a4c27460f Add summary details for frontend developer 2019-12-02 00:28:10 +04:00
Kamran Ahmed
5553b411eb Add summary 2019-12-02 00:00:57 +04:00
Kamran Ahmed
98cc968ed1 Add roadmap summary for frontend 2019-12-01 23:51:23 +04:00
Kamran Ahmed
3de37468a6 Render page markdown 2019-12-01 17:06:53 +04:00
Kamran Ahmed
3364eae0a6 Change sitemap priority for hidden pages 2019-12-01 16:17:29 +04:00
Kamran Ahmed
a06eaec5d4 Add summary pages to landscape 2019-12-01 16:16:45 +04:00
Kamran Ahmed
10e433f538 Do not display hidden pages 2019-12-01 15:49:13 +04:00
Kamran Ahmed
129deed6a9 Roadmap author and contributors page 2019-12-01 15:46:13 +04:00
Kamran Ahmed
ce35a8112f Remove utm params from share URLs 2019-12-01 15:11:28 +04:00
Kamran Ahmed
35f6070133 Relevant page loading on detail page 2019-12-01 15:01:22 +04:00
Kamran Ahmed
629f1058f2 Make mobile sidebar responsive 2019-11-30 18:12:07 +04:00
Kamran Ahmed
199310df93 Add share icons on roadmap detail page 2019-11-30 17:15:56 +04:00
Kamran Ahmed
0d45fcbf79 Add share icons to roadmap header 2019-11-30 17:07:50 +04:00
Kamran Ahmed
47cbcde5dc Add detailed roadmap 2019-11-30 14:33:22 +04:00
Kamran Ahmed
5b12eb9e02 Split roadmap summaries and detailed roadmap 2019-11-30 14:27:37 +04:00
Kamran Ahmed
6632b46d98 Fix - Guide having space on top 2019-11-30 14:27:21 +04:00
Kamran Ahmed
25e009a63f Update roadmaps summaries 2019-11-30 14:26:03 +04:00
Kamran Ahmed
9ae7eed1e3 Remove static images 2019-11-30 14:25:31 +04:00
Kamran Ahmed
8db62cb19f Update badges 2019-11-30 11:21:14 +04:00
Kamran Ahmed
d1a991b18c Add badges 2019-11-30 11:14:42 +04:00
Kamran Ahmed
8107e008ff Overflowing scroll on page 2019-11-30 10:28:37 +04:00
Kamran Ahmed
944858bbb1 Make upcoming badge take to signup 2019-11-30 10:27:39 +04:00
Kamran Ahmed
b864c60ea3 Upcoming roadmap page 2019-11-30 10:00:44 +04:00
Kamran Ahmed
618b55f601 Split roadmap header to separate component 2019-11-30 09:06:06 +04:00
Kamran Ahmed
b5c65b408b Update meta script 2019-11-30 00:43:29 +04:00
Kamran Ahmed
21f2ef80ba Upcoming roadmap UI 2019-11-30 00:20:24 +04:00
Kamran Ahmed
ebd351e133 Refactor markdown rendering 2019-11-29 18:36:49 +04:00
Kamran Ahmed
77dab81b92 Add padding around container 2019-11-29 18:13:19 +04:00
Kamran Ahmed
0350da2929 Split markdown rendering 2019-11-29 18:13:07 +04:00
Kamran Ahmed
59c07c9000 Minor update 2019-11-29 11:51:43 +04:00
Kamran Ahmed
79ab31dec7 Update sitemap generation for roadmap pages 2019-11-29 11:49:50 +04:00
Kamran Ahmed
16983cb950 Update path-map generation 2019-11-29 11:23:48 +04:00
Mazhar Zandsalimi
e29fe52cb1 minor modification: max-age=3600 means 60 minutes 2019-11-29 10:48:40 +04:00
Kamran Ahmed
7921acb666 Add roadmaps meta generator 2019-11-28 00:19:03 +04:00
Kamran Ahmed
b53f8c982c Update pathmap generation for roadmap routes 2019-11-27 20:53:29 +04:00
Kamran Ahmed
0b72a07147 Add roadmap pathmap generator 2019-11-25 21:00:37 +04:00
Konstantinos Psychas
5155a0c358 Update design-patterns-for-humans.md
A typo that may cause confusion.
2019-11-24 11:26:49 +04:00
Kamran Ahmed
bd5663ab26 Add roadmap text 2019-11-23 16:30:48 +04:00
Kamran Ahmed
af3ccd5bb5 Fix broken build 2019-11-21 18:22:57 +04:00
B3nnyL
035eaa47e8 [fix]canonical url and og:url 2019-11-21 11:57:21 +04:00
Pat Laundy
3541d4e717 Adding missed word in opening paragraph 2019-11-19 09:33:25 +04:00
Kamran Ahmed
e8dcfe97f2 Fix - Subscription form throws warning 2019-11-16 16:16:50 +04:00
Kamran Ahmed
8f3307e53e Update sitemap and build 2019-11-16 16:15:05 +04:00
Kamran Ahmed
dcc825416d Push dev configuration 2019-11-16 16:13:37 +04:00
Kamran Ahmed
f8fcb8d600 Update build script 2019-11-16 16:12:18 +04:00
Kamran Ahmed
40919dec14 Add configuration and build changes 2019-11-16 16:11:08 +04:00
Kamran Ahmed
f3592155bf Add build check for .env file 2019-11-16 15:35:37 +04:00
Kamran Ahmed
927ee73be7 Add dotenv file loading 2019-11-16 15:21:40 +04:00
Kamran Ahmed
4f81d5374e Fix - Analytics not working 2019-11-16 15:07:10 +04:00
Kamran Ahmed
e95fd69886 Update subscribe button in top nav 2019-11-16 14:18:43 +04:00
Kamran Ahmed
11d9da5afb Update FAQ page 2019-11-16 14:06:31 +04:00
Kamran Ahmed
cea8abc5ef Update build script 2019-11-16 14:02:16 +04:00
Kamran Ahmed
7169d3bb8f Add FAQ page in top nav 2019-11-16 13:54:36 +04:00
Kamran Ahmed
ae9c1c4992 Add about page 2019-11-16 13:51:10 +04:00
Kamran Ahmed
58e560af7d Do not send analytics for dev mode 2019-11-16 13:50:30 +04:00
Kamran Ahmed
09fa166f56 Delete .nojekyll 2019-11-15 02:12:02 +04:00
Kamran Ahmed
6ed7d9c25f Create .nojekyll 2019-11-15 02:11:24 +04:00
Kamran Ahmed
e59fc5e4e9 Update canonical URL 2019-11-15 02:09:54 +04:00
Kamran Ahmed
f5da05c3ec Update canonical URL 2019-11-15 02:08:45 +04:00
Kamran Ahmed
07b200b878 Update readme.md 2019-11-14 22:31:12 +04:00
Kamran Ahmed
ccca782f25 Update readme 2019-11-14 22:30:49 +04:00
Kamran Ahmed
77d9846d9b Update readme 2019-11-14 22:22:04 +04:00
Kamran Ahmed
8da175e9d8 Update readme 2019-11-14 21:32:28 +04:00
Kamran Ahmed
467634889b Update repository URL 2019-11-14 21:29:30 +04:00
Kamran Ahmed
b46b425b41 Fix twitter share URL issue 2019-11-14 21:26:01 +04:00
Kamran Ahmed
9e23439f0c Add sitemap generation and remove extra files 2019-11-14 21:21:56 +04:00
Kamran Ahmed
c6db625e35 Update license 2019-11-14 12:09:51 +04:00
Kamran Ahmed
672245e4e4 Fix invalid URL being generated 2019-11-13 23:44:45 +04:00
Kamran Ahmed
e4ce3475c6 Update repository URLs 2019-11-13 23:38:29 +04:00
Kamran Ahmed
d15b97db73 Update bundle application 2019-11-13 23:29:52 +04:00
Kamran Ahmed
8f040e5e8a Add gh-pages deployment 2019-11-13 23:13:45 +04:00
Kamran Ahmed
888800d2a0 Update contribution docs 2019-11-13 23:07:29 +04:00
Kamran Ahmed
51b2c70586 Restructure and update imports 2019-11-13 23:06:07 +04:00
Kamran Ahmed
5b4cc86f61 Restructure and update readme 2019-11-13 22:59:27 +04:00
Kamran Ahmed
9952ee5805 Resolve merge conflicts 2019-11-13 22:48:43 +04:00
Stéphane Klein
dacbf09f55 Remove JSCS (deprecated) and add StandardJS linter (#605) 2019-07-10 10:26:35 +04:00
Kamran Ahmed
a16787ab58 Remove myself from github sponsors 2019-07-07 15:59:19 +04:00
Rahul Madhav Upakare
7d45c8e462 Corrected language name for Go programming language (#601) 2019-07-05 18:05:06 +04:00
Kamran Ahmed
796bde76c9 Update copy 2019-07-01 13:33:06 +04:00
Kamran Ahmed
22d5622e1e Add funding.yml 2019-05-23 16:30:44 +04:00
Eric Jeker
2312fdd608 Duplicated word in the CSS Architecture comment box. Removed 'push'. 2019-05-17 16:59:23 +04:00
Kamran Ahmed
bc2ecea03b Update license 2019-05-13 02:47:20 +04:00
Kamran Ahmed
84a551f906 Fix transparency of roadmaps 2019-05-06 13:04:27 +04:00
Kamran Ahmed
9fab5c7134 Update devops map 2019-05-06 12:21:47 +04:00
Kamran Ahmed
c61f4a845d Fix some typos and update banner 2019-05-06 12:07:28 +04:00
Kamran Ahmed
025753b279 Fix spelling mistake 2019-05-06 11:17:24 +04:00
Kamran Ahmed
6b9901db28 Update the banner 2019-05-05 01:18:22 +04:00
Kamran Ahmed
34f0e483ec Update repo banneer 2019-05-05 00:44:15 +04:00
Kamran Ahmed
0ae9bc0e3e Update repo banner 2019-05-05 00:40:46 +04:00
Kamran Ahmed
3f17f60daf Update headeer 2019-05-05 00:30:36 +04:00
Kamran Ahmed
7f2acba352 Add sponsor 2019-03-18 00:44:13 +04:00
johnoct
907fb9915f fix the cut off names teamcity, LXC, and puppet 2019-03-17 10:06:19 +04:00
Kamran Ahmed
fd2e64ec50 Update sponsors 2019-03-12 10:29:23 +04:00
Kamran Ahmed
3fd5b9e744 Update sponsor text 2019-02-06 10:11:16 +04:00
Kamran Ahmed
edff9156ff Update sponsor link 2019-02-05 15:20:32 +04:00
Kamran Ahmed
e1c89585e9 Add sponsor link 2019-02-05 15:05:15 +04:00
Kamran Ahmed
abaa839b26 Fix transparency for backend roadmap 2019-01-26 14:55:41 +04:00
Kamran Ahmed
1bc7384929 Minor markdown change 2019-01-04 10:10:55 +04:00
Kamran Ahmed
6a148295f7 Update sponsors section 2019-01-04 10:10:30 +04:00
Kamran Ahmed
ea25f2d99b Update readme 2019-01-02 21:48:30 +04:00
Kamran Ahmed
08303c0623 Update badge 2019-01-01 14:26:33 +04:00
Kamran Ahmed
f18f9fb5b3 Fix tweet URL 2018-12-30 21:10:46 +04:00
Kamran Ahmed
dfc07e0753 Remove emojis 2018-12-29 23:32:52 +04:00
Kamran Ahmed
64a19fdc3c Update badge 2018-12-29 23:23:39 +04:00
Kamran Ahmed
1b3e8712ff Rearrange badges 2018-12-29 22:51:56 +04:00
Kamran Ahmed
f242c6e358 Update badges and intro section 2018-12-29 22:51:10 +04:00
Kamran Ahmed
7e2121bed9 Merge branch 'master' of github.com:kamranahmedse/developer-roadmap 2018-12-29 22:48:26 +04:00
Kamran Ahmed
bb80ceb7ba Update intro map 2018-12-29 22:48:19 +04:00
Kamran Ahmed
25dfb28368 Update badge 2018-12-29 22:32:58 +04:00
Kamran Ahmed
a1c75bb9f8 Update badges 2018-12-29 22:32:37 +04:00
Kamran Ahmed
efdb628120 Update badges 2018-12-29 22:31:20 +04:00
Kamran Ahmed
ac23dddeb9 Update header 2018-12-29 21:44:43 +04:00
Kamran Ahmed
b208eaa1bd Update frontend roadmap for 2019 2018-12-29 20:39:20 +04:00
Kamran Ahmed
8ebf97277c Add updated frontend roadmap 2018-12-29 20:37:25 +04:00
Kamran Ahmed
928d79e3fb Update frontend roadmap image 2018-12-29 17:27:52 +04:00
Kamran Ahmed
9b95218eb8 Update frontend roadmap image 2018-12-29 17:20:02 +04:00
Kamran Ahmed
8bcdd84f0f Update frontend developer roadmap 2018-12-29 17:17:46 +04:00
Asad Mansoor
67a72aab11 added container orchestration to devops roadmap (#518)
* added container orchestration to devops roadmap

* Added kubernetes as preferred
2018-11-29 10:25:13 +04:00
Kamran Ahmed
771f3a9cb7 Merge branch 'bekicot-fetch-api-for-frontend' 2018-10-16 12:19:23 +04:00
Kamran Ahmed
38b6b34437 Resolve merge conflicts 2018-10-16 12:19:10 +04:00
Kamran Ahmed
548dfd85e7 Add Fetch API 2018-10-16 12:14:43 +04:00
Kamran Ahmed
971d23c43a Contribution docs update 2018-10-16 12:11:07 +04:00
Kamran Ahmed
3aac8de849 Add contribution docs 2018-10-16 12:00:49 +04:00
Ahmad Awais ⚡️
8d605735b2 👌 IMPROVE: Contribution Docs + Fix Frontend RoadMap (#498)
* 📦 NEW: No auto formatting for JSON in VSCode

* 👌 IMPROVE: lingo for several libraries/software

* 👌 IMPROVE: alt text for Web Developer Roadmap Introduction

* 👌 IMPROVE: alt text for Frontend Roadmap

* 👌 IMPROVE: alt text for Back-end Roadmap

* 👌 IMPROVE: alt text for DevOps Roadmap

*  📖 DOC: make contribution fun again with more details

* 🐛 FIX: names of several libraries/software
2018-10-16 11:21:44 +04:00
Yana Agun Siswanto
7debdb90c1 frontend-map.json: add Fetch API as recomendation
Fetch API should be added instead of XMLHttpRequest(XHR) API
as fetch uses promises which enables a simpler and cleaner API.
However, understanding both Fetch/XHR is required for frontend.

Closes #475
2018-10-16 05:28:00 +07:00
Andre Christoga Pramaditya Sion
f6f5c821b3 Emoji for both genders (#502)
Because the tech isn't for males only.
2018-10-12 00:48:08 +04:00
Kamran Ahmed
227e08b7c4 Don't need coffee 2018-09-09 22:18:27 +04:00
Kamran Ahmed
16651606fb Add badge 2018-09-08 20:11:23 +04:00
Kamran Ahmed
0ea67f695d Remove sponsor 2018-07-02 14:44:32 +04:00
Kamran Ahmed
6c4386ed7d Update license 2018-06-09 17:56:23 +04:00
Kamran Ahmed
e65ba9365b Add license 2018-06-09 17:53:56 +04:00
Kamran Ahmed
e5843568dd Add License 2018-06-09 17:52:57 +04:00
Kamran Ahmed
7968151c44 Update backend map 2018-06-09 04:35:03 +04:00
Kamran Ahmed
9f0753f098 Add devops map 2018-06-09 04:24:11 +04:00
Kamran Ahmed
98d0aa5103 Update backend roadmap 2018-06-08 18:14:13 +04:00
Kamran Ahmed
c1706e2c18 Remove banner 2018-06-06 21:28:24 +04:00
Kamran Ahmed
84e74096b7 Update readme 2018-05-05 23:02:07 +02:00
Kamran Ahmed
3d96fdf1df Update weekly 2018-04-08 00:24:35 +02:00
Kamran Ahmed
a157605b2b Update readme.md 2018-04-07 23:34:34 +02:00
Kamran Ahmed
ec83830577 Update readme 2018-04-07 02:49:19 +02:00
Kamran Ahmed
6babeb3f21 Add esguy link 2018-04-07 02:48:03 +02:00
Kamran Ahmed
0b9754c9ae Add disclaimer 2018-04-07 02:38:48 +02:00
Kamran Ahmed
c2f7754b0d Add updated backend developer roadmap 2018-04-02 18:28:52 +02:00
Kamran Ahmed
4df519845f Update roadmaps 2018-03-27 00:46:00 +02:00
Kamran Ahmed
910bd371dd Add backend and devops text files 2018-03-26 22:09:12 +02:00
Kamran Ahmed
0aa6db6007 Update textual form 2018-03-26 22:07:12 +02:00
Kamran Ahmed
01be603780 Rename readme 2018-03-26 22:04:14 +02:00
Kamran Ahmed
55a3ce4def Rename readme 2018-03-26 22:04:04 +02:00
Kamran Ahmed
a21264eb5e Remove splits 2018-03-26 22:00:43 +02:00
Kamran Ahmed
8c216782e5 Update markdown 2018-03-26 21:59:32 +02:00
Kamran Ahmed
ed9823245b Update structure 2018-03-26 21:56:13 +02:00
Kamran Ahmed
378e53eba4 Update frontend roadmap 2018-03-25 21:19:48 +02:00
Kamran Ahmed
66b68bc26f Add frontend map 2018-03-25 21:17:37 +02:00
Kamran Ahmed
0785d28bb4 Temp commit 2018-03-25 21:17:12 +02:00
Kamran Ahmed
f43dda522d Update frontend roadmap 2018-03-25 20:53:37 +02:00
Kamran Ahmed
ba98142d5b Remove recommendation 2018-03-25 18:16:24 +02:00
Kamran Ahmed
43160d3058 Put images in the repository 2018-03-25 18:03:57 +02:00
Kamran Ahmed
d40a858c6a Add disclaimer 2018-03-25 16:43:19 +02:00
Kamran Ahmed
4024005c4a Remove splits 2018-03-25 16:40:24 +02:00
Kamran Ahmed
91d1fc7245 Add massive disclaimer 2018-03-25 16:39:28 +02:00
Kamran Ahmed
328efa6ff6 Update frontend roadmap 2018-03-25 16:13:40 +02:00
Kamran Ahmed
cb352aba68 Add fancy splits 2018-02-27 21:31:39 +01:00
Kamran Ahmed
625ca5dcf4 Update youtube link 2018-02-27 13:53:02 +01:00
Kamran Ahmed
25d686ae5c Fix blog URL 2018-02-27 12:57:46 +01:00
Kamran Ahmed
0ab94faa95 Update README.md 2018-02-27 12:55:35 +01:00
Kamran Ahmed
5299a04acd Update README.md 2018-02-27 12:49:37 +01:00
Kamran Ahmed
f326a58bee Update readme 2018-02-27 12:49:07 +01:00
Kamran Ahmed
d8d52a6e86 Update readme 2018-02-27 12:42:05 +01:00
Kamran Ahmed
ba09cc4b86 Update readme 2018-02-27 12:22:14 +01:00
andrea
5804deb8ac Added a list of Linux & Unix server distributions, and Emacs as text editor (#328)
* Added a list of Linux & Unix server distributions, and Emacs as text editor

* Updated Linux server list personal preference and possibilities

* Added OpenBSD and NetBSD as unix suitable OS's
2018-02-27 09:57:27 +01:00
Zeeshan Ahmad
63b3f0199b Update README.md (#418) 2018-02-26 15:10:25 +01:00
Kamran Ahmed
0b0addaee4 Update readme 2018-02-24 20:44:01 +01:00
Kamran Ahmed
aab6d380aa Update project files 2018-01-06 17:16:47 +04:00
Ricardo N Feliciano
79b5c09a06 Add CircleCI, Packer, remove TeamCity, fix SaltStack. (#308) 2018-01-05 22:40:04 +04:00
Kamran Ahmed
3bd4ad5874 Update devops 2018-01-05 11:25:25 +04:00
Kamran Ahmed
79887dc7d5 Update intro 2018-01-05 03:16:54 +04:00
Kamran Ahmed
dc8cb8e777 Update charts for 2018 2018-01-05 03:14:25 +04:00
Kamran Ahmed
a8059e73c0 Update header image 2018-01-05 01:57:58 +04:00
PlanB
ee2b3e5de0 Change Flask's color to '16770457' (#292) 2017-11-28 09:21:36 +05:00
Kamran Ahmed
807e5ea2c1 Add sponsor link 2017-11-16 00:18:53 +04:00
Kamran Ahmed
f7b42203a4 Remove sponsor link 2017-11-03 12:27:26 +04:00
8280 changed files with 56089 additions and 574096 deletions

View File

@@ -1,8 +0,0 @@
{
"devToolbar": {
"enabled": false
},
"_variables": {
"lastUpdateCheck": 1732419746256
}
}

1
.astro/types.d.ts vendored
View File

@@ -1 +0,0 @@
/// <reference types="astro/client" />

13
.babelrc Normal file
View File

@@ -0,0 +1,13 @@
{
"presets": [
"next/babel"
],
"plugins": [
[
"styled-components",
{
"ssr": true
}
]
]
}

23
.editorconfig Normal file
View File

@@ -0,0 +1,23 @@
# EditorConfig for the node-soap library - head over to editorconfig.org to see if you editor supports this file.
# this is the topmost .editorconfig file
root = true
[*]
end_of_line = lf
insert_final_newline = true
[*.xml]
insert_final_newline = false
[*.js]
indent_style = space
indent_size = 2
[*.json]
indent_style = space
indent_size = 2
[{package.json, .travis.yml}]
indent_style = space
indent_size = 2

View File

@@ -1,3 +0,0 @@
PUBLIC_API_URL=https://api.roadmap.sh
PUBLIC_AVATAR_BASE_URL=https://dodrc8eu8m09s.cloudfront.net/avatars
PUBLIC_EDITOR_APP_URL=https://draw.roadmap.sh

1
.github/FUNDING.yml vendored
View File

@@ -1,2 +1,3 @@
# These are supported funding model platforms
github: kamranahmedse

36
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,36 @@
<!--
Please do not remove anything written below.
Fill the details and open the issue. Any issue that
doesn't have all of these filled in will be closed,
if yours is closed reopen with everything filled in.
-->
#### What roadmap is this issue about?
- [ ] Frontend Roadmap
- [ ] Backend Roadmap
- [ ] DevOps Roadmap
- [ ] All Roadmaps
#### What is this issue about?
- [ ] Functionality of the website
- [ ] Discussion for a pull request I would want to open.
- [ ] Addition of a new item
- [ ] Removal of some existing item
- [ ] Changing in arrangement
- [ ] General suggestion
- [ ] Sharing an Idea
- [ ] Something else
#### Please acknowledge the below listed
- [ ] This is not a duplicate issue. I have searched and there is no existing issue for this.
- [ ] I understand that these roadmaps are highly opinionated. The purpose is to not to include everything out there in these roadmaps but to have everything that is most relevant today comparing to the other options listed.
- [ ] I have read the [contribution docs](../contributing) before opening this issue.
#### Enter the details about the issue here
<!-- Please enter the issue details here -->

View File

@@ -1,25 +0,0 @@
name: "✍️ Missing or Deprecated Roadmap Topics"
description: Help us improve the roadmaps by suggesting changes
labels: [topic-change]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to help us improve the roadmaps with your suggestions.
- type: input
id: url
attributes:
label: Roadmap URL
description: Please provide the URL of the roadmap you are suggesting changes to.
placeholder: https://roadmap.sh
validations:
required: true
- type: textarea
id: roadmap-suggestions
attributes:
label: Suggestions
description: What changes would you like to suggest?
placeholder: Enter your suggestions here.
validations:
required: true

View File

@@ -1,42 +0,0 @@
name: "🐛 Bug Report"
description: Report an issue or possible bug
labels: [bug]
assignees: []
body:
- type: input
id: url
attributes:
label: What is the URL where the issue is happening
placeholder: https://roadmap.sh
validations:
required: true
- type: dropdown
id: browsers
attributes:
label: What browsers are you seeing the problem on?
multiple: true
options:
- Firefox
- Chrome
- Safari
- Microsoft Edge
- Other
- type: textarea
id: bug-description
attributes:
label: Describe the Bug
description: A clear and concise description of what the bug is.
validations:
required: true
- type: textarea
id: logs
attributes:
label: Output from browser console (if any)
description: Please copy and paste any relevant log output.
- type: checkboxes
id: will-pr
attributes:
label: Participation
options:
- label: I am willing to submit a pull request for this issue.
required: false

View File

@@ -1,12 +0,0 @@
name: "✨ Feature Suggestion"
description: Is there a feature you'd like to see on Roadmap.sh? Let us know!
labels: [feature request]
assignees: []
body:
- type: textarea
id: feature-description
attributes:
label: Feature Description
description: Please provide a detailed description of the feature you are suggesting and how it would help you/others.
validations:
required: true

View File

@@ -1,25 +0,0 @@
name: "🙏 Submit a Roadmap"
description: Help us launch a new roadmap with your expertise.
labels: [roadmap contribution]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to submit a roadmap! Please fill out the information below and we'll get back to you as soon as we can.
- type: input
id: roadmap-title
attributes:
label: What is the title of the roadmap you are submitting?
placeholder: e.g. Roadmap to learn Data Science
validations:
required: true
- type: textarea
id: roadmap-description
attributes:
label: Roadmap Link
description: Please create the roadmap [using our roadmap editor](https://twitter.com/kamrify/status/1708293162693767426) and submit the roadmap link.
placeholder: |
https://roadmap.sh/xyz
validations:
required: true

View File

@@ -1,35 +0,0 @@
name: "🙏 Submit a Project Idea"
description: Help us add project ideas to roadmaps.
labels: [project contribution]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to submit a project idea! Please fill out the information below and we'll get back to you as soon as we can.
- type: input
id: roadmap-title
attributes:
label: What Roadmap is this project for?
placeholder: e.g. Backend Roadmap
validations:
required: true
- type: dropdown
id: project-difficulty
attributes:
label: Project Difficulty
options:
- Beginner
- Intermediate
- Advanced
validations:
required: true
- type: textarea
id: roadmap-description
attributes:
label: Add Project Details
description: Please write a detailed description of the project in 3rd person e.g. "You are required to build a..."
placeholder: |
e.g. You are required to build a RESTful API...
validations:
required: true

View File

@@ -1,12 +0,0 @@
name: "🤷‍♂️ Something else"
description: If none of the above templates fit your needs, please use this template to submit your issue.
labels: []
assignees: []
body:
- type: textarea
id: issue-description
attributes:
label: Detailed Description
description: Please provide a detailed description of the issue.
validations:
required: true

View File

@@ -1,14 +0,0 @@
blank_issues_enabled: false
contact_links:
- name: Roadmap Request
url: https://roadmap.sh/discord
about: Please do not open issues with roadmap requests, hop onto the discord server for that.
- name: 📝 Typo or Grammatical Mistake
url: https://github.com/kamranahmedse/developer-roadmap/tree/master/src/data
about: Please submit a pull request instead of reporting it as an issue.
- name: 💬 Chat on Discord
url: https://roadmap.sh/discord
about: Join the community on our Discord server.
- name: 🤝 Guidance
url: https://roadmap.sh/discord
about: Join the community in our Discord server.

19
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,19 @@
#### What roadmap does this PR target?
- [ ] Code Change
- [ ] Frontend Roadmap
- [ ] Backend Roadmap
- [ ] DevOps Roadmap
- [ ] All Roadmaps
- [ ] Guides
#### Please acknowledge the items listed below
- [ ] I have discussed this contribution and got a go-ahead in an issue before opening this pull request.
- [ ] This is not a duplicate issue. I have searched and there is no existing issue for this.
- [ ] I understand that these roadmaps are highly opinionated. The purpose is to not to include everything out there in these roadmaps but to have everything that is most relevant today comparing to the other options listed.
- [ ] I have read the [contribution docs](../contributing) before opening this PR.
#### Enter the details about the contribution
<!-- Enter the details here -->

View File

@@ -1,21 +0,0 @@
name: Sends Daily AWS Costs to Slack
on:
# Allow manual Run
workflow_dispatch:
# Run at 7:00 UTC every day
schedule:
- cron: "0 7 * * *"
jobs:
aws_costs:
runs-on: ubuntu-latest
steps:
- name: Get Costs
env:
AWS_KEY: ${{ secrets.COST_AWS_ACCESS_KEY }}
AWS_SECRET: ${{ secrets.COST_AWS_SECRET_KEY }}
AWS_REGION: ${{ secrets.COST_AWS_REGION }}
SLACK_CHANNEL: ${{ secrets.SLACK_COST_CHANNEL }}
SLACK_TOKEN: ${{ secrets.SLACK_TOKEN }}
run: |
npm install -g aws-cost-cli
aws-cost -k $AWS_KEY -s $AWS_SECRET -r $AWS_REGION -S $SLACK_TOKEN -C $SLACK_CHANNEL

View File

@@ -1,50 +0,0 @@
name: Close PRs with Feedback
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
jobs:
close-pr:
runs-on: ubuntu-latest
steps:
- name: Close PR if it has label "feedback left" and no changes in 7 days
uses: actions/github-script@v3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { data: pullRequests } = await github.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
base: 'master',
});
for (const pullRequest of pullRequests) {
const { data: labels } = await github.issues.listLabelsOnIssue({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pullRequest.number,
});
const feedbackLabel = labels.find((label) => label.name === 'feedback left');
if (feedbackLabel) {
const lastUpdated = new Date(pullRequest.updated_at);
const sevenDaysAgo = new Date();
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
if (lastUpdated < sevenDaysAgo) {
await github.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pullRequest.number,
body: 'Closing this PR because there has been no activity for the past 7 days. Feel free to reopen if you have any feedback.',
});
await github.pulls.update({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pullRequest.number,
state: 'closed',
});
}
}
}

View File

@@ -1,16 +0,0 @@
name: Clears API Cloudfront Cache
on:
workflow_dispatch:
jobs:
aws_costs:
runs-on: ubuntu-latest
steps:
- name: Clear Cloudfront Caching
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GH_PAT }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/roadmapsh/infra-ansible/actions/workflows/playbook.yml/dispatches \
-d '{ "ref":"master", "inputs": { "playbook": "roadmap_web.yml", "tags": "cloudfront-api", "is_verbose": false } }'

View File

@@ -1,16 +0,0 @@
name: Clears Frontend Cloudfront Cache
on:
workflow_dispatch:
jobs:
aws_costs:
runs-on: ubuntu-latest
steps:
- name: Clear Cloudfront Caching
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GH_PAT }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/roadmapsh/infra-ansible/actions/workflows/playbook.yml/dispatches \
-d '{ "ref":"master", "inputs": { "playbook": "roadmap_web.yml", "tags": "cloudfront", "is_verbose": false } }'

31
.github/workflows/deploy.yml vendored Normal file
View File

@@ -0,0 +1,31 @@
name: Deployment to GitHub Pages
on:
push:
branches: [ master ]
env:
ROADMAP_GA_SECRET: ${{ secrets.GA_SECRET }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CI: true
NEXT_TELEMETRY_DISABLED: 1
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: 12
- name: Setup Environment
run: |
npm install -g yarn
yarn install
- name: Generate meta and builld
run: |
yarn meta
yarn build
- name: Deploy to GitHub Pages
run: |
git config user.email "kamranahmed.se@gmail.com"
git config user.name "Kamran Ahmed"
git remote set-url origin https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git
npm run deploy

View File

@@ -1,75 +0,0 @@
name: Deploy to EC2
on:
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 2
- uses: actions/setup-node@v4
with:
node-version: 20
- uses: pnpm/action-setup@v4.0.0
with:
version: 9
# -------------------
# Setup configuration
# -------------------
- name: Prepare configuration files
run: |
git clone https://${{ secrets.GH_PAT }}@github.com/roadmapsh/infra-config.git configuration --depth 1
- name: Copy configuration files
run: |
cp configuration/dist/github/developer-roadmap.env .env
# -----------------
# Prepare the Build
# -----------------
- name: Install Dependencies
run: |
pnpm install
- name: Generate Production Build
run: |
git clone https://${{ secrets.GH_PAT }}@github.com/roadmapsh/web-draw.git .temp/web-draw --depth 1
npm run generate-renderer
npm run compress:images
npm run build
# --------------------
# Deploy to EC2
# --------------------
- uses: webfactory/ssh-agent@v0.7.0
with:
ssh-private-key: ${{ secrets.EC2_PRIVATE_KEY }}
- name: Deploy Application to EC2
run: |
rsync -apvz --delete --no-times --exclude "configuration" -e "ssh -o StrictHostKeyChecking=no" -p ./ ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }}:/var/www/roadmap.sh/
- name: Restart PM2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script: |
cd /var/www/roadmap.sh
sudo pm2 restart web-roadmap
# ----------------------
# Clear cloudfront cache
# ----------------------
- name: Clear Cloudfront Caching
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GH_PAT }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/roadmapsh/infra-ansible/actions/workflows/playbook.yml/dispatches \
-d '{ "ref":"master", "inputs": { "playbook": "roadmap_web.yml", "tags": "cloudfront", "is_verbose": false } }'

View File

@@ -1,40 +0,0 @@
name: Label Issue
on:
issues:
types: [ opened, edited ]
jobs:
label-topic-change-issue:
runs-on: ubuntu-latest
steps:
- name: Add Labels To Issue
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const issue = context.payload.issue;
const roadmapUrl = issue.body.match(/https?:\/\/roadmap.sh\/[^ ]+/);
// if the issue is labeled as a topic-change, add the roadmap slug as a label
if (issue.labels.some(label => label.name === 'topic-change')) {
if (roadmapUrl) {
const roadmapSlug = new URL(roadmapUrl[0]).pathname.replace(/\//, '');
github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
labels: [roadmapSlug]
});
}
// Close the issue if it has no roadmap URL
if (!roadmapUrl) {
github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
state: 'closed'
});
}
}

View File

@@ -1,52 +0,0 @@
name: Refresh Roadmap Content JSON
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
jobs:
refresh-content:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup pnpm@v9
uses: pnpm/action-setup@v4
with:
version: 9
run_install: false
- name: Setup Node.js Version 20 (LTS)
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install Dependencies and Generate Content JSON
run: |
pnpm install
npm run generate:roadmap-content-json
- name: Create PR
uses: peter-evans/create-pull-request@v7
with:
delete-branch: false
branch: "chore/update-content-json"
base: "master"
labels: |
dependencies
automated pr
reviewers: kamranahmedse
commit-message: "chore: update roadmap content json"
title: "Updated Roadmap Content JSON - Automated"
body: |
## Updated Roadmap Content JSON
> [!IMPORTANT]
> This PR Updates the Roadmap Content JSON files stored in the `public` directory.
>
> Commit: ${{ github.sha }}
> Workflow Path: ${{ github.workflow_ref }}
**Please Review the Changes and Merge the PR if everything is fine.**

View File

@@ -1,51 +0,0 @@
name: Upgrade Dependencies
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * 0'
jobs:
upgrade-deps:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js Version 20 (LTS)
uses: actions/setup-node@v4
with:
node-version: 20
- name: Setup pnpm@v9
uses: pnpm/action-setup@v4
with:
version: 9
- name: Install & Upgrade Dependencies
run: |
pnpm install
npm run upgrade
pnpm install --lockfile-only
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
with:
delete-branch: false
branch: "update-deps"
base: "master"
labels: |
dependencies
automated pr
reviewers: kamranahmedse
commit-message: "chore: update dependencies to latest"
title: "Upgrade Dependencies To Latest - Automated"
body: |
## Updated all Dependencies to Latest Versions.
> [!IMPORTANT]
> This PR Upgrades the Dependencies to the Latest Their Versions.
>
> Commit: ${{ github.sha }}
> Workflow Path: ${{ github.workflow_ref }}
**Please Review the Changes and Merge the PR if everything is fine.**

48
.gitignore vendored
View File

@@ -1,36 +1,14 @@
.idea
.temp
.astro
# build output
dist/
.output/
# dependencies
node_modules/
scripts/developer-roadmap
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
_*
Thumbs.db
.DS_Store
/test-results/
/playwright-report/
/playwright/.cache/
tests-examples
*.csv
/editor/*
!/editor/readonly-editor.tsx
!/editor/renderer/renderer.ts
!/editor/renderer/index.tsx
.idea
.next
out
.env
build
node_modules
yarn-error.log
*.sublime-project
*.sublime-workspace
config/*.json
!config/dev.json

2
.npmrc
View File

@@ -1,2 +0,0 @@
auto-install-peers=true
strict-peer-dependencies=false

View File

@@ -1,7 +0,0 @@
app-dist
dist
.idea
.github
public
node_modules
pnpm-lock.yaml

View File

@@ -1,18 +0,0 @@
module.exports = {
semi: true,
singleQuote: true,
overrides: [
{
files: '*.astro',
options: {
parser: 'astro',
singleQuote: true,
jsxSingleQuote: true,
},
},
],
plugins: [
require.resolve('prettier-plugin-astro'),
'prettier-plugin-tailwindcss',
],
};

View File

@@ -1,4 +0,0 @@
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}

11
.vscode/launch.json vendored
View File

@@ -1,11 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}

View File

@@ -1,6 +0,0 @@
{
"prettier.documentSelectors": ["**/*.astro"],
"[astro]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}

76
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,76 @@
# Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to make participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies within all project spaces, and it also applies when
an individual is representing the project or its community in public spaces.
Examples of representing a project or community include using an official
project e-mail address, posting via an official social media account, or acting
as an appointed representative at an online or offline event. Representation of
a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at <kamranahmed.se@gmail.com>. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

20
LICENSE Normal file
View File

@@ -0,0 +1,20 @@
The codebase in this repository is covered under BSD 4-Clause license and
the content with CC BY-NC-ND 3.0 with additional clauses
Everything including text and images in this project are protected by the copyright laws.
You are allowed to use this material for personal use but are not allowed to use it for
any other purpose including publishing the images, the project files or the content in the
images in any form either digital, non-digital, textual, graphical or written formats.
You are allowed to share the links to the repository or the website roadmap.sh but not
the content for any sort of usage that involves the content of this repository taken out
of the repository and be shared from any other medium including but not limited to blog
posts, articles, newsletters, you must get prior consent from the understated.
Copyright © 2021 Kamran Ahmed <kamranahmed.se@gmail.com>
Please note that I am really flexible with allowing the usage of the content in this
repository. If you reach out to me with a brief detail of why and how you would like
to use this content, there is a good chance that I will allow you to use it. The reason
behind this strictness in the license is to stop the people who have been using these
roadmaps in ill manners e.g. ripping people off with suggesting random affiliate links,
redistributing these roadmaps just for the sake of monetizing the traffic.

View File

@@ -1,60 +0,0 @@
// https://astro.build/config
import sitemap from '@astrojs/sitemap';
import tailwind from '@astrojs/tailwind';
import node from '@astrojs/node';
import { defineConfig } from 'astro/config';
import rehypeExternalLinks from 'rehype-external-links';
import { serializeSitemap, shouldIndexPage } from './sitemap.mjs';
import react from '@astrojs/react';
// https://astro.build/config
export default defineConfig({
site: 'https://roadmap.sh/',
markdown: {
shikiConfig: {
theme: 'dracula',
},
rehypePlugins: [
[
rehypeExternalLinks,
{
target: '_blank',
rel: function (element) {
const href = element.properties.href;
const whiteListedStarts = [
'/',
'#',
'mailto:',
'https://github.com/kamranahmedse',
'https://thenewstack.io',
'https://kamranahmed.info',
'https://roadmap.sh',
];
if (whiteListedStarts.some((start) => href.startsWith(start))) {
return [];
}
return 'noopener noreferrer nofollow';
},
},
],
],
},
output: 'hybrid',
adapter: node({
mode: 'standalone',
}),
trailingSlash: 'never',
integrations: [
tailwind({
config: {
applyBaseStyles: false,
},
}),
sitemap({
filter: shouldIndexPage,
serialize: serializeSitemap,
}),
react(),
],
});

View File

@@ -1,76 +0,0 @@
# Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to make participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or
advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies within all project spaces, and it also applies when
an individual is representing the project or its community in public spaces.
Examples of representing a project or community include using an official
project e-mail address, posting via an official social media account, or acting
as an appointed representative at an online or offline event. Representation of
a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at <kamranahmed.se@gmail.com>. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

View File

@@ -0,0 +1,22 @@
import { AboutHeaderWrap } from './style';
import siteConfig from "content/site";
const AboutHeader = () => (
<AboutHeaderWrap>
<div className="container container-small">
<div className="author-info">
<img className='author-img d-none d-sm-none d-md-block d-lg-block d-xl-block' src="/kamran.jpeg" />
<div className="author-msg">
<h1>Hello, I'm Kamran Ahmed.</h1>
<p>I created <span className='flow-black'>roadmap.sh</span> to help developers find their path if they are confused and help them grow in their career.</p>
<div className="author-links">
<a href={`https://twitter.com/${siteConfig.twitter}`} target="_blank">@kamranahmedse</a>
<a href="mailto:kamran@roadmap.sh">kamran@roadmap.sh</a>
</div>
</div>
</div>
</div>
</AboutHeaderWrap>
);
export default AboutHeader;

View File

@@ -0,0 +1,49 @@
import styled from 'styled-components';
export const AboutHeaderWrap = styled.div`
text-align: left;
padding: 70px 0;
margin: 0 auto;
.author-info {
display: flex;
align-items: center;
flex-direction: row;
}
h1 {
font-weight: 700;
}
p {
font-size: 20px;
color: #333;
font-weight: 400;
margin-bottom: 0;
line-height: 35px;
}
a {
font-weight: 700;
color: #000;
}
.author-img {
height: 160px;
margin-right: 25px;
margin-top: 8px;
border-radius: 9px;
}
.author-links a {
display: inline-block;
margin-right: 5px;
background: #2d2d2d;
color: white;
padding: 5px 10px;
font-weight: 500;
margin-top: 12px;
border-radius: 5px;
text-decoration: none;
}
`;

View File

@@ -0,0 +1,54 @@
import styled from 'styled-components';
export const BadgesList = styled.p`
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 0;
`;
export const PrimaryBadge = styled.span`
font-size: 11px;
font-weight: 600;
background: #2929ff;
color: white;
padding: 2px 8px;
border-radius: 4px;
text-transform: uppercase;
display: inline-flex;
align-items: center;
justify-content: center;
margin-left: 10px;
svg {
height: 11px !important;
margin-right: 5px;
&.fa-clock {
height: 10px !important;
}
}
`;
export const SecondaryBadge = styled(PrimaryBadge)`
background: #696969;
color: white;
`;
export const InfoBadge = styled(PrimaryBadge)`
background: #039640;
color: white;
`;
export const DarkBadge = styled(PrimaryBadge)`
background: #101010;
color: white;
`;
export const BadgeLink = styled.a`
text-decoration: none;
&:hover {
text-decoration:none;
}
`;

View File

@@ -0,0 +1,133 @@
import { useState } from 'react';
import classNames from 'classnames';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faFacebookSquare, faTwitterSquare, faRedditSquare, faGithubSquare } from '@fortawesome/free-brands-svg-icons'
import {
PageHeader,
RoadmapMeta,
ShareRoadmap,
Sidebar,
Summary,
SummaryContainer,
MobileNavHeader,
SidebarButton,
MobileSidebar,
MobileSidebarWrap,
DesktopSidebarWrap,
PageTitle,
PageDetail
} from './style';
import { faBars } from '@fortawesome/free-solid-svg-icons'
import { getFacebookShareUrl } from 'lib/url';
import { ShareIcon } from 'components/share-icon';
import { getRedditShareUrl, getTwitterShareUrl } from 'lib/url';
import siteConfig from "content/site";
import MdRenderer from 'components/md-renderer';
const DetailedRoadmap = ({ roadmap }) => {
const [menuActive, setMenuState] = useState(false);
const {
sidebar = {},
page: currentPage = {},
author = {}
} = roadmap;
const roadmapPages = Object.keys(sidebar || {}).map((groupTitle, groupCounter) => {
if (groupTitle.startsWith('_')) {
return;
}
// @todo remove it after completing the frontend roadmap
const isInProgress = groupCounter !== 0;
return (
<div className={`links-group ${isInProgress ? 'in-progress' : ''}`} key={groupTitle}>
<h3>
{ groupTitle }
{ isInProgress && <span className='badge badge-warning progress-badge'>In Progress</span> }
</h3>
<ul>
{ sidebar[groupTitle].map(page => {
const isActivePage = page.url === currentPage.url;
// e.g. /frontend should mark `/frontend/landscape` as active
const isSummaryPage = page.url === `${currentPage.url}/summary`;
return (
<li className={classNames({ active: isActivePage || isSummaryPage })} key={page.url}>
<a href={ page.url }>
<span className="bullet"></span>
{ page.title }
</a>
</li>
);
}) }
</ul>
</div>
);
});
const filePath = currentPage.path.replace(/^\//, '');
const RoadmapContent = require(`../../content/${filePath}`).default;
return (
<SummaryContainer>
<PageHeader className="border-top border-bottom text-center text-md-left">
<div className="container d-flex align-items-center flex-column flex-md-row">
<RoadmapMeta>
<h3>{ roadmap.title }</h3>
<p>
Roadmap contributed by <a href={ author.url } target="_blank">{ author.name }</a>
{ roadmap.contributorsCount > 1 && ` and <a href="${roadmap.contributorsUrl}">${roadmap.contributorsCount} others</a>`}
</p>
</RoadmapMeta>
<ShareRoadmap className="mt-2 mt-md-0">
<ShareIcon href={ siteConfig.url.repo } target="_blank">
<FontAwesomeIcon icon={ faGithubSquare } />
</ShareIcon>
<ShareIcon href={ getFacebookShareUrl({ text: roadmap.title, url: roadmap.url }) } target="_blank">
<FontAwesomeIcon icon={ faFacebookSquare } />
</ShareIcon>
<ShareIcon href={ getTwitterShareUrl({ text: roadmap.title, url: roadmap.url }) } target="_blank">
<FontAwesomeIcon icon={ faTwitterSquare } />
</ShareIcon>
<ShareIcon href={ getRedditShareUrl({ text: roadmap.title, url: roadmap.url }) } target="_blank">
<FontAwesomeIcon icon={ faRedditSquare } />
</ShareIcon>
</ShareRoadmap>
</div>
</PageHeader>
<MobileNavHeader className="border-bottom d-block d-md-none">
<div className="container">
<SidebarButton onClick={() => setMenuState((prevMenuActive) => !prevMenuActive)}>
<FontAwesomeIcon icon={ faBars } />
{ currentPage.title }
</SidebarButton>
</div>
<MobileSidebarWrap className={classNames({ visible: menuActive })}>
<div className="container">
<MobileSidebar>
{ roadmapPages }
</MobileSidebar>
</div>
</MobileSidebarWrap>
</MobileNavHeader>
<Summary className="container">
<DesktopSidebarWrap className="d-none d-md-block">
<Sidebar>
{ roadmapPages }
</Sidebar>
</DesktopSidebarWrap>
<PageDetail>
<PageTitle>{ currentPage.title }</PageTitle>
<MdRenderer>
<RoadmapContent />
</MdRenderer>
</PageDetail>
</Summary>
</SummaryContainer>
)
};
export default DetailedRoadmap;

View File

@@ -0,0 +1,199 @@
import styled from 'styled-components';
export const SummaryContainer = styled.div``;
export const Summary = styled.div`
text-align: left;
min-height: 400px;
display: flex;
.container {
position: relative;
}
`;
export const PageHeader = styled.div`
padding-top: 20px;
padding-bottom: 20px;
h3 {
margin-bottom: 4px;
font-weight: 600;
font-size: 21px;
}
p {
margin-bottom: 0;
font-size: 14px;
color: #696969;
a {
color: #101010;
}
}
`;
export const RoadmapMeta = styled.div`
flex: 1;
`;
export const ShareRoadmap = styled.div`
display: flex;
align-items: center;
a {
margin-bottom: 0;
& + a {
margin-left: 5px;
}
}
`;
export const MobileNavHeader = styled.div`
padding: 10px 0;
display: flex;
align-items: center;
position: relative;
`;
export const SidebarButton = styled.button`
background: transparent;
border: none !important;
box-shadow: none !important;
outline: none !important;
-webkit-appearance: none;
display: flex;
align-items: center;
svg {
margin-right: 10px;
}
`;
export const PageDetail = styled.div`
padding: 25px 0 100px;
`;
export const PageTitle = styled.h1`
font-size: 40px;
font-weight: 700;
`;
export const Sidebar = styled.div`
padding-bottom: 150px;
ul {
list-style: none;
margin: 0;
padding: 0;
}
.bullet {
display: inline-block;
margin-right: 7px;
width: 7px;
height: 7px;
min-width: 7px;
border-radius: 100%;
background: #efefef;
transform: translateX(-4px);
transition: background 0.5s ease;
}
.links-group {
padding: 30px 0 10px;
width: 260px;
h3 {
font-size: 12px;
font-weight: 600;
text-transform: uppercase;
padding-left: 20px;
}
}
.progress-badge {
position: relative;
top: -2px;
margin-left: 5px;
}
.links-group.in-progress {
opacity: 0.3;
}
.links-group li {
list-style: none;
margin: 7px 0;
a {
font-size: 14px;
font-weight: normal;
color: #696969;
}
.bullet {
display: inline-block;
margin-right: 12px;
width: 7px;
height: 7px;
min-width: 7px;
border-radius: 100%;
background: #efefef;
transform: translateX(-4px);
transition: background 0.5s ease;
}
&.active a {
color: #101010;
}
&.active .bullet {
background: #101010;
}
}
`;
export const DesktopSidebarWrap = styled.div`
border-left: 1px solid #efefef;
${Sidebar} {
position: sticky;
top: 0;
background: white;
}
`;
export const MobileSidebarWrap = styled.div`
position: absolute;
z-index: 999;
background: white;
width: 100%;
left: 0;
bottom: 100%;
overflow-y: scroll;
box-shadow: rgba(0, 0, 0, 0.1) 0 10px 20px;
top: calc(100% + 1px);
transition: bottom 0.5s ease 0s;
&.visible {
bottom: -50vh;
}
`;
export const MobileSidebar = styled(Sidebar)`
border-left: 1px solid #efefef;
margin-left: 12px;
padding-bottom: 20px;
.links-group {
width: auto;
}
.progress-badge {
position: relative;
top: -2px;
margin-left: 5px;
}
`;

View File

@@ -0,0 +1,16 @@
import { FaqContainer } from './style';
import MdRenderer from 'components/md-renderer';
const AboutPage = require(`../../content/pages/about.md`).default;
const FaqList = () => (
<FaqContainer className='border-top bg-light'>
<div className="container container-small">
<MdRenderer>
<AboutPage />
</MdRenderer>
</div>
</FaqContainer>
);
export default FaqList;

View File

@@ -0,0 +1,25 @@
import styled from 'styled-components';
export const FaqContainer = styled.div`
padding: 40px 0;
h4 {
margin-top: 30px;
font-weight: 700;
}
h4:first-child {
margin-top: 0;
}
p {
color: #333;
}
p:last-child {
margin-bottom: 0;
}
.container {
}
`;

View File

@@ -0,0 +1,25 @@
import Link from 'next/link';
import { FeaturedContentWrap } from './style';
import FeaturedGuide from 'components/featured-guide';
import { getFeaturedGuides } from 'lib/guide';
const FeaturedGuides = () => (
<FeaturedContentWrap className="featured-content-wrap">
<div className="container">
<p className='border-through featured-separator'>
<span>
Guides mostly visited by the community&nbsp;
<a href="/guides" className="dark-link d-none d-sm-none d-md-inline d-xl-inline">View all Guides &rarr;</a>
</span>
</p>
<div className="swim-lane row">
{ getFeaturedGuides()
.map(guide => (
<FeaturedGuide guide={ guide } key={ guide.url } />
)) }
</div>
</div>
</FeaturedContentWrap>
);
export default FeaturedGuides;

View File

@@ -0,0 +1,16 @@
import { FeaturedWrap } from './style';
import FeaturedGuides from './guides';
import FeaturedRoadmaps from './roadmaps';
const FeaturedContent = (props) => (
<FeaturedWrap className="border-top bg-light">
<FeaturedRoadmaps />
<FeaturedGuides />
</FeaturedWrap>
);
FeaturedContent.defaultProps = {
className: '',
};
export default FeaturedContent;

View File

@@ -0,0 +1,27 @@
import { FeaturedContentWrap } from './style';
import roadmaps from 'content/roadmaps';
import FeaturedRoadmap from 'components/featured-roadmap';
const FeaturedRoadmaps = () => (
<FeaturedContentWrap className="featured-content-wrap">
<div className="container">
<div className="featured-head">
<p className="border-through featured-separator">
<span>
Roadmaps mostly visited by the community&nbsp;
<a href='/roadmaps' className="dark-link d-none d-sm-none d-md-inline d-xl-inline">View all Roadmaps &rarr;</a>
</span>
</p>
</div>
<div className="swim-lane row">
{ roadmaps
.filter(({ featured }) => featured)
.map(roadmap => (
<FeaturedRoadmap roadmap={ roadmap } key={ roadmap.url } />
)) }
</div>
</div>
</FeaturedContentWrap>
);
export default FeaturedRoadmaps;

View File

@@ -0,0 +1,110 @@
import styled from 'styled-components';
export const FeaturedWrap = styled.div`
padding: 30px 0 50px;
`;
export const FeaturedContentWrap = styled.div`
.featured-head {
text-align: center;
display: block;
h3 {
font-weight: 700;
font-size: 35px;
margin-bottom: 30px;
}
}
.featured-separator {
font-size: 16px;
margin-bottom: 40px;
margin-top: 25px;
color: #999;
span {
background: #f8f9fa;
}
a {
background: black;
color: white;
padding: 3px 8px;
border-radius: 6px;
font-size: 14px;
text-decoration: none;
margin-left: 5px;
}
}
.swim-lane {
.featured-block {
}
}
.guide-item {
border-bottom: 1px solid #dee2e6;
padding: 15px 10px;
p {
margin-bottom: 0;
font-size: 15px;
color: #999;
}
&:last-child {
border-bottom: none;
}
}
.journey-block {
a {
border: 1px solid #f7f7f7;
display: block;
text-decoration: none;
color: #000000;
background: #ffffff;
box-shadow: rgba(0, 0, 0, 0.12) 0 5px 10px;
transition: box-shadow 0.2s ease 0s;
cursor: pointer;
margin-bottom: 32px;
border-radius: 0 0 10px 10px;
&:hover {
box-shadow: rgba(0, 0, 0, 0.12) 0 30px 60px;
img {
filter: grayscale(0);
}
}
}
.journey-meta {
padding: 18px 25px 20px;
h4 {
line-height: 27px;
font-weight: 600;
margin-bottom: 0;
font-size: 18px;
white-space: nowrap;
text-overflow: ellipsis;
flex: 0 0 auto;
overflow: hidden;
}
p {
font-size: 15px;
line-height: 25px;
color: #999999;
margin-bottom: 0;
}
}
img {
width: 100%;
filter: grayscale(1);
border-radius: 10px 10px 0 0;
}
}
`;

View File

@@ -0,0 +1,25 @@
import formatDate from 'date-fns/format';
import { Author, AuthorImage, AuthorName, BlockLink, BlockMeta, BlockSubtitle, BlockTitle, PublishDate } from './style';
import { findByUsername } from 'lib/author';
const FeaturedGuide = ({ guide }) => {
const author = findByUsername(guide.author) || {};
return (
<div className='col-xl-4 col-lg-6 col-md-6 col-sm-12 col-12 grid-item-container'>
<BlockLink href={guide.url}>
<BlockTitle>{guide.title}</BlockTitle>
<BlockSubtitle>{guide.featuredDescription || guide.description}</BlockSubtitle>
<BlockMeta>
<Author>
<AuthorImage src={author.picture} />
<AuthorName>{author.name}</AuthorName>
</Author>
<PublishDate>{formatDate(new Date(guide.createdAt), 'MMMM d, yyyy')}</PublishDate>
</BlockMeta>
</BlockLink>
</div>
);
};
export default FeaturedGuide;

View File

@@ -0,0 +1,65 @@
import styled from 'styled-components';
export const BlockLink = styled.a`
border: 1px solid #f7f7f7;
display: block;
text-decoration: none;
color: #000000;
background: #ffffff;
padding: 25px 25px 22px;
border-radius: 10px;
box-shadow: rgba(0, 0, 0, 0.12) 0 5px 10px;
transition: box-shadow 0.2s ease 0s;
cursor: pointer;
margin-bottom: 32px;
&:hover {
text-decoration: none;
color: #000000;
box-shadow: rgba(0, 0, 0, 0.12) 0 30px 60px;
}
`;
export const BlockTitle = styled.h4`
line-height: 27px;
font-weight: 600;
font-size: 22px;
white-space: nowrap;
text-overflow: ellipsis;
flex: 0 0 auto;
overflow: hidden;
`;
export const BlockSubtitle = styled.p`
font-size: 15px;
line-height: 25px;
color: #999999;
margin-bottom: 0;
`;
export const BlockMeta = styled.div`
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 19px;
`;
export const PublishDate = styled.time`
font-size: 13px;
color: #999;
`;
export const Author = styled.div`
display: flex;
align-items: center;
font-size: 15px;
color: #999;
`;
export const AuthorImage = styled.img`
height: 22px;
width: 22px;
border-radius: 100%;
margin-right: 10px;
`;
export const AuthorName = styled.div``;

View File

@@ -0,0 +1,12 @@
import { BlockLink, BlockSubtitle, BlockTitle } from './style';
const FeaturedRoadmap = ({ roadmap }) => (
<div className='col-xl-4 col-lg-4 col-md-6 col-sm-12 col-12 grid-item-container'>
<BlockLink href={roadmap.url}>
<BlockTitle>{roadmap.title}</BlockTitle>
<BlockSubtitle>{roadmap.featuredDescription || roadmap.description}</BlockSubtitle>
</BlockLink>
</div>
);
export default FeaturedRoadmap;

View File

@@ -0,0 +1,38 @@
import styled from 'styled-components';
export const BlockLink = styled.a`
border: 1px solid #f7f7f7;
display: block;
text-decoration: none;
color: #000000;
background: #ffffff;
padding: 26px 25px 25px;
border-radius: 10px;
box-shadow: rgba(0, 0, 0, 0.12) 0 5px 10px;
transition: box-shadow 0.2s ease 0s;
cursor: pointer;
margin-bottom: 32px;
&:hover {
text-decoration: none;
color: #000000;
box-shadow: rgba(0, 0, 0, 0.12) 0 30px 60px;
}
`;
export const BlockTitle = styled.h4`
line-height: 27px;
font-weight: 600;
font-size: 22px;
white-space: nowrap;
text-overflow: ellipsis;
flex: 0 0 auto;
overflow: hidden;
`;
export const BlockSubtitle = styled.p`
font-size: 15px;
line-height: 25px;
color: #999999;
margin-bottom: 0;
`;

View File

@@ -0,0 +1,23 @@
import MdRenderer from 'components/md-renderer'
import SharePage from 'components/share-page';
import { GuideBodyWrap } from './style';
const GuideBody = ({ guide }) => {
const GuideContent = require(`../../content/guides/${guide.fileName}.md`).default;
return (
<GuideBodyWrap>
<MdRenderer>
<GuideContent />
{
guide.author && <SharePage
title={ guide.title }
url={ guide.url }
twitterUsername={ guide.author.twitter }
/>
}
</MdRenderer>
</GuideBodyWrap>
);
};
export default GuideBody;

View File

@@ -0,0 +1,13 @@
import styled from 'styled-components';
export const GuideBodyWrap = styled.div`
position: relative;
max-width: 750px;
margin: 0 auto;
padding: 0 20px;
min-height: 300px;
p:first-child, h1, h2, h3, h4, h5, h6, img, blockquote {
margin-top: 0;
}
`;

View File

@@ -0,0 +1,83 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faFacebookSquare, faGithub, faHackerNewsSquare, faRedditSquare, faTwitter, faTwitterSquare } from '@fortawesome/free-brands-svg-icons'
import { getContributionUrl } from "lib/guide";
import {
getTwitterUrl,
getTwitterShareUrl,
getFacebookShareUrl,
getRedditShareUrl,
getHnShareUrl
} from "lib/url";
import {
AuthorBio,
AuthorImg,
AuthorInfoWrap,
AuthorMeta,
ContributeIcon,
FooterBg,
FooterContainer,
FooterWrap,
ShareIcons,
ShareWrap
} from './style';
const GuideFooter = ({
guide,
guide: {
author = {}
} = {}
}) => (
<FooterWrap>
<FooterBg className="border-top">
<FooterContainer>
<ShareWrap>
<ContributeIcon>
<a href={ getContributionUrl(guide) } target="_blank">
<span className="d-none d-sm-none d-md-inline d-lg-inline d-xl-inline">Improve this Guide </span>
<span className="d-inline d-sm-inline d-md-none d-lg-none d-xl-none">Contribute </span>
<FontAwesomeIcon icon={faGithub}/>
</a>
</ContributeIcon>
<ContributeIcon hasMargins>
<a href={ getTwitterUrl(author.twitter) } target="_blank">
<span className="d-none d-sm-none d-md-inline d-lg-inline d-xl-inline">Follow the author </span>
<span className="d-inline d-sm-inline d-md-none d-lg-none d-xl-none">Author </span>
<FontAwesomeIcon icon={faTwitter}/>
</a>
</ContributeIcon>
<ShareIcons>
<span className="d-none d-sm-none d-md-none d-lg-inline d-xl-inline">Help spread the word</span>
<span className="d-inline d-sm-inline d-md-inline d-lg-none d-xl-none">Share</span>
<a href={ getTwitterShareUrl({ text: `${guide.title} by @${author.twitter}`, url: guide.url })} target="_blank">
<FontAwesomeIcon icon={faTwitterSquare}/>
</a>
<a href={ getFacebookShareUrl({ text: guide.title, url: guide.url }) } target="_blank">
<FontAwesomeIcon icon={faFacebookSquare}/>
</a>
<a href={ getRedditShareUrl({ text: guide.title, url: guide.url })} target="_blank">
<FontAwesomeIcon icon={faRedditSquare}/>
</a>
<a href={ getHnShareUrl({ text: guide.title, url: guide.url })} target="_blank">
<FontAwesomeIcon icon={faHackerNewsSquare}/>
</a>
</ShareIcons>
</ShareWrap>
</FooterContainer>
</FooterBg>
<FooterBg className="border-top">
<FooterContainer>
<AuthorInfoWrap>
<AuthorImg src={ author.picture } alt={ author.name }/>
<AuthorMeta>
<h4><a href={ getTwitterUrl(author.twitter) } target="_blank">{ author.name }</a></h4>
<AuthorBio>{ author.bio }</AuthorBio>
</AuthorMeta>
</AuthorInfoWrap>
</FooterContainer>
</FooterBg>
</FooterWrap>
);
export default GuideFooter;

View File

@@ -0,0 +1,123 @@
import styled from 'styled-components';
export const FooterWrap = styled.div`
display: block;
margin-top: 50px;
`;
export const FooterContainer = styled.div`
max-width: 750px;
margin: 0 auto;
padding: 0 20px;
`;
export const FooterBg = styled.div`
`;
export const ShareWrap = styled.div`
padding: 17px 0px;
align-items: center;
justify-content: center;
display: flex;
a {
display: flex;
align-items: center;
color: #101010;
svg {
height: 18px !important;
width: 18px !important;
color: #757575;
margin-left: 7px;
transition: all 0.2s ease;
}
&:hover {
svg {
color: #101010;
}
}
}
`;
export const ContributeIcon = styled.div`
display: flex;
align-items: center;
justify-content: center;
margin: ${props => props.hasMargins ? '0 30px' : '0'};
span {
margin-right: 4px;
}
a {
color: #757575;
font-size: 14px;
transition: all 0.2s ease;
&:hover {
color: #101010;
}
}
`;
export const ShareIcons = styled.div`
display: flex;
align-items: center;
color: #757575;
font-size: 14px;
span {
margin-right: 4px;
}
`;
export const AuthorInfoWrap = styled.div`
display: flex;
align-items: center;
padding: 40px 0;
h4 {
position: relative;
font-size: 22px;
margin: 10px 0;
line-height: 17px;
a {
font-weight: 700;
color: #101010;
}
}
.author-description {
margin-bottom: 14px;
}
`;
export const AuthorBio = styled.p`
font-size: 15px;
line-height: 24px;
color: #757575;
margin-bottom: 0;
a {
font-weight: 500;
}
`;
export const AuthorImg = styled.img`
border-radius: 100%;
height: 100px !important;
width: 100px !important;
margin-right: 22px;
display: block;
`;
export const AuthorMeta = styled.div`
display: flex;
justify-content: center;
flex-direction: column;
flex: 1;
`;

View File

@@ -0,0 +1,57 @@
import formatDate from 'date-fns/format'
import {
ActionItems,
AuthorImage,
EditGuide,
GuideAuthor,
GuideDate,
GuideMeta,
GuideSubtitle,
GuideTitle,
HeaderWrap,
} from './style';
import { getContributionUrl } from "lib/guide";
import { getTwitterUrl } from "lib/url";
import { faClock, faEnvelope, faArrowLeft } from '@fortawesome/free-solid-svg-icons';
import { BadgeLink, BadgesList, PrimaryBadge, SecondaryBadge, DarkBadge } from 'components/badges';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
const GuideHeader = ({
guide,
guide: {
author = {}
} = {}
}) => (
<HeaderWrap className="border-bottom">
<GuideMeta>
<GuideAuthor href={ getTwitterUrl(author.twitter) } target="_blank">
<AuthorImage src={ author.picture } />
{ author.name }
</GuideAuthor>
&middot;
<GuideDate>{ formatDate(new Date(guide.createdAt), 'EEEE, MMMM d yyyy') }</GuideDate>
&middot;
<EditGuide href={ getContributionUrl(guide) } target="_blank">Improve this Guide</EditGuide>
</GuideMeta>
<GuideTitle>{ guide.title }</GuideTitle>
<GuideSubtitle>{ guide.description }</GuideSubtitle>
<ActionItems>
<BadgesList className="mt-4">
<BadgeLink href="/guides">
<SecondaryBadge>
<FontAwesomeIcon icon={faArrowLeft}/>
Other Guides
</SecondaryBadge>
</BadgeLink>
<BadgeLink href="/signup">
<PrimaryBadge>
<FontAwesomeIcon icon={faEnvelope}/>
Send me Updates
</PrimaryBadge>
</BadgeLink>
</BadgesList>
</ActionItems>
</HeaderWrap>
);
export default GuideHeader;

View File

@@ -0,0 +1,54 @@
import styled from 'styled-components';
export const HeaderWrap = styled.div`
padding: 80px 15px 45px;
text-align: center;
margin-bottom: 35px;
`;
export const GuideTitle = styled.h1`
font-weight: 700;
font-size: 46px;
margin: 12px 0;
`;
export const GuideSubtitle = styled.p`
margin-bottom: 0;
font-size: 16px;
color: #444;
`;
export const GuideMeta = styled.p`
margin-bottom: 0;
color: #757575;
font-size: 13px;
font-weight: 400;
`;
export const GuideDate = styled.span`
margin-left: 7px;
margin-right: 7px;
`;
export const GuideAuthor = styled.a`
margin-right: 7px;
font-weight: 500;
color: #101010;
&:hover {
color: #101010;
}
`;
export const AuthorImage = styled.img`
width: 22px;
height: 22px;
border-radius: 100%;
margin-right: 10px;
`;
export const EditGuide = styled.a`
margin-left: 7px;
`;
export const ActionItems = styled.div``;

View File

@@ -0,0 +1,74 @@
import NextHead from 'next/head';
import siteConfig from 'content/site';
const prepareTitle = (givenTitle) => {
return givenTitle || siteConfig.title;
};
const prepareDescription = (givenDescription) => {
return givenDescription || siteConfig.description;
};
// noinspection JSUnresolvedLibraryURL
const Helmet = (props) => (
<NextHead>
<meta charSet='UTF-8' />
<title>{ prepareTitle(props.title) }</title>
<meta name='description' content={ prepareDescription(props.description) } />
<meta name="author" content={ siteConfig.author } />
<meta name="keywords" content={ props.keywords ? props.keywords.join(',') : siteConfig.keywords.join(',') } />
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0, maximum-scale=3.0, minimum-scale=1.0" />
{ props.canonical && <link rel="canonical" href={ props.canonical } /> }
<meta httpEquiv="Content-Language" content="en" />
<meta property="og:title" content={ prepareTitle(props.title) } />
<meta property="og:description" content={ prepareDescription(props.description) } />
<meta property="og:image" content={ `${siteConfig.url.web}${siteConfig.logoSquare}` } />
<meta property="og:url" content={ siteConfig.url.web } />
<meta property="og:type" content="website" />
<meta property="article:publisher" content={ `https://facebook.com/${siteConfig.facebook}` } />
<meta property="og:site_name" content={ siteConfig.name } />
<meta property="article:author" content={ siteConfig.author } />
<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content={ `@${siteConfig.twitter}` } />
<meta name="twitter:title" content={ prepareTitle(props.title) } />
<meta name="twitter:description" content={ prepareDescription(props.description) } />
<meta name="twitter:image" content={ `${siteConfig.url.web}${siteConfig.logoSquare}` } />
<meta name="twitter:image:alt" content="roadmap.sh" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="apple-touch-icon" sizes="180x180" href="/manifest/apple-touch-icon.png" />
<meta name="msapplication-TileColor" content="#101010" />
<meta name="theme-color" content="#848a9a" />
<link rel="manifest" href="/manifest/manifest.json" />
<link rel="icon" type="image/png" sizes="32x32" href="/manifest/icon32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/manifest/icon16.png" />
<link rel="shortcut icon" href="/manifest/favicon.ico" type="image/x-icon" />
<link rel="icon" href="/manifest/favicon.ico" type="image/x-icon" />
{ /* Global Site Tag (gtag.js) - Google Analytics */ }
{ process.env.GA_SECRET && (
<>
<script async src={ `https://www.googletagmanager.com/gtag/js?id=${process.env.GA_SECRET}` } />
<script dangerouslySetInnerHTML={{
__html: `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '${process.env.GA_SECRET}');
`,
}} />
</>
)}
</NextHead>
);
export default Helmet;

View File

@@ -0,0 +1,13 @@
import Link from 'next/link';
import { HeroSectionWrap } from './style';
const HeroSection = () => (
<HeroSectionWrap>
<div className="container">
<h1>Developer Roadmaps</h1>
<p>Community driven roadmaps, articles and resources for developers. <Link href="/signup"><a>Sign up</a></Link> for occasional updates on new roadmaps, updates and guides</p>
</div>
</HeroSectionWrap>
);
export default HeroSection;

View File

@@ -0,0 +1,30 @@
import styled from 'styled-components';
export const HeroSectionWrap = styled.div`
text-align: center;
padding: 70px 20px;
margin: 0 auto;
.container {
max-width: 800px;
}
h1 {
font-size: 70px;
font-weight: 700;
margin-bottom: 25px;
}
p {
font-size: 20px;
color: #333;
font-weight: 400;
margin-bottom: 0;
line-height: 35px;
}
a {
font-weight: 700;
color: #000;
}
`;

View File

@@ -0,0 +1,15 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import RowBlock from 'components/row-block';
import { SubmitText, SubmitWrap } from './style';
const IconRowBlock = ({ url, icon, text, openExternal=false }) => (
<RowBlock url={ url } openExternal={openExternal}>
<SubmitWrap>
<FontAwesomeIcon icon={ icon } />
<SubmitText>{ text }</SubmitText>
</SubmitWrap>
</RowBlock>
);
export default IconRowBlock;

View File

@@ -0,0 +1,20 @@
import styled from 'styled-components';
export const SubmitWrap = styled.div`
display: flex;
flex-direction: column;
height: 100%;
align-items: center;
justify-content: center;
svg {
height: 25px;
color: #d6d6d6;
}
`;
export const SubmitText = styled.p`
margin-bottom: 0;
color: dimgrey;
margin-top: 8px;
`;

View File

@@ -0,0 +1,3 @@
<svg width="29" height="29">
<path d="M23.2 5H5.8a.8.8 0 0 0-.8.8V23.2c0 .44.35.8.8.8h9.3v-7.13h-2.38V13.9h2.38v-2.38c0-2.45 1.55-3.66 3.74-3.66 1.05 0 1.95.08 2.2.11v2.57h-1.5c-1.2 0-1.48.57-1.48 1.4v1.96h2.97l-.6 2.97h-2.37l.05 7.12h5.1a.8.8 0 0 0 .79-.8V5.8a.8.8 0 0 0-.8-.79"></path>
</svg>

After

Width:  |  Height:  |  Size: 298 B

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" aria-label="GitHub" role="img" viewBox="0 0 512 512" width="22px" height="20px">
<rect width="512" height="512" rx="15%"/>
<path fill="#fff" d="M335 499c14 0 12 17 12 17H165s-2-17 12-17c13 0 16-6 16-12l-1-50c-71 16-86-28-86-28-12-30-28-37-28-37-24-16 1-16 1-16 26 2 40 26 40 26 22 39 59 28 74 22 2-17 9-28 16-35-57-6-116-28-116-126 0-28 10-51 26-69-3-6-11-32 3-67 0 0 21-7 70 26 42-12 86-12 128 0 49-33 70-26 70-26 14 35 6 61 3 67 16 18 26 41 26 69 0 98-60 120-117 126 10 8 18 24 18 48l-1 70c0 6 3 12 16 12z"/>
</svg>

After

Width:  |  Height:  |  Size: 565 B

View File

@@ -0,0 +1,4 @@
<svg viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">
<path fill-rule="evenodd"
d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path>
</svg>

After

Width:  |  Height:  |  Size: 474 B

View File

@@ -0,0 +1,3 @@
<svg width="29" height="29">
<path d="M22.05 7.54a4.47 4.47 0 0 0-3.3-1.46 4.53 4.53 0 0 0-4.53 4.53c0 .35.04.7.08 1.05A12.9 12.9 0 0 1 5 6.89a5.1 5.1 0 0 0-.65 2.26c.03 1.6.83 2.99 2.02 3.79a4.3 4.3 0 0 1-2.02-.57v.08a4.55 4.55 0 0 0 3.63 4.44c-.4.08-.8.13-1.21.16l-.81-.08a4.54 4.54 0 0 0 4.2 3.15 9.56 9.56 0 0 1-5.66 1.94l-1.05-.08c2 1.27 4.38 2.02 6.94 2.02 8.3 0 12.86-6.9 12.84-12.85.02-.24 0-.43 0-.65a8.68 8.68 0 0 0 2.26-2.34c-.82.38-1.7.62-2.6.72a4.37 4.37 0 0 0 1.95-2.51c-.84.53-1.81.9-2.83 1.13z"></path>
</svg>

After

Width:  |  Height:  |  Size: 529 B

View File

@@ -0,0 +1,9 @@
export function BadgeLink({ target='_blank', variant ='success', badgeText, href, children }) {
return (
<p className='mb-0'>
<a href={href} target={ target }>
<span style={{ position: 'relative', top: '-2px'}} className={`badge badge-${variant}`}>{badgeText}</span> { children }
</a>
</p>
);
}

13
components/link/index.js Normal file
View File

@@ -0,0 +1,13 @@
import styled from 'styled-components';
export const StrongLink = styled.a`
border-bottom: 2px solid currentColor;
position: relative;
transition: background-color 120ms;
text-decoration: none;
font-weight: 600;
&:hover {
text-decoration: none;
}
`;

11
components/mark/index.js Normal file
View File

@@ -0,0 +1,11 @@
import styled from 'styled-components';
export const Mark = styled.span`
background: #1b1e21;
color: #fff;
display: inline-block;
font-size: 18px;
font-weight: 600;
margin: 0 4px;
padding: 0 6px 0 7px;
`;

View File

@@ -0,0 +1,10 @@
import { MDXProvider } from '@mdx-js/react';
import MdxComponents from './mdx-components';
const MdRenderer = (props) => (
<MDXProvider components={ MdxComponents }>
{ props.children }
</MDXProvider>
);
export default MdRenderer;

View File

@@ -0,0 +1,18 @@
import styled from 'styled-components';
const Link = styled.a`
font-weight: 600;
`;
const EnrichedLink = props => {
// Is external URL or is a media URL
const isExternalUrl = /(^http(s)?:\/\/)|(\.(png|svg|jpeg|jpg)$)/.test(props.href);
return (
<Link href={ props.href } target={ isExternalUrl ? '_blank' : '_self' }>
{ props.children }
</Link>
);
};
export default EnrichedLink;

View File

@@ -0,0 +1,26 @@
import styled from 'styled-components';
const BlockQuote = styled.blockquote`
padding: 16px 20px;
position: relative;
background: #e8e8e8;
border-radius: 5px;
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
}
p + h4 {
margin-top: 15px;
}
p {
margin: 0;
& + p {
margin-top: 10px;
}
}
`;
export default BlockQuote;

View File

@@ -0,0 +1,77 @@
import styled from 'styled-components';
import Link from 'components/icons/link.svg';
const linkify = (Component) => {
return (props) => {
const text = props.children;
const id = text.toLowerCase && text
.toLowerCase()
.replace(/[^\x00-\x7F]/g, '')
.replace(/\s+/g, '-')
.replace(/[?!]/g, '');
return (
<Component id={ id }>
<HeaderLink href={ `#${id}` }>
<Link />
</HeaderLink>
{ props.children }
</Component>
);
};
};
const HeaderLink = styled.a`
position: absolute;
top: 0;
left: -25px;
width: 25px;
display: none;
height: 100%;
align-items: center;
justify-content: flex-start;
`;
const H1 = styled.h1`
position: relative;
font-size: 42px;
font-weight: 700;
margin: 32px 0 10px !important;
&:hover ${HeaderLink} {
display: flex;
}
`;
const H2 = styled(H1).attrs({ as: 'h2' })`
font-size: 32px;
`;
const H3 = styled(H1).attrs({ as: 'h3' })`
margin: 22px 0 8px;
font-size: 30px;
`;
const H4 = styled(H1).attrs({ as: 'h4' })`
margin: 18px 0 8px;
font-size: 24px;
`;
const H5 = styled(H1).attrs({ as: 'h5' })`
margin: 14px 0 8px;
font-size: 18px;
`;
const H6 = styled(H1).attrs({ as: 'h6' })`
margin: 12px 0 8px;
font-size: 18px;
`;
export const Headings = {
h1: linkify(H1),
h2: linkify(H2),
h3: linkify(H3),
h4: linkify(H4),
h5: linkify(H5),
h6: linkify(H6),
};

View File

@@ -0,0 +1,8 @@
import styled from 'styled-components';
export const IFrame = styled.iframe`
display: block;
width: 100%;
border: none;
margin: 30px auto;
`;

View File

@@ -0,0 +1,7 @@
import styled from 'styled-components';
export const Img = styled.img`
max-width: 100%;
margin: 25px auto;
display: block;
`;

View File

@@ -0,0 +1,23 @@
import P from './p';
import { Headings } from './heading';
import { Pre } from './pre';
import BlockQuote from './blockquote';
import { Table } from './table';
import { IFrame } from './iframe';
import { Img } from './img';
import EnrichedLink from './a';
import { BadgeLink } from '../../link/badge-link';
const MdxComponents = {
p: P,
...Headings,
pre: Pre,
blockquote: BlockQuote,
a: EnrichedLink,
table: Table,
iframe: IFrame,
img: Img,
BadgeLink: BadgeLink
};
export default MdxComponents;

View File

@@ -0,0 +1,20 @@
import styled from 'styled-components';
const P = styled.p`
color: inherit;
font-size: 16px;
font-weight: 400;
line-height: 26px;
margin: 0 0 12px;
img + em {
text-align: center;
color: #666666;
font-style: normal;
font-size: 14px;
margin: 5px 0 10px;
display: block;
}
`;
export default P;

View File

@@ -0,0 +1,12 @@
import styled from 'styled-components';
export const Pre = styled.pre`
margin: 25px -25px 25px -25px !important;
padding: 20px 25px !important;
border-radius: 10px;
line-height: 1.5 !important;
code {
background: transparent;
}
`;

View File

@@ -0,0 +1,25 @@
import styled from 'styled-components';
export const Table = styled.table`
border-collapse: separate;
width: 100%;
border-spacing: 0;
margin: 20px 0;
th {
color: #666;
font-size: 12px;
font-weight: 400;
background: #FAFAFA;
text-transform: uppercase;
height: 40px;
vertical-align: middle;
padding: 5px 10px;
}
td {
font-size: 14px;
padding: 10px;
border-bottom: 1px solid #EAEAEA;
}
`;

View File

@@ -0,0 +1,62 @@
#carbonads {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu,
Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif;
position: fixed;
bottom: 15px;
right: 20px;
}
#carbonads {
display: flex;
max-width: 330px;
background-color: hsl(0, 0%, 98%);
box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, .1);
}
#carbonads a {
color: inherit;
text-decoration: none;
}
#carbonads a:hover {
color: inherit;
}
#carbonads span {
position: relative;
display: block;
overflow: hidden;
}
#carbonads .carbon-wrap {
display: flex;
}
.carbon-img {
display: block;
margin: 0;
line-height: 1;
}
.carbon-img img {
display: block;
}
.carbon-text {
font-size: 13px;
padding: 10px;
line-height: 1.5;
text-align: left;
}
.carbon-poweredby {
display: block;
padding: 8px 10px;
background: repeating-linear-gradient(-45deg, transparent, transparent 5px, hsla(0, 0%, 0%, .025) 5px, hsla(0, 0%, 0%, .025) 10px) hsla(203, 11%, 95%, .4);
text-align: center;
text-transform: uppercase;
letter-spacing: .5px;
font-weight: 600;
font-size: 9px;
line-height: 1;
}

View File

@@ -0,0 +1,41 @@
export const CustomAd = () => {
return (
<div id="carbonads">
<span>
<span className="carbon-wrap">
<a
href="https://freemote.com/strategy?sl=roadmap"
className="carbon-img"
target="_blank"
rel="noopener sponsored"
>
<img
src="/fm-img.png"
alt="FM Logo"
border="0"
height="100"
width="130"
style={{ maxWidth: "130px" }}
/>
</a>
<a
href="https://freemote.com/strategy?sl=roadmap"
className="carbon-text"
target="_blank"
rel="noopener sponsored"
>
He Went from ZERO TO $74,000 as a Full Time Developer in 7 Weeks
</a>
</span>
<a
href="https://github.com/sponsors/kamranahmedse"
className="carbon-poweredby"
target="_blank"
rel="noopener sponsored"
>
Sponsored by
</a>
</span>
</div>
);
};

View File

@@ -0,0 +1,71 @@
import siteConfig from 'content/site';
import { FooterWrap } from './style.js';
import './carbon.scss';
import { CustomAd } from "./custom-ad";
const PageFooter = () => (
<FooterWrap className="border-top">
<div className="container">
<div className="foot-cols-wrap row">
<div className="site-meta-wrap col-12 col-sm-12 col-lg col-xl col-md-12">
<div className="site-meta">
<div className="brand-detail">
<a href="/" className='brand'><img src="/brand.png" alt="" /> roadmap.sh</a>
<span className="preposition">by</span>
<a href="https://twitter.com/kamranahmedse" target="_blank" className='follow-author'>@kamranahmedse</a>
</div>
<div className="brand-explanation">
<p>Community created roadmaps, articles, resources and journeys to help you choose your path and grow in your career.</p>
</div>
<p className='meta-links'>
&copy; roadmap.sh &middot;
&nbsp; <a href="/about">FAQ</a> &middot;
&nbsp; <a href="/terms">Terms</a> &middot;
&nbsp; <a href="/privacy">Privacy</a>
</p>
</div>
</div>
<div className="site-contribute foot-col col-12 col-sm-4 col-lg-2">
<ul>
<li className='foot-header'>Contribute</li>
<li><a href='https://gum.co/roadmap-sh' target="_blank">Sponsor us</a></li>
<li><a href={ siteConfig.url.addGuide } target="_blank">Write a Guide</a></li>
<li><a href={ siteConfig.url.addRoadmap } target="_blank">Submit a Roadmap</a></li>
<li><a href='/about'>About this Site</a></li>
</ul>
</div>
<div className="site-learn foot-col col-12 col-sm-4 col-lg-2">
<ul>
<li className="foot-header">Learn</li>
<li><a href="/guides">Read Guides</a></li>
<li><a href="/watch">Watch Videos</a></li>
<li><a href="/podcasts">Podcasts</a></li>
<li><a href="https://www.youtube.com/channel/UCA0H2KIWgWTwpTFjSxp0now?sub_confirmation=1" target="_blank">YouTube</a></li>
</ul>
</div>
<div className="site-learn foot-col col-12 col-sm-4 col-lg-2">
<ul>
<li className="foot-header">Most Visited</li>
<li><a href="/frontend">Frontend Roadmap</a></li>
<li><a href="/backend">Backend Roadmap</a></li>
<li><a href="/devops">DevOps Roadmap</a></li>
<li><a href="/roadmaps">Upcoming</a></li>
</ul>
</div>
</div>
</div>
<CustomAd />
{/* Do not show on local */}
{ process.env.GA_SECRET && false && (
<>
<script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?serve=CE7DLK3Y&placement=roadmapsh" id="_carbonads_js"></script>
{/*<div id="codefund"></div>*/}
{/*<script src="https://app.codefund.io/properties/681/funder.js" async></script>*/}
</>
) }
</FooterWrap>
);
export default PageFooter;

View File

@@ -0,0 +1,94 @@
import styled from 'styled-components';
export const FooterWrap = styled.div`
padding: 65px 0;
.site-meta {
margin-bottom: 30px;
width: 350px;
.brand-detail {
display: flex;
align-items: center;
}
.brand {
display: flex;
align-items: center;
font-weight: 600;
color: #000;
text-decoration: none;
img {
height: 25px;
width: 25px;
margin-right: 8px;
}
}
.preposition {
margin: 0 7px;
}
.follow-author {
background-color: #1e99e6;
border-radius: 3px;
color: #fff;
cursor: pointer;
font-size: 12px;
font-weight: 600;
line-height: 20px;
padding: 0 6px;
white-space: nowrap;
text-decoration: none;
&:hover {
background: #43aaea;
}
}
.brand-explanation {
color: #999;
p {
font-size: 15px;
line-height: 24px;
margin: 15px 0;
}
}
.meta-links {
color: #a3a3a3;
font-size: 15px;
a {
color: #000;
text-decoration: none;
}
}
}
.foot-col {
margin-bottom: 20px;
a {
color: #999;
}
.foot-header {
font-weight: 500;
margin-bottom: 7px;
}
ul {
margin: 0;
padding: 0;
li {
margin-bottom: 2px;
font-size: 15px;
list-style: none;
margin-left: 0;
}
}
}
`;

View File

@@ -0,0 +1,16 @@
import { HeaderWrap, Subtitle, Title } from './style';
const PageHeader = ({
title,
subtitle,
children,
}) => (
<HeaderWrap>
<Title>{ title }</Title>
<Subtitle dangerouslySetInnerHTML={{ __html: subtitle }} />
{ children }
</HeaderWrap>
);
export default PageHeader;

View File

@@ -0,0 +1,22 @@
import styled from 'styled-components';
export const HeaderWrap = styled.div`
text-align: center;
padding: 45px 30px;
`;
export const Title = styled.h1`
font-size: 48px;
font-weight: 700;
margin-bottom: 12px;
`;
export const Subtitle = styled.p`
font-size: 16px;
color: #444;
a {
color: inherit;
font-weight: 700;
}
`;

View File

@@ -0,0 +1,13 @@
import { HeaderWrap, Subtitle, Title, Logo } from './style';
const PageLogoHeader = ({ title, subtitle, children, }) => (
<HeaderWrap>
<Logo src='/brand.png' alt='' />
<Title>{ title }</Title>
<Subtitle dangerouslySetInnerHTML={{ __html: subtitle }} />
{ children }
</HeaderWrap>
);
export default PageLogoHeader;

View File

@@ -0,0 +1,30 @@
import styled from 'styled-components';
export const HeaderWrap = styled.div`
text-align: center;
padding: 45px 30px;
`;
export const Title = styled.h1`
font-size: 40px;
font-weight: 700;
margin-bottom: 12px;
`;
export const Subtitle = styled.p`
font-size: 16px;
color: #444;
margin-bottom: 0;
a {
color: inherit;
font-weight: 700;
}
`;
export const Logo = styled.img`
width: 75px;
height: 75px;
margin-bottom: 26px;
`;

View File

@@ -0,0 +1,62 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faArrowLeft, faClock, faEnvelope, faHandshake } from '@fortawesome/free-solid-svg-icons';
import { BadgeLink, BadgesList, DarkBadge, PrimaryBadge, SecondaryBadge } from 'components/badges';
import siteConfig from "content/site";
import { Description, Header, Title, MenuItemLink, MenuItems } from './style';
import Link from 'next/link';
import classNames from 'classnames';
const RoadmapHeader = ({ roadmap, page = 'landscape' }) => (
<Header>
<Title>{ roadmap.title }</Title>
<Description>{ roadmap.description }</Description>
<BadgesList className="mt-4">
<BadgeLink href="/roadmaps">
<DarkBadge>
<FontAwesomeIcon className='d-none d-md-block' icon={ faArrowLeft } />
Other Roadmaps
</DarkBadge>
</BadgeLink>
{ roadmap.upcoming && (
<BadgeLink href="/signup">
<SecondaryBadge>
<FontAwesomeIcon className='d-none d-md-block' icon={ faClock } />
Upcoming Roadmap
</SecondaryBadge>
</BadgeLink>
) }
{ !roadmap.upcoming && (
<BadgeLink href={ `${siteConfig.url.issue}?title=[${roadmap.title}] - Title Here` } target="_blank" className='d-none d-md-block' >
<SecondaryBadge>
<FontAwesomeIcon icon={ faHandshake } />
Suggest Changes
</SecondaryBadge>
</BadgeLink>
) }
<BadgeLink href="/signup">
<PrimaryBadge>
<FontAwesomeIcon className='d-none d-md-block' icon={ faEnvelope } />
Send me Updates
</PrimaryBadge>
</BadgeLink>
</BadgesList>
<MenuItems className="border-bottom">
<div className={ classNames({ 'd-none': roadmap.title.toLowerCase() !== 'frontend developer' })}>
<Link href={ `${roadmap.url}` } passHref>
<MenuItemLink className={ classNames({ active: page === 'landscape', }) }>Landscape</MenuItemLink>
</Link>
<Link href={ `${roadmap.url}/resources` } passHref>
<MenuItemLink className={ classNames({ active: page === 'resources', }) }>Resources</MenuItemLink>
</Link>
{/*<Link href={ `${roadmap.url}/resources` } passHref>*/}
{/* <MenuItemLink className={ classNames({ active: false, }) }>Project Ideas</MenuItemLink>*/}
{/*</Link>*/}
</div>
</MenuItems>
</Header>
);
export default RoadmapHeader;

View File

@@ -0,0 +1,50 @@
import styled from 'styled-components';
export const Header = styled.div`
text-align: center;
padding: 45px 30px 10px;
`;
export const Title = styled.h1`
font-weight: 700;
margin-bottom: 12px;
font-size: 48px;
`;
export const Description = styled.p`
font-size: 16px;
color: #444444;
`;
export const MenuItems = styled.div`
margin: 35px 0 15px;
`;
export const MenuItemLink = styled.a`
display: inline-block;
position: relative;
padding: 5px 10px 8px;
text-decoration: none;
color: rgb(102, 102, 102);
font-size: 14px;
font-weight: 400;
&.active, &.active:hover {
color: #2d2d2d;
&:after {
position: absolute;
content: "";
display: block;
height: 0;
left: 9px;
right: 9px;
bottom: -1px;
border-bottom: 2px solid currentColor;
}
}
&:hover {
text-decoration: none;
color: #111111;
}
`;

View File

@@ -0,0 +1,35 @@
import { Summary, SummaryContainer, UpcomingContainer } from './style';
import GuideBody from 'components/guide-body';
import RoadmapHeader from 'components/roadmap-header';
import SharePage from 'components/share-page';
import MdRenderer from 'components/md-renderer';
const RoadmapResources = ({ roadmap }) => {
if (roadmap.upcoming) {
return (
<>
<RoadmapHeader roadmap={ roadmap } />
<UpcomingContainer>
<GuideBody guide={{ fileName: 'upcoming' }} />
</UpcomingContainer>
</>
);
}
const filePath = roadmap.resources.replace(/^\//, '');
const ResourcesContent = require(`../../content/${filePath}`).default;
return (
<SummaryContainer>
<RoadmapHeader roadmap={ roadmap } page='resources' />
<Summary className="container">
<MdRenderer>
<ResourcesContent />
</MdRenderer>
<SharePage title={ roadmap.description } url={ roadmap.url } />
</Summary>
</SummaryContainer>
)
};
export default RoadmapResources;

View File

@@ -0,0 +1,21 @@
import styled from 'styled-components';
export const SummaryContainer = styled.div``;
export const UpcomingContainer = styled.div`
text-align: center;
padding: 40px 0 50px;
.container {
position: relative;
}
`;
export const Summary = styled.div`
margin-top: 35px;
min-height: 400px;
max-width: 1000px;
display: block;
position: relative;
text-align: left;
`;

View File

@@ -0,0 +1,36 @@
import { Summary, SummaryContainer, UpcomingContainer } from './style';
import classNames from 'classnames';
import GuideBody from 'components/guide-body';
import RoadmapHeader from 'components/roadmap-header';
import SharePage from 'components/share-page';
import MdRenderer from 'components/md-renderer';
const RoadmapSummary = ({ roadmap }) => {
if (roadmap.upcoming) {
return (
<>
<RoadmapHeader roadmap={ roadmap } />
<UpcomingContainer>
<GuideBody guide={{ fileName: 'upcoming' }} />
</UpcomingContainer>
</>
);
}
const filePath = roadmap.path.replace(/^\//, '');
const RoadmapContent = require(`../../content/${filePath}`).default;
return (
<SummaryContainer>
<RoadmapHeader roadmap={ roadmap } />
<Summary className={classNames("container", { "container-small": roadmap.isTextHeavy })}>
<MdRenderer>
<RoadmapContent />
</MdRenderer>
<SharePage title={ roadmap.description } url={ roadmap.url } />
</Summary>
</SummaryContainer>
)
};
export default RoadmapSummary;

View File

@@ -0,0 +1,21 @@
import styled from 'styled-components';
export const SummaryContainer = styled.div``;
export const UpcomingContainer = styled.div`
text-align: center;
padding: 40px 0 50px;
.container {
position: relative;
}
`;
export const Summary = styled.div`
margin-top: 35px;
min-height: 400px;
max-width: 1000px;
display: block;
position: relative;
text-align: left;
`;

View File

@@ -0,0 +1,28 @@
import { Badge, BlockItem, ItemSubtitle, ItemTitle, ItemWrap } from './style';
const RowBlock = ({
title,
subtitle,
url,
badge,
openExternal = false,
disabled = false,
children = null
}) => (
<ItemWrap className="col-md-6 col-lg-4 col-xl-4">
<BlockItem href={ url } disabled={ disabled } target={openExternal ? '_blank' : '_self'}>
{ !children && (
<>
<ItemTitle>
{ title }
{ badge && <Badge>{ badge }</Badge>}
</ItemTitle>
<ItemSubtitle>{ subtitle }</ItemSubtitle>
</>
) }
{ children }
</BlockItem>
</ItemWrap>
);
export default RowBlock;

View File

@@ -0,0 +1,62 @@
import styled from 'styled-components';
export const ItemWrap = styled.div`
padding: 0 10px 20px;
`;
export const BlockItem = styled.a`
min-height: 114px;
box-shadow: rgba(0, 0, 0, 0.12) 0 5px 10px;
transition: box-shadow 0.2s ease 0s;
align-items: stretch;
flex: 1;
display: flex;
flex-direction: column;
min-width: 1px;
max-width: 100%;
background: white;
padding: 20px;
border-radius: 10px;
justify-content: center;
text-decoration:none;
opacity: ${ props => props.disabled ? 0.5 : 1 };
&:hover {
text-decoration:none;
box-shadow: rgba(0, 0, 0, 0.12) 0 30px 60px;
z-index: 1;
}
`;
export const ItemTitle = styled.h3`
font-weight: 600;
font-size: 18px;
line-height: 24px;
color: #101010;
display: flex;
align-items: center;
justify-content: flex-start;
`;
export const Badge = styled.span`
font-size: 10px;
font-weight: 600;
background: #8a8a8a;
color: white;
padding: 0 8px;
border-radius: 4px;
text-transform: uppercase;
display: flex;
align-items: center;
justify-content: center;
margin-left: 10px;
height: 18px;
`;
export const ItemSubtitle = styled.p`
font-size: 14px;
color: rgb(102, 102, 102);
white-space: normal;
line-height: 1.5;
margin: 0;
`;

View File

@@ -0,0 +1,21 @@
import styled from 'styled-components';
export const ShareIcon = styled.a`
display: block;
width: 22px;
height: 22px;
margin-bottom: 8px;
text-align: center;
svg {
height: 22px !important;
width: 22px !important;
color: #757575;
transition: all 0.2s;
vertical-align: top;
}
&:hover svg {
color: #000000
}
`;

View File

@@ -0,0 +1,37 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faFacebookSquare, faHackerNewsSquare, faRedditSquare, faTwitterSquare } from '@fortawesome/free-brands-svg-icons';
import { getFacebookShareUrl, getHnShareUrl, getRedditShareUrl, getTwitterShareUrl } from 'lib/url';
import { ShareIconsList, ShareWrap } from './style';
import { ShareIcon } from 'components/share-icon';
const SharePage = ({
url,
title,
twitterUsername,
}) => (
<ShareWrap>
<ShareIconsList className="d-none d-sm-flex">
<ShareIcon
href={ getTwitterShareUrl({
text: `${title} ${twitterUsername ? `by @${twitterUsername}` : ''}`,
url: url
})}
target="_blank"
>
<FontAwesomeIcon icon={ faTwitterSquare } />
</ShareIcon>
<ShareIcon href={ getFacebookShareUrl({ text: title, url: url }) } target="_blank">
<FontAwesomeIcon icon={ faFacebookSquare } />
</ShareIcon>
<ShareIcon href={ getHnShareUrl({ text: title, url: url })} target="_blank">
<FontAwesomeIcon icon={faHackerNewsSquare}/>
</ShareIcon>
<ShareIcon href={ getRedditShareUrl({ text: title, url: url })} target="_blank">
<FontAwesomeIcon icon={ faRedditSquare } />
</ShareIcon>
</ShareIconsList>
</ShareWrap>
);
export default SharePage;

View File

@@ -0,0 +1,21 @@
import styled from 'styled-components';
export const ShareIconsList = styled.div`
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
position: sticky;
top: 65px;
`;
export const ShareWrap = styled.div`
display: flex;
align-items: center;
flex-direction: column;
position: absolute;
padding: 0 0;
top: 0;
left: -40px;
min-height: 100%;
`;

View File

@@ -0,0 +1,17 @@
import { SignUpWrap, Title, Subtitle, Textbox, Button } from './style';
const SignUpForm = () => (
<SignUpWrap>
<Title>Subscribe</Title>
<Subtitle>Enter your email below to get notified about the new roadmaps, guides and updates</Subtitle>
<form action="https://kamranahmed.us9.list-manage.com/subscribe/post?u=6f57b741a6a939744f1f203a0&amp;id=f9ca4d6aee" target="_blank" method="post">
<Textbox type="email" name="EMAIL" required placeholder="Your email" />
<div style={{position: 'absolute', left: '-5000px'}}>
<input type="text" name="b_6f57b741a6a939744f1f203a0_f9ca4d6aee" tabIndex="-1" />
</div>
<Button type="submit">Subscribe</Button>
</form>
</SignUpWrap>
);
export default SignUpForm;

View File

@@ -0,0 +1,57 @@
import styled from 'styled-components';
export const SignUpWrap = styled.div`
max-width: 400px;
margin: 200px auto;
text-align: center;
`;
export const Title = styled.h1`
font-size: 48px;
font-weight: 700;
margin-bottom: 17px;
`;
export const Subtitle = styled.p`
font-size: 16px;
`;
export const Textbox = styled.input`
display: block;
width: 100%;
padding: 10px 15px;
font-size: 16px;
font-weight: 400;
line-height: 1.5;
color: #495057;
height: auto;
outline: none;
background-color: #fff;
border: 1px solid #ced4da;
border-radius: 5px;
&:focus {
border: 1px solid #101010;
}
`;
export const Button = styled.button`
-webkit-appearance: none;
border: none;
outline: none;
box-shadow: none;
display: block;
text-align: center;
width: 100%;
padding: 10px 15px;
margin-top: 10px;
background: #333;
color: white;
border-radius: 5px;
&:hover, &:active, &:focus {
background: #000000;
box-shadow: none;
outline: none;
}
`;

View File

@@ -0,0 +1,26 @@
import { HeaderWrap } from './style';
const SiteNav = () => (
<HeaderWrap>
<div className='top-row container'>
<div className='flex-grow-1 brand'>
<a href='/'>
<img src='/brand.png' alt='' />
</a>
</div>
<div className='nav-links'>
<a href='/guides'>Read</a>
<a href='/watch'>
Watch
<span className='new-item' />
</a>
</div>
<div className='ml-3 align-items-center d-none d-md-flex'>
<iframe src="https://ghbtns.com/github-btn.html?user=kamranahmedse&repo=developer-roadmap&type=star&count=true&size=large" frameBorder="0" scrolling="0" width="190px" height="30px"></iframe>
</div>
</div>
</HeaderWrap>
);
export default SiteNav;

Some files were not shown because too many files have changed in this diff Show More