This is a digitized version of the Macedonian children's alphabet book "Бушава азбука" (Bushava Azbuka) by Goran Stefanovski, illustrated by Dušan Petričić. The project is a Jekyll-based static website with Bootstrap 5, SCSS, and PWA support.
npm install # Install dependencies (run after cloning)
npm run build # Build optimized CSS from SCSS (compressed)
npm run watch # Watch mode for SCSS (generates source maps)
npm run copy-js # Copy jQuery, Popper, Bootstrap to assets/jsbundle install # Install Ruby dependencies
bundle exec jekyll serve --incremental # Start local server
jekyll build # Build for productionThere are no test frameworks configured. The npm test command exits with error:
npm test # Outputs: "Error: no test specified" && exit 1To add tests, consider adding a framework like Jest for JavaScript or a Ruby testing gem.
- Jekyll templates in
_layouts/and_includes/ - SCSS partials in
assets/scss/(prefixed with_) - Main entry:
assets/scss/main.scss - Service worker:
sw.js(PWA caching logic)
- File Organization: Partial files start with underscore (
_variables.scss,_mixins.scss) - Import Order: Mixins first, then Bootstrap, then custom components (see
main.scss) - Variables: Follow Bootstrap's
$component-state-property-sizeformula - Naming: Use kebab-case for variables and CSS classes (e.g.,
$primary-bg-subtle) - Defaults: Use
!defaultfor overridable variables - Color System: Follow Bootstrap's color scale (100-900)
- Comments: Use
//for single-line,/* */for multi-line; use scss-docs markers for variables
- Style: Use ES6+ (const, arrow functions)
- Naming: camelCase for variables and functions
- Error Handling: Add .catch() for offline fallback
- Caching: Cache-first strategy for static assets
- URL: Use
self.location.origininstead of hardcoded URL
- Syntax: Liquid tags for templating:
{{ variable }},{% tag %} - Includes: Use
_includes/for reusable components (navbar, footer, scripts) - Layouts: Use
_layouts/for page templates (default.html, bukva.html)
- SCSS partials:
_filename.scss - Jekyll layouts:
layout-name.html - Includes:
component-name.html - Service worker:
sw.js
- Indentation: 2 spaces for SCSS and JavaScript
- No trailing whitespace
- Maximum line length: 120 characters (soft limit)
- Use semicolons in JavaScript
- CSS: Generated from SCSS via
npm run build - JS: jQuery, Popper.js, Bootstrap (minified copies from node_modules)
- Fonts: FreeSerif WOFF/WOFF2 in
assets/free-serif/ - Images: Optimized PNGs and SVGs in
assets/ - Video: H.264 and WebM formats for compatibility
├── _includes/ # Reusable HTML partials
├── _layouts/ # Page templates (default.html, bukva.html)
├── _data/ # Jekyll data files
├── _bukvi/ # Letter pages (generated content)
├── assets/
│ ├── scss/ # SCSS source files (_*.scss, main.scss)
│ ├── js/ # JavaScript (copied from node_modules)
│ ├── sliki/ # Images
│ ├── video/ # Video files
│ └── free-serif/ # Web fonts
├── _config.yml # Jekyll configuration
├── sw.js # Service worker (PWA)
├── Gemfile # Ruby dependencies (Jekyll)
└── package.json # Node.js dependencies
- Create Markdown file in
_bukvi/(e.g.,32-ѥ.html) - Set
layout: bukvaand define letter info in front matter - Letters are auto-generated based on content
- Edit SCSS partial in
assets/scss/ - Run
npm run watchto see changes live - Run
npm run buildto generate production CSS
- Edit
sw.jsto change cache name or resources - Service worker auto-updates on page refresh
- No linting or type checking configured
- No automated tests
- Dark mode disabled (
$enable-dark-mode: false) - Use
bundle execfor Jekyll commands to ensure correct gem versions - Video compression: Use H.264 (CRF 30) and VP9 (CRF 50) for compatibility
- Use 2-space indentation
- Set encoding to UTF-8
- Line endings: LF (Unix)
- Ruby: Jekyll 4.2.1, jekyll-feed, webrick
- Node.js: sass, bootstrap, jquery, @popperjs/core
- CSS Framework: Bootstrap 5 (customized, dark mode disabled)
- Markdown processor: kramdown
- Collections:
bukvi(letter pages) - Sass directory:
assets/scss - Output style: compressed
- Service worker:
sw.js - Cache strategy: Cache-first for static assets
- Cache invalidation: On service worker update (new cache name with date)
All Bootstrap variables are customized in assets/scss/_variables.scss:
- Custom color:
$banana(#ffffba) - Rounded corners disabled:
$enable-rounded: false - Shadows disabled:
$enable-shadows: false - Dark mode disabled:
$enable-dark-mode: false
- Primary font: FreeSerif (WOFF/WOFF2)
- Fallback: Times New Roman, serif
- Custom fonts in
assets/free-serif/
- Intro video in
assets/video/ - H.264 format for broad compatibility
- WebM format for modern browsers
- Poster image for video placeholder
- Run
npm run buildto generate production CSS - Verify no JavaScript errors in browser console
- Test PWA functionality (service worker registration)
- Check all letter pages render correctly
- Minified Bootstrap, jQuery, Popper (do not modify)
- Compressed CSS output
- Web fonts preloaded in HTML head
- Video poster images for perceived performance
- Use semantic HTML elements
- Ensure sufficient color contrast (WCAG 2.2, ratio 4.5:1)
- Include alt text for images
- Support keyboard navigation