Chrome Extension adding a custom full-year view to Google Calendar.
This extension implements a Swiss International Style design system based on the principles of Josef Müller-Brockmann and Karl Gerstner. The visual design uses mathematical hierarchy and objective clarity to communicate data states.
See DESIGN.md for complete design documentation, including:
- Visual element explanations (blue squares, black baseline strokes)
- Swiss design principles applied
- Color system and typographic hierarchy
- Grid system structure
✅ All 7 phases implemented:
- Phase 1: Project Setup & Manifest Configuration
- Phase 2: OAuth 2.0 Authentication Setup
- Phase 3: View Injection System
- Phase 4: Full-Year View Layout
- Phase 5: Google Calendar API Integration
- Phase 6: Event Display & Rendering
- Phase 7: Basic Interactions
✅ Multi-Day Events Feature Complete (2026-01-08):
- Full CRUD functionality for multi-day events
- Dedicated "full-year-view" calendar with automatic creation
- Date range selection (desktop and mobile)
- Event creation/editing modal with validation
- 5-event maximum limit enforcement
- Multi-color event bars with vertical stacking
- Single-day events from all calendars shown as blue dots
-
Install dependencies (for testing):
npm install
-
Create icon files (required for extension to load):
- Create
assets/icons/icon-16.png(16x16 pixels) - Create
assets/icons/icon-48.png(48x48 pixels) - Create
assets/icons/icon-128.png(128x128 pixels)
Or use placeholder icons temporarily.
- Create
-
Configure OAuth (required for API access):
- Create Google Cloud Console project
- Enable Google Calendar API
- Configure OAuth consent screen
- Create OAuth 2.0 Client ID (Chrome Extension type)
- Add Client ID to
manifest.json(replaceYOUR_CLIENT_ID)
- Open Chrome and navigate to
chrome://extensions/ - Enable "Developer mode" (toggle in top right)
- Click "Load unpacked"
- Select the project directory (
google-calendar-plugin/)
npm test # Run all tests
npm run test:watch # Watch mode
npm run test:coverage # Coverage reportNote: If tests fail with "jest-environment-jsdom cannot be found", install it:
npm install --legacy-peer-deps jest-environment-jsdom- No build step required: Code uses vanilla JavaScript with global module pattern
- ES6 modules converted: All imports/exports converted to work in Chrome Extension context
- Date utilities: Custom implementations replace date-fns for browser compatibility
- Module loading: All scripts loaded via manifest.json in dependency order
google-calendar-plugin/
├── manifest.json # Extension manifest (V3)
├── package.json # Dependencies and scripts
├── src/
│ ├── content/ # Content scripts
│ ├── background/ # Service worker
│ ├── popup/ # Extension popup
│ ├── styles/ # CSS files
│ └── utils/ # Utility functions
└── tests/ # Test files
If you get EPERM errors when running npm install:
# Remove macOS extended attributes
sudo xattr -cr ~/.nvm/versions/node/v18.20.8/
npm install --legacy-peer-depsSee FIX_NPM_NOW.md for detailed solutions.
If you get ERESOLVE errors:
# Use legacy peer deps (already configured in .npmrc)
npm install --legacy-peer-depsIf tests fail with "Cannot find module '@jest/test-sequencer'":
# Remove macOS extended attributes blocking node_modules
sudo xattr -cr node_modules/
npm testIf tests fail with missing jest-environment-jsdom:
npm install --legacy-peer-deps jest-environment-jsdomSee FIX_JEST_NOW.md and FIX_TESTS.md for more details.
Use the provided icon generator:
- Open
generate-icons.htmlin your browser - Click "Generate Icons" or "Download All Icons"
- Save icons to
assets/icons/directory:icon-16.pngicon-48.pngicon-128.png
# Build extension
npm run build
# Create package for submission
npm run package
# Output: dist/extension-v{VERSION}.zip# Bump patch version (0.1.0 → 0.1.1)
npm run version:patch
# Bump minor version (0.1.0 → 0.2.0)
npm run version:minor
# Bump major version (0.1.0 → 1.0.0)
npm run version:majorSee RELEASE_CHECKLIST.md for complete release process.
See store-assets/SUBMISSION_GUIDE.md for detailed submission instructions.
- ✅ Install dependencies:
npm install --legacy-peer-deps - ✅ Create icon files (use
generate-icons.html) - ✅ Configure OAuth credentials (see Prerequisites)
⚠️ Load extension in Chrome⚠️ Test on Google Calendar (manual testing pending)⚠️ Run automated tests:npm test(test environment needs fix)⚠️ Create store assets (screenshots, descriptions)- ✅ Host privacy policy (hosted at https://saski.github.io/google-calendar-plugin/)
⚠️ Submit to Chrome Web Store
Current Status: 99% complete - Multi-day events feature implemented. Ready for manual testing and store submission.