@flamingo-stack/openframe-frontend-core 0.0.291 → 0.0.292-snapshot.20260619040151

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 (201) hide show
  1. package/dist/{chunk-ODR6A6FC.js → chunk-26PKDALD.js} +7 -67
  2. package/dist/chunk-26PKDALD.js.map +1 -0
  3. package/dist/{chunk-EGSAB76W.js → chunk-2U2M2TG2.js} +4 -4
  4. package/dist/{chunk-EI4WALN2.cjs → chunk-4W7NYJ3B.cjs} +39 -29
  5. package/dist/chunk-4W7NYJ3B.cjs.map +1 -0
  6. package/dist/{chunk-KBKZYJRI.cjs → chunk-5E2HOSSH.cjs} +66 -19
  7. package/dist/chunk-5E2HOSSH.cjs.map +1 -0
  8. package/dist/{chunk-6BWZFRUG.cjs → chunk-6G2INVGG.cjs} +24 -22
  9. package/dist/chunk-6G2INVGG.cjs.map +1 -0
  10. package/dist/{chunk-7NM7DEUK.js → chunk-6GCI7JOE.js} +2 -2
  11. package/dist/{chunk-N6ZM5PYZ.js → chunk-7RIYT7ZH.js} +49 -2
  12. package/dist/chunk-7RIYT7ZH.js.map +1 -0
  13. package/dist/{chunk-AGRSALEN.js → chunk-BRNHX6C6.js} +15 -13
  14. package/dist/chunk-BRNHX6C6.js.map +1 -0
  15. package/dist/{chunk-Z2EOXZBW.js → chunk-DOMJSNXW.js} +262 -162
  16. package/dist/chunk-DOMJSNXW.js.map +1 -0
  17. package/dist/{chunk-7EYWERFT.js → chunk-E4XABBSU.js} +16 -8
  18. package/dist/{chunk-7EYWERFT.js.map → chunk-E4XABBSU.js.map} +1 -1
  19. package/dist/{chunk-ZLN6SM2U.js → chunk-EJXHZX2E.js} +3 -3
  20. package/dist/{chunk-3SDBXXDP.cjs → chunk-EYEW6PTA.cjs} +44 -36
  21. package/dist/chunk-EYEW6PTA.cjs.map +1 -0
  22. package/dist/{chunk-D4R2MUPA.js → chunk-FJDPUPXC.js} +5 -5
  23. package/dist/{chunk-VRSXJ5QJ.js → chunk-FQJK446R.js} +10 -3
  24. package/dist/chunk-FQJK446R.js.map +1 -0
  25. package/dist/{chunk-I6ZPGKZ2.cjs → chunk-FT4FCV7L.cjs} +6 -6
  26. package/dist/{chunk-I6ZPGKZ2.cjs.map → chunk-FT4FCV7L.cjs.map} +1 -1
  27. package/dist/{chunk-Y4JNA4W6.cjs → chunk-J54Z3OCR.cjs} +10 -3
  28. package/dist/chunk-J54Z3OCR.cjs.map +1 -0
  29. package/dist/{chunk-ZYBUFVQV.cjs → chunk-JSOMFVEV.cjs} +30 -30
  30. package/dist/{chunk-ZYBUFVQV.cjs.map → chunk-JSOMFVEV.cjs.map} +1 -1
  31. package/dist/{chunk-D6RK5YXX.cjs → chunk-KXCRGTRN.cjs} +10 -70
  32. package/dist/chunk-KXCRGTRN.cjs.map +1 -0
  33. package/dist/{chunk-5KD3S25X.cjs → chunk-LFGGF7OT.cjs} +139 -2
  34. package/dist/chunk-LFGGF7OT.cjs.map +1 -0
  35. package/dist/{chunk-R2KT5GDD.js → chunk-NSPOYUBH.js} +14 -4
  36. package/dist/chunk-NSPOYUBH.js.map +1 -0
  37. package/dist/{chunk-TYZEMPPH.js → chunk-OQ6X7ZOC.js} +138 -1
  38. package/dist/chunk-OQ6X7ZOC.js.map +1 -0
  39. package/dist/{chunk-2YSC3API.cjs → chunk-RJL6PIOK.cjs} +1091 -991
  40. package/dist/chunk-RJL6PIOK.cjs.map +1 -0
  41. package/dist/{chunk-CSL3ECOF.js → chunk-SOJCR63T.js} +4 -4
  42. package/dist/{chunk-BVNYQDZE.cjs → chunk-TYMUKFP2.cjs} +40 -40
  43. package/dist/{chunk-BVNYQDZE.cjs.map → chunk-TYMUKFP2.cjs.map} +1 -1
  44. package/dist/{chunk-VMRPM24G.cjs → chunk-VTY7S2QG.cjs} +25 -19
  45. package/dist/chunk-VTY7S2QG.cjs.map +1 -0
  46. package/dist/{chunk-Z4GAFSNM.cjs → chunk-X3TSMCKX.cjs} +12 -12
  47. package/dist/{chunk-Z4GAFSNM.cjs.map → chunk-X3TSMCKX.cjs.map} +1 -1
  48. package/dist/{chunk-RSIFEDZX.js → chunk-YICTMMXP.js} +13 -7
  49. package/dist/{chunk-RSIFEDZX.js.map → chunk-YICTMMXP.js.map} +1 -1
  50. package/dist/{chunk-EL5GCMPU.cjs → chunk-YIGPRLQY.cjs} +9 -9
  51. package/dist/{chunk-EL5GCMPU.cjs.map → chunk-YIGPRLQY.cjs.map} +1 -1
  52. package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
  53. package/dist/components/chat/chat-message-list.d.ts.map +1 -1
  54. package/dist/components/chat/embeddable-chat.d.ts +15 -0
  55. package/dist/components/chat/embeddable-chat.d.ts.map +1 -1
  56. package/dist/components/chat/entity-cards/roadmap-card.d.ts +7 -1
  57. package/dist/components/chat/entity-cards/roadmap-card.d.ts.map +1 -1
  58. package/dist/components/chat/hooks/use-realtime-chunk-processor.d.ts.map +1 -1
  59. package/dist/components/chat/index.cjs +9 -7
  60. package/dist/components/chat/index.cjs.map +1 -1
  61. package/dist/components/chat/index.d.ts +1 -0
  62. package/dist/components/chat/index.d.ts.map +1 -1
  63. package/dist/components/chat/index.js +8 -6
  64. package/dist/components/chat/remark-mention-chips.d.ts +30 -0
  65. package/dist/components/chat/remark-mention-chips.d.ts.map +1 -0
  66. package/dist/components/chat/types/api.types.d.ts +4 -0
  67. package/dist/components/chat/types/api.types.d.ts.map +1 -1
  68. package/dist/components/chat/types/component.types.d.ts +24 -0
  69. package/dist/components/chat/types/component.types.d.ts.map +1 -1
  70. package/dist/components/chat/types/context-item.types.d.ts +5 -0
  71. package/dist/components/chat/types/context-item.types.d.ts.map +1 -1
  72. package/dist/components/chat/types/processing.types.d.ts +4 -0
  73. package/dist/components/chat/types/processing.types.d.ts.map +1 -1
  74. package/dist/components/chat/utils/chunk-parser.d.ts.map +1 -1
  75. package/dist/components/chat/utils/nav-anchor-props.d.ts +8 -3
  76. package/dist/components/chat/utils/nav-anchor-props.d.ts.map +1 -1
  77. package/dist/components/chat/utils/process-historical-messages.d.ts.map +1 -1
  78. package/dist/components/contact/index.cjs +8 -8
  79. package/dist/components/contact/index.js +7 -7
  80. package/dist/components/docs/index.cjs +6 -6
  81. package/dist/components/docs/index.js +5 -5
  82. package/dist/components/docs/use-document-tree.d.ts.map +1 -1
  83. package/dist/components/embeds/index.cjs +8 -8
  84. package/dist/components/embeds/index.js +7 -7
  85. package/dist/components/faq/faq-section.d.ts.map +1 -1
  86. package/dist/components/faq/index.cjs +8 -8
  87. package/dist/components/faq/index.js +7 -7
  88. package/dist/components/features/index.cjs +7 -7
  89. package/dist/components/features/index.js +6 -6
  90. package/dist/components/index.cjs +216 -193
  91. package/dist/components/index.cjs.map +1 -1
  92. package/dist/components/index.js +52 -29
  93. package/dist/components/index.js.map +1 -1
  94. package/dist/components/navigation/index.cjs +7 -7
  95. package/dist/components/navigation/index.js +6 -6
  96. package/dist/components/onboarding-guides/index.cjs +24 -24
  97. package/dist/components/onboarding-guides/index.js +4 -4
  98. package/dist/components/related-content/index.cjs +8 -8
  99. package/dist/components/related-content/index.js +7 -7
  100. package/dist/components/shared/delivery/delivery-lists.d.ts.map +1 -1
  101. package/dist/components/shared/delivery/delivery-row.d.ts +8 -1
  102. package/dist/components/shared/delivery/delivery-row.d.ts.map +1 -1
  103. package/dist/components/shared/delivery/delivery-table.d.ts.map +1 -1
  104. package/dist/components/shared/roadmap/roadmap-grid.d.ts.map +1 -1
  105. package/dist/components/shared/roadmap/roadmap-view.d.ts.map +1 -1
  106. package/dist/components/tickets/help-center-card.d.ts +7 -1
  107. package/dist/components/tickets/help-center-card.d.ts.map +1 -1
  108. package/dist/components/tickets/help-center-list.d.ts.map +1 -1
  109. package/dist/components/tickets/index.cjs +82 -73
  110. package/dist/components/tickets/index.cjs.map +1 -1
  111. package/dist/components/tickets/index.js +24 -15
  112. package/dist/components/tickets/index.js.map +1 -1
  113. package/dist/components/tickets/ticket-center.d.ts.map +1 -1
  114. package/dist/components/tickets/ticket-row.d.ts +6 -1
  115. package/dist/components/tickets/ticket-row.d.ts.map +1 -1
  116. package/dist/components/ui/index.cjs +9 -7
  117. package/dist/components/ui/index.cjs.map +1 -1
  118. package/dist/components/ui/index.js +8 -6
  119. package/dist/components/ui/simple-markdown-renderer.d.ts.map +1 -1
  120. package/dist/components/ui/tag.d.ts +10 -1
  121. package/dist/components/ui/tag.d.ts.map +1 -1
  122. package/dist/hooks/index.cjs +5 -3
  123. package/dist/hooks/index.cjs.map +1 -1
  124. package/dist/hooks/index.d.ts +1 -0
  125. package/dist/hooks/index.d.ts.map +1 -1
  126. package/dist/hooks/index.js +4 -2
  127. package/dist/hooks/use-scroll-to-hash.d.ts +17 -0
  128. package/dist/hooks/use-scroll-to-hash.d.ts.map +1 -0
  129. package/dist/index.cjs +21 -7
  130. package/dist/index.cjs.map +1 -1
  131. package/dist/index.js +21 -7
  132. package/dist/utils/dev-sections/dev-section-param-keys.d.ts +10 -0
  133. package/dist/utils/dev-sections/dev-section-param-keys.d.ts.map +1 -1
  134. package/dist/utils/index.cjs +92 -10
  135. package/dist/utils/index.cjs.map +1 -1
  136. package/dist/utils/index.d.ts +2 -1
  137. package/dist/utils/index.d.ts.map +1 -1
  138. package/dist/utils/index.js +88 -11
  139. package/dist/utils/index.js.map +1 -1
  140. package/dist/utils/same-page-hash-nav.d.ts +37 -0
  141. package/dist/utils/same-page-hash-nav.d.ts.map +1 -0
  142. package/dist/utils/scroll-into-view.d.ts +12 -0
  143. package/dist/utils/scroll-into-view.d.ts.map +1 -1
  144. package/dist/utils/source-icons.d.ts.map +1 -1
  145. package/package.json +1 -1
  146. package/src/components/chat/chat-message-enhanced.tsx +71 -9
  147. package/src/components/chat/chat-message-list.tsx +2 -0
  148. package/src/components/chat/embeddable-chat.tsx +50 -6
  149. package/src/components/chat/entity-cards/roadmap-card.tsx +8 -1
  150. package/src/components/chat/hooks/use-realtime-chunk-processor.ts +1 -0
  151. package/src/components/chat/index.ts +1 -0
  152. package/src/components/chat/remark-mention-chips.ts +72 -0
  153. package/src/components/chat/types/api.types.ts +1 -1
  154. package/src/components/chat/types/component.types.ts +18 -0
  155. package/src/components/chat/types/context-item.types.ts +5 -0
  156. package/src/components/chat/types/processing.types.ts +8 -1
  157. package/src/components/chat/utils/chunk-parser.ts +11 -0
  158. package/src/components/chat/utils/nav-anchor-props.ts +22 -4
  159. package/src/components/chat/utils/process-historical-messages.ts +22 -0
  160. package/src/components/docs/use-document-tree.ts +45 -3
  161. package/src/components/faq/faq-section.tsx +22 -9
  162. package/src/components/shared/delivery/delivery-lists.tsx +9 -0
  163. package/src/components/shared/delivery/delivery-row.tsx +15 -2
  164. package/src/components/shared/delivery/delivery-table.tsx +7 -1
  165. package/src/components/shared/roadmap/roadmap-grid.tsx +7 -0
  166. package/src/components/shared/roadmap/roadmap-view.tsx +11 -0
  167. package/src/components/tickets/help-center-card.tsx +9 -17
  168. package/src/components/tickets/help-center-list.tsx +13 -0
  169. package/src/components/tickets/ticket-center.tsx +2 -0
  170. package/src/components/tickets/ticket-row.tsx +7 -1
  171. package/src/components/ui/simple-markdown-renderer.tsx +14 -11
  172. package/src/components/ui/tag.tsx +12 -2
  173. package/src/hooks/index.ts +5 -0
  174. package/src/hooks/use-scroll-to-hash.ts +74 -0
  175. package/src/utils/.source-icons.md +1 -1
  176. package/src/utils/dev-sections/dev-section-param-keys.ts +14 -0
  177. package/src/utils/index.ts +17 -1
  178. package/src/utils/same-page-hash-nav.ts +115 -0
  179. package/src/utils/scroll-into-view.ts +51 -9
  180. package/src/utils/source-icons.ts +7 -1
  181. package/dist/chunk-2YSC3API.cjs.map +0 -1
  182. package/dist/chunk-3SDBXXDP.cjs.map +0 -1
  183. package/dist/chunk-5KD3S25X.cjs.map +0 -1
  184. package/dist/chunk-6BWZFRUG.cjs.map +0 -1
  185. package/dist/chunk-AGRSALEN.js.map +0 -1
  186. package/dist/chunk-D6RK5YXX.cjs.map +0 -1
  187. package/dist/chunk-EI4WALN2.cjs.map +0 -1
  188. package/dist/chunk-KBKZYJRI.cjs.map +0 -1
  189. package/dist/chunk-N6ZM5PYZ.js.map +0 -1
  190. package/dist/chunk-ODR6A6FC.js.map +0 -1
  191. package/dist/chunk-R2KT5GDD.js.map +0 -1
  192. package/dist/chunk-TYZEMPPH.js.map +0 -1
  193. package/dist/chunk-VMRPM24G.cjs.map +0 -1
  194. package/dist/chunk-VRSXJ5QJ.js.map +0 -1
  195. package/dist/chunk-Y4JNA4W6.cjs.map +0 -1
  196. package/dist/chunk-Z2EOXZBW.js.map +0 -1
  197. /package/dist/{chunk-EGSAB76W.js.map → chunk-2U2M2TG2.js.map} +0 -0
  198. /package/dist/{chunk-7NM7DEUK.js.map → chunk-6GCI7JOE.js.map} +0 -0
  199. /package/dist/{chunk-ZLN6SM2U.js.map → chunk-EJXHZX2E.js.map} +0 -0
  200. /package/dist/{chunk-D4R2MUPA.js.map → chunk-FJDPUPXC.js.map} +0 -0
  201. /package/dist/{chunk-CSL3ECOF.js.map → chunk-SOJCR63T.js.map} +0 -0
@@ -19,4 +19,14 @@ export declare const DEV_SECTION_PARAM_KEYS: {
19
19
  /** Delivery (bug-fix / enhancement) task-type filter. */
20
20
  readonly deliveryTaskType: "task_type";
21
21
  };
22
+ /** Section keys that participate in `<section>-<id>` anchor IDs.
23
+ * The URL composer (`appendSearchAndHash` in hub `dev-section-url.ts`)
24
+ * and the row components (`DeliveryRow`, `RoadmapCard`, `HelpCenterCard`)
25
+ * both call `devSectionAnchorId` so the DOM `id` and the URL hash stay
26
+ * in lockstep — adding a new section means adding the literal here
27
+ * ONCE, not at every render site. */
28
+ export type DevSectionAnchorKind = 'roadmap' | 'delivery' | 'ticket';
29
+ /** Compose the canonical `<section>-<id>` anchor id used by the dev-center
30
+ * rows + URL composer. */
31
+ export declare function devSectionAnchorId(section: DevSectionAnchorKind, id: string): string;
22
32
  //# sourceMappingURL=dev-section-param-keys.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev-section-param-keys.d.ts","sourceRoot":"","sources":["../../../src/utils/dev-sections/dev-section-param-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB;IACjC,iEAAiE;;IAEjE,uDAAuD;;IAEvD,8CAA8C;;IAE9C,yDAAyD;;CAEjD,CAAA"}
1
+ {"version":3,"file":"dev-section-param-keys.d.ts","sourceRoot":"","sources":["../../../src/utils/dev-sections/dev-section-param-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB;IACjC,iEAAiE;;IAEjE,uDAAuD;;IAEvD,8CAA8C;;IAE9C,yDAAyD;;CAEjD,CAAA;AAEV;;;;;sCAKsC;AACtC,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAA;AAEpE;2BAC2B;AAC3B,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEpF"}
@@ -1569,6 +1569,9 @@ var DEV_SECTION_PARAM_KEYS = {
1569
1569
  /** Delivery (bug-fix / enhancement) task-type filter. */
1570
1570
  deliveryTaskType: "task_type"
1571
1571
  };
1572
+ function devSectionAnchorId(section, id) {
1573
+ return `${section}-${id}`;
1574
+ }
1572
1575
  var OpenFrameLogoIcon = ({ className }) => React2.createElement(OpenFrameLogo, { className, upperPathColor: "currentColor" });
1573
1576
  var ICON_REGISTRY = {
1574
1577
  // lucide-react (kebab-case)
@@ -2615,7 +2618,13 @@ var SOURCE_LABELS_BY_TABLE = {
2615
2618
  "github-pr-reviews-public": "OpenFrame PR Reviews",
2616
2619
  // HubSpot
2617
2620
  "hubspot-tickets": "HubSpot Tickets",
2618
- "hubspot-tickets-anon": "Known Issues",
2621
+ // Anon + self share the "Tickets" root so the chip vocabulary is
2622
+ // uniform across logged-out (everyone's resolved support tickets,
2623
+ // anonymized → "Tickets") and logged-in (user-scoped → "My Tickets")
2624
+ // surfaces. The full-PII `hubspot-tickets` entry above is product-hub
2625
+ // internal only (admin view), kept as "HubSpot Tickets" to flag the
2626
+ // distinct scope.
2627
+ "hubspot-tickets-anon": "Tickets",
2619
2628
  "hubspot-tickets-self": "My Tickets",
2620
2629
  // Communications
2621
2630
  "slack-messages": "OpenMSP Community"
@@ -3308,22 +3317,34 @@ function cancelActiveScroll() {
3308
3317
  }
3309
3318
  }
3310
3319
  var easeOutCubic = (t) => 1 - Math.pow(1 - t, 3);
3320
+ function getScrollableAncestor(el) {
3321
+ for (let node = el.parentElement; node; node = node.parentElement) {
3322
+ const overflowY = getComputedStyle(node).overflowY;
3323
+ if ((overflowY === "auto" || overflowY === "scroll" || overflowY === "overlay") && node.scrollHeight > node.clientHeight) {
3324
+ return node;
3325
+ }
3326
+ }
3327
+ return null;
3328
+ }
3311
3329
  function scrollElementIntoView(target, options = {}) {
3312
3330
  if (typeof window === "undefined" || !target) return;
3313
3331
  const { headerOffset = 0, behavior = "smooth", adjustTargetY, durationMs = 320 } = options;
3332
+ const container = getScrollableAncestor(target);
3333
+ const readCurrent = () => container ? container.scrollTop : window.scrollY;
3334
+ const writeTo = (y) => {
3335
+ if (container) container.scrollTop = y;
3336
+ else window.scrollTo(0, y);
3337
+ };
3314
3338
  const computeTarget = () => {
3315
- const raw = target.getBoundingClientRect().top + window.scrollY - headerOffset;
3339
+ const raw = container ? container.scrollTop + (target.getBoundingClientRect().top - container.getBoundingClientRect().top) - headerOffset : target.getBoundingClientRect().top + window.scrollY - headerOffset;
3316
3340
  const adjusted = adjustTargetY ? adjustTargetY(raw) : raw;
3317
- const maxScroll = Math.max(
3318
- 0,
3319
- document.documentElement.scrollHeight - window.innerHeight
3320
- );
3341
+ const maxScroll = container ? Math.max(0, container.scrollHeight - container.clientHeight) : Math.max(0, document.documentElement.scrollHeight - window.innerHeight);
3321
3342
  return Math.min(Math.max(0, adjusted), maxScroll);
3322
3343
  };
3323
3344
  cancelActiveScroll();
3324
3345
  const prefersReduced = typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
3325
3346
  if (behavior === "instant" || behavior === "auto" || prefersReduced) {
3326
- window.scrollTo(0, computeTarget());
3347
+ writeTo(computeTarget());
3327
3348
  return;
3328
3349
  }
3329
3350
  let startY = null;
@@ -3337,17 +3358,17 @@ function scrollElementIntoView(target, options = {}) {
3337
3358
  };
3338
3359
  const step = (now) => {
3339
3360
  if (startY === null) {
3340
- startY = window.scrollY;
3361
+ startY = readCurrent();
3341
3362
  startTime = now;
3342
3363
  }
3343
3364
  const targetY = computeTarget();
3344
3365
  const t = Math.min(1, (now - startTime) / durationMs);
3345
3366
  const y = startY + (targetY - startY) * easeOutCubic(t);
3346
- window.scrollTo(0, y);
3367
+ writeTo(y);
3347
3368
  if (t < 1) {
3348
3369
  activeRaf = requestAnimationFrame(step);
3349
3370
  } else {
3350
- window.scrollTo(0, computeTarget());
3371
+ writeTo(computeTarget());
3351
3372
  activeRaf = 0;
3352
3373
  if (teardownActive) {
3353
3374
  teardownActive();
@@ -3358,6 +3379,62 @@ function scrollElementIntoView(target, options = {}) {
3358
3379
  activeRaf = requestAnimationFrame(step);
3359
3380
  }
3360
3381
 
3382
+ // src/utils/same-page-hash-nav.ts
3383
+ var STICKY_HEADER_OFFSET_PX = 96;
3384
+ var HUB_HEADER_OFFSET_PX = 80;
3385
+ function normalizeHashFragment(hash) {
3386
+ if (!hash) return "";
3387
+ const second = hash.indexOf("#", 1);
3388
+ return second < 0 ? hash : hash.slice(0, second);
3389
+ }
3390
+ function navigateSamePageHash(target, options = {}) {
3391
+ if (typeof window === "undefined") return false;
3392
+ const { headerOffset = 0, history: historyMode = "push" } = options;
3393
+ const normalizedTarget = target.startsWith("#") ? window.location.pathname + window.location.search + target : target;
3394
+ let url;
3395
+ try {
3396
+ url = new URL(normalizedTarget, window.location.href);
3397
+ } catch {
3398
+ return false;
3399
+ }
3400
+ if (url.origin !== window.location.origin || url.pathname !== window.location.pathname || url.search !== window.location.search) {
3401
+ return false;
3402
+ }
3403
+ const current = window.location.pathname + window.location.search + window.location.hash;
3404
+ const normalizedHash = normalizeHashFragment(url.hash);
3405
+ if (process.env.NODE_ENV === "development" && normalizedHash !== url.hash) {
3406
+ console.warn(
3407
+ `[navigateSamePageHash] malformed fragment "${url.hash}" \u2192 normalizing to "${normalizedHash}". Fix the upstream composer.`
3408
+ );
3409
+ }
3410
+ const next = url.pathname + url.search + normalizedHash;
3411
+ const id = normalizedHash && normalizedHash !== "#" ? normalizedHash.slice(1) : "";
3412
+ if (!id && next !== current) return false;
3413
+ if (next !== current) {
3414
+ const oldURL = window.location.href;
3415
+ if (historyMode === "replace") {
3416
+ window.history.replaceState(null, "", next);
3417
+ } else {
3418
+ window.history.pushState(null, "", next);
3419
+ }
3420
+ window.dispatchEvent(new HashChangeEvent("hashchange", {
3421
+ oldURL,
3422
+ newURL: window.location.href
3423
+ }));
3424
+ }
3425
+ const el = id ? document.getElementById(id) : null;
3426
+ if (id && !el && process.env.NODE_ENV === "development") {
3427
+ console.warn(
3428
+ `[navigateSamePageHash] anchor "#${id}" not found \u2014 scrolling to top.`
3429
+ );
3430
+ }
3431
+ scrollElementIntoView(el ?? document.documentElement, {
3432
+ behavior: "smooth",
3433
+ headerOffset
3434
+ });
3435
+ return true;
3436
+ }
3437
+
3361
3438
  // src/utils/list-url.ts
3362
3439
  var ALIASES = { blog_post_existing: "blog_post" };
3363
3440
  function canonicalContentRefType(contentRefType) {
@@ -3828,6 +3905,7 @@ exports.ELAPSED_MS_FIELD = ELAPSED_MS_FIELD;
3828
3905
  exports.GENERIC_EMAIL_DOMAINS = GENERIC_EMAIL_DOMAINS;
3829
3906
  exports.HEX_PATTERN = HEX_PATTERN;
3830
3907
  exports.HONEYPOT_FIELD = HONEYPOT_FIELD;
3908
+ exports.HUB_HEADER_OFFSET_PX = HUB_HEADER_OFFSET_PX;
3831
3909
  exports.ICON_REGISTRY = ICON_REGISTRY;
3832
3910
  exports.OPENFRAME_DEV_SECTIONS = OPENFRAME_DEV_SECTIONS;
3833
3911
  exports.OS_PLATFORMS = OS_PLATFORMS;
@@ -3837,6 +3915,7 @@ exports.SCROLL_ANCHOR = SCROLL_ANCHOR;
3837
3915
  exports.SCROLL_ANCHOR_WIRE_KEY = SCROLL_ANCHOR_WIRE_KEY;
3838
3916
  exports.SOURCE_ICON_NAMES = SOURCE_ICON_NAMES;
3839
3917
  exports.SOURCE_LABELS_BY_TABLE = SOURCE_LABELS_BY_TABLE;
3918
+ exports.STICKY_HEADER_OFFSET_PX = STICKY_HEADER_OFFSET_PX;
3840
3919
  exports.TICKET_STATUS_OPTIONS = TICKET_STATUS_OPTIONS;
3841
3920
  exports.analyzeImageColor = analyzeImageColor;
3842
3921
  exports.applyProxyAuth = applyProxyAuth;
@@ -3858,6 +3937,7 @@ exports.deepClone = deepClone;
3858
3937
  exports.delay = delay;
3859
3938
  exports.deriveActiveColor = deriveActiveColor;
3860
3939
  exports.deriveHoverColor = deriveHoverColor;
3940
+ exports.devSectionAnchorId = devSectionAnchorId;
3861
3941
  exports.embedAuthedFetch = embedAuthedFetch;
3862
3942
  exports.escapeMarkdownInline = escapeMarkdownInline;
3863
3943
  exports.evaluateHumanitySignals = evaluateHumanitySignals;
@@ -3981,8 +4061,10 @@ exports.isWithinMinutes = isWithinMinutes;
3981
4061
  exports.makeComposeContentUrl = makeComposeContentUrl;
3982
4062
  exports.markdownToPlainText = markdownToPlainText;
3983
4063
  exports.nameInitials = nameInitials;
4064
+ exports.navigateSamePageHash = navigateSamePageHash;
3984
4065
  exports.normalizeDocPath = normalizeDocPath;
3985
4066
  exports.normalizeDomain = normalizeDomain;
4067
+ exports.normalizeHashFragment = normalizeHashFragment;
3986
4068
  exports.normalizeIconKey = normalizeIconKey;
3987
4069
  exports.normalizeOSType = normalizeOSType;
3988
4070
  exports.normalizeToolType = normalizeToolType;