@faqir-ui/core 1.0.0 → 1.1.1

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.
Files changed (41) hide show
  1. package/README.md +45 -5
  2. package/cdn.json +38 -22
  3. package/dist/faqir-core.js +121 -57
  4. package/dist/faqir-core.min.js +3 -3
  5. package/dist/faqir-core.min.js.map +3 -3
  6. package/dist/faqir-core.mjs +75 -59
  7. package/dist/faqir.aurora.css +1209 -507
  8. package/dist/faqir.brutalist.css +1184 -489
  9. package/dist/faqir.candy.css +14152 -0
  10. package/dist/faqir.clinical.css +14152 -0
  11. package/dist/faqir.contrast.css +1198 -526
  12. package/dist/faqir.default.css +1261 -588
  13. package/dist/faqir.document-serif.css +1211 -491
  14. package/dist/faqir.document.css +1193 -490
  15. package/dist/faqir.editorial-document.css +14116 -0
  16. package/dist/faqir.editorial.css +14152 -0
  17. package/dist/faqir.fintech.css +14152 -0
  18. package/dist/faqir.glass.css +1214 -517
  19. package/dist/faqir.ink-document.css +14116 -0
  20. package/dist/faqir.ink.css +14127 -0
  21. package/dist/faqir.luxe.css +14211 -0
  22. package/dist/faqir.midnight.css +1229 -507
  23. package/dist/faqir.neo.css +14153 -0
  24. package/dist/faqir.neumorph.css +14151 -0
  25. package/dist/faqir.nordic.css +14151 -0
  26. package/dist/faqir.organic.css +14152 -0
  27. package/dist/faqir.paper.css +1200 -508
  28. package/dist/faqir.slate.css +1296 -564
  29. package/dist/faqir.soft.css +1180 -494
  30. package/dist/faqir.sunset.css +14153 -0
  31. package/dist/faqir.swiss-document.css +14116 -0
  32. package/dist/faqir.swiss.css +14153 -0
  33. package/dist/faqir.terminal.css +1187 -491
  34. package/dist/plugins/faqir-collapse.js +1 -1
  35. package/dist/plugins/faqir-intersect.js +2 -0
  36. package/dist/plugins/faqir-mask.js +27 -17
  37. package/dist/plugins/faqir-rules.js +63 -0
  38. package/dist/plugins/faqir-validate.js +471 -58
  39. package/dist/sri.json +36 -20
  40. package/faqir-core.d.ts +119 -6
  41. package/package.json +1 -1
@@ -126,6 +126,7 @@ var require_faqir_core = __commonJS((exports, module) => {
126
126
  var iterations = 0;
127
127
  while (pendingEffects.size > 0) {
128
128
  if (++iterations > 100) {
129
+ console.warn("[Faqir] Effect loop: dropped " + pendingEffects.size + " effect(s) after 100 flushes; effects keep re-triggering each other");
129
130
  pendingEffects.clear();
130
131
  break;
131
132
  }
@@ -631,6 +632,14 @@ var require_faqir_core = __commonJS((exports, module) => {
631
632
  function signalOf(ac) {
632
633
  return ac ? ac.signal : undefined;
633
634
  }
635
+ function locate(id, row) {
636
+ var items = scope[name];
637
+ for (var i = 0;i < items.length; i++) {
638
+ if (row ? items[i] === row : items[i] && items[i][idKey] === id)
639
+ return i;
640
+ }
641
+ return -1;
642
+ }
634
643
  scope[name] = [];
635
644
  scope[name + "Loading"] = false;
636
645
  scope[name + "Error"] = null;
@@ -673,11 +682,10 @@ var require_faqir_core = __commonJS((exports, module) => {
673
682
  if (destroyed)
674
683
  return Promise.resolve(null);
675
684
  scope[name + "Error"] = null;
676
- var tempIndex = -1;
685
+ var temp = null;
677
686
  if (isOptimistic) {
678
- var temp = Object.assign({}, payload, { _pending: true });
679
- scope[name].push(temp);
680
- tempIndex = scope[name].length - 1;
687
+ scope[name].push(Object.assign({}, payload, { _pending: true }));
688
+ temp = scope[name][scope[name].length - 1];
681
689
  }
682
690
  var ac = beginRequest();
683
691
  return fetch(endpoint, {
@@ -693,9 +701,10 @@ var require_faqir_core = __commonJS((exports, module) => {
693
701
  endRequest(ac);
694
702
  if (destroyed)
695
703
  return null;
696
- if (isOptimistic && tempIndex >= 0) {
697
- scope[name][tempIndex] = created;
698
- } else {
704
+ var at = temp ? locate(null, temp) : -1;
705
+ if (at >= 0) {
706
+ scope[name][at] = created;
707
+ } else if (!temp || !created || created[idKey] == null || locate(created[idKey]) < 0) {
699
708
  scope[name].push(created);
700
709
  }
701
710
  return created;
@@ -704,9 +713,9 @@ var require_faqir_core = __commonJS((exports, module) => {
704
713
  if (destroyed)
705
714
  return null;
706
715
  scope[name + "Error"] = e.message;
707
- if (isOptimistic && tempIndex >= 0) {
708
- scope[name].splice(tempIndex, 1);
709
- }
716
+ var at = temp ? locate(null, temp) : -1;
717
+ if (at >= 0)
718
+ scope[name].splice(at, 1);
710
719
  return null;
711
720
  });
712
721
  },
@@ -715,20 +724,14 @@ var require_faqir_core = __commonJS((exports, module) => {
715
724
  return Promise.resolve(null);
716
725
  scope[name + "Error"] = null;
717
726
  var items = scope[name];
718
- var idx = -1;
719
- for (var i = 0;i < items.length; i++) {
720
- if (items[i][idKey] === id) {
721
- idx = i;
722
- break;
723
- }
724
- }
727
+ var idx = locate(id);
725
728
  var snapshot = null;
726
729
  if (isOptimistic && idx >= 0) {
727
730
  snapshot = Object.assign({}, items[idx]);
728
731
  Object.assign(items[idx], payload);
729
732
  }
730
733
  var ac = beginRequest();
731
- return fetch(endpoint + "/" + id, {
734
+ return fetch(endpoint + "/" + encodeURIComponent(id), {
732
735
  method: "PATCH",
733
736
  headers: { "Content-Type": "application/json" },
734
737
  body: JSON.stringify(payload),
@@ -741,17 +744,18 @@ var require_faqir_core = __commonJS((exports, module) => {
741
744
  endRequest(ac);
742
745
  if (destroyed)
743
746
  return null;
744
- if (idx >= 0)
745
- scope[name][idx] = updated;
747
+ var at = locate(id);
748
+ if (at >= 0)
749
+ scope[name][at] = updated;
746
750
  return updated;
747
751
  }).catch(function(e) {
748
752
  endRequest(ac);
749
753
  if (destroyed)
750
754
  return null;
751
755
  scope[name + "Error"] = e.message;
752
- if (isOptimistic && snapshot && idx >= 0) {
753
- scope[name][idx] = snapshot;
754
- }
756
+ var at = snapshot ? locate(id) : -1;
757
+ if (at >= 0)
758
+ scope[name][at] = snapshot;
755
759
  return null;
756
760
  });
757
761
  },
@@ -760,34 +764,28 @@ var require_faqir_core = __commonJS((exports, module) => {
760
764
  return Promise.resolve();
761
765
  scope[name + "Error"] = null;
762
766
  var items = scope[name];
763
- var idx = -1;
764
- for (var i = 0;i < items.length; i++) {
765
- if (items[i][idKey] === id) {
766
- idx = i;
767
- break;
768
- }
769
- }
767
+ var idx = locate(id);
770
768
  var snapshot = null;
771
769
  if (isOptimistic && idx >= 0) {
772
770
  snapshot = items[idx];
773
771
  items.splice(idx, 1);
774
772
  }
775
773
  var ac = beginRequest();
776
- return fetch(endpoint + "/" + id, { method: "DELETE", signal: signalOf(ac) }).then(function(res) {
774
+ return fetch(endpoint + "/" + encodeURIComponent(id), { method: "DELETE", signal: signalOf(ac) }).then(function(res) {
777
775
  if (!res.ok)
778
776
  throw new Error(res.status + " " + res.statusText);
779
777
  endRequest(ac);
780
778
  if (destroyed)
781
779
  return;
782
- if (!isOptimistic && idx >= 0) {
783
- scope[name].splice(idx, 1);
784
- }
780
+ var at = isOptimistic ? -1 : locate(id);
781
+ if (at >= 0)
782
+ scope[name].splice(at, 1);
785
783
  }).catch(function(e) {
786
784
  endRequest(ac);
787
785
  if (destroyed)
788
786
  return;
789
787
  scope[name + "Error"] = e.message;
790
- if (isOptimistic && snapshot) {
788
+ if (snapshot && locate(id) < 0) {
791
789
  scope[name].splice(idx, 0, snapshot);
792
790
  }
793
791
  });
@@ -1258,15 +1256,11 @@ var require_faqir_core = __commonJS((exports, module) => {
1258
1256
  });
1259
1257
  var inputHandler = function() {
1260
1258
  var value = el.value;
1261
- if (modifiers.has("number"))
1262
- value = parseFloat(value) || 0;
1263
1259
  if (modifiers.has("trim"))
1264
1260
  value = value.trim();
1265
- if (typeof value === "number") {
1266
- writeModel(prop, value, scope, el);
1267
- } else {
1268
- writeModel(prop, value, scope, el);
1269
- }
1261
+ if (modifiers.has("number"))
1262
+ value = parseFloat(value) || 0;
1263
+ writeModel(prop, value, scope, el);
1270
1264
  };
1271
1265
  if (modifiers.has("debounce")) {
1272
1266
  inputHandler = debounce(inputHandler, 300);
@@ -1501,16 +1495,20 @@ var require_faqir_core = __commonJS((exports, module) => {
1501
1495
  }) : [];
1502
1496
  var oldMap = new Map;
1503
1497
  for (var i = 0;i < currentEntries.length; i++) {
1504
- oldMap.set(currentEntries[i].key, currentEntries[i]);
1498
+ var k = currentEntries[i].key;
1499
+ if (oldMap.has(k))
1500
+ oldMap.get(k).push(currentEntries[i]);
1501
+ else
1502
+ oldMap.set(k, [currentEntries[i]]);
1505
1503
  }
1506
1504
  var n = items.length;
1507
1505
  var newEntries = new Array(n);
1508
1506
  var source = new Array(n);
1509
1507
  for (var i = 0;i < n; i++) {
1510
1508
  var key = keyFor(items[i], i);
1511
- var entry = oldMap.get(key);
1509
+ var olds = oldMap.get(key);
1510
+ var entry = olds && olds.shift();
1512
1511
  if (entry !== undefined) {
1513
- oldMap.delete(key);
1514
1512
  entry.scope[itemName] = items[i];
1515
1513
  entry.scope[indexName] = i;
1516
1514
  source[i] = entry.__i + 1;
@@ -1520,10 +1518,12 @@ var require_faqir_core = __commonJS((exports, module) => {
1520
1518
  }
1521
1519
  newEntries[i] = entry;
1522
1520
  }
1523
- oldMap.forEach(function(stale) {
1524
- for (var j2 = 0;j2 < stale.nodes.length; j2++) {
1525
- destroyScope(stale.nodes[j2]);
1526
- stale.nodes[j2].remove();
1521
+ oldMap.forEach(function(olds2) {
1522
+ for (var e = 0;e < olds2.length; e++) {
1523
+ for (var j2 = 0;j2 < olds2[e].nodes.length; j2++) {
1524
+ destroyScope(olds2[e].nodes[j2]);
1525
+ olds2[e].nodes[j2].remove();
1526
+ }
1527
1527
  }
1528
1528
  });
1529
1529
  var seq = getSequence(source);
@@ -3532,13 +3532,17 @@ var require_faqir_core = __commonJS((exports, module) => {
3532
3532
  }
3533
3533
  let cancelExitWait = null;
3534
3534
  function open() {
3535
+ if (root.dataset.state === "open" && focusCleanup)
3536
+ return;
3535
3537
  cancelExitWait?.();
3536
3538
  cancelExitWait = null;
3537
- previouslyFocused = document.activeElement;
3539
+ if (!focusCleanup)
3540
+ previouslyFocused = document.activeElement;
3538
3541
  root.dataset.state = "open";
3539
3542
  overlay.hidden = false;
3540
3543
  panel.hidden = false;
3541
- focusCleanup = trapFocus(panel);
3544
+ if (!focusCleanup)
3545
+ focusCleanup = trapFocus(panel);
3542
3546
  focusInitial();
3543
3547
  }
3544
3548
  function close() {
@@ -8666,7 +8670,7 @@ var require_faqir_core = __commonJS((exports, module) => {
8666
8670
  }
8667
8671
  function dismiss(id) {
8668
8672
  const entry = toasts.get(id);
8669
- if (!entry)
8673
+ if (!entry || entry.cancelExitWait)
8670
8674
  return;
8671
8675
  const { el, timer, closeBtn, onCloseClick, actionBtn, onActionClick } = entry;
8672
8676
  if (timer)
@@ -9519,6 +9523,9 @@ var require_faqir_core = __commonJS((exports, module) => {
9519
9523
  },
9520
9524
  warnings: function() {
9521
9525
  return devHooks ? devHooks.warnings() : [];
9526
+ },
9527
+ report: function(message, el) {
9528
+ return false;
9522
9529
  }
9523
9530
  };
9524
9531
  function initController(name, el) {
@@ -9547,7 +9554,7 @@ var require_faqir_core = __commonJS((exports, module) => {
9547
9554
  continue;
9548
9555
  if (rootEl.__faqirScope) {
9549
9556
  processed.add(rootEl);
9550
- var seen = rootEl.querySelectorAll("[l-data]");
9557
+ var seen = rootEl.querySelectorAll("[l-data], [data-ui]");
9551
9558
  for (var sd = 0;sd < seen.length; sd++)
9552
9559
  processed.add(seen[sd]);
9553
9560
  continue;
@@ -9573,7 +9580,7 @@ var require_faqir_core = __commonJS((exports, module) => {
9573
9580
  }
9574
9581
  if (!skipThis) {
9575
9582
  initTree(rootEl, null);
9576
- var descendants = rootEl.querySelectorAll("[l-data]");
9583
+ var descendants = rootEl.querySelectorAll("[l-data], [data-ui]");
9577
9584
  for (var d = 0;d < descendants.length; d++)
9578
9585
  processed.add(descendants[d]);
9579
9586
  processed.add(rootEl);
@@ -9607,7 +9614,7 @@ var require_faqir_core = __commonJS((exports, module) => {
9607
9614
  if (uiName && controllerRegistry[uiName]) {
9608
9615
  initController(uiName, node);
9609
9616
  }
9610
- if (node.hasAttribute && node.hasAttribute("l-data")) {
9617
+ if (node.__faqirScope) {} else if (node.hasAttribute && node.hasAttribute("l-data")) {
9611
9618
  initTree(node, findParentScope(node));
9612
9619
  } else if (node.hasAttribute && node.hasAttribute("data-ui") && !findParentScope(node)) {
9613
9620
  initTree(node, null);
@@ -9638,16 +9645,25 @@ var require_faqir_core = __commonJS((exports, module) => {
9638
9645
  mutationObserver.observe(document.body, { childList: true, subtree: true });
9639
9646
  }
9640
9647
  var currentScript = typeof document !== "undefined" ? document.currentScript : null;
9641
- var isManual = currentScript && currentScript.hasAttribute("data-manual");
9648
+ var isManual = currentScript ? currentScript.hasAttribute("data-manual") : typeof document !== "undefined" && !!document.querySelector('script[type="module"][data-manual]');
9649
+ var autoStarted = false;
9650
+ function autoStart() {
9651
+ if (autoStarted)
9652
+ return;
9653
+ autoStarted = true;
9654
+ bootstrap();
9655
+ }
9642
9656
  if (!isManual && typeof document !== "undefined") {
9643
9657
  if (document.readyState === "loading") {
9644
- document.addEventListener("DOMContentLoaded", bootstrap);
9658
+ document.addEventListener("DOMContentLoaded", autoStart);
9645
9659
  } else {
9646
- bootstrap();
9660
+ if (document.readyState === "interactive")
9661
+ document.addEventListener("DOMContentLoaded", autoStart);
9662
+ setTimeout(autoStart, 0);
9647
9663
  }
9648
9664
  }
9649
9665
  var Faqir = {
9650
- version: "1.0.0",
9666
+ version: "1.1.1",
9651
9667
  reactive,
9652
9668
  effect,
9653
9669
  batch,