v1.0.0

πŸ“¦ Modular Structure

OnigiriJS is built as a modular framework, allowing you to load only the features you need for optimal performance and smaller bundle sizes.

Why Modular?

⚑

Faster Loading

Load only what you need - reduce bundle size by up to 70%

🎯

Precise Control

Pick exactly which features your app needs

πŸ”§

Easy Maintenance

Each module is independent and focused

πŸ“ˆ

Scalable

Start small, add features as you grow

Available Modules

Core Module (Required)

// onigiri-core.js - ~8KB
// - DOM manipulation
// - Element selection
// - Basic utilities
// - Plugin system

<script src="onigiri-core.js"></script>

Events Module

// onigiri-events.js - ~3KB
// - Event emitter
// - Namespaced events
// - Once events
// - Event delegation

<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>

Components Module

// onigiri-components.js - ~5KB
// - Reactive components
// - Lifecycle hooks
// - Computed properties
// - Data watchers

<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>

Security Module

// onigiri-security.js - ~4KB
// - CSRF protection
// - CSP support
// - XSS prevention
// - URL validation

<script src="onigiri-core.js"></script>
<script src="onigiri-security.js"></script>

AJAX Module

// onigiri-ajax.js - ~2KB
// - AJAX requests
// - Auto-CSRF
// - Promise-based
// - Convenience methods

<script src="onigiri-core.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-ajax.js"></script>

Storage Module

// onigiri-storage.js - ~3KB
// - Local storage
// - Session storage
// - Expiration support
// - Prefix management

<script src="onigiri-core.js"></script>
<script src="onigiri-storage.js"></script>

PJAX Module

// onigiri-pjax.js - ~4KB
// - PJAX navigation
// - Browser history
// - Response caching
// - Event hooks

<script src="onigiri-core.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-pjax.js"></script>

Validation Module

// onigiri-validation.js - ~3KB
// - Form validation
// - Built-in rules
// - Custom rules
// - Real-time validation

<script src="onigiri-core.js"></script>
<script src="onigiri-validation.js"></script>

Animation Module

// onigiri-animate.js - ~2KB
// - Fade in/out
// - Slide up/down
// - Smooth animations
// - Callback support

<script src="onigiri-core.js"></script>
<script src="onigiri-animate.js"></script>

HumHub Module

// onigiri-humhub.js - ~2KB
// - HumHub integration
// - Auto PJAX remounting
// - Module helper

<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>
<script src="onigiri-humhub.js"></script>

Loading Strategies

Minimal Setup (DOM Only)

<!-- Just 8KB for basic DOM manipulation -->
<script src="onigiri-core.js"></script>

<script>
// DOM manipulation only
O('.button').on('click', function() {
    O(this).addClass('active');
});
</script>

Basic Reactive App

<!-- ~16KB for reactive components -->
<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>

<script>
const app = new Onigiri.prototype.Component({
    data: { count: 0 },
    methods: {
        increment() { this.count++; }
    }
});
</script>

Full-Featured App

<!-- ~30KB for complete feature set -->
<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-ajax.js"></script>
<script src="onigiri-storage.js"></script>
<script src="onigiri-pjax.js"></script>
<script src="onigiri-validation.js"></script>
<script src="onigiri-animate.js"></script>

HumHub Module

<!-- Optimized for HumHub -->
<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-ajax.js"></script>
<script src="onigiri-storage.js"></script>
<script src="onigiri-humhub.js"></script>

Module Dependencies

// Dependency tree
onigiri-core.js (required, no dependencies)
β”œβ”€β”€ onigiri-events.js (depends on: core)
β”‚   └── onigiri-components.js (depends on: core, events)
β”‚       └── onigiri-humhub.js (depends on: core, events, components)
β”œβ”€β”€ onigiri-security.js (depends on: core)
β”‚   β”œβ”€β”€ onigiri-ajax.js (depends on: core, security)
β”‚   └── onigiri-pjax.js (depends on: core, security)
β”œβ”€β”€ onigiri-storage.js (depends on: core)
β”œβ”€β”€ onigiri-validation.js (depends on: core)
└── onigiri-animate.js (depends on: core)

Checking Loaded Modules

// Check which modules are loaded
console.log(Onigiri.modules);
// { core: true, events: true, components: true, ... }

// Check specific module
if (Onigiri.modules.security) {
    // Security module is loaded
    Onigiri.security.init();
}

if (Onigiri.modules.pjax) {
    // PJAX module is loaded
    Onigiri.pjax.init();
}

Conditional Loading

Load Modules Based on Features

<!-- Core always loaded -->
<script src="onigiri-core.js"></script>

<?php if ($needsComponents): ?>
    <script src="onigiri-events.js"></script>
    <script src="onigiri-components.js"></script>
<?php endif; ?>

<?php if ($needsAjax): ?>
    <script src="onigiri-security.js"></script>
    <script src="onigiri-ajax.js"></script>
<?php endif; ?>

<?php if ($needsValidation): ?>
    <script src="onigiri-validation.js"></script>
<?php endif; ?>

Dynamic Module Loading

// Load module dynamically
async function loadModule(moduleName) {
    return new Promise((resolve, reject) => {
        const script = document.createElement('script');
        script.src = \`onigiri.\${moduleName}.js\`;
        script.onload = resolve;
        script.onerror = reject;
        document.head.appendChild(script);
    });
}

// Usage
async function enableValidation() {
    if (!Onigiri.modules.validation) {
        await loadModule('validation');
        console.log('πŸ™ Validation module loaded!');
    }
    
    // Now use validation
    const result = O('#form').validate(rules);
}

Build Your Own Bundle

Custom Build Script

// build-custom.js
const fs = require('fs');

const modules = [
    'onigiri-core.js',
    'onigiri-events.js',
    'onigiri-components.js',
    'onigiri-security.js',
    'onigiri-ajax.js'
];

let combined = '';

modules.forEach(module => {
    combined += fs.readFileSync(module, 'utf8');
    combined += '\n\n';
});

fs.writeFileSync('onigiri.custom.js', combined);
console.log('πŸ™ Custom bundle created!');

Concatenate Modules

#!/bin/bash
# build.sh

# Create custom bundle
cat onigiri-core.js \
    onigiri-events.js \
    onigiri-components.js \
    onigiri-security.js \
    onigiri-ajax.js \
    onigiri-storage.js \
    > onigiri.bundle.js

echo "πŸ™ Bundle created: onigiri.bundle.js"

Module Size Comparison

// Approximate sizes (minified)
onigiri-core.js        ~8KB  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
onigiri-events.js      ~3KB  β–ˆβ–ˆβ–ˆ
onigiri-components.js  ~5KB  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
onigiri-security.js    ~4KB  β–ˆβ–ˆβ–ˆβ–ˆ
onigiri-ajax.js        ~2KB  β–ˆβ–ˆ
onigiri-storage.js     ~3KB  β–ˆβ–ˆβ–ˆ
onigiri-pjax.js        ~4KB  β–ˆβ–ˆβ–ˆβ–ˆ
onigiri-validation.js  ~3KB  β–ˆβ–ˆβ–ˆ
onigiri-animate.js     ~2KB  β–ˆβ–ˆ
onigiri-humhub.js      ~2KB  β–ˆβ–ˆ

Total (all modules):   ~36KB β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Compare to:
jQuery:                ~30KB
Vue.js:                ~33KB
React + ReactDOM:      ~42KB

Use Case Examples

Simple Landing Page

<!-- Only need DOM + Animations (10KB) -->
<script src="onigiri-core.js"></script>
<script src="onigiri-animate.js"></script>

<script>
O('.hero').fadeIn(500);
O('.cta-button').on('click', () => {
    O('.signup-form').slideDown(300);
});
</script>

Contact Form

<!-- DOM + Security + AJAX + Validation (17KB) -->
<script src="onigiri-core.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-ajax.js"></script>
<script src="onigiri-validation.js"></script>

<script>
Onigiri.security.init();

O('#contact-form').on('submit', async (e) => {
    e.preventDefault();
    
    const result = O(e.target).validate(rules);
    if (result.isValid) {
        await Onigiri.post('/api/contact', formData);
    }
});
</script>

Full SPA

<!-- Everything except HumHub (32KB) -->
<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-ajax.js"></script>
<script src="onigiri-storage.js"></script>
<script src="onigiri-pjax.js"></script>
<script src="onigiri-validation.js"></script>
<script src="onigiri-animate.js"></script>

HumHub Widget

<!-- HumHub-optimized (24KB) -->
<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-ajax.js"></script>
<script src="onigiri-storage.js"></script>
<script src="onigiri-humhub.js"></script>
πŸ™ Pro Tip: Start with just core + the modules you need. You can always add more modules later as your app grows!

Module Best Practices

  • Always load core.js first
  • Respect module dependencies
  • Only load modules you actually use
  • Check Onigiri.modules before using features
  • Consider creating custom bundles for production
  • Test with only required modules loaded
  • Document which modules your code needs
  • Use conditional loading for optional features

Future Modules

Modules planned for future releases:

  • onigiri.router.js - Client-side routing
  • onigiri.i18n.js - Internationalization
  • onigiri.websocket.js - WebSocket support
  • onigiri.charts.js - Data visualization
  • onigiri.drag.js - Drag and drop

Creating Custom Modules

// onigiri.custom.js - Custom module template
(function(Onigiri) {
    'use strict';

    if (!Onigiri) {
        throw new Error('OnigiriJS core not found');
    }

    // Your custom functionality
    Onigiri.customFeature = {
        init: function() {
            console.log('πŸ™ Custom feature initialized');
        },
        
        doSomething: function() {
            // Your code here
        }
    };

    // Register module
    Onigiri.modules.custom = true;

})(typeof Onigiri !== 'undefined' ? Onigiri : null);

βœ… Development Roadmap

Track the progress of OnigiriJS modules. Tasks are marked complete by the development team.

OnigiriJS Module Roadmap

Implementation progress of planned modules

6 / 21 completed (29%)
onigiri-state
Shared global & scoped state management
onigiri-directives
Declarative DOM bindings (o-show, o-model, etc.)
onigiri-resource
REST-style data models over AJAX
onigiri-observe
Intersection & Mutation observer helpers
onigiri-humhub-ui
Standard HumHub UI abstractions (modal, notify, confirm)
onigiri-lifecycle
Component lifecycle hooks
onigiri-guard
Debounce, throttle, single-run guards
onigiri-scroll
Scroll save/restore & helpers (PJAX-friendly)
onigiri-permission
Client-side permission awareness
onigiri-portal
DOM teleport / overlay mounting
onigiri-router
Micro router (non-SPA, PJAX-first)
onigiri-sanitize
HTML & input sanitization
onigiri-shortcut
Keyboard shortcut manager
onigiri-queue
Sequential async task runner
onigiri-gesture
Touch & swipe helpers
onigiri-devtools
Debugging & inspection helpers
onigiri-plugin
Plugin registration system
onigiri-time
Relative time & timezone utilities
onigiri-emojis
Emoji Picker and Manager
onigiri-tasks
Task Management
onigiri-polls
Polls creation and management
Note: Task completion is managed by the OnigiriJS development team.