businesslens 0.11.0 → 0.12.0

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 (129) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/dist/cli.js +3 -1
  3. package/dist/viewer/200.html +1 -1
  4. package/dist/viewer/404.html +1 -1
  5. package/dist/viewer/_nuxt/1AKcmNi5.js +2 -0
  6. package/dist/viewer/_nuxt/B-mP848s.js +1 -0
  7. package/dist/viewer/_nuxt/Bit4pBdc.js +1 -0
  8. package/dist/viewer/_nuxt/BlrFlowCanvas.DQt_5hA7.css +1 -0
  9. package/dist/viewer/_nuxt/BtQ-s_jB.js +2 -0
  10. package/dist/viewer/_nuxt/Dpgwz9sb.js +1 -0
  11. package/dist/viewer/_nuxt/builds/latest.json +1 -1
  12. package/dist/viewer/_nuxt/builds/meta/5aaede1d-b2e2-4361-9046-383c78ec9ec1.json +1 -0
  13. package/dist/viewer/_nuxt/cSnpUPR8.js +1 -0
  14. package/dist/viewer/_nuxt/diagram.worker-DsHz2mkM.js +1 -0
  15. package/dist/viewer/_nuxt/entry.Cn2HYcjJ.css +1 -0
  16. package/dist/viewer/_nuxt/index.M4u1EpFn.css +1 -0
  17. package/dist/viewer/index.html +1 -1
  18. package/docs/business-rules.md +4 -4
  19. package/docs/capabilities.md +4 -4
  20. package/docs/ci.md +1 -1
  21. package/docs/cli-contribute.md +1 -1
  22. package/docs/cli-export.md +1 -1
  23. package/docs/cli-install.md +1 -1
  24. package/docs/cli-lint.md +1 -1
  25. package/docs/cli-open.md +1 -1
  26. package/docs/cli-pull.md +1 -1
  27. package/docs/cli-update.md +1 -1
  28. package/docs/cli-view.md +1 -1
  29. package/docs/cli.md +1 -1
  30. package/docs/domains.md +2 -2
  31. package/docs/entities.md +5 -5
  32. package/docs/integration.md +1 -1
  33. package/docs/interfaces.md +271 -12
  34. package/docs/journeys.md +4 -5
  35. package/docs/product-model.md +25 -22
  36. package/docs/references.md +2 -2
  37. package/docs/skill-businesslens-ideate.md +1 -1
  38. package/docs/skill-businesslens-map.md +1 -1
  39. package/docs/skill-businesslens-verify.md +1 -1
  40. package/docs/skills.md +1 -1
  41. package/docs/with-plan-mode.md +1 -1
  42. package/docs/with-sdd.md +1 -1
  43. package/layers/nuxt/report-viewer/README.md +76 -11
  44. package/layers/nuxt/report-viewer/THIRD_PARTY.md +19 -0
  45. package/layers/nuxt/report-viewer/app/assets/report-topology.css +97 -0
  46. package/layers/nuxt/report-viewer/app/assets/report-viewer.css +74 -0
  47. package/layers/nuxt/report-viewer/app/components/BlrConnections.vue +11 -162
  48. package/layers/nuxt/report-viewer/app/components/BlrDiagram.vue +152 -0
  49. package/layers/nuxt/report-viewer/app/components/BlrEntityLifecycle.vue +12 -14
  50. package/layers/nuxt/report-viewer/app/components/BlrExperienceContents.vue +20 -0
  51. package/layers/nuxt/report-viewer/app/components/BlrFilterBar.vue +73 -0
  52. package/layers/nuxt/report-viewer/app/components/BlrFlowCanvas.vue +115 -328
  53. package/layers/nuxt/report-viewer/app/components/BlrFlowNode.vue +8 -207
  54. package/layers/nuxt/report-viewer/app/components/BlrFlowNodeContent.vue +49 -0
  55. package/layers/nuxt/report-viewer/app/components/BlrFlowRoutedEdge.vue +12 -131
  56. package/layers/nuxt/report-viewer/app/components/BlrInterfaceDelivery.vue +23 -0
  57. package/layers/nuxt/report-viewer/app/components/BlrInterfaceType.vue +33 -3
  58. package/layers/nuxt/report-viewer/app/components/BlrKind.vue +10 -2
  59. package/layers/nuxt/report-viewer/app/components/BlrOverview.vue +192 -299
  60. package/layers/nuxt/report-viewer/app/components/BlrPageBlock.vue +13 -2
  61. package/layers/nuxt/report-viewer/app/components/BlrProductTopology.vue +174 -339
  62. package/layers/nuxt/report-viewer/app/components/BlrRail.vue +9 -51
  63. package/layers/nuxt/report-viewer/app/components/BlrReportShell.vue +357 -921
  64. package/layers/nuxt/report-viewer/app/components/BlrResourceBody.vue +13 -77
  65. package/layers/nuxt/report-viewer/app/components/BlrResourcePage.vue +22 -63
  66. package/layers/nuxt/report-viewer/app/components/BlrScenarios.vue +7 -2
  67. package/layers/nuxt/report-viewer/app/components/BlrTopologyBranch.vue +28 -0
  68. package/layers/nuxt/report-viewer/app/components/BlrTopologyComposition.vue +86 -0
  69. package/layers/nuxt/report-viewer/app/components/BlrTopologyMatrix.vue +72 -0
  70. package/layers/nuxt/report-viewer/app/components/BlrTopologyResource.vue +11 -0
  71. package/layers/nuxt/report-viewer/app/components/BlrTopologyTree.vue +56 -0
  72. package/layers/nuxt/report-viewer/app/components/BusinessLensReportViewer.vue +38 -5
  73. package/layers/nuxt/report-viewer/app/composables/useBlrReadingWidth.ts +11 -0
  74. package/layers/nuxt/report-viewer/app/composables/useBlrReportNavigation.ts +42 -0
  75. package/layers/nuxt/report-viewer/app/composables/useBlrTopologyScroll.ts +54 -0
  76. package/layers/nuxt/report-viewer/app/utils/diagram.ts +106 -0
  77. package/layers/nuxt/report-viewer/app/utils/diagram.worker.ts +3 -0
  78. package/layers/nuxt/report-viewer/app/utils/entityLifecycle.ts +28 -83
  79. package/layers/nuxt/report-viewer/app/utils/pageSections.ts +9 -40
  80. package/layers/nuxt/report-viewer/app/utils/productTopologyViews.ts +32 -109
  81. package/layers/nuxt/report-viewer/app/utils/reportDestinations.ts +41 -0
  82. package/layers/nuxt/report-viewer/app/utils/reportWorkspace.ts +28 -239
  83. package/layers/nuxt/report-viewer/app/utils/resourceCards.ts +9 -4
  84. package/layers/nuxt/report-viewer/app/utils/resourceConnections.ts +185 -0
  85. package/layers/nuxt/report-viewer/app/utils/resourceDocs.ts +3 -5
  86. package/layers/nuxt/report-viewer/app/utils/resourceFacets.ts +64 -16
  87. package/layers/nuxt/report-viewer/app/utils/topologyProjections.ts +221 -0
  88. package/layers/nuxt/report-viewer/app/utils/topologyRelations.ts +113 -0
  89. package/layers/nuxt/report-viewer/app/utils/topologyState.ts +73 -0
  90. package/layers/nuxt/report-viewer/app/utils/topologyTargets.ts +41 -0
  91. package/layers/nuxt/report-viewer/app/utils/topologyTree.ts +58 -0
  92. package/layers/nuxt/report-viewer/app/utils/vocabulary.generated.ts +5 -7
  93. package/layers/nuxt/report-viewer/licenses/ELK-EPL-2.0.md +263 -0
  94. package/layers/nuxt/report-viewer/licenses/diagram-design-MIT.txt +21 -0
  95. package/layers/nuxt/report-viewer/licenses/vue-flow-MIT.txt +20 -0
  96. package/layers/nuxt/report-viewer/nuxt.config.ts +17 -9
  97. package/layers/nuxt/theme/app/assets/theme.css +31 -0
  98. package/package.json +4 -12
  99. package/dist/viewer/_nuxt/CcApCzJy.js +0 -34
  100. package/dist/viewer/_nuxt/CeE3421Y.js +0 -1
  101. package/dist/viewer/_nuxt/CmwFmk8h.js +0 -37
  102. package/dist/viewer/_nuxt/DQ3ZnyMB.js +0 -1
  103. package/dist/viewer/_nuxt/builds/meta/3da08759-853a-4f1f-97f9-21437357aef0.json +0 -1
  104. package/dist/viewer/_nuxt/entry.DsWXLqBw.css +0 -1
  105. package/dist/viewer/_nuxt/index.BeuARo3I.css +0 -1
  106. package/dist/viewer/brand/icons/apple-touch-icon.png +0 -0
  107. package/dist/viewer/brand/icons/businesslens-app-icon.svg +0 -7
  108. package/dist/viewer/brand/icons/businesslens-maskable-icon.svg +0 -7
  109. package/dist/viewer/brand/icons/favicon-32.png +0 -0
  110. package/dist/viewer/brand/icons/favicon.ico +0 -0
  111. package/dist/viewer/brand/icons/favicon.svg +0 -7
  112. package/dist/viewer/brand/icons/icon-1024.png +0 -0
  113. package/dist/viewer/brand/icons/icon-192.png +0 -0
  114. package/dist/viewer/brand/icons/icon-512.png +0 -0
  115. package/dist/viewer/brand/icons/maskable-icon-512.png +0 -0
  116. package/dist/viewer/brand/logo/mark-dark.svg +0 -4
  117. package/dist/viewer/brand/logo/mark.svg +0 -4
  118. package/dist/viewer/brand/logo/wordmark-dark.svg +0 -173
  119. package/dist/viewer/brand/logo/wordmark.svg +0 -173
  120. package/docs/experiences.md +0 -106
  121. package/docs/screens.md +0 -171
  122. package/layers/nuxt/report-viewer/app/components/BlrFlowGroup.vue +0 -126
  123. package/layers/nuxt/report-viewer/app/components/BlrFlowLabel.vue +0 -47
  124. package/layers/nuxt/report-viewer/app/components/BlrFlowSelfEdge.vue +0 -105
  125. package/layers/nuxt/report-viewer/app/components/BlrFlowState.vue +0 -112
  126. package/layers/nuxt/report-viewer/app/utils/flowGraph.ts +0 -824
  127. package/layers/nuxt/report-viewer/app/utils/productTopologyFilters.ts +0 -92
  128. package/layers/nuxt/report-viewer/app/utils/productTopologyGraphs.ts +0 -614
  129. package/layers/nuxt/report-viewer/app/utils/productTopologyLayout.ts +0 -124
package/CHANGELOG.md CHANGED
@@ -5,7 +5,33 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased]
8
+ ## [0.12.0] - 2026-09-10
9
+
10
+ ### Changed
11
+
12
+ - Every page of the report reads the same way: what it is and the ways out of
13
+ it, then tabs for which set you are reading, then what narrows it.
14
+ - Tabs are the report's only switch. Each named reading sits beside List in the
15
+ collection it belongs to; the Cards/Table toggle and the grouping menu are
16
+ gone.
17
+ - Filters sit beside the rows they narrow, one control per axis, on every
18
+ collection whatever its size.
19
+ - Collections group by Domain on their own, and Entities that act lead the list.
20
+ - Overview is the Product's own page, with About, Coverage and References.
21
+ - Compare delivery is now a Capability by Interface matrix.
22
+ - The documentation explains the Product Model. The report explains itself.
23
+ - Report links shared before this release open the Overview.
24
+
25
+ ### Removed
26
+
27
+ - The All resources and connections view. The rail already lists every
28
+ collection with its count, and a resource's connections are on its page.
29
+
30
+ ### Fixed
31
+
32
+ - Icons missing from the local report, including the loading indicator and the
33
+ warning shown while an edit is invalid.
34
+ - Interactive controls now show the hand cursor.
9
35
 
10
36
  ## [0.11.0] - 2026-09-07
11
37
 
@@ -719,6 +745,7 @@ Initial public launch of the repository.
719
745
  `docs/format.md`.
720
746
  - Claude plugin manifest and marketplace entry.
721
747
 
748
+ [0.12.0]: https://github.com/businesslens/pdd/compare/v0.11.0...v0.12.0
722
749
  [0.11.0]: https://github.com/businesslens/pdd/compare/v0.10.0...v0.11.0
723
750
  [0.10.0]: https://github.com/businesslens/pdd/compare/v0.9.0...v0.10.0
724
751
  [0.9.0]: https://github.com/businesslens/pdd/compare/v0.8.0...v0.9.0
package/dist/cli.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { INTERFACE_TYPES, ProductReportV13Schema, REPORT_SCHEMA_VERSION, bulletList, containsPlace, containsStructuralHeading, decisionPoints, interfaceOf, isId, isQualifiedId, operationPlaces, parseCodeTarget, parseMarkdown, parseProductReport, permissionTargetSelectsOperation, projectPortableReport, qualify, screenStates, section, supportingSections, validateBlueprintReport, validatePermissionBehavior, validateProductReport } from "./portable-DmgFo37G.js";
3
3
  import { MAX_PRODUCT_LOGO_BYTES, PRODUCT_LOGO_FILENAME, validateProductLogo } from "./logo-ByUBSRUb.js";
4
4
  import { reportDigest } from "./report-digest-BtjFf-4A.js";
5
+ import { createRequire } from "node:module";
5
6
  import { basename, dirname, extname, isAbsolute, join, relative, resolve, sep } from "node:path";
6
7
  import { Command, CommanderError, Help, InvalidArgumentError, Option } from "commander";
7
8
  import { execFileSync, spawn, spawnSync } from "node:child_process";
@@ -4431,6 +4432,7 @@ const HEALTH_PATH = "/_businesslens/health";
4431
4432
  const LOGO_PATH = "/_businesslens/logo.svg";
4432
4433
  const ASSET_PREFIX = "/_businesslens/file/";
4433
4434
  const VIEWER_ROOT = fileURLToPath(new URL("./viewer/", import.meta.url));
4435
+ const BRAND_ROOT = resolve(createRequire(import.meta.url).resolve("businesslens/package.json"), "../layers/nuxt/theme/public/brand");
4434
4436
  /** 25 MB. A product asset is a mockup or a capture, never a build output. */
4435
4437
  const MAX_ASSET_BYTES = 25 * 1024 * 1024;
4436
4438
  const CONTENT_TYPES = {
@@ -4730,7 +4732,7 @@ function requestHandler(options, store, streams, port$1) {
4730
4732
  });
4731
4733
  return;
4732
4734
  }
4733
- const file = staticFile(viewerRoot, pathname);
4735
+ const file = staticFile(viewerRoot, pathname) ?? (pathname.startsWith("/brand/") ? staticFile(BRAND_ROOT, pathname.slice(7)) : void 0);
4734
4736
  if (!file) {
4735
4737
  json(response, 404, { message: "Not found." }, head);
4736
4738
  return;
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/_nuxt/entry.DsWXLqBw.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CmwFmk8h.js"><script type="module" src="/_nuxt/CmwFmk8h.js" crossorigin></script><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BwxPsW7a.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DQ3ZnyMB.js"><script>"use strict";(()=>{const o=window,e=document.documentElement,c=["dark","light"],s=getStorageValue("localStorage","nuxt-color-mode")||"light";let r=s==="system"?f():s;const l=e.getAttribute("data-color-mode-forced");l&&(r=l),i(r),o["__NUXT_COLOR_MODE__"]={preference:s,value:r,getColorScheme:f,addColorScheme:i,removeColorScheme:d};function i(t){const a=""+t+"",n="";e.classList?e.classList.add(a):e.className+=" "+a,n&&e.setAttribute("data-"+n,t)}function d(t){const a=""+t+"",n="";e.classList?e.classList.remove(a):e.className=e.className.replace(new RegExp(a,"g"),""),n&&e.removeAttribute("data-"+n)}function u(t){return o.matchMedia("(prefers-color-scheme"+t+")")}function f(){if(o.matchMedia&&u("").media!=="not all"){for(const t of c)if(u(":"+t).matches)return t}return"light"}})();function getStorageValue(o,e){switch(o){case"localStorage":try{return window.localStorage.getItem(e)}catch{return null}case"sessionStorage":try{return window.sessionStorage.getItem(e)}catch{return null}case"cookie":try{return getCookie(e)}catch{return null}default:return null}}function getCookie(o){const c=("; "+window.document.cookie).split("; "+o+"=");if(c.length===2){const s=c.pop();return s?s.split(";").shift():null}}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{pddVersion:"0.11.0"},app:{baseURL:"/",buildId:"3da08759-853a-4f1f-97f9-21437357aef0",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1788770970157,false]</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/_nuxt/entry.Cn2HYcjJ.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BtQ-s_jB.js"><script type="module" src="/_nuxt/BtQ-s_jB.js" crossorigin></script><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.VJcZ3YVw.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/cSnpUPR8.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BwxPsW7a.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/B-mP848s.js"><script>"use strict";(()=>{const o=window,e=document.documentElement,c=["dark","light"],s=getStorageValue("localStorage","nuxt-color-mode")||"light";let r=s==="system"?f():s;const l=e.getAttribute("data-color-mode-forced");l&&(r=l),i(r),o["__NUXT_COLOR_MODE__"]={preference:s,value:r,getColorScheme:f,addColorScheme:i,removeColorScheme:d};function i(t){const a=""+t+"",n="";e.classList?e.classList.add(a):e.className+=" "+a,n&&e.setAttribute("data-"+n,t)}function d(t){const a=""+t+"",n="";e.classList?e.classList.remove(a):e.className=e.className.replace(new RegExp(a,"g"),""),n&&e.removeAttribute("data-"+n)}function u(t){return o.matchMedia("(prefers-color-scheme"+t+")")}function f(){if(o.matchMedia&&u("").media!=="not all"){for(const t of c)if(u(":"+t).matches)return t}return"light"}})();function getStorageValue(o,e){switch(o){case"localStorage":try{return window.localStorage.getItem(e)}catch{return null}case"sessionStorage":try{return window.sessionStorage.getItem(e)}catch{return null}case"cookie":try{return getCookie(e)}catch{return null}default:return null}}function getCookie(o){const c=("; "+window.document.cookie).split("; "+o+"=");if(c.length===2){const s=c.pop();return s?s.split(";").shift():null}}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{pddVersion:"0.12.0"},app:{baseURL:"/",buildId:"5aaede1d-b2e2-4361-9046-383c78ec9ec1",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1789070949687,false]</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/_nuxt/entry.DsWXLqBw.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CmwFmk8h.js"><script type="module" src="/_nuxt/CmwFmk8h.js" crossorigin></script><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BwxPsW7a.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DQ3ZnyMB.js"><script>"use strict";(()=>{const o=window,e=document.documentElement,c=["dark","light"],s=getStorageValue("localStorage","nuxt-color-mode")||"light";let r=s==="system"?f():s;const l=e.getAttribute("data-color-mode-forced");l&&(r=l),i(r),o["__NUXT_COLOR_MODE__"]={preference:s,value:r,getColorScheme:f,addColorScheme:i,removeColorScheme:d};function i(t){const a=""+t+"",n="";e.classList?e.classList.add(a):e.className+=" "+a,n&&e.setAttribute("data-"+n,t)}function d(t){const a=""+t+"",n="";e.classList?e.classList.remove(a):e.className=e.className.replace(new RegExp(a,"g"),""),n&&e.removeAttribute("data-"+n)}function u(t){return o.matchMedia("(prefers-color-scheme"+t+")")}function f(){if(o.matchMedia&&u("").media!=="not all"){for(const t of c)if(u(":"+t).matches)return t}return"light"}})();function getStorageValue(o,e){switch(o){case"localStorage":try{return window.localStorage.getItem(e)}catch{return null}case"sessionStorage":try{return window.sessionStorage.getItem(e)}catch{return null}case"cookie":try{return getCookie(e)}catch{return null}default:return null}}function getCookie(o){const c=("; "+window.document.cookie).split("; "+o+"=");if(c.length===2){const s=c.pop();return s?s.split(";").shift():null}}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{pddVersion:"0.11.0"},app:{baseURL:"/",buildId:"3da08759-853a-4f1f-97f9-21437357aef0",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1788770970157,false]</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/_nuxt/entry.Cn2HYcjJ.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BtQ-s_jB.js"><script type="module" src="/_nuxt/BtQ-s_jB.js" crossorigin></script><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.VJcZ3YVw.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/cSnpUPR8.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BwxPsW7a.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/B-mP848s.js"><script>"use strict";(()=>{const o=window,e=document.documentElement,c=["dark","light"],s=getStorageValue("localStorage","nuxt-color-mode")||"light";let r=s==="system"?f():s;const l=e.getAttribute("data-color-mode-forced");l&&(r=l),i(r),o["__NUXT_COLOR_MODE__"]={preference:s,value:r,getColorScheme:f,addColorScheme:i,removeColorScheme:d};function i(t){const a=""+t+"",n="";e.classList?e.classList.add(a):e.className+=" "+a,n&&e.setAttribute("data-"+n,t)}function d(t){const a=""+t+"",n="";e.classList?e.classList.remove(a):e.className=e.className.replace(new RegExp(a,"g"),""),n&&e.removeAttribute("data-"+n)}function u(t){return o.matchMedia("(prefers-color-scheme"+t+")")}function f(){if(o.matchMedia&&u("").media!=="not all"){for(const t of c)if(u(":"+t).matches)return t}return"light"}})();function getStorageValue(o,e){switch(o){case"localStorage":try{return window.localStorage.getItem(e)}catch{return null}case"sessionStorage":try{return window.sessionStorage.getItem(e)}catch{return null}case"cookie":try{return getCookie(e)}catch{return null}default:return null}}function getCookie(o){const c=("; "+window.document.cookie).split("; "+o+"=");if(c.length===2){const s=c.pop();return s?s.split(";").shift():null}}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{pddVersion:"0.12.0"},app:{baseURL:"/",buildId:"5aaede1d-b2e2-4361-9046-383c78ec9ec1",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1789070949687,false]</script></body></html>