├── mater.icns ├── mater.ico ├── mater.png ├── wav ├── click.wav ├── ding.wav └── windup.wav ├── img ├── ico │ ├── icon-0.ico │ ├── icon-1.ico │ ├── icon-2.ico │ ├── icon-3.ico │ ├── icon-4.ico │ ├── icon-5.ico │ ├── icon-6.ico │ ├── icon-7.ico │ ├── icon-8.ico │ ├── icon-9.ico │ ├── icon-10.ico │ ├── icon-11.ico │ ├── icon-12.ico │ ├── icon-13.ico │ ├── icon-14.ico │ ├── icon-15.ico │ ├── icon-16.ico │ ├── icon-17.ico │ ├── icon-18.ico │ ├── icon-19.ico │ ├── icon-20.ico │ ├── icon-21.ico │ ├── icon-22.ico │ ├── icon-23.ico │ ├── icon-24.ico │ ├── icon-25.ico │ ├── icon-0-break.ico │ ├── icon-1-break.ico │ ├── icon-2-break.ico │ ├── icon-3-break.ico │ ├── icon-4-break.ico │ └── icon-5-break.ico ├── png │ ├── blank.png │ ├── icon-0.png │ ├── icon-1.png │ ├── icon-2.png │ ├── icon-3.png │ ├── icon-4.png │ ├── icon-5.png │ ├── icon-6.png │ ├── icon-7.png │ ├── icon-8.png │ ├── icon-9.png │ ├── icon-10.png │ ├── icon-11.png │ ├── icon-12.png │ ├── icon-13.png │ ├── icon-14.png │ ├── icon-15.png │ ├── icon-16.png │ ├── icon-17.png │ ├── icon-18.png │ ├── icon-19.png │ ├── icon-20.png │ ├── icon-21.png │ ├── icon-22.png │ ├── icon-23.png │ ├── icon-24.png │ ├── icon-25.png │ ├── icon-0-break.png │ ├── icon-1-break.png │ ├── icon-2-break.png │ ├── icon-3-break.png │ ├── icon-4-break.png │ └── icon-5-break.png └── template │ ├── icon-0-Template.png │ ├── icon-1-Template.png │ ├── icon-10-Template.png │ ├── icon-11-Template.png │ ├── icon-12-Template.png │ ├── icon-13-Template.png │ ├── icon-14-Template.png │ ├── icon-15-Template.png │ ├── icon-16-Template.png │ ├── icon-17-Template.png │ ├── icon-18-Template.png │ ├── icon-19-Template.png │ ├── icon-2-Template.png │ ├── icon-20-Template.png │ ├── icon-21-Template.png │ ├── icon-22-Template.png │ ├── icon-23-Template.png │ ├── icon-24-Template.png │ ├── icon-25-Template.png │ ├── icon-3-Template.png │ ├── icon-4-Template.png │ ├── icon-5-Template.png │ ├── icon-6-Template.png │ ├── icon-7-Template.png │ ├── icon-8-Template.png │ ├── icon-9-Template.png │ ├── icon-0-Template@2x.png │ ├── icon-1-Template@2x.png │ ├── icon-10-Template@2x.png │ ├── icon-11-Template@2x.png │ ├── icon-12-Template@2x.png │ ├── icon-13-Template@2x.png │ ├── icon-14-Template@2x.png │ ├── icon-15-Template@2x.png │ ├── icon-16-Template@2x.png │ ├── icon-17-Template@2x.png │ ├── icon-18-Template@2x.png │ ├── icon-19-Template@2x.png │ ├── icon-2-Template@2x.png │ ├── icon-20-Template@2x.png │ ├── icon-21-Template@2x.png │ ├── icon-22-Template@2x.png │ ├── icon-23-Template@2x.png │ ├── icon-24-Template@2x.png │ ├── icon-25-Template@2x.png │ ├── icon-3-Template@2x.png │ ├── icon-4-Template@2x.png │ ├── icon-5-Template@2x.png │ ├── icon-6-Template@2x.png │ ├── icon-7-Template@2x.png │ ├── icon-8-Template@2x.png │ ├── icon-9-Template@2x.png │ ├── icon-0-break-Template.png │ ├── icon-1-break-Template.png │ ├── icon-2-break-Template.png │ ├── icon-3-break-Template.png │ ├── icon-4-break-Template.png │ ├── icon-5-break-Template.png │ ├── icon-0-break-Template@2x.png │ ├── icon-1-break-Template@2x.png │ ├── icon-2-break-Template@2x.png │ ├── icon-3-break-Template@2x.png │ ├── icon-4-break-Template@2x.png │ └── icon-5-break-Template@2x.png ├── .gitignore ├── .prettierrc ├── .github ├── workflows │ ├── stale.yml │ └── nodejs.yml └── dependabot.yml ├── index.html ├── LICENSE ├── README.md ├── main.js ├── package.json ├── main.css ├── renderer.js └── .stylelintrc /mater.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/mater.icns -------------------------------------------------------------------------------- /mater.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/mater.ico -------------------------------------------------------------------------------- /mater.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/mater.png -------------------------------------------------------------------------------- /wav/click.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/wav/click.wav -------------------------------------------------------------------------------- /wav/ding.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/wav/ding.wav -------------------------------------------------------------------------------- /wav/windup.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/wav/windup.wav -------------------------------------------------------------------------------- /img/ico/icon-0.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-0.ico -------------------------------------------------------------------------------- /img/ico/icon-1.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-1.ico -------------------------------------------------------------------------------- /img/ico/icon-2.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-2.ico -------------------------------------------------------------------------------- /img/ico/icon-3.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-3.ico -------------------------------------------------------------------------------- /img/ico/icon-4.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-4.ico -------------------------------------------------------------------------------- /img/ico/icon-5.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-5.ico -------------------------------------------------------------------------------- /img/ico/icon-6.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-6.ico -------------------------------------------------------------------------------- /img/ico/icon-7.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-7.ico -------------------------------------------------------------------------------- /img/ico/icon-8.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-8.ico -------------------------------------------------------------------------------- /img/ico/icon-9.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-9.ico -------------------------------------------------------------------------------- /img/png/blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/blank.png -------------------------------------------------------------------------------- /img/png/icon-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-0.png -------------------------------------------------------------------------------- /img/png/icon-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-1.png -------------------------------------------------------------------------------- /img/png/icon-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-2.png -------------------------------------------------------------------------------- /img/png/icon-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-3.png -------------------------------------------------------------------------------- /img/png/icon-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-4.png -------------------------------------------------------------------------------- /img/png/icon-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-5.png -------------------------------------------------------------------------------- /img/png/icon-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-6.png -------------------------------------------------------------------------------- /img/png/icon-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-7.png -------------------------------------------------------------------------------- /img/png/icon-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-8.png -------------------------------------------------------------------------------- /img/png/icon-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-9.png -------------------------------------------------------------------------------- /img/ico/icon-10.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-10.ico -------------------------------------------------------------------------------- /img/ico/icon-11.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-11.ico -------------------------------------------------------------------------------- /img/ico/icon-12.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-12.ico -------------------------------------------------------------------------------- /img/ico/icon-13.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-13.ico -------------------------------------------------------------------------------- /img/ico/icon-14.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-14.ico -------------------------------------------------------------------------------- /img/ico/icon-15.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-15.ico -------------------------------------------------------------------------------- /img/ico/icon-16.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-16.ico -------------------------------------------------------------------------------- /img/ico/icon-17.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-17.ico -------------------------------------------------------------------------------- /img/ico/icon-18.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-18.ico -------------------------------------------------------------------------------- /img/ico/icon-19.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-19.ico -------------------------------------------------------------------------------- /img/ico/icon-20.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-20.ico -------------------------------------------------------------------------------- /img/ico/icon-21.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-21.ico -------------------------------------------------------------------------------- /img/ico/icon-22.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-22.ico -------------------------------------------------------------------------------- /img/ico/icon-23.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-23.ico -------------------------------------------------------------------------------- /img/ico/icon-24.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-24.ico -------------------------------------------------------------------------------- /img/ico/icon-25.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-25.ico -------------------------------------------------------------------------------- /img/png/icon-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-10.png -------------------------------------------------------------------------------- /img/png/icon-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-11.png -------------------------------------------------------------------------------- /img/png/icon-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-12.png -------------------------------------------------------------------------------- /img/png/icon-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-13.png -------------------------------------------------------------------------------- /img/png/icon-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-14.png -------------------------------------------------------------------------------- /img/png/icon-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-15.png -------------------------------------------------------------------------------- /img/png/icon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-16.png -------------------------------------------------------------------------------- /img/png/icon-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-17.png -------------------------------------------------------------------------------- /img/png/icon-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-18.png -------------------------------------------------------------------------------- /img/png/icon-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-19.png -------------------------------------------------------------------------------- /img/png/icon-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-20.png -------------------------------------------------------------------------------- /img/png/icon-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-21.png -------------------------------------------------------------------------------- /img/png/icon-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-22.png -------------------------------------------------------------------------------- /img/png/icon-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-23.png -------------------------------------------------------------------------------- /img/png/icon-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-24.png -------------------------------------------------------------------------------- /img/png/icon-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-25.png -------------------------------------------------------------------------------- /img/ico/icon-0-break.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-0-break.ico -------------------------------------------------------------------------------- /img/ico/icon-1-break.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-1-break.ico -------------------------------------------------------------------------------- /img/ico/icon-2-break.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-2-break.ico -------------------------------------------------------------------------------- /img/ico/icon-3-break.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-3-break.ico -------------------------------------------------------------------------------- /img/ico/icon-4-break.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-4-break.ico -------------------------------------------------------------------------------- /img/ico/icon-5-break.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/ico/icon-5-break.ico -------------------------------------------------------------------------------- /img/png/icon-0-break.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-0-break.png -------------------------------------------------------------------------------- /img/png/icon-1-break.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-1-break.png -------------------------------------------------------------------------------- /img/png/icon-2-break.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-2-break.png -------------------------------------------------------------------------------- /img/png/icon-3-break.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-3-break.png -------------------------------------------------------------------------------- /img/png/icon-4-break.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-4-break.png -------------------------------------------------------------------------------- /img/png/icon-5-break.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/png/icon-5-break.png -------------------------------------------------------------------------------- /img/template/icon-0-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-0-Template.png -------------------------------------------------------------------------------- /img/template/icon-1-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-1-Template.png -------------------------------------------------------------------------------- /img/template/icon-10-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-10-Template.png -------------------------------------------------------------------------------- /img/template/icon-11-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-11-Template.png -------------------------------------------------------------------------------- /img/template/icon-12-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-12-Template.png -------------------------------------------------------------------------------- /img/template/icon-13-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-13-Template.png -------------------------------------------------------------------------------- /img/template/icon-14-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-14-Template.png -------------------------------------------------------------------------------- /img/template/icon-15-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-15-Template.png -------------------------------------------------------------------------------- /img/template/icon-16-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-16-Template.png -------------------------------------------------------------------------------- /img/template/icon-17-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-17-Template.png -------------------------------------------------------------------------------- /img/template/icon-18-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-18-Template.png -------------------------------------------------------------------------------- /img/template/icon-19-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-19-Template.png -------------------------------------------------------------------------------- /img/template/icon-2-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-2-Template.png -------------------------------------------------------------------------------- /img/template/icon-20-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-20-Template.png -------------------------------------------------------------------------------- /img/template/icon-21-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-21-Template.png -------------------------------------------------------------------------------- /img/template/icon-22-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-22-Template.png -------------------------------------------------------------------------------- /img/template/icon-23-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-23-Template.png -------------------------------------------------------------------------------- /img/template/icon-24-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-24-Template.png -------------------------------------------------------------------------------- /img/template/icon-25-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-25-Template.png -------------------------------------------------------------------------------- /img/template/icon-3-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-3-Template.png -------------------------------------------------------------------------------- /img/template/icon-4-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-4-Template.png -------------------------------------------------------------------------------- /img/template/icon-5-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-5-Template.png -------------------------------------------------------------------------------- /img/template/icon-6-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-6-Template.png -------------------------------------------------------------------------------- /img/template/icon-7-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-7-Template.png -------------------------------------------------------------------------------- /img/template/icon-8-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-8-Template.png -------------------------------------------------------------------------------- /img/template/icon-9-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-9-Template.png -------------------------------------------------------------------------------- /img/template/icon-0-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-0-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-1-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-1-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-10-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-10-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-11-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-11-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-12-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-12-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-13-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-13-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-14-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-14-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-15-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-15-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-16-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-16-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-17-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-17-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-18-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-18-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-19-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-19-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-2-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-2-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-20-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-20-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-21-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-21-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-22-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-22-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-23-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-23-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-24-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-24-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-25-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-25-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-3-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-3-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-4-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-4-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-5-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-5-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-6-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-6-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-7-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-7-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-8-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-8-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-9-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-9-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-0-break-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-0-break-Template.png -------------------------------------------------------------------------------- /img/template/icon-1-break-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-1-break-Template.png -------------------------------------------------------------------------------- /img/template/icon-2-break-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-2-break-Template.png -------------------------------------------------------------------------------- /img/template/icon-3-break-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-3-break-Template.png -------------------------------------------------------------------------------- /img/template/icon-4-break-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-4-break-Template.png -------------------------------------------------------------------------------- /img/template/icon-5-break-Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-5-break-Template.png -------------------------------------------------------------------------------- /img/template/icon-0-break-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-0-break-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-1-break-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-1-break-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-2-break-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-2-break-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-3-break-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-3-break-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-4-break-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-4-break-Template@2x.png -------------------------------------------------------------------------------- /img/template/icon-5-break-Template@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/mater/main/img/template/icon-5-break-Template@2x.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | Mater-darwin-x64 4 | Mater-linux-x64 5 | Mater-win32-x64 6 | Mater-darwin-x64.zip 7 | Mater-linux-x64.zip 8 | Mater-win32-x64.zip 9 | .claude 10 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "trailingComma": "none", 4 | "singleQuote": true, 5 | "printWidth": 120, 6 | "tabWidth": 2, 7 | "useTabs": false, 8 | "jsxSingleQuote": true, 9 | "bracketSpacing": true 10 | } 11 | -------------------------------------------------------------------------------- /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | name: 'Close stale issues and PRs' 2 | on: 3 | schedule: 4 | - cron: '30 1 * * *' 5 | workflow_dispatch: 6 | 7 | jobs: 8 | stale: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/stale@v6 12 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "npm" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | day: "monday" 8 | groups: 9 | electron: 10 | patterns: 11 | - "electron-*" 12 | - "electron" 13 | stylelint: 14 | patterns: 15 | - "stylelint-*" 16 | - "stylelint" 17 | -------------------------------------------------------------------------------- /.github/workflows/nodejs.yml: -------------------------------------------------------------------------------- 1 | name: Node.js CI 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-latest 9 | 10 | strategy: 11 | matrix: 12 | node-version: [22.x, 24.x] 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | - name: Use Node.js ${{ matrix.node-version }} 17 | uses: actions/setup-node@v1 18 | with: 19 | node-version: ${{ matrix.node-version }} 20 | - run: npm install 21 | - run: npm test 22 | env: 23 | CI: true 24 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |26 | 27 | 28 |
29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Jason Long 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. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Mater 2 | 3 | [](https://github.com/jasonlong/mater/releases/latest) 4 |  5 | [](https://github.com/xojs/xo) 6 | 7 |  8 | 9 | This is a minimal menubar Pomodoro app written in Electron. It simply runs a 25 minute timer, resets for a 5 minute break, and repeats until you stop it. 10 | 11 | ### Installation 12 | 13 | There are binaries built for Mac, Windows, and Linux on the [releases page](https://github.com/jasonlong/mater/releases). 14 | 15 | _Note: Currently, I'm not able to test the Windows and Linux builds, so please open an issue if you have any problems._ 16 | 17 | ### Contributions 18 | 19 | I don't have plans to add much else at this time, so please open an issue to discuss any feature ideas before implementing them. 20 | 21 | ### Development 22 | 23 | ``` 24 | $ git clone https://github.com/jasonlong/mater 25 | $ cd mater 26 | $ npm install 27 | $ npm start 28 | ``` 29 | 30 | ### What's with the name? 31 | 32 | I'm a Pixar fan and Mater is awesome. ["Like Ta-mater without the ta"](https://youtu.be/MJm8vNTasMg?t=25s). Get it? 33 | 34 |  35 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | const {Menu} = require('electron') 2 | const platform = require('os').platform() 3 | const path = require('path') 4 | const {menubar} = require('menubar') 5 | 6 | const initialIcon = path.join(__dirname, 'img/png/blank.png') 7 | 8 | const mb = menubar({ 9 | preloadWindow: true, 10 | icon: initialIcon, 11 | browserWindow: { 12 | width: 220, 13 | height: 206, 14 | webPreferences: { 15 | nodeIntegration: true, 16 | enableRemoteModule: true 17 | } 18 | } 19 | }) 20 | 21 | // Make menubar accessible to the renderer 22 | globalThis.sharedObject = {mb} 23 | 24 | mb.on('ready', () => { 25 | console.log('app is ready') 26 | // Workaround to fix window position when statusbar at top for win32 27 | if (platform === 'win32' && mb.tray.getBounds().y < 5) { 28 | mb.setOption('windowPosition', 'trayCenter') 29 | } 30 | }) 31 | 32 | mb.on('after-create-window', () => { 33 | mb.window.loadURL(`file://${__dirname}/index.html`) // eslint-disable-line n/no-path-concat 34 | 35 | const contextMenu = Menu.buildFromTemplate([ 36 | { 37 | label: 'Sound', 38 | submenu: [ 39 | { 40 | label: 'On', 41 | type: 'radio', 42 | checked: true, 43 | click: () => mb.window.webContents.send('TOGGLE_SOUND', true) 44 | }, 45 | { 46 | label: 'Off', 47 | type: 'radio', 48 | checked: false, 49 | click: () => mb.window.webContents.send('TOGGLE_SOUND', false) 50 | } 51 | ] 52 | }, 53 | { 54 | label: 'Quit', 55 | click() { 56 | mb.app.quit() 57 | } 58 | } 59 | ]) 60 | mb.tray.on('right-click', () => { 61 | mb.tray.popUpContextMenu(contextMenu) 62 | }) 63 | }) 64 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mater", 3 | "version": "1.0.9", 4 | "description": "A Pomodoro menubar app", 5 | "main": "main.js", 6 | "scripts": { 7 | "start": "electron main.js", 8 | "build": "run-s build:*", 9 | "build:mac": "electron-packager . Mater --platform=darwin --arch=x64 --overwrite --icon=mater", 10 | "build:linux": "electron-packager . Mater --platform=linux --arch=x64 --overwrite --icon=mater", 11 | "build:win": "electron-packager . Mater --platform=win32 --arch=x64 --overwrite --icon=mater", 12 | "lint:css": "stylelint \"*.css\"", 13 | "lint:js": "xo", 14 | "test": "run-s lint:*" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git+https://github.com/jasonlong/mater.git" 19 | }, 20 | "keywords": [ 21 | "pomodoro", 22 | "productivity", 23 | "timer", 24 | "electron", 25 | "menubar" 26 | ], 27 | "author": "Jason Long", 28 | "license": "MIT", 29 | "bugs": { 30 | "url": "https://github.com/jasonlong/mater/issues" 31 | }, 32 | "homepage": "https://github.com/jasonlong/mater", 33 | "dependencies": { 34 | "menubar": "^9.5.2", 35 | "tiny-timer": "^1.6.0" 36 | }, 37 | "devDependencies": { 38 | "devtron": "^1.4.0", 39 | "electron": "31.1.0", 40 | "electron-osx-sign": "^0.6.0", 41 | "electron-packager": "^17.1.2", 42 | "npm-run-all": "^4.1.5", 43 | "stylelint": "^16.26.1", 44 | "stylelint-config-standard": "^39.0.1", 45 | "stylelint-order": "^7.0.0", 46 | "xo": "^1.2.3" 47 | }, 48 | "xo": { 49 | "rules": { 50 | "@stylistic/comma-dangle": 0, 51 | "unicorn/prefer-module": 0, 52 | "unicorn/prefer-node-protocol": 0 53 | }, 54 | "semicolon": false, 55 | "space": true 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /main.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --red: #f40c05; 3 | --green: #18c93b; 4 | --white: #fff; 5 | } 6 | 7 | .app { 8 | width: 100%; 9 | height: 100%; 10 | overflow: hidden; 11 | 12 | /* system font */ 13 | font: caption; /* stylelint-disable-line font-family-no-missing-generic-family-keyword */ 14 | color: var(--white); 15 | } 16 | 17 | .container { 18 | position: relative; 19 | display: grid; 20 | justify-items: center; 21 | justify-content: center; 22 | height: 100vh; 23 | margin: 0; 24 | grid-template-rows: 41px 58px 6px 36px 64px; 25 | } 26 | 27 | .ui-bg { 28 | position: absolute; 29 | z-index: -1; 30 | display: block; 31 | width: 100%; 32 | height: 100%; 33 | content: ""; 34 | background-size: cover; 35 | transition: opacity 0.5s linear; 36 | } 37 | 38 | .ui-bg-working { 39 | background-image: linear-gradient(var(--red), #e60b05); 40 | opacity: 1; 41 | } 42 | 43 | .ui-bg-breaking { 44 | background-image: linear-gradient(var(--green), #17bb3c); 45 | opacity: 0; 46 | } 47 | 48 | .is-breaking .ui-bg-working { 49 | opacity: 0; 50 | } 51 | 52 | .is-breaking .ui-bg-breaking { 53 | opacity: 1; 54 | } 55 | 56 | .slider { 57 | position: relative; 58 | left: 297px; /* (600 / 2 - half of width of start line) */ 59 | width: 600px; 60 | text-align: left; 61 | } 62 | 63 | .slider.is-resetting-work { 64 | transition: 0.5s ease-in-out; 65 | transform: translateX(-500px); 66 | } 67 | 68 | .slider.is-resetting-break { 69 | transition: 0.5s ease-in-out; 70 | transform: translateX(-100px); 71 | } 72 | 73 | .minute { 74 | display: inline-block; 75 | width: 100px; 76 | margin-left: -5px; 77 | font-size: 24px; 78 | font-weight: bold; 79 | } 80 | 81 | .ruler { 82 | width: 505px; 83 | height: 15px; 84 | margin-top: 5px; 85 | background-image: 86 | linear-gradient( 87 | 90deg, 88 | #fff 0, 89 | #fff 5%, 90 | transparent 5%, 91 | transparent 20%, 92 | #fff 20%, 93 | #fff 22%, 94 | transparent 22%, 95 | transparent 40%, 96 | #fff 40%, 97 | #fff 42%, 98 | transparent 42%, 99 | transparent 60%, 100 | #fff 60%, 101 | #fff 62%, 102 | transparent 62%, 103 | transparent 80%, 104 | #fff 80%, 105 | #fff 82%, 106 | transparent 82% 107 | ); 108 | background-repeat: repeat-x; 109 | background-size: 100px 15px; 110 | } 111 | 112 | .groove { 113 | width: 100%; 114 | background-color: rgba(0 0 0 / 0.5); 115 | box-shadow: inset 0 2px 2px rgba(0 0 0 / 0.5); 116 | } 117 | 118 | .marker { 119 | font-size: 1.8em; 120 | } 121 | 122 | .controls { 123 | width: 100%; 124 | margin-top: 6px; 125 | text-align: center; 126 | } 127 | 128 | .start-btn { 129 | display: inline-block; 130 | } 131 | 132 | .stop-btn { 133 | display: none; 134 | } 135 | 136 | .is-breaking .start-btn, 137 | .is-working .start-btn { 138 | display: none; 139 | } 140 | 141 | .is-breaking .stop-btn, 142 | .is-working .stop-btn { 143 | display: inline-block; 144 | } 145 | 146 | .btn { 147 | width: 95px; 148 | padding-top: 0.5em; 149 | padding-bottom: 0.5em; 150 | font-size: 1.125rem; 151 | font-weight: 500; 152 | color: #4e0300; 153 | background-color: var(--white); 154 | border: 0; 155 | border-radius: 100px; 156 | box-shadow: rgba(0 0 0 / 0.16) 0 3px 12px, rgba(0 0 0 / 0.23) 0 3px 10px; 157 | } 158 | 159 | .is-working .btn { 160 | color: var(--red); 161 | } 162 | 163 | .btn:active { 164 | outline: none; 165 | box-shadow: 0 1px 1px rgba(0 0 0 / 0.2); 166 | } 167 | -------------------------------------------------------------------------------- /renderer.js: -------------------------------------------------------------------------------- 1 | /* global document, Audio */ 2 | 'use strict' 3 | 4 | // DOM elements & variables 5 | // ============================================================================= 6 | 7 | // Get menubar instance from main.js 8 | const {mb} = require('electron').remote.getGlobal('sharedObject') 9 | const {ipcRenderer} = require('electron') 10 | const path = require('path') 11 | const Timer = require('tiny-timer') 12 | 13 | const appContainer = document.querySelector('.js-app') 14 | const startButton = document.querySelector('.js-start-btn') 15 | const stopButton = document.querySelector('.js-stop-btn') 16 | const slider = document.querySelector('.js-slider') 17 | 18 | // Sounds 19 | let soundEnabled = true 20 | const soundWindup = new Audio(path.join(__dirname, '/wav/windup.wav')) 21 | const soundClick = new Audio(path.join(__dirname, '/wav/click.wav')) 22 | const soundDing = new Audio(path.join(__dirname, '/wav/ding.wav')) 23 | 24 | let state = '' 25 | let currentMinute = 0 26 | const workMinutes = 25 27 | const breakMinutes = 5 28 | 29 | // Timer stuff 30 | const timer = new Timer() 31 | 32 | // Utilities 33 | // ============================================================================= 34 | const minToMs = min => min * 60 * 1000 35 | 36 | const msToMin = ms => ms / 60 / 1000 37 | 38 | const getCurrentMinutes = () => state === 'breaking' ? breakMinutes : workMinutes 39 | 40 | const getCurrentSliderWidth = () => state === 'breaking' ? 100 : 500 41 | 42 | const playSound = sound => { 43 | sound.currentTime = 0 44 | if (soundEnabled) { 45 | sound.play() 46 | } 47 | } 48 | 49 | // State handling 50 | // ============================================================================= 51 | 52 | const setState = newState => { 53 | appContainer.classList.remove('is-stopped', 'is-working', 'is-breaking') 54 | appContainer.classList.add(`is-${newState}`) 55 | state = newState 56 | } 57 | 58 | setState('stopped') 59 | 60 | const setIcon = (currentMinute, currentState) => { 61 | const process = require('process') 62 | let file = '' 63 | const breakSuffix = currentState === 'breaking' ? '-break' : '' 64 | 65 | switch (process.platform) { 66 | case 'darwin': { 67 | file = path.join(__dirname, `img/template/icon-${currentMinute}${breakSuffix}-Template.png`) 68 | break 69 | } 70 | 71 | case 'win32': { 72 | file = path.join(__dirname, `img/ico/icon-${currentMinute}${breakSuffix}.ico`) 73 | break 74 | } 75 | 76 | default: { 77 | file = path.join(__dirname, `img/png/icon-${currentMinute}${breakSuffix}.png`) 78 | } 79 | } 80 | 81 | mb.tray.setImage(file) 82 | } 83 | 84 | const setCurrentMinute = ms => { 85 | currentMinute = Math.ceil(msToMin(ms)) 86 | setIcon(currentMinute, state) 87 | } 88 | 89 | setCurrentMinute(0) 90 | 91 | // Event handlers 92 | // ============================================================================= 93 | 94 | document.addEventListener('keydown', event => { 95 | switch (event.key) { 96 | case 'Escape': { 97 | mb.hideWindow() 98 | break 99 | } 100 | 101 | default: { 102 | break 103 | } 104 | } 105 | }) 106 | 107 | startButton.addEventListener('click', () => { 108 | playSound(soundWindup) 109 | timer.start(minToMs(workMinutes)) 110 | setState('working') 111 | slider.classList.add('is-resetting-work') 112 | setTimeout(() => slider.classList.remove('is-resetting-work'), 1000) 113 | }) 114 | 115 | stopButton.addEventListener('click', () => { 116 | playSound(soundClick) 117 | timer.stop() 118 | setState('stopped') 119 | }) 120 | 121 | mb.on('after-hide', () => { 122 | mb.app.hide() 123 | }) 124 | 125 | timer.on('tick', ms => { 126 | const minutes = getCurrentMinutes() 127 | const sliderWidth = getCurrentSliderWidth() 128 | slider.style.transform = 'translateX(-' + Math.ceil((sliderWidth * ms) / (minToMs(minutes))) + 'px)' 129 | setCurrentMinute(ms) 130 | }) 131 | 132 | timer.on('done', () => { 133 | playSound(soundDing) 134 | setCurrentMinute(0) 135 | mb.showWindow() 136 | 137 | setTimeout(() => { 138 | playSound(soundWindup) 139 | if (state === 'working') { 140 | setState('breaking') 141 | timer.start(minToMs(breakMinutes)) 142 | slider.classList.add('is-resetting-break') 143 | setTimeout(() => slider.classList.remove('is-resetting-break'), 1000) 144 | } else { 145 | setState('working') 146 | timer.start(minToMs(workMinutes)) 147 | slider.classList.add('is-resetting-work') 148 | setTimeout(() => slider.classList.remove('is-resetting-work'), 1000) 149 | } 150 | }, 2000) 151 | }) 152 | 153 | ipcRenderer.on('TOGGLE_SOUND', (event, data) => { 154 | soundEnabled = data 155 | }) 156 | -------------------------------------------------------------------------------- /.stylelintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["stylelint-config-standard"], 3 | "plugins": [ 4 | "stylelint-order" 5 | ], 6 | "rules": { 7 | "alpha-value-notation": "number", 8 | "at-rule-empty-line-before": [null, { 9 | "except": ["first-nested"] 10 | }], 11 | "at-rule-no-vendor-prefix": true, 12 | "color-function-alias-notation": null, 13 | "color-named": "never", 14 | "declaration-empty-line-before": null, 15 | "declaration-no-important": true, 16 | "font-family-name-quotes": "always-where-recommended", 17 | "font-family-no-missing-generic-family-keyword": true, 18 | "length-zero-no-unit": true, 19 | "no-descending-specificity": null, 20 | "no-duplicate-selectors": true, 21 | "order/properties-order": [ 22 | "position", 23 | "top", 24 | "right", 25 | "bottom", 26 | "left", 27 | "z-index", 28 | "box-sizing", 29 | "display", 30 | "flex", 31 | "flex-align", 32 | "flex-basis", 33 | "flex-direction", 34 | "flex-wrap", 35 | "flex-flow", 36 | "flex-shrink", 37 | "flex-grow", 38 | "flex-order", 39 | "flex-pack", 40 | "align-content", 41 | "align-items", 42 | "align-self", 43 | "justify-content", 44 | "order", 45 | "float", 46 | "width", 47 | "min-width", 48 | "max-width", 49 | "height", 50 | "min-height", 51 | "max-height", 52 | "padding", 53 | "padding-top", 54 | "padding-right", 55 | "padding-bottom", 56 | "padding-left", 57 | "margin", 58 | "margin-top", 59 | "margin-right", 60 | "margin-bottom", 61 | "margin-left", 62 | "overflow", 63 | "overflow-x", 64 | "overflow-y", 65 | "-webkit-overflow-scrolling", 66 | "-ms-overflow-x", 67 | "-ms-overflow-y", 68 | "-ms-overflow-style", 69 | "columns", 70 | "column-count", 71 | "column-fill", 72 | "column-gap", 73 | "column-rule", 74 | "column-rule-width", 75 | "column-rule-style", 76 | "column-rule-color", 77 | "column-span", 78 | "column-width", 79 | "orphans", 80 | "widows", 81 | "clip", 82 | "clear", 83 | "font", 84 | "font-family", 85 | "font-size", 86 | "font-style", 87 | "font-weight", 88 | "font-variant", 89 | "font-size-adjust", 90 | "font-stretch", 91 | "font-effect", 92 | "font-emphasize", 93 | "font-emphasize-position", 94 | "font-emphasize-style", 95 | "font-smooth", 96 | "src", 97 | "hyphens", 98 | "line-height", 99 | "color", 100 | "text-align", 101 | "text-align-last", 102 | "text-emphasis", 103 | "text-emphasis-color", 104 | "text-emphasis-style", 105 | "text-emphasis-position", 106 | "text-decoration", 107 | "text-indent", 108 | "text-justify", 109 | "text-outline", 110 | "-ms-text-overflow", 111 | "text-overflow", 112 | "text-overflow-ellipsis", 113 | "text-overflow-mode", 114 | "text-shadow", 115 | "text-transform", 116 | "text-wrap", 117 | "-webkit-text-size-adjust", 118 | "-ms-text-size-adjust", 119 | "letter-spacing", 120 | "-ms-word-break", 121 | "word-break", 122 | "word-spacing", 123 | "-ms-word-wrap", 124 | "word-wrap", 125 | "overflow-wrap", 126 | "tab-size", 127 | "white-space", 128 | "vertical-align", 129 | "direction", 130 | "unicode-bidi", 131 | "list-style", 132 | "list-style-position", 133 | "list-style-type", 134 | "list-style-image", 135 | "pointer-events", 136 | "-ms-touch-action", 137 | "touch-action", 138 | "cursor", 139 | "visibility", 140 | "zoom", 141 | "table-layout", 142 | "empty-cells", 143 | "caption-side", 144 | "border-spacing", 145 | "border-collapse", 146 | "content", 147 | "quotes", 148 | "counter-reset", 149 | "counter-increment", 150 | "resize", 151 | "user-select", 152 | "nav-index", 153 | "nav-up", 154 | "nav-right", 155 | "nav-down", 156 | "nav-left", 157 | "background", 158 | "background-color", 159 | "background-image", 160 | "filter", 161 | "background-repeat", 162 | "background-attachment", 163 | "background-position", 164 | "background-position-x", 165 | "background-position-y", 166 | "background-clip", 167 | "background-origin", 168 | "background-size", 169 | "border", 170 | "border-color", 171 | "border-style", 172 | "border-width", 173 | "border-top", 174 | "border-top-color", 175 | "border-top-style", 176 | "border-top-width", 177 | "border-right", 178 | "border-right-color", 179 | "border-right-style", 180 | "border-right-width", 181 | "border-bottom", 182 | "border-bottom-color", 183 | "border-bottom-style", 184 | "border-bottom-width", 185 | "border-left", 186 | "border-left-color", 187 | "border-left-style", 188 | "border-left-width", 189 | "border-radius", 190 | "border-top-left-radius", 191 | "border-top-right-radius", 192 | "border-bottom-right-radius", 193 | "border-bottom-left-radius", 194 | "border-image", 195 | "border-image-source", 196 | "border-image-slice", 197 | "border-image-width", 198 | "border-image-outset", 199 | "border-image-repeat", 200 | "outline", 201 | "outline-width", 202 | "outline-style", 203 | "outline-color", 204 | "outline-offset", 205 | "box-shadow", 206 | "opacity", 207 | "-ms-interpolation-mode", 208 | "page-break-after", 209 | "page-break-before", 210 | "page-break-inside", 211 | "transition", 212 | "transition-delay", 213 | "transition-timing-function", 214 | "transition-duration", 215 | "transition-property", 216 | "transform", 217 | "transform-origin", 218 | "perspective", 219 | "appearance", 220 | "animation", 221 | "animation-name", 222 | "animation-duration", 223 | "animation-play-state", 224 | "animation-timing-function", 225 | "animation-delay", 226 | "animation-iteration-count", 227 | "animation-direction", 228 | "animation-fill-mode", 229 | "fill", 230 | "stroke" 231 | ], 232 | "property-no-vendor-prefix": true, 233 | "rule-empty-line-before": null, 234 | "selector-attribute-quotes": "always", 235 | "selector-max-attribute": 2, 236 | "selector-max-class": 4, 237 | "selector-max-combinators": 4, 238 | "selector-max-compound-selectors": 4, 239 | "selector-max-id": 0, 240 | "selector-max-specificity": null, 241 | "selector-max-type": 2, 242 | "selector-max-universal": 1, 243 | "selector-no-qualifying-type": true, 244 | "selector-no-vendor-prefix": true, 245 | "value-keyword-case": "lower", 246 | "value-no-vendor-prefix": true 247 | } 248 | } 249 | --------------------------------------------------------------------------------