zero-query 0.3.1 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/core.js CHANGED
@@ -468,6 +468,16 @@ query.id = (id) => document.getElementById(id);
468
468
  query.class = (name) => document.querySelector(`.${name}`);
469
469
  query.classes = (name) => Array.from(document.getElementsByClassName(name));
470
470
  query.tag = (name) => Array.from(document.getElementsByTagName(name));
471
+ Object.defineProperty(query, 'name', {
472
+ value: (name) => Array.from(document.getElementsByName(name)),
473
+ writable: true, configurable: true
474
+ });
475
+ query.attr = (attr, value) => Array.from(
476
+ document.querySelectorAll(value !== undefined ? `[${attr}="${value}"]` : `[${attr}]`)
477
+ );
478
+ query.data = (key, value) => Array.from(
479
+ document.querySelectorAll(value !== undefined ? `[data-${key}="${value}"]` : `[data-${key}]`)
480
+ );
471
481
  query.children = (parentId) => {
472
482
  const p = document.getElementById(parentId);
473
483
  return p ? Array.from(p.children) : [];
@@ -496,13 +506,26 @@ query.ready = (fn) => {
496
506
  else document.addEventListener('DOMContentLoaded', fn);
497
507
  };
498
508
 
499
- // Global event delegation
500
- query.on = (event, selector, handler) => {
509
+ // Global event listeners — supports direct and delegated forms
510
+ // $.on('keydown', handler) direct listener on document
511
+ // $.on('click', '.btn', handler) → delegated via closest()
512
+ query.on = (event, selectorOrHandler, handler) => {
513
+ if (typeof selectorOrHandler === 'function') {
514
+ // 2-arg: direct document listener (keydown, resize, etc.)
515
+ document.addEventListener(event, selectorOrHandler);
516
+ return;
517
+ }
518
+ // 3-arg: delegated
501
519
  document.addEventListener(event, (e) => {
502
- const target = e.target.closest(selector);
520
+ const target = e.target.closest(selectorOrHandler);
503
521
  if (target) handler.call(target, e);
504
522
  });
505
523
  };
506
524
 
525
+ // Remove a direct global listener
526
+ query.off = (event, handler) => {
527
+ document.removeEventListener(event, handler);
528
+ };
529
+
507
530
  // Extend collection prototype (like $.fn in jQuery)
508
531
  query.fn = ZQueryCollection.prototype;
package/src/router.js CHANGED
@@ -22,9 +22,9 @@ import { mount, destroy } from './component.js';
22
22
  class Router {
23
23
  constructor(config = {}) {
24
24
  this._el = null;
25
- // Auto-detect: file:// protocol can't use pushState, fall back to hash
25
+ // file:// protocol can't use pushState always force hash mode
26
26
  const isFile = typeof location !== 'undefined' && location.protocol === 'file:';
27
- this._mode = config.mode || (isFile ? 'hash' : 'history');
27
+ this._mode = isFile ? 'hash' : (config.mode || 'history');
28
28
 
29
29
  // Base path for sub-path deployments
30
30
  // Priority: explicit config.base → window.__ZQ_BASE → <base href> tag