estreui 1.2.2 → 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.2",
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);
@@ -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
 
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
  "./",