estreui 1.2.1 → 1.2.3

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/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # EstreUI.js
2
2
 
3
+ ![jQuery 4.0 Supported](https://img.shields.io/badge/jQuery-4.0%20Supported-0769AD?style=for-the-badge&logo=jquery&logoColor=white)
4
+
3
5
  EstreUI is a "Rimwork" (Runnable Frame) designed to bridge the gap between classic web development and modern native-like web applications. It provides a structured, mobile-first environment for developers familiar with jQuery, ASP, PHP, or JSP, as well as native app developers looking to transition to the web.
4
6
 
5
7
  [한국어 문서 (Korean Documentation)](#estre-ui-rimwork-korean)
@@ -27,6 +29,10 @@ EstreUI is not just a library, nor a full-blown framework in the traditional sen
27
29
  * **Browsers**: Chromium 92+, Safari 15+ (iOS 15+).
28
30
  * **Recommendation**: **iOS 16+** is strongly recommended due to severe CSS limitations in iOS 15.
29
31
 
32
+ ### Developer & AI Agent Documentation
33
+ * **[EstreUI.js Developer Docs](.agent/estreui/README.md)**: In-depth, case-based developer documentation covering foundations, page system, handles, markup conventions, boot sequence, navigation API, and template engine.
34
+ * **[Project Adaptation Guide](.agent/project/README.md)**: Reference material for integrating EstreUI.js into a new project or modifying code in an existing one — includes upstream file classification, adaptation patterns, and style guide.
35
+
30
36
  ---
31
37
 
32
38
  ## Getting Started
@@ -292,6 +298,10 @@ EstreUI는 단순한 라이브러리도, 전통적인 의미의 완전한 프레
292
298
  * **브라우저**: Chromium 92+, Safari 15+ (iOS 15+).
293
299
  * **권장 사항**: iOS 15의 CSS 제한으로 인해 **iOS 16 이상**을 강력히 권장합니다.
294
300
 
301
+ ### 개발자 및 AI 에이전트 문서
302
+ * **[EstreUI.js 개발문서](.agent/estreui/README.md)**: 기초, 페이지 시스템, 핸들, 마크업 컨벤션, 부트 시퀀스, 네비게이션 API, 템플릿 엔진을 다루는 사례 기반 상세 개발문서입니다.
303
+ * **[프로젝트 적용 가이드](.agent/project/README.md)**: EstreUI.js를 새 프로젝트에 통합하거나 기존 프로젝트의 코드를 수정할 때 필요한 참고 자료 — 업스트림 파일 분류, 적용 패턴, 스타일 가이드를 포함합니다.
304
+
295
305
  ---
296
306
 
297
307
  ## 시작하기 (Getting Started)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "estreui",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "description": "EstreUI Core Library - A comprehensive UI framework for web applications",
5
5
  "main": "scripts/estreUi.js",
6
6
  "files": [
@@ -32,7 +32,11 @@
32
32
  "mobile-ui",
33
33
  "desktop-ui",
34
34
  "web-desktop",
35
- "jquery-plugin"
35
+ "jquery-plugin",
36
+ "legacy-modernization",
37
+ "no-build",
38
+ "jquery4",
39
+ "ai-ready"
36
40
  ],
37
41
  "author": "SoliEstre",
38
42
  "license": "MIT",
@@ -593,6 +593,44 @@ const cvt = {
593
593
 
594
594
 
595
595
 
596
+ /** Data Attribute name alias constant and Data prefixed Kebab Case Characters loopback (2 letters and more) */
597
+ const dd = new Proxy({
598
+ get a() { return ; }, // *reserved*
599
+ get b() { return ; }, // *reserved*
600
+ get c() { return ; }, // *reserved*
601
+ get d() { return "data-disabled"; },
602
+ get e() { return ; }, // *reserved*
603
+ get f() { return ; }, // *reserved*
604
+ get g() { return ; }, // *reserved*
605
+ get h() { return ; }, // *reserved*
606
+ get i() { return ; }, // *reserved*
607
+ get j() { return ; }, // *reserved*
608
+ get k() { return ; }, // *reserved*
609
+ get l() { return ; }, // *reserved*
610
+ get m() { return ; }, // *reserved*
611
+ get n() { return ; }, // *reserved*
612
+ get o() { return ; }, // *reserved*
613
+ get p() { return ; }, // *reserved*
614
+ get q() { return ; }, // *reserved*
615
+ get r() { return ; }, // *reserved*
616
+ get s() { return ; }, // *reserved*
617
+ get t() { return ; }, // *reserved*
618
+ get u() { return ; }, // *reserved*
619
+ get v() { return ; }, // *reserved*
620
+ get w() { return ; }, // *reserved*
621
+ get x() { return ; }, // *reserved*
622
+ get y() { return ; }, // *reserved*
623
+ get z() { return ; }, // *reserved*
624
+ }, {
625
+ get: (target, prop) => {
626
+ if (prop in target) return target[prop];
627
+ else return "data-" + prop.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
628
+ .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')
629
+ .replace(/^([A-Z])/, '-$1').toLowerCase();
630
+ }
631
+ });
632
+
633
+
596
634
  // Utility constants block --
597
635
 
598
636
  // Text alias constant
@@ -899,8 +937,7 @@ class LocalStyle {
899
937
  }
900
938
  localPrefix += specifier;
901
939
  }
902
- // const localizedStyles = styles.replace(/^([\t\s]*)##/gm, "$1" + localPrefix);
903
- const localizedStyles = styles.replace(/([^#])##([^#])/g, "$1" + localPrefix + "$2").replace(/^##([^#])/gm, localPrefix + "$1");
940
+ const localizedStyles = styles.replace(/(^|[^#])##(?!#)/gm, "$1" + localPrefix);
904
941
 
905
942
  const styleSheet = doc.ce("style");
906
943
  if (elem == null) location.append(styleSheet);
@@ -488,7 +488,7 @@ const eds = {
488
488
 
489
489
 
490
490
  // Popup browser
491
- function estrePopupBrowser(options = {}) {
491
+ function estrePopupBrowser(options = {}, instanceOrigin) {
492
492
  return new Promise((resolve) => pageManager.bringPage("!popupBrowser", {
493
493
  data: options,
494
494
  onBeforeAttach(handle, iframe) {
@@ -513,7 +513,7 @@ function estrePopupBrowser(options = {}) {
513
513
  onClickForward(handle, iframe, url) {
514
514
  return this?.data?.callbackForward?.(handle, iframe, url);
515
515
  },
516
- }));
516
+ }, instanceOrigin));
517
517
  }
518
518
 
519
519
  const popupBrowser = (src = "about:blank", name = "webview",
@@ -539,7 +539,7 @@ const closePopupBrowserWhenOnTop = async () => {
539
539
 
540
540
 
541
541
  // Toast up slide dialog
542
- function estreToastAlert(options = {}) {
542
+ function estreToastAlert(options = {}, instanceOrigin) {
543
543
  return new Promise((resolve) => pageManager.bringPage("!toastAlert", {
544
544
  data: options,
545
545
  onOk() {
@@ -550,7 +550,7 @@ function estreToastAlert(options = {}) {
550
550
  this?.data?.callbackDissmiss?.();
551
551
  resolve(undefined);
552
552
  },
553
- }));
553
+ }, instanceOrigin));
554
554
  }
555
555
 
556
556
  const toastAlert = (title, message,
@@ -560,7 +560,7 @@ const toastAlert = (title, message,
560
560
  ) => estreToastAlert({ title, message, callbackOk, callbackDissmiss, ok });
561
561
 
562
562
 
563
- function estreToastConfirm(options = {}) {
563
+ function estreToastConfirm(options = {}, instanceOrigin) {
564
564
  return new Promise((resolve) => pageManager.bringPage("!toastConfirm", {
565
565
  data: options,
566
566
  onPositive() {
@@ -579,7 +579,7 @@ function estreToastConfirm(options = {}) {
579
579
  this?.data?.callbackDissmiss?.();
580
580
  resolve(undefined);
581
581
  },
582
- }));
582
+ }, instanceOrigin));
583
583
  }
584
584
 
585
585
  const toastConfirm = (title, message,
@@ -633,7 +633,7 @@ const toastPrompt = (title,
633
633
  ) => estreToastPrompt({ title, message, callbackConfirm, callbackDissmiss, confirm, placeholder, type, value });
634
634
 
635
635
 
636
- function estreToastOption(options = {}) {
636
+ function estreToastOption(options = {}, instanceOrigin) {
637
637
  return new Promise((resolve) => pageManager.bringPage("!toastOption", {
638
638
  data: options,
639
639
  onSelected(key, value) {
@@ -644,7 +644,7 @@ function estreToastOption(options = {}) {
644
644
  this?.data?.callbackDissmiss?.();
645
645
  resolve(undefined);
646
646
  },
647
- }));
647
+ }, instanceOrigin));
648
648
  }
649
649
 
650
650
  const toastOption = (title = "", message = "",
@@ -708,7 +708,7 @@ const selectionToast = (options = ["option A", "option B", "option C"],
708
708
  ) => toastSelection(title, message, minSelection, maxSelection, options, defaultSelected, callbackConfirm, callbackSelect, callbackDissmiss, callbackAnother, confirm, another);
709
709
 
710
710
 
711
- function estreToastDials(options = {}) {
711
+ function estreToastDials(options = {}, instanceOrigin) {
712
712
  const arrays = [c.table, c.initial, c.aligns, c.prefixes, c.suffixes, c.dividers];
713
713
  for (const name of arrays) if (!typeString(options[name])) options[name] = Jcodd.coddify(options[name]);
714
714
  options.stretch = !options.stretch ? "" : t1;
@@ -733,7 +733,7 @@ function estreToastDials(options = {}) {
733
733
  resolve(undefined);
734
734
  },
735
735
  };
736
- return pageManager.bringPage("!toastDials", intent);
736
+ return pageManager.bringPage("!toastDials", intent, instanceOrigin);
737
737
  });
738
738
  return new class {
739
739
  get data() { return intent.data; }
@@ -784,7 +784,7 @@ classicConfirm = confirm;
784
784
  classicPrompt = prompt;
785
785
 
786
786
 
787
- function estreAlert(options = {}) {
787
+ function estreAlert(options = {}, instanceOrigin) {
788
788
  return new Promise((resolve) => pageManager.bringPage("!alert", {
789
789
  data: options,
790
790
  onOk() {
@@ -795,7 +795,7 @@ function estreAlert(options = {}) {
795
795
  this?.data?.callbackDissmiss?.();
796
796
  resolve(undefined);
797
797
  },
798
- }));
798
+ }, instanceOrigin));
799
799
  }
800
800
 
801
801
  alert = (title, message,
@@ -805,7 +805,7 @@ alert = (title, message,
805
805
  ) => tu(title) ? classicAlert() : estreAlert({ title, message, callbackOk, callbackDissmiss, ok });
806
806
 
807
807
 
808
- function estreConfirm(options = {}) {
808
+ function estreConfirm(options = {}, instanceOrigin) {
809
809
  return new Promise((resolve) => pageManager.bringPage("!confirm", {
810
810
  data: options,
811
811
  onPositive() {
@@ -824,7 +824,7 @@ function estreConfirm(options = {}) {
824
824
  this?.data?.callbackDissmiss?.();
825
825
  resolve(undefined);
826
826
  },
827
- }));
827
+ }, instanceOrigin));
828
828
  }
829
829
 
830
830
  confirm = (title, message,
@@ -841,7 +841,7 @@ confirm = (title, message,
841
841
  }
842
842
 
843
843
 
844
- function estrePrompt(options = {}) {
844
+ function estrePrompt(options = {}, instanceOrigin) {
845
845
  return new Promise((resolve) => pageManager.bringPage("!prompt", {
846
846
  data: options,
847
847
  onPromptFocus(input, text, event) {
@@ -867,7 +867,7 @@ function estrePrompt(options = {}) {
867
867
  this?.data?.callbackDissmiss?.();
868
868
  resolve(undefined);
869
869
  },
870
- }));
870
+ }, instanceOrigin));
871
871
  }
872
872
 
873
873
  prompt = (title,
@@ -3118,7 +3118,7 @@ class EstreComponent extends EstrePageHostHandle {
3118
3118
 
3119
3119
  openContainer(id, intent, instanceOrigin) {
3120
3120
  if (this.isClosing) return false;
3121
- const page = pageManager.getConatiner(id, this.id, this.sectionBound);
3121
+ const page = pageManager.getContainer(id, this.id, this.sectionBound);
3122
3122
  if (page == null) return null;
3123
3123
  if (page.statement == "static") return null;
3124
3124
  this.$host.append(page.live);
@@ -5782,7 +5782,7 @@ class EstreUiPageManager {
5782
5782
  else return null;
5783
5783
  }
5784
5784
 
5785
- getConatiner(id, componentId, sectionBound, statement) {
5785
+ getContainer(id, componentId, sectionBound, statement) {
5786
5786
  var pid = this.findPid(EstreUiPage.getPidContainer(id, componentId, sectionBound, statement));
5787
5787
  if (pid != null) return this.get(pid);
5788
5788
  else return null;
@@ -5895,12 +5895,14 @@ class EstreUiPageManager {
5895
5895
  if (!isIntentNone && existArticle && (page.isArticle || page.article == "main")) targetProcessed.article = container.showArticle(page.article, intent, articleInstanceOrigin);
5896
5896
  else targetProcessed.article = article.show();
5897
5897
  success = targetProcessed.article;
5898
+ // falls through
5898
5899
  case "container":
5899
5900
  if (success) {
5900
5901
  if (!isIntentNone && existContainer && (page.isContainer || isRootMain)) targetProcessed.container = component.showContainer(page.container, intent, containerInstanceOrigin);
5901
5902
  else targetProcessed.container = container.show();
5902
5903
  success = targetProcessed.container;
5903
5904
  }
5905
+ // falls through
5904
5906
  case "component":
5905
5907
  if (success) {
5906
5908
  if (page.isHeader) {
@@ -5966,12 +5968,14 @@ class EstreUiPageManager {
5966
5968
  if (!isIntentNone && (page.isArticle || page.article == "main")) targetProcessed.article = container.showArticle(page.article, intent, articleInstanceOrigin);
5967
5969
  else targetProcessed.article = article.show();
5968
5970
  success = targetProcessed.article;
5971
+ // falls through
5969
5972
  case "container":
5970
5973
  if (success) {
5971
5974
  if (!isIntentNone && (page.isContainer || (page.article == "main" && page.container == "root"))) targetProcessed.container = component.showContainer(page.container, intent, containerInstanceOrigin);
5972
5975
  else targetProcessed.container = container.show();
5973
5976
  success = targetProcessed.container;
5974
5977
  }
5978
+ // falls through
5975
5979
  case "component":
5976
5980
  if (success) {
5977
5981
  const isRootMain = page.container == "root" && page.article == "main";
@@ -6053,18 +6057,18 @@ class EstreUiPageManager {
6053
6057
  return postPromise(resolve => {
6054
6058
  postQueue(async _ => {
6055
6059
  if (pid.indexOf("!") > -1) pid = this.#managedPidMap[pid.replace(/^\!/, "")];
6056
- if (pid == null) resolve(null);
6060
+ if (pid == null) return resolve(null);
6057
6061
  if (pid.indexOf("*") > -1) pid = this.extPidMap[pid.replace(/^\*/, "")];
6058
- if (pid == null) resolve(null);
6062
+ if (pid == null) return resolve(null);
6059
6063
  if (pid.indexOf("$") < 0) pid = this.findPid(pid);
6060
6064
  const page = this.get(pid);
6061
- if (page == null) resolve(null);
6065
+ if (page == null) return resolve(null);
6062
6066
  page.setInstanceOrigin(instanceOrigin);
6063
6067
  const sections = page.sections;
6064
- if (sections == null) resolve(null);
6068
+ if (sections == null) return resolve(null);
6065
6069
 
6066
6070
  var component = sections[page.componentInstanceId];
6067
- if (component == null) resolve(null);
6071
+ if (component == null) return resolve(null);
6068
6072
  var container = null;
6069
6073
  var article = null;
6070
6074
  const componentInstanceOrigin = page.componentInstanceOrigin;
@@ -6150,8 +6154,7 @@ class EstreUiCustomPageManager {
6150
6154
  }
6151
6155
 
6152
6156
  showOrBringPage(id, intent, instanceOrigin) {
6153
- pid = "*" + id;
6154
- return pageManager.showOrBringPage(id, intent, instanceOrigin);
6157
+ return pageManager.showOrBringPage("*" + id, intent, instanceOrigin);
6155
6158
  }
6156
6159
 
6157
6160
  hidePage(id, hideHost = false, instanceOrigin = null) {
@@ -6174,7 +6177,7 @@ class EstreHandle {
6174
6177
  // constants
6175
6178
  static #handles = {
6176
6179
  get [uis.unifiedCalendar]() { return EstreUnifiedCalendarHandle; },
6177
- get [uis.dedicatedCalendar]() { return EstreDedicatedCalanderHandle; },
6180
+ get [uis.dedicatedCalendar]() { return EstreDedicatedCalendarHandle; },
6178
6181
 
6179
6182
  get [uis.scalable]() { return EstreScalableHandle; },
6180
6183
  get [uis.collapsible]() { return EstreCollapsibleHandle; },
@@ -9610,7 +9613,7 @@ const scheduleDataSet = new ScheduleDataSet();
9610
9613
 
9611
9614
 
9612
9615
 
9613
- class EstreDedicatedCalanderHandle extends EstreHandle {
9616
+ class EstreDedicatedCalendarHandle extends EstreHandle {
9614
9617
 
9615
9618
  // constants
9616
9619
 
@@ -12005,17 +12008,19 @@ class EstreMultiDialSlotHandle extends EstreHandle {
12005
12008
  });
12006
12009
 
12007
12010
 
12008
- const threshold = 1;
12011
+ const threshold = 0.99;
12009
12012
  const rootMargin = "0px";
12010
12013
 
12011
12014
  this.#itemSelectionObserver[index] = new IntersectionObserver(entries => {
12015
+ let best = n;
12012
12016
  for (const entry of entries) {
12013
- if (entry.isIntersecting) {
12014
- const idx = entry.target.dataset.index;
12015
- const i = parseInt(idx);
12016
- itemBound.dataset.selected = idx;
12017
- this.#onSelected(index, i);
12018
- }
12017
+ if (entry.intersectionRatio > (best?.intersectionRatio ?? 0)) best = entry;
12018
+ }
12019
+ if (best != n && best.intersectionRatio >= threshold) {
12020
+ const idx = best.target.dataset.index;
12021
+ const i = parseInt(idx);
12022
+ itemBound.dataset.selected = idx;
12023
+ this.#onSelected(index, i);
12019
12024
  }
12020
12025
  }, {
12021
12026
  root: itemBound,
@@ -12038,13 +12043,15 @@ class EstreMultiDialSlotHandle extends EstreHandle {
12038
12043
  if (current != null) for (const elem of items) current.unobserve(elem);
12039
12044
 
12040
12045
  this.#itemSelectionObserver[index] = new IntersectionObserver(entries => {
12046
+ let best = n;
12041
12047
  for (const entry of entries) {
12042
- if (entry.isIntersecting) {
12043
- const idx = entry.target.dataset.index;
12044
- const i = parseInt(idx);
12045
- itemBound.dataset.selected = idx;
12046
- this.#onSelected(index, i);
12047
- }
12048
+ if (entry.intersectionRatio > (best?.intersectionRatio ?? 0)) best = entry;
12049
+ }
12050
+ if (best != n && best.intersectionRatio >= threshold) {
12051
+ const idx = best.target.dataset.index;
12052
+ const i = parseInt(idx);
12053
+ itemBound.dataset.selected = idx;
12054
+ this.#onSelected(index, i);
12048
12055
  }
12049
12056
  }, {
12050
12057
  root: itemBound,
@@ -12052,12 +12059,33 @@ class EstreMultiDialSlotHandle extends EstreHandle {
12052
12059
  threshold
12053
12060
  });
12054
12061
 
12055
- for (const item of items) this.#setItemEvent(index, item.dataset.index, item);
12062
+ for (const item of items) this.#setItemEvent(index, item.dataset.index.int, item);
12056
12063
  }
12057
12064
  });
12058
12065
 
12059
12066
  ro.observe(itemBound);
12060
12067
 
12068
+ // Safari/WebKit does not re-evaluate IntersectionObserver entries
12069
+ // when scrolling occurs in an intermediate scroll container (dialHost)
12070
+ // between the IO root (dialBound) and the observed targets (li items).
12071
+ // Force IO re-evaluation on scroll by cycling unobserve/observe.
12072
+ {
12073
+ const dialHost = this.$dialHosts[index];
12074
+ let scrollRaf = 0;
12075
+ dialHost?.addEventListener("scroll", () => {
12076
+ cancelAnimationFrame(scrollRaf);
12077
+ scrollRaf = requestAnimationFrame(() => {
12078
+ const observer = this.#itemSelectionObserver[index];
12079
+ if (observer == n) return;
12080
+ const items = this.getDialItems(index);
12081
+ for (const item of items) {
12082
+ observer.unobserve(item);
12083
+ observer.observe(item);
12084
+ }
12085
+ });
12086
+ }, { passive: true });
12087
+ }
12088
+
12061
12089
  return ro;
12062
12090
  }
12063
12091
 
@@ -12133,7 +12161,6 @@ class EstreMultiDialSlotHandle extends EstreHandle {
12133
12161
  observer.observe(item);
12134
12162
  $(item).off(c.click).click(function (e) {
12135
12163
  e.preventDefault();
12136
-
12137
12164
  inst.#scrollSmooth(this);
12138
12165
 
12139
12166
  return false;
@@ -14887,83 +14914,99 @@ const estreUi = {
14887
14914
 
14888
14915
 
14889
14916
  let loadExportedFixedBottom;
14890
- loadExportedFixedBottom = _ => loadExported("fixedBottom.html").then(htmlContent => {
14917
+ loadExportedFixedBottom = (_, attempt = 0) => loadExported("fixedBottom.html").then(htmlContent => {
14891
14918
  this.$fixedBottom.prepend(htmlContent);
14892
14919
  return onLoadedFixedBottom();
14893
14920
  }).catch(error => {
14921
+ const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
14894
14922
  console.error("There has been a problem with your fetch operation for fixedBottom: ", error);
14895
- console.log("Retrying to load fixedBottom...");
14896
- return loadExportedFixedBottom();
14923
+ console.log(`Retrying to load fixedBottom in ${delay}ms...`);
14924
+ return postPromise(resolve => setTimeout(resolve, delay))
14925
+ .then(() => loadExportedFixedBottom(_, attempt + 1));
14897
14926
  });
14898
14927
 
14899
14928
  let loadExportedFixedTop;
14900
- loadExportedFixedTop = subTerm => loadExported("fixedTop.html").then(htmlContent => {
14929
+ loadExportedFixedTop = (subTerm, attempt = 0) => loadExported("fixedTop.html").then(htmlContent => {
14901
14930
  this.$fixedTop.prepend(htmlContent);
14902
14931
  return onLoadedFixedTop(subTerm);
14903
14932
  }).catch(error => {
14933
+ const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
14904
14934
  console.error("There has been a problem with your fetch operation for fixedTop: ", error);
14905
- console.log("Retrying to load fixedTop...");
14906
- return loadExportedFixedTop(subTerm);
14935
+ console.log(`Retrying to load fixedTop in ${delay}ms...`);
14936
+ return postPromise(resolve => setTimeout(resolve, delay))
14937
+ .then(() => loadExportedFixedTop(subTerm, attempt + 1));
14907
14938
  });
14908
14939
 
14909
14940
  let loadExportedStaticDoc;
14910
- loadExportedStaticDoc = subTerm => loadExported("staticDoc.html").then(htmlContent => {
14941
+ loadExportedStaticDoc = (subTerm, attempt = 0) => loadExported("staticDoc.html").then(htmlContent => {
14911
14942
  this.$mainArea.prepend(htmlContent);
14912
14943
  return onLoadedStaticDoc(subTerm);
14913
14944
  }).catch(error => {
14945
+ const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
14914
14946
  console.error("There has been a problem with your fetch operation for staticDoc: ", error);
14915
- console.log("Retrying to load staticDoc...");
14916
- return loadExportedStaticDoc(subTerm);
14947
+ console.log(`Retrying to load staticDoc in ${delay}ms...`);
14948
+ return postPromise(resolve => setTimeout(resolve, delay))
14949
+ .then(() => loadExportedStaticDoc(subTerm, attempt + 1));
14917
14950
  });
14918
14951
 
14919
14952
  let loadExportedInstantDoc;
14920
- loadExportedInstantDoc = subTerm => loadExported("instantDoc.html").then(htmlContent => {
14953
+ loadExportedInstantDoc = (subTerm, attempt = 0) => loadExported("instantDoc.html").then(htmlContent => {
14921
14954
  this.$blindArea.prepend(htmlContent);
14922
14955
  return onLoadedInstantDoc(subTerm);
14923
14956
  }).catch(error => {
14957
+ const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
14924
14958
  console.error("There has been a problem with your fetch operation for instantDoc: ", error);
14925
- console.log("Retrying to load instantDoc...");
14926
- return loadExportedInstantDoc(subTerm);
14959
+ console.log(`Retrying to load instantDoc in ${delay}ms...`);
14960
+ return postPromise(resolve => setTimeout(resolve, delay))
14961
+ .then(() => loadExportedInstantDoc(subTerm, attempt + 1));
14927
14962
  });
14928
14963
 
14929
14964
  let loadExportedManagedOverlay;
14930
- loadExportedManagedOverlay = subTerm => loadExported("managedOverlay.html").then(htmlContent => {
14965
+ loadExportedManagedOverlay = (subTerm, attempt = 0) => loadExported("managedOverlay.html").then(htmlContent => {
14931
14966
  this.$overlayArea.prepend(htmlContent);
14932
14967
  return onLoadedManagedOverlay(subTerm);
14933
14968
  }).catch(error => {
14969
+ const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
14934
14970
  console.error("There has been a problem with your fetch operation for managedOverlay: ", error);
14935
- console.log("Retrying to load managedOverlay...");
14936
- return loadExportedManagedOverlay(subTerm);
14971
+ console.log(`Retrying to load managedOverlay in ${delay}ms...`);
14972
+ return postPromise(resolve => setTimeout(resolve, delay))
14973
+ .then(() => loadExportedManagedOverlay(subTerm, attempt + 1));
14937
14974
  });
14938
14975
 
14939
14976
  let loadExportedMainMenu;
14940
- loadExportedMainMenu = subTerm => loadExported("mainMenu.html").then(htmlContent => {
14977
+ loadExportedMainMenu = (subTerm, attempt = 0) => loadExported("mainMenu.html").then(htmlContent => {
14941
14978
  this.$mainMenu.prepend(htmlContent);
14942
14979
  return onLoadedMainMenu(subTerm);
14943
14980
  }).catch(error => {
14981
+ const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
14944
14982
  console.error("There has been a problem with your fetch operation for mainMenu: ", error);
14945
- console.log("Retrying to load mainMenu...");
14946
- return loadExportedMainMenu(subTerm);
14983
+ console.log(`Retrying to load mainMenu in ${delay}ms...`);
14984
+ return postPromise(resolve => setTimeout(resolve, delay))
14985
+ .then(() => loadExportedMainMenu(subTerm, attempt + 1));
14947
14986
  });
14948
14987
 
14949
14988
  let loadExportedStockHandlePrototypes;
14950
- loadExportedStockHandlePrototypes = _ => loadExported("stockHandlePrototypes.html").then(htmlContent => {
14989
+ loadExportedStockHandlePrototypes = (_, attempt = 0) => loadExported("stockHandlePrototypes.html").then(htmlContent => {
14951
14990
  this.$handlePrototypes.prepend(htmlContent);
14952
14991
  return true;
14953
14992
  }).catch(error => {
14993
+ const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
14954
14994
  console.error("There has been a problem with your fetch operation for stockHandlePrototypes: ", error);
14955
- console.log("Retrying to load stockHandlePrototypes...");
14956
- return loadExportedStockHandlePrototypes();
14995
+ console.log(`Retrying to load stockHandlePrototypes in ${delay}ms...`);
14996
+ return postPromise(resolve => setTimeout(resolve, delay))
14997
+ .then(() => loadExportedStockHandlePrototypes(_, attempt + 1));
14957
14998
  });
14958
14999
 
14959
15000
  let loadExportedCustomHandlePrototypes;
14960
- loadExportedCustomHandlePrototypes = _ => loadExported("customHandlePrototypes.html").then(htmlContent => {
15001
+ loadExportedCustomHandlePrototypes = (_, attempt = 0) => loadExported("customHandlePrototypes.html").then(htmlContent => {
14961
15002
  this.$handlePrototypes.append(htmlContent);
14962
15003
  return true;
14963
15004
  }).catch(error => {
15005
+ const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
14964
15006
  console.error("There has been a problem with your fetch operation for customHandlePrototypes: ", error);
14965
- console.log("Retrying to load customHandlePrototypes...");
14966
- return loadExportedCustomHandlePrototypes();
15007
+ console.log(`Retrying to load customHandlePrototypes in ${delay}ms...`);
15008
+ return postPromise(resolve => setTimeout(resolve, delay))
15009
+ .then(() => loadExportedCustomHandlePrototypes(_, attempt + 1));
14967
15010
  });
14968
15011
 
14969
15012
 
@@ -15501,7 +15544,7 @@ const estreUi = {
15501
15544
  return !unhandled;
15502
15545
  },
15503
15546
 
15504
- async closeInstantBlinded(id, instanceOrigin, isTermination = !component.isStatic) {
15547
+ async closeInstantBlinded(id, instanceOrigin, isTermination) {
15505
15548
  let component = this.blindSections[id + (instanceOrigin?.let(it => "^" + it) ?? "")];
15506
15549
  if (component == null) {
15507
15550
  if (instanceOrigin != null) return null;
@@ -15520,6 +15563,7 @@ const estreUi = {
15520
15563
  } else return null;
15521
15564
  } else {
15522
15565
  if (!component.$host.hasClass("home")) {
15566
+ isTermination ??= !component.isStatic;
15523
15567
  const closed = await component.close(false, isTermination);
15524
15568
  setTimeout(async _ => {
15525
15569
  const $components = this.$blindSections.filter(naiv(m.id, id));
@@ -31,7 +31,7 @@ SOFTWARE.
31
31
  // Collections of bypass for process codes takes be inline,
32
32
  // and monkey patching like as modern languages.
33
33
  //
34
- // v0.7.0 / release 2026.02.06
34
+ // v0.7.1 / release 2026.03.31
35
35
  //
36
36
  // Author: Estre Soliette
37
37
  // Established: 2025.01.05
@@ -758,7 +758,7 @@ defineGetterAndSetter(Function, "new", function () { return new this(); });
758
758
 
759
759
 
760
760
  // additional global prototype functions
761
- defineGetterAndSetterPlex("it", function () { return classCase(this, { [_BOOLEAN]: it => Boolean(it), [_NUMBER]: it => Number(it), [_STRING]: it => String(it), [_BIG_INT]: it => BigInt(it), [DEFAULT]: it => it }); });
761
+ defineGetterAndSetterPlex("it", function () { return classCase(this, { [_BOOLEAN]: it => it.valueOf(), [_NUMBER]: it => Number(it), [_STRING]: it => String(it), [_BIG_INT]: it => BigInt(it), [DEFAULT]: it => it }); });
762
762
 
763
763
  definePropertyPlex("matchCase", function () { return matchCase(this.it, ...arguments); });
764
764
  definePropertyPlex("equalCase", function () { return equalCase(this.it, ...arguments); });
package/serviceWorker.js CHANGED
@@ -1,4 +1,4 @@
1
- const INSTALLATION_VERSION_NAME = "1.2.1-r20260308";
1
+ const INSTALLATION_VERSION_NAME = "1.2.3-r20260416";
2
2
  // ^^ Use for check new update "Native application(webview) version(or Android/iOS version combo) - PWA release version"
3
3
  // ex) "1.0.1/1.0.0-r20251101k"
4
4
 
@@ -21,7 +21,7 @@ const INSTALLATION_FILE_LIST = [
21
21
 
22
22
 
23
23
  // Common files cache - Be changes some time but, well not changed very often
24
- const CACHE_NAME_COMMON_FILES = "common-files-cache-v1-20260308";
24
+ const CACHE_NAME_COMMON_FILES = "common-files-cache-v1-20260416";
25
25
 
26
26
  const COMMON_FILES_TO_CACHE = [
27
27
  "./",
@@ -170,6 +170,10 @@ body .tp_tiled_btn.padded { padding: 0 12px; }
170
170
  body .tp_tiled_btn.padded > span { padding: 0 4px; }
171
171
  body .tp_tiled_btn.fit_pad_h { padding-left: 0; padding-right: 0; }
172
172
  body .tp_tiled_btn.fit_pad_v { padding-top: 0; padding-bottom: 0; }
173
+ body .tp_tiled_btn:disabled { opacity: 0.5; }
174
+ body .tp_tiled_btn:disabled:active { cursor: not-allowed; }
175
+ body .tp_tiled_btn[data-disabled="1"] { opacity: 0.5; }
176
+ body .tp_tiled_btn[data-disabled="1"]:active { cursor: not-allowed; }
173
177
 
174
178
  /* extra */
175
179
  body img.logo { filter: drop-shadow(0 0 5px rgb(var(--cglr) / 60%)); }