├── .github └── main.workflow ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── action └── entrypoint.sh ├── docs ├── gatsby-browser.js ├── gatsby-config.js ├── gatsby-node.js ├── now.json ├── package.json └── src │ ├── components │ ├── Anchor.js │ ├── Button │ │ ├── AnchorButton.js │ │ ├── Button.js │ │ ├── ButtonContainer.js │ │ ├── GlowingAnchorButton.js │ │ ├── GlowingButton.js │ │ └── LinkButton.js │ ├── CenteredText.js │ ├── CenteredTitle.js │ ├── Favicons.js │ ├── Feature.js │ ├── Features.js │ ├── FocusStyles.js │ ├── Footer.js │ ├── Header.js │ ├── Link.js │ └── Section.js │ ├── images │ ├── ChangeCast.png │ ├── ChangeCastTransparent.png │ └── oleg-laptev-546607-unsplash.png │ ├── styles │ ├── global.js │ └── typography.js │ └── templates │ └── IndexTemplate.js ├── fonts ├── Inter-SemiBold.woff └── fonts.css ├── icons ├── AbstractIcon1.js ├── AbstractIcon10.js ├── AbstractIcon11.js ├── AbstractIcon12.js ├── AbstractIcon2.js ├── AbstractIcon3.js ├── AbstractIcon4.js ├── AbstractIcon5.js ├── AbstractIcon6.js ├── AbstractIcon7.js ├── AbstractIcon8.js ├── AbstractIcon9.js ├── Cast.js ├── ChevronLeft.js ├── Clipboard.js ├── Close.js ├── Copy.js ├── ExternalLink.js ├── Facebook.js ├── Link.js ├── Linkedin.js ├── Radio.js ├── Search.js ├── Twitter.js ├── package.json ├── svgs │ ├── AbstractIcon1.svg │ ├── AbstractIcon10.svg │ ├── AbstractIcon11.svg │ ├── AbstractIcon12.svg │ ├── AbstractIcon2.svg │ ├── AbstractIcon3.svg │ ├── AbstractIcon4.svg │ ├── AbstractIcon5.svg │ ├── AbstractIcon6.svg │ ├── AbstractIcon7.svg │ ├── AbstractIcon8.svg │ ├── AbstractIcon9.svg │ ├── Cast.svg │ ├── ChevronLeft.svg │ ├── Clipboard.svg │ ├── Close.svg │ ├── Copy.svg │ ├── ExternalLink.svg │ ├── Facebook.svg │ ├── Link.svg │ ├── Linkedin.svg │ ├── Radio.svg │ ├── Search.svg │ └── Twitter.svg ├── templates │ └── namedExportNoSvg.js └── yarn.lock ├── netlify.toml ├── now.json ├── package.json ├── plugins ├── gatsby-remark-images │ ├── .babelrc │ ├── .npmignore │ ├── CHANGELOG.md │ ├── README.md │ ├── constants.js │ ├── gatsby-browser.js │ ├── index.js │ ├── package.json │ ├── src │ │ ├── __tests__ │ │ │ ├── __snapshots__ │ │ │ │ └── index.js.snap │ │ │ └── index.js │ │ ├── constants.js │ │ ├── gatsby-browser.js │ │ └── index.js │ └── yarn.lock ├── gatsby-source-github-releases │ ├── gatsby-node.js │ ├── index.js │ ├── package.json │ └── yarn.lock ├── gatsby-transformer-color-thief │ ├── gatsby-node.js │ ├── index.js │ ├── package.json │ └── yarn.lock ├── gatsby-transformer-favicons │ ├── gatsby-node.js │ ├── index.js │ ├── package.json │ └── yarn.lock └── gatsby-transformer-og-image │ ├── gatsby-node.js │ ├── index.js │ ├── package.json │ └── yarn.lock ├── site ├── gatsby-config.js ├── gatsby-node.js ├── package.json └── src │ ├── components │ ├── Button │ │ ├── AnchorButton.js │ │ ├── Button.js │ │ ├── LinkButton.js │ │ └── MenuButton.js │ ├── Favicons.js │ ├── FocusStyles.js │ ├── Header.js │ ├── Release │ │ ├── Release.js │ │ ├── ReleaseHeader.js │ │ └── SocialButton.js │ ├── SiteWrapper.js │ ├── Tag.js │ └── WidgetWrapper.js │ ├── hooks │ └── useSiteSetup.js │ ├── providers │ ├── SiteProvider.js │ └── WidgetProvider.js │ ├── styles │ ├── global.js │ ├── markdown.js │ ├── theme.js │ └── typography.js │ ├── templates │ ├── ReleaseTemplate.js │ └── ReleasesTemplate.js │ └── utils │ ├── constants.js │ ├── copyToClipboard.js │ ├── data.js │ └── windowPopup.js ├── widget ├── index.html ├── package.json ├── src │ ├── styles.css │ └── widget.js └── webpack.config.js └── yarn.lock /.github/main.workflow: -------------------------------------------------------------------------------- 1 | workflow "Build and Deploy ChangeCast" { 2 | resolves = [ 3 | "Alias Now Deployment", 4 | "Deploy with Netlify", 5 | ] 6 | on = "release" 7 | } 8 | 9 | action "Build" { 10 | uses = "./" 11 | secrets = ["GITHUB_TOKEN"] 12 | env = { 13 | DEPLOY_URL = "https://changecast-log.now.sh" 14 | } 15 | } 16 | 17 | action "Deploy with Netlify" { 18 | needs = "Build" 19 | uses = "netlify/actions/cli@master" 20 | args = "deploy --dir=./changecast --site=061cc43b-d700-492c-9e3d-3d92f6d197aa --prod" 21 | secrets = [ 22 | "NETLIFY_AUTH_TOKEN", 23 | ] 24 | } 25 | 26 | action "Deploy with Now" { 27 | uses = "actions/zeit-now@1.0.0" 28 | needs = ["Build"] 29 | args = "--public --no-clipboard --scope=palmer deploy ./changecast > $GITHUB_WORKSPACE/deploy.txt" 30 | secrets = ["ZEIT_TOKEN"] 31 | } 32 | 33 | action "Alias Now Deployment" { 34 | uses = "actions/zeit-now@1.0.0" 35 | args = "alias `cat $GITHUB_WORKSPACE/deploy.txt` changecast-log" 36 | secrets = [ 37 | "ZEIT_TOKEN", 38 | ] 39 | needs = ["Deploy with Now"] 40 | } 41 | 42 | workflow "Run Chronicler" { 43 | on = "pull_request" 44 | resolves = ["Chronicler"] 45 | } 46 | 47 | action "Chronicler" { 48 | uses = "crosscompile/chronicler-action@v1.0.1" 49 | secrets = ["GITHUB_TOKEN"] 50 | } 51 | 52 | workflow "Build and Deploy Docs Preview" { 53 | resolves = [ 54 | "Alias Material UI Preview", 55 | "Alias React Beautiful DnD Preview", 56 | "Alias Workbox Preview", 57 | "Alias Docs Preview", 58 | ] 59 | on = "pull_request" 60 | } 61 | 62 | action "Build React Beautiful DnD ChangeCast Preview" { 63 | uses = "./" 64 | secrets = ["GITHUB_TOKEN"] 65 | args = "DEPLOY_URL=https://changecast-1-$GITHUB_SHA.now.sh" 66 | env = { 67 | REPO_URL = "https://github.com/atlassian/react-beautiful-dnd" 68 | } 69 | } 70 | 71 | action "Deploy React Beautiful DnD Preview" { 72 | uses = "actions/zeit-now@1.0.0" 73 | args = "--public --no-clipboard --scope=palmer deploy ./changecast > $GITHUB_WORKSPACE/deploy.txt" 74 | secrets = ["ZEIT_TOKEN"] 75 | needs = ["Build React Beautiful DnD ChangeCast Preview"] 76 | } 77 | 78 | action "Alias React Beautiful DnD Preview" { 79 | uses = "actions/zeit-now@1.0.0" 80 | args = "alias --scope=palmer `cat $GITHUB_WORKSPACE/deploy.txt` changecast-1-$GITHUB_SHA" 81 | secrets = ["ZEIT_TOKEN"] 82 | needs = ["Deploy React Beautiful DnD Preview"] 83 | } 84 | 85 | action "Build Material UI ChangeCast Preview" { 86 | uses = "./" 87 | args = "DEPLOY_URL=https://changecast-2-$GITHUB_SHA.now.sh" 88 | secrets = ["GITHUB_TOKEN"] 89 | env = { 90 | REPO_URL = "https://github.com/mui-org/material-ui" 91 | } 92 | } 93 | 94 | action "Deploy Material UI Preview" { 95 | uses = "actions/zeit-now@1.0.0" 96 | secrets = ["ZEIT_TOKEN"] 97 | args = "--public --no-clipboard --scope=palmer deploy ./changecast > $GITHUB_WORKSPACE/deploy.txt" 98 | needs = ["Build Material UI ChangeCast Preview"] 99 | } 100 | 101 | action "Alias Material UI Preview" { 102 | uses = "actions/zeit-now@1.0.0" 103 | args = "alias --scope=palmer `cat $GITHUB_WORKSPACE/deploy.txt` changecast-2-$GITHUB_SHA" 104 | secrets = ["ZEIT_TOKEN"] 105 | needs = ["Deploy Material UI Preview"] 106 | } 107 | 108 | action "Build Workbox ChangeCast Preview" { 109 | uses = "./" 110 | args = "DEPLOY_URL=https://changecast-3-$GITHUB_SHA.now.sh" 111 | secrets = ["GITHUB_TOKEN"] 112 | env = { 113 | REPO_URL = "https://github.com/GoogleChrome/workbox" 114 | } 115 | } 116 | 117 | action "Deploy Workbox Preview" { 118 | uses = "actions/zeit-now@1.0.0" 119 | args = "--public --no-clipboard --scope=palmer deploy ./changecast > $GITHUB_WORKSPACE/deploy.txt" 120 | secrets = ["ZEIT_TOKEN"] 121 | needs = ["Build Workbox ChangeCast Preview"] 122 | } 123 | 124 | action "Alias Workbox Preview" { 125 | uses = "actions/zeit-now@1.0.0" 126 | secrets = ["ZEIT_TOKEN"] 127 | args = "alias --scope=palmer `cat $GITHUB_WORKSPACE/deploy.txt` changecast-3-$GITHUB_SHA" 128 | needs = ["Deploy Workbox Preview"] 129 | } 130 | 131 | action "Install and Build Docs Preview" { 132 | uses = "nuxt/actions-yarn@master" 133 | args = "install && FIRST_EXAMPLE_URL=https://changecast-1-$GITHUB_SHA.now.sh SECOND_EXAMPLE_URL=https://changecast-2-$GITHUB_SHA.now.sh THIRD_EXAMPLE_URL=https://changecast-3-$GITHUB_SHA.now.sh yarn build:docs" 134 | } 135 | 136 | action "Deploy Docs Preview" { 137 | uses = "actions/zeit-now@1.0.0" 138 | args = "--public --no-clipboard --scope=palmer deploy ./docs/public --local-config=../now.json > $GITHUB_WORKSPACE/deploy.txt" 139 | secrets = ["ZEIT_TOKEN"] 140 | needs = ["Install and Build Docs Preview"] 141 | } 142 | 143 | action "Alias Docs Preview" { 144 | uses = "actions/zeit-now@5c51b26db987d15a0133e4c760924896b4f1512f" 145 | secrets = ["ZEIT_TOKEN"] 146 | args = "alias --scope=palmer `cat $GITHUB_WORKSPACE/deploy.txt` changecast-$GITHUB_SHA" 147 | needs = ["Deploy Docs Preview"] 148 | } 149 | 150 | workflow "Build and Deploy Docs" { 151 | resolves = [ 152 | "Alias Material UI", 153 | "Alias Workbox", 154 | "Alias React Beautiful Dnd", 155 | "Alias Docs", 156 | ] 157 | on = "push" 158 | } 159 | 160 | action "Filter master" { 161 | uses = "actions/bin/filter@master" 162 | args = "branch master" 163 | } 164 | 165 | action "Build React Beautiful DnD ChangeCast" { 166 | uses = "./" 167 | secrets = ["GITHUB_TOKEN"] 168 | env = { 169 | REPO_URL = "https://github.com/atlassian/react-beautiful-dnd" 170 | DEPLOY_URL = "https://changecast-1.now.sh" 171 | } 172 | needs = ["Filter master"] 173 | } 174 | 175 | action "Deploy React Beautiful DnD" { 176 | uses = "actions/zeit-now@1.0.0" 177 | args = "--public --no-clipboard --scope=palmer deploy ./changecast > $GITHUB_WORKSPACE/deploy.txt" 178 | secrets = ["ZEIT_TOKEN"] 179 | needs = ["Build React Beautiful DnD ChangeCast"] 180 | } 181 | 182 | action "Alias React Beautiful Dnd" { 183 | uses = "actions/zeit-now@1.0.0" 184 | args = "alias --scope=palmer `cat $GITHUB_WORKSPACE/deploy.txt` changecast-1" 185 | secrets = ["ZEIT_TOKEN"] 186 | needs = ["Deploy React Beautiful DnD"] 187 | } 188 | 189 | action "Build Material UI ChangeCast" { 190 | uses = "./" 191 | args = "GITHUB_REPO_URL=" 192 | secrets = ["GITHUB_TOKEN"] 193 | env = { 194 | REPO_URL = "https://github.com/mui-org/material-ui" 195 | DEPLOY_URL = "https://changecast-2.now.sh" 196 | } 197 | needs = ["Filter master"] 198 | } 199 | 200 | action "Deploy Material UI" { 201 | uses = "actions/zeit-now@1.0.0" 202 | secrets = ["ZEIT_TOKEN"] 203 | args = "--public --no-clipboard --scope=palmer deploy ./changecast > $GITHUB_WORKSPACE/deploy.txt" 204 | needs = ["Build Material UI ChangeCast"] 205 | } 206 | 207 | action "Alias Material UI" { 208 | uses = "actions/zeit-now@1.0.0" 209 | args = "alias --scope=palmer `cat $GITHUB_WORKSPACE/deploy.txt` changecast-2" 210 | secrets = ["ZEIT_TOKEN"] 211 | needs = ["Deploy Material UI"] 212 | } 213 | 214 | action "Build Workbox ChangeCast" { 215 | uses = "./" 216 | secrets = ["GITHUB_TOKEN"] 217 | env = { 218 | REPO_URL = "https://github.com/GoogleChrome/workbox" 219 | DEPLOY_URL = "https://changecast-3.now.sh" 220 | } 221 | needs = ["Filter master"] 222 | } 223 | 224 | action "Deploy Workbox" { 225 | uses = "actions/zeit-now@1.0.0" 226 | args = "--public --no-clipboard --scope=palmer deploy ./changecast > $GITHUB_WORKSPACE/deploy.txt" 227 | secrets = ["ZEIT_TOKEN"] 228 | needs = ["Build Workbox ChangeCast"] 229 | } 230 | 231 | action "Alias Workbox" { 232 | uses = "actions/zeit-now@1.0.0" 233 | secrets = ["ZEIT_TOKEN"] 234 | args = "alias --scope=palmer `cat $GITHUB_WORKSPACE/deploy.txt` changecast-3" 235 | needs = ["Deploy Workbox"] 236 | } 237 | 238 | action "Install and Build Docs" { 239 | uses = "nuxt/actions-yarn@master" 240 | args = "install && FIRST_EXAMPLE_URL=https://changecast-1.now.sh SECOND_EXAMPLE_URL=https://changecast-2.now.sh THIRD_EXAMPLE_URL=https://changecast-3.now.sh yarn build:docs" 241 | needs = ["Filter master"] 242 | } 243 | 244 | action "Deploy Docs" { 245 | uses = "actions/zeit-now@1.0.0" 246 | args = "--public --no-clipboard --scope=palmer deploy ./docs/public --local-config=../now.json > $GITHUB_WORKSPACE/deploy.txt" 247 | secrets = ["ZEIT_TOKEN"] 248 | needs = ["Install and Build Docs"] 249 | } 250 | 251 | action "Alias Docs" { 252 | uses = "actions/zeit-now@5c51b26db987d15a0133e4c760924896b4f1512f" 253 | secrets = ["ZEIT_TOKEN"] 254 | args = "alias --scope=palmer `cat $GITHUB_WORKSPACE/deploy.txt` changecast" 255 | needs = ["Deploy Docs"] 256 | } 257 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # dotenv environment variables file 55 | .env 56 | 57 | # gatsby files 58 | .cache/ 59 | public 60 | static 61 | 62 | # Mac files 63 | .DS_Store 64 | 65 | # Yarn 66 | yarn-error.log 67 | .pnp/ 68 | .pnp.js 69 | # Yarn Integrity file 70 | .yarn-integrity 71 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:10 2 | 3 | COPY . /changecast 4 | 5 | RUN cd /changecast && yarn 6 | 7 | ENTRYPOINT ["/changecast/action/entrypoint.sh"] 8 | 9 | LABEL "com.github.actions.name"="ChangeCast" 10 | LABEL "com.github.actions.description"="Create beautiful, performant, accessible changelogs from your Github releases." 11 | LABEL "com.github.actions.icon"="radio" 12 | LABEL "com.github.actions.color"="blue" 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019-present The Palmer Group 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |
22 | {children} 23 |
24 |37 | {children} 38 |
39 |163 | Create{' '} 164 | 165 | beautiful 166 | 167 | ,{' '} 168 | 169 | performant 170 | 171 | ,{' '} 172 | 173 | accessible 174 | {' '} 175 | changelogs from your Github releases. 176 |
177 |83 | {differenceInDays(Date.now(), publishedAt) < 30 84 | ? distanceInWordsToNow(publishedAt, { 85 | addSuffix: true, 86 | }) 87 | : isThisYear(publishedAt) 88 | ? format(publishedAt, 'MMM D') 89 | : format(publishedAt, 'MMMM Do, YYYY')} 90 |
91 | )} 92 |