@syntrologie/adapt-nav 2.16.0 → 2.17.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 (211) hide show
  1. package/dist/NavWidgetLit.d.ts.map +1 -1
  2. package/dist/chunk-HMLY7DHA.js +16 -0
  3. package/dist/chunk-HMLY7DHA.js.map +7 -0
  4. package/dist/chunk-ZYHZ6JAD.js +447 -0
  5. package/dist/chunk-ZYHZ6JAD.js.map +7 -0
  6. package/dist/editor.d.ts +42 -21
  7. package/dist/editor.d.ts.map +1 -1
  8. package/dist/editor.js +310 -313
  9. package/dist/editor.js.map +7 -0
  10. package/dist/resolveNavTarget.d.ts +61 -0
  11. package/dist/resolveNavTarget.d.ts.map +1 -0
  12. package/dist/resolveNavTarget.test.d.ts +2 -0
  13. package/dist/resolveNavTarget.test.d.ts.map +1 -0
  14. package/dist/runtime.d.ts +3 -4
  15. package/dist/runtime.d.ts.map +1 -1
  16. package/dist/runtime.js +612 -221
  17. package/dist/runtime.js.map +7 -0
  18. package/dist/schema.d.ts +182 -72
  19. package/dist/schema.d.ts.map +1 -1
  20. package/dist/schema.js +155 -125
  21. package/dist/schema.js.map +7 -0
  22. package/package.json +9 -24
  23. package/dist/NavWidget.d.ts +0 -31
  24. package/dist/NavWidget.d.ts.map +0 -1
  25. package/dist/NavWidget.js +0 -476
  26. package/dist/NavWidgetLit.js +0 -495
  27. package/dist/NavWidgetLit.test.js +0 -199
  28. package/dist/cdn.d.ts +0 -62
  29. package/dist/cdn.d.ts.map +0 -1
  30. package/dist/cdn.js +0 -48
  31. package/dist/editor-lit.d.ts +0 -49
  32. package/dist/editor-lit.d.ts.map +0 -1
  33. package/dist/editor-lit.js +0 -319
  34. package/dist/runtime-lit.d.ts +0 -108
  35. package/dist/runtime-lit.d.ts.map +0 -1
  36. package/dist/runtime-lit.js +0 -241
  37. package/dist/summarize.js +0 -51
  38. package/dist/types.js +0 -18
  39. package/node_modules/@syntro/design-system/README.md +0 -335
  40. package/node_modules/@syntro/design-system/dist/assets/syntrologie-logo.svg +0 -21
  41. package/node_modules/@syntro/design-system/dist/assets/syntrologie-logomark.svg +0 -10
  42. package/node_modules/@syntro/design-system/dist/index.d.ts +0 -8
  43. package/node_modules/@syntro/design-system/dist/index.d.ts.map +0 -1
  44. package/node_modules/@syntro/design-system/dist/index.js +0 -7
  45. package/node_modules/@syntro/design-system/dist/tailwind-preset.d.ts +0 -19
  46. package/node_modules/@syntro/design-system/dist/tailwind-preset.d.ts.map +0 -1
  47. package/node_modules/@syntro/design-system/dist/tailwind-preset.js +0 -455
  48. package/node_modules/@syntro/design-system/dist/tokens/colors.css +0 -464
  49. package/node_modules/@syntro/design-system/dist/tokens/colors.d.ts +0 -874
  50. package/node_modules/@syntro/design-system/dist/tokens/colors.d.ts.map +0 -1
  51. package/node_modules/@syntro/design-system/dist/tokens/colors.js +0 -564
  52. package/node_modules/@syntro/design-system/dist/tokens/effects.css +0 -43
  53. package/node_modules/@syntro/design-system/dist/tokens/effects.d.ts +0 -139
  54. package/node_modules/@syntro/design-system/dist/tokens/effects.d.ts.map +0 -1
  55. package/node_modules/@syntro/design-system/dist/tokens/effects.js +0 -121
  56. package/node_modules/@syntro/design-system/dist/tokens/index.d.ts +0 -12
  57. package/node_modules/@syntro/design-system/dist/tokens/index.d.ts.map +0 -1
  58. package/node_modules/@syntro/design-system/dist/tokens/index.js +0 -11
  59. package/node_modules/@syntro/design-system/dist/tokens/panel-shell.d.ts +0 -93
  60. package/node_modules/@syntro/design-system/dist/tokens/panel-shell.d.ts.map +0 -1
  61. package/node_modules/@syntro/design-system/dist/tokens/panel-shell.js +0 -72
  62. package/node_modules/@syntro/design-system/package.json +0 -55
  63. package/node_modules/@syntro/design-system/src/assets/syntrologie-logo.svg +0 -21
  64. package/node_modules/@syntro/design-system/src/assets/syntrologie-logomark.svg +0 -10
  65. package/node_modules/@syntrologie/sdk-contracts/dist/index.d.ts +0 -129
  66. package/node_modules/@syntrologie/sdk-contracts/dist/index.js +0 -17
  67. package/node_modules/@syntrologie/sdk-contracts/dist/schemas.d.ts +0 -2296
  68. package/node_modules/@syntrologie/sdk-contracts/dist/schemas.js +0 -361
  69. package/node_modules/@syntrologie/sdk-contracts/package.json +0 -33
  70. package/node_modules/@syntrologie/shared-editor-ui/dist/cn.d.ts +0 -2
  71. package/node_modules/@syntrologie/shared-editor-ui/dist/cn.d.ts.map +0 -1
  72. package/node_modules/@syntrologie/shared-editor-ui/dist/cn.js +0 -3
  73. package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPicker.d.ts +0 -34
  74. package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPicker.d.ts.map +0 -1
  75. package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPicker.js +0 -161
  76. package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPickerLit.d.ts +0 -84
  77. package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPickerLit.d.ts.map +0 -1
  78. package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPickerLit.js +0 -323
  79. package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggle.d.ts +0 -7
  80. package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggle.d.ts.map +0 -1
  81. package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggle.js +0 -9
  82. package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggleLit.d.ts +0 -25
  83. package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggleLit.d.ts.map +0 -1
  84. package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggleLit.js +0 -55
  85. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.d.ts +0 -23
  86. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.d.ts.map +0 -1
  87. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.js +0 -40
  88. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLineLit.d.ts +0 -33
  89. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLineLit.d.ts.map +0 -1
  90. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLineLit.js +0 -118
  91. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.d.ts +0 -7
  92. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.d.ts.map +0 -1
  93. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.js +0 -22
  94. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadgeLit.d.ts +0 -32
  95. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadgeLit.d.ts.map +0 -1
  96. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadgeLit.js +0 -68
  97. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSection.d.ts +0 -8
  98. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSection.d.ts.map +0 -1
  99. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSection.js +0 -9
  100. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSectionLit.d.ts +0 -34
  101. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSectionLit.d.ts.map +0 -1
  102. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSectionLit.js +0 -57
  103. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButton.d.ts +0 -7
  104. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButton.d.ts.map +0 -1
  105. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButton.js +0 -4
  106. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButtonLit.d.ts +0 -13
  107. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButtonLit.d.ts.map +0 -1
  108. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButtonLit.js +0 -31
  109. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBody.d.ts +0 -7
  110. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBody.d.ts.map +0 -1
  111. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBody.js +0 -4
  112. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBodyLit.d.ts +0 -7
  113. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBodyLit.d.ts.map +0 -1
  114. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBodyLit.js +0 -15
  115. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCard.d.ts +0 -13
  116. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCard.d.ts.map +0 -1
  117. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCard.js +0 -15
  118. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCardLit.d.ts +0 -36
  119. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCardLit.d.ts.map +0 -1
  120. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCardLit.js +0 -102
  121. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooter.d.ts +0 -7
  122. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooter.d.ts.map +0 -1
  123. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooter.js +0 -4
  124. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooterLit.d.ts +0 -20
  125. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooterLit.d.ts.map +0 -1
  126. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooterLit.js +0 -48
  127. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeader.d.ts +0 -9
  128. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeader.d.ts.map +0 -1
  129. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeader.js +0 -4
  130. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeaderLit.d.ts +0 -16
  131. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeaderLit.d.ts.map +0 -1
  132. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeaderLit.js +0 -25
  133. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInput.d.ts +0 -8
  134. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInput.d.ts.map +0 -1
  135. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInput.js +0 -8
  136. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInputLit.d.ts +0 -66
  137. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInputLit.d.ts.map +0 -1
  138. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInputLit.js +0 -87
  139. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayout.d.ts +0 -7
  140. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayout.d.ts.map +0 -1
  141. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayout.js +0 -4
  142. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayoutLit.d.ts +0 -7
  143. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayoutLit.d.ts.map +0 -1
  144. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayoutLit.js +0 -15
  145. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.d.ts +0 -25
  146. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.d.ts.map +0 -1
  147. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.js +0 -390
  148. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShellLit.d.ts +0 -66
  149. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShellLit.d.ts.map +0 -1
  150. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShellLit.js +0 -528
  151. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelect.d.ts +0 -8
  152. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelect.d.ts.map +0 -1
  153. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelect.js +0 -8
  154. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelectLit.d.ts +0 -41
  155. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelectLit.d.ts.map +0 -1
  156. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelectLit.js +0 -63
  157. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextarea.d.ts +0 -8
  158. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextarea.d.ts.map +0 -1
  159. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextarea.js +0 -17
  160. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextareaLit.d.ts +0 -55
  161. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextareaLit.d.ts.map +0 -1
  162. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextareaLit.js +0 -92
  163. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlight.d.ts +0 -32
  164. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlight.d.ts.map +0 -1
  165. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlight.js +0 -85
  166. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlightLit.d.ts +0 -90
  167. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlightLit.d.ts.map +0 -1
  168. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlightLit.js +0 -242
  169. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyState.d.ts +0 -6
  170. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyState.d.ts.map +0 -1
  171. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyState.js +0 -4
  172. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyStateLit.d.ts +0 -12
  173. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyStateLit.d.ts.map +0 -1
  174. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyStateLit.js +0 -21
  175. package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeader.d.ts +0 -8
  176. package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeader.d.ts.map +0 -1
  177. package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeader.js +0 -5
  178. package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeaderLit.d.ts +0 -21
  179. package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeaderLit.d.ts.map +0 -1
  180. package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeaderLit.js +0 -33
  181. package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.d.ts +0 -12
  182. package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.d.ts.map +0 -1
  183. package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.js +0 -40
  184. package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourneyLit.d.ts +0 -28
  185. package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourneyLit.d.ts.map +0 -1
  186. package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourneyLit.js +0 -121
  187. package/node_modules/@syntrologie/shared-editor-ui/dist/controllers/PanelShellController.d.ts +0 -110
  188. package/node_modules/@syntrologie/shared-editor-ui/dist/controllers/PanelShellController.d.ts.map +0 -1
  189. package/node_modules/@syntrologie/shared-editor-ui/dist/controllers/PanelShellController.js +0 -481
  190. package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.d.ts +0 -26
  191. package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.d.ts.map +0 -1
  192. package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.js +0 -202
  193. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useElementRect.d.ts +0 -8
  194. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useElementRect.d.ts.map +0 -1
  195. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useElementRect.js +0 -46
  196. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.d.ts +0 -24
  197. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.d.ts.map +0 -1
  198. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.js +0 -86
  199. package/node_modules/@syntrologie/shared-editor-ui/dist/index.d.ts +0 -36
  200. package/node_modules/@syntrologie/shared-editor-ui/dist/index.d.ts.map +0 -1
  201. package/node_modules/@syntrologie/shared-editor-ui/dist/index.js +0 -26
  202. package/node_modules/@syntrologie/shared-editor-ui/dist/lit-elements.d.ts +0 -15
  203. package/node_modules/@syntrologie/shared-editor-ui/dist/lit-elements.d.ts.map +0 -1
  204. package/node_modules/@syntrologie/shared-editor-ui/dist/lit-elements.js +0 -14
  205. package/node_modules/@syntrologie/shared-editor-ui/dist/utils/elementChainRecommender.d.ts +0 -33
  206. package/node_modules/@syntrologie/shared-editor-ui/dist/utils/elementChainRecommender.d.ts.map +0 -1
  207. package/node_modules/@syntrologie/shared-editor-ui/dist/utils/elementChainRecommender.js +0 -68
  208. package/node_modules/@syntrologie/shared-editor-ui/dist/utils/selectorGenerator.d.ts +0 -22
  209. package/node_modules/@syntrologie/shared-editor-ui/dist/utils/selectorGenerator.d.ts.map +0 -1
  210. package/node_modules/@syntrologie/shared-editor-ui/dist/utils/selectorGenerator.js +0 -143
  211. package/node_modules/@syntrologie/shared-editor-ui/package.json +0 -55
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/editor.ts", "../src/summarize.ts", "../src/types.ts"],
4
+ "sourcesContent": ["/**\n * Adaptive Nav - Editor Component\n *\n * Lit web component that displays nav tip cards with detection badges,\n * inline editing (Title, Description, Link URL, Icon, Category), and rationale.\n *\n * Custom events:\n * navigate-home \u2014 user clicked back\n * dirty-change \u2014 { dirty: boolean }\n */\n\nimport { html, LitElement, nothing } from 'lit';\n\nimport { describeTrigger, summarizeNavItem } from './summarize';\nimport { isOwnAction, type NavConfig, type NavTipAction, type RuleStrategy } from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface FlatItem {\n key: string;\n index: number;\n summary: string;\n trigger: string;\n rationale?: string;\n firstAnchor: string | null;\n firstPage: string | null;\n tip: NavTipAction;\n}\n\ninterface DetectionEntry {\n found: boolean;\n}\n\n// ============================================================================\n// Targeting Extraction\n// ============================================================================\n\nconst isRuleStrategy = (s: unknown): s is RuleStrategy<boolean> =>\n typeof s === 'object' &&\n s !== null &&\n (s as Record<string, unknown>).type === 'rules' &&\n Array.isArray((s as Record<string, unknown>).rules);\n\nconst extractFirstPage = (triggerWhen?: unknown): string | null => {\n if (!triggerWhen || !isRuleStrategy(triggerWhen)) return null;\n for (const rule of triggerWhen.rules) {\n for (const cond of rule.conditions) {\n const c = cond as Record<string, unknown>;\n if (c.type === 'page_url' && typeof c.url === 'string') return c.url;\n }\n }\n return null;\n};\n\nconst extractFirstAnchor = (triggerWhen?: unknown): string | null => {\n if (!triggerWhen || !isRuleStrategy(triggerWhen)) return null;\n for (const rule of triggerWhen.rules) {\n for (const cond of rule.conditions) {\n const c = cond as Record<string, unknown>;\n if (c.type === 'anchor_visible' && typeof c.anchorId === 'string') return c.anchorId;\n }\n }\n return null;\n};\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst flattenItems = (config: NavConfig): FlatItem[] => {\n const actions = (config.actions || []).filter(isOwnAction);\n return actions.map((tip, i) => {\n // Prefer the tip's own anchor (real pipeline data ships the target here).\n // Fall back to an `anchor_visible` condition inside triggerWhen for older configs.\n const tipAnchor = tip.kind === 'nav:tip' ? tip.config.anchor?.selector : undefined;\n const rawRoute = tip.kind === 'nav:tip' ? tip.config.anchor?.route : undefined;\n const tipRoute = typeof rawRoute === 'string' ? rawRoute : undefined;\n return {\n key: String(i),\n index: i,\n summary: summarizeNavItem(tip),\n trigger: describeTrigger(tip.triggerWhen),\n rationale: tip.rationale?.why,\n firstAnchor: tipAnchor || extractFirstAnchor(tip.triggerWhen),\n firstPage: tipRoute || extractFirstPage(tip.triggerWhen),\n tip,\n };\n });\n};\n\nconst runDetection = (items: FlatItem[]): Map<string, DetectionEntry> => {\n const map = new Map<string, DetectionEntry>();\n const currentPath = window.location.pathname;\n\n for (const item of items) {\n // Page match\n let pageMatch = true;\n if (item.firstPage) {\n const pattern = item.firstPage;\n const regex = new RegExp(\n `^${pattern.replace(/\\*\\*/g, '.*').replace(/(?<!\\.)(\\*)/g, '[^/]*')}$`\n );\n pageMatch = regex.test(currentPath);\n }\n\n // Anchor match\n let anchorFound = false;\n if (item.firstAnchor) {\n try {\n anchorFound = document.querySelector(item.firstAnchor) !== null;\n } catch {\n // Invalid selector\n }\n } else {\n anchorFound = pageMatch;\n }\n\n map.set(item.key, { found: pageMatch && anchorFound });\n }\n return map;\n};\n\n// ============================================================================\n// Element\n// ============================================================================\n\nexport class NavEditorLit extends LitElement {\n static override properties = {\n config: { attribute: false },\n onChange: { attribute: false },\n _editingKey: { state: true },\n _detectionMap: { state: true },\n };\n\n config: NavConfig | null = null;\n onChange: ((updated: Record<string, unknown>) => void) | null = null;\n\n private _editingKey: string | null = null;\n private _detectionMap: Map<string, DetectionEntry> = new Map();\n private _detectionInterval: ReturnType<typeof setInterval> | null = null;\n private _onPopstate = () => this._runDetection();\n\n override createRenderRoot() {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n window.addEventListener('popstate', this._onPopstate);\n // Run detection on an interval (matches React's 2s interval)\n this._detectionInterval = setInterval(() => this._runDetection(), 2000);\n }\n\n override disconnectedCallback(): void {\n window.removeEventListener('popstate', this._onPopstate);\n if (this._detectionInterval) {\n clearInterval(this._detectionInterval);\n this._detectionInterval = null;\n }\n super.disconnectedCallback();\n }\n\n override firstUpdated(): void {\n this._runDetection();\n // No auto-dirty on load \u2014 only dirty when user makes changes (matching React behavior).\n }\n\n private _runDetection = () => {\n if (!this.config) return;\n this._detectionMap = runDetection(flattenItems(this.config));\n };\n\n // ---- Actions ----\n\n private _handleBack = () => {\n if (this._editingKey !== null) {\n this._editingKey = null;\n } else {\n this.dispatchEvent(new CustomEvent('navigate-home', { bubbles: true }));\n }\n };\n\n private _handleItemClick = (key: string) => {\n this._editingKey = key;\n };\n\n private _handleFieldChange = (index: number, field: string, value: unknown) => {\n if (!this.config || !this.onChange) return;\n\n const ownActions = (this.config.actions || []).filter(isOwnAction).slice();\n const tip = { ...ownActions[index], config: { ...ownActions[index].config } };\n (tip.config as Record<string, unknown>)[field] = value;\n ownActions[index] = tip;\n\n const otherActions = (this.config.actions || []).filter((a) => !isOwnAction(a));\n const updated = { ...this.config, actions: [...otherActions, ...ownActions] };\n this.onChange(updated as unknown as Record<string, unknown>);\n\n this.dispatchEvent(new CustomEvent('dirty-change', { detail: { dirty: true }, bubbles: true }));\n };\n\n // ---- Render ----\n\n private _handleBadgeClick = (item: FlatItem, e: Event) => {\n e.stopPropagation();\n const href = item.tip.config.href;\n if (!href) return;\n // SPA navigate via pushState + popstate\n window.history.pushState({}, '', href);\n window.dispatchEvent(new PopStateEvent('popstate'));\n };\n\n private _renderDetectionBadge = (item: FlatItem) => {\n const detection = this._detectionMap.get(item.key);\n const found = detection?.found ?? false;\n\n if (found) {\n return html`<button type=\"button\"\n title=\"Click to scroll to element\"\n @click=${(e: Event) => this._handleBadgeClick(item, e)}\n class=\"se-shrink-0 se-w-2 se-h-2 se-rounded-full se-border-none se-cursor-pointer\"\n style=\"background:#22c55e\"\n ></button>`;\n }\n return html`<button type=\"button\"\n title=\"Click to navigate to page\"\n @click=${(e: Event) => this._handleBadgeClick(item, e)}\n class=\"se-shrink-0 se-w-2 se-h-2 se-rounded-full se-border-none se-cursor-pointer\"\n style=\"background:#ef4444\"\n ></button>`;\n };\n\n private _renderEditMode = (item: FlatItem) => {\n const tip = item.tip;\n return html`\n <div class=\"se-py-1\">\n <div class=\"se-flex se-items-center se-gap-2 se-mb-3 se-text-[13px] se-font-semibold se-text-text-primary\">\n <span>\uD83E\uDDED</span>\n <span>${item.summary}</span>\n </div>\n\n <div class=\"se-mb-3\">\n <label class=\"se-text-[11px] se-font-semibold se-text-text-secondary se-mb-1 se-block\">Title</label>\n <input type=\"text\" .value=${tip.config.title}\n @input=${(e: Event) => this._handleFieldChange(item.index, 'title', (e.target as HTMLInputElement).value)}\n class=\"se-w-full se-p-2 se-rounded se-border se-border-border-primary se-bg-input-field-bg se-text-text-primary se-text-sm\" />\n </div>\n\n <div class=\"se-mb-3\">\n <label class=\"se-text-[11px] se-font-semibold se-text-text-secondary se-mb-1 se-block\">Description</label>\n <input type=\"text\" .value=${tip.config.description}\n @input=${(e: Event) => this._handleFieldChange(item.index, 'description', (e.target as HTMLInputElement).value)}\n class=\"se-w-full se-p-2 se-rounded se-border se-border-border-primary se-bg-input-field-bg se-text-text-primary se-text-sm\" />\n </div>\n\n <div class=\"se-mb-3\">\n <label class=\"se-text-[11px] se-font-semibold se-text-text-secondary se-mb-1 se-block\">Link URL</label>\n <input type=\"text\" .value=${tip.config.href || ''} placeholder=\"Optional\"\n @input=${(e: Event) => this._handleFieldChange(item.index, 'href', (e.target as HTMLInputElement).value)}\n class=\"se-w-full se-p-2 se-rounded se-border se-border-border-primary se-bg-input-field-bg se-text-text-primary se-text-sm\" />\n </div>\n\n <div class=\"se-mb-3\">\n <label class=\"se-text-[11px] se-font-semibold se-text-text-secondary se-mb-1 se-block\">Icon</label>\n <input type=\"text\" .value=${tip.config.icon || ''} placeholder=\"e.g., \uD83E\uDDED\"\n @input=${(e: Event) => this._handleFieldChange(item.index, 'icon', (e.target as HTMLInputElement).value)}\n class=\"se-w-full se-p-2 se-rounded se-border se-border-border-primary se-bg-input-field-bg se-text-text-primary se-text-sm\" />\n </div>\n\n <div class=\"se-mb-3\">\n <label class=\"se-text-[11px] se-font-semibold se-text-text-secondary se-mb-1 se-block\">Category</label>\n <input type=\"text\" .value=${tip.config.category || ''} placeholder=\"Optional\"\n @input=${(e: Event) => this._handleFieldChange(item.index, 'category', (e.target as HTMLInputElement).value)}\n class=\"se-w-full se-p-2 se-rounded se-border se-border-border-primary se-bg-input-field-bg se-text-text-primary se-text-sm\" />\n </div>\n\n ${\n tip.rationale\n ? html`\n <div>\n <span class=\"se-text-[11px] se-font-semibold se-text-text-secondary se-mb-1 se-block\">AI Rationale</span>\n <div class=\"se-p-2 se-rounded se-border se-border-dashed se-border-border-primary se-bg-card-bg se-text-text-secondary se-text-xs se-mb-2\">\n ${tip.rationale.why}\n </div>\n </div>\n `\n : nothing\n }\n </div>\n `;\n };\n\n private _renderListMode = (items: FlatItem[]) => {\n if (items.length === 0) {\n return html`<div class=\"se-text-center se-py-8 se-px-4 se-text-text-secondary se-text-sm\">\n No tips configured.\n </div>`;\n }\n\n return html`\n <div class=\"se-text-[11px] se-font-semibold se-uppercase se-tracking-wider se-text-text-secondary se-mb-2 se-px-1\">\n TIPS <span class=\"se-text-text-tertiary se-font-normal\">${items.length}</span>\n </div>\n ${items.map(\n (item) => html`\n <div\n data-item-key=${item.key}\n data-card-body\n @click=${() => this._handleItemClick(item.key)}\n class=\"se-p-3 se-rounded-lg se-border se-border-border-primary se-bg-card-bg se-cursor-pointer se-mb-2 se-transition-all hover:se-border-pink-4/40 hover:se-bg-pink-4/5\"\n >\n <div class=\"se-flex se-items-center se-gap-2\">\n ${this._renderDetectionBadge(item)}\n <span class=\"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap se-text-sm se-text-text-primary\">\n ${item.summary}\n </span>\n </div>\n ${\n item.trigger !== 'All pages'\n ? html`\n <div class=\"se-text-[10px] se-text-text-tertiary se-mt-1\">\uD83D\uDCCD ${item.trigger}</div>\n `\n : nothing\n }\n ${\n item.rationale\n ? html`\n <div class=\"se-text-[10px] se-text-text-tertiary se-mt-1\">WHY: ${item.rationale}</div>\n `\n : nothing\n }\n </div>\n `\n )}\n `;\n };\n\n override render() {\n if (!this.config) {\n return html`<div class=\"se-p-8 se-text-center se-text-text-secondary se-text-sm\">Loading...</div>`;\n }\n\n const items = flattenItems(this.config);\n const editItem =\n this._editingKey !== null ? items.find((it) => it.key === this._editingKey) : null;\n\n return html`\n <div class=\"se-flex se-flex-col se-h-full\">\n <!-- Header (no Back button \u2014 panel provides that) -->\n <div class=\"se-px-4 se-pt-3 se-pb-1\">\n <h2 class=\"se-m-0 se-text-base se-font-semibold se-text-text-primary\">Navigation Tips</h2>\n <p class=\"se-m-0 se-mt-0.5 se-text-xs se-text-text-secondary\">\n ${items.length} tip${items.length !== 1 ? 's' : ''}\n </p>\n </div>\n\n <div class=\"se-flex-1 se-overflow-auto se-p-4\">\n ${\n editItem\n ? html`\n <button type=\"button\" @click=${() => {\n this._editingKey = null;\n }}\n class=\"se-mb-3 se-py-1 se-px-2 se-rounded se-border-none se-bg-card-bg se-text-text-secondary se-text-xs se-cursor-pointer\"\n >\u2190 Back to list</button>\n ${this._renderEditMode(editItem)}\n `\n : this._renderListMode(items)\n }\n </div>\n </div>\n `;\n }\n}\n\ncustomElements.define('se-nav-editor', NavEditorLit);\n", "/**\n * Human-readable summary generation for Nav items.\n * Pure functions \u2014 no DOM access, just string formatting.\n */\n\nimport type { DecisionStrategy, NavTipAction, RuleStrategy } from './types';\n\nconst MAX_TITLE_LEN = 30;\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return `${text.slice(0, max).trimEnd()}...`;\n}\n\nfunction isRuleStrategy(s: unknown): s is RuleStrategy<boolean> {\n return (\n typeof s === 'object' &&\n s !== null &&\n (s as Record<string, unknown>).type === 'rules' &&\n Array.isArray((s as Record<string, unknown>).rules)\n );\n}\n\n/**\n * Parse a triggerWhen strategy into a human-readable trigger description.\n */\nexport function describeTrigger(triggerWhen?: DecisionStrategy<boolean> | null): string {\n if (!triggerWhen) return 'All pages';\n if (!isRuleStrategy(triggerWhen)) return 'All pages';\n\n const pages: string[] = [];\n const anchors: string[] = [];\n\n for (const rule of triggerWhen.rules) {\n for (const condition of rule.conditions) {\n if (condition.type === 'page_url' && typeof (condition as any).url === 'string') {\n pages.push((condition as any).url);\n }\n if (condition.type === 'anchor_visible' && typeof (condition as any).anchorId === 'string') {\n anchors.push((condition as any).anchorId);\n }\n }\n }\n\n const parts: string[] = [];\n if (pages.length > 0) parts.push(pages[0]);\n if (anchors.length > 0) parts.push(anchors[0]);\n\n return parts.length > 0 ? parts.join(' \\u00b7 ') : 'All pages';\n}\n\n/**\n * Generate a one-liner summary for a Nav tip.\n */\nexport function summarizeNavItem(item: NavTipAction): string {\n const icon = item.config.icon || '\\u{1F9ED}';\n const title = truncate(item.config.title, MAX_TITLE_LEN);\n return `${icon} ${title}`;\n}\n", "/**\n * Adaptive Nav - Types\n *\n * Type definitions for the navigation tips accordion adaptive.\n * Demonstrates compositional action pattern with per-item triggerWhen.\n */\n\n// ============================================================================\n// Decision Strategy Types (from runtime-sdk)\n// ============================================================================\n\n/**\n * Simplified DecisionStrategy type for this package.\n * Full definition is in @syntrologie/runtime-sdk.\n */\nexport type DecisionStrategy<T = unknown> =\n | RuleStrategy<T>\n | ScoreStrategy<T>\n | ModelStrategy<T>\n | ExternalStrategy<T>;\n\nexport interface RuleStrategy<T = unknown> {\n type: 'rules';\n rules: Array<{\n conditions: Array<Record<string, unknown>>;\n value: T;\n }>;\n default: T;\n}\n\nexport interface ScoreStrategy<T = unknown> {\n type: 'score';\n field: string;\n threshold: number;\n above: T;\n below: T;\n}\n\nexport interface ModelStrategy<T = unknown> {\n type: 'model';\n modelId: string;\n inputs: string[];\n outputMapping: Record<string, T>;\n default: T;\n}\n\nexport interface ExternalStrategy<T = unknown> {\n type: 'external';\n endpoint: string;\n method?: 'GET' | 'POST';\n default: T;\n timeoutMs?: number;\n}\n\n// ============================================================================\n// Event Scope Types (from sdk-contracts)\n// ============================================================================\n\n// ============================================================================\n// Nav Tip Action Types\n// ============================================================================\n\n/**\n * Single navigation tip configuration.\n * This is a \"compositional action\" \u2014 rendered as an accordion item by the parent.\n */\nexport interface NavTipAction {\n /** Action kind identifier */\n kind: 'nav:tip';\n /** Tip configuration */\n config: {\n /** Unique identifier for this tip */\n id: string;\n /** Accordion header text */\n title: string;\n /** Expanded body text */\n description: string;\n /**\n * Target anchor: route = where to go, selector = what to highlight/focus.\n * - Same page + valid selector \u2192 scroll + pulse + focus\n * - Same page + no selector/\"*\" \u2192 no-op (already there)\n * - Different page \u2192 navigate via pushState + popstate\n */\n anchor?: AnchorId;\n /** @deprecated Use anchor instead. Falls back to { route: href, selector: \"*\" } */\n href?: string;\n /** Optional icon (emoji or icon key) */\n icon?: string;\n /** Whether the link opens in a new tab */\n external?: boolean;\n /** Category for grouping */\n category?: string;\n };\n /** Optional per-item activation strategy */\n triggerWhen?: DecisionStrategy<boolean> | null;\n /** Toast config when triggerWhen transitions false \u2192 true. Required when triggerWhen is set (use null to opt out). */\n notify?: { title?: string; body?: string; icon?: string } | null;\n /** AI-generated reasoning for why this tip was recommended */\n rationale?: {\n why: string;\n confidence?: number;\n };\n}\n\n/** @deprecated Use NavTipAction instead */\nexport type NavLinkAction = NavTipAction;\n\n// ============================================================================\n// Nav Widget Configuration\n// ============================================================================\n\n/**\n * Expand behavior for the accordion.\n */\nexport type NavExpandBehavior = 'single' | 'multiple';\n\n/**\n * Theme for the navigation widget.\n */\nexport type NavTheme = 'light' | 'dark' | 'auto';\n\n/**\n * Full configuration for the adaptive-nav widget.\n */\nexport interface NavConfig {\n /** Expand behavior */\n expandBehavior: NavExpandBehavior;\n /** Color theme */\n theme: NavTheme;\n /** Navigation tips (compositional actions) */\n actions: NavTipAction[];\n}\n\n// ============================================================================\n// Widget Props Types\n// ============================================================================\n\n/**\n * Runtime services passed to the widget.\n */\nexport interface NavWidgetRuntime {\n /** Synchronously evaluate a decision strategy */\n evaluateSync: <T>(strategy: DecisionStrategy<T>) => { value: T; isFallback: boolean };\n /** Context manager for subscribing to changes */\n context: {\n subscribe: (callback: () => void) => () => void;\n };\n /** Event bus for publishing interactions */\n events: {\n publish: (name: string, props?: Record<string, unknown>) => void;\n };\n /** Event accumulator for event_count-based triggerWhen */\n accumulator?: {\n subscribe: (callback: () => void) => () => void;\n register: (key: string, predicate: (event: any) => boolean) => void;\n };\n}\n\n/**\n * Props passed to the NavWidget component.\n */\nexport interface NavWidgetProps {\n /** Widget configuration */\n config: NavConfig;\n /** Runtime services */\n runtime: NavWidgetRuntime;\n /** Instance ID for telemetry */\n instanceId: string;\n}\n\n// ============================================================================\n// Navigation Action Types (merged from adaptive-navigation)\n// ============================================================================\n\nimport type { AnchorId } from '@syntrologie/sdk-contracts';\n\ninterface BaseAction {\n label?: string;\n}\n\nexport interface ScrollToAction extends BaseAction {\n kind: 'navigation:scrollTo';\n anchorId: AnchorId;\n behavior?: ScrollBehavior;\n block?: ScrollLogicalPosition;\n inline?: ScrollLogicalPosition;\n}\n\nexport interface NavigateAction extends BaseAction {\n kind: 'navigation:navigate';\n url: string;\n target?: '_self' | '_blank';\n /** When true, always use full page navigation (window.location.href) even for same-origin URLs. */\n forceFullNavigation?: boolean;\n}\n\n// ============================================================================\n// Action Namespace\n// ============================================================================\n\nexport const ACTION_NAMESPACES = ['nav', 'navigation'] as const;\n\n/**\n * Returns true if the action belongs to this adaptive package.\n * Uses prefix matching so new kinds (e.g. nav:dropdown) are automatically included.\n * Covers both `nav:*` (compositional) and `navigation:*` (executor) prefixes.\n */\nexport function isOwnAction(action: { kind: string }): boolean {\n return ACTION_NAMESPACES.some((ns) => action.kind.startsWith(`${ns}:`));\n}\n\n// ============================================================================\n// Executor Types (from shared contracts)\n// ============================================================================\n\nexport type {\n ActionExecutor,\n ExecutorCleanup,\n ExecutorContext,\n ExecutorResult,\n ExecutorUpdate,\n} from '@syntrologie/sdk-contracts';\n\n// ============================================================================\n// Editor Types (from sdk-contracts)\n// ============================================================================\n\nexport type { EditorPanelProps } from '@syntrologie/sdk-contracts';\n"],
5
+ "mappings": "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",
6
+ "names": ["isRuleStrategy"]
7
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Pure decision function for nav-tip click routing.
3
+ *
4
+ * Given an href, an `external` flag, the current window's origin, and whether
5
+ * the SDK is mounted inside an iframe, returns the navigation action to take.
6
+ *
7
+ * Extracted from NavWidgetLit so both the Lit and React widget variants
8
+ * share one decision matrix and so the routing logic can be unit-tested
9
+ * without mutating window.location (jsdom doesn't allow redefining
10
+ * origin/href).
11
+ */
12
+ export type NavTarget = {
13
+ kind: 'open';
14
+ url: string;
15
+ } | {
16
+ kind: 'fullnav';
17
+ url: string;
18
+ } | {
19
+ kind: 'spa';
20
+ url: URL;
21
+ };
22
+ export interface ResolveNavTargetArgs {
23
+ href: string;
24
+ external: boolean;
25
+ windowOrigin: string;
26
+ /**
27
+ * True when the SDK is mounted inside an iframe (window !== window.top, or
28
+ * window.top access threw cross-origin). When true, every nav escapes via
29
+ * window.open — the parent page's sandbox `allow-popups` lets the new
30
+ * window pop out to the user's main browser.
31
+ */
32
+ isIframe: boolean;
33
+ }
34
+ /**
35
+ * Decide what to do with a nav-tip click.
36
+ *
37
+ * Routing branches (in order):
38
+ *
39
+ * 1. **Iframe context** (`isIframe=true` OR opaque origin "null"):
40
+ * always `window.open` the href as-is. Action-plan authors who want
41
+ * cross-iframe nav must use absolute URLs (any host — customer's,
42
+ * partner's, doesn't matter). The sandbox's `allow-popups` lets the
43
+ * open() call escape to the user's main browser.
44
+ *
45
+ * 2. **Explicit external** (`external=true`): always opens in `_blank`.
46
+ *
47
+ * 3. **Cross-origin absolute href** (no iframe; URL parses to a different
48
+ * origin): full `window.location.href` navigation.
49
+ *
50
+ * 4. **Same-origin** (most common — SDK on customer site, internal route):
51
+ * SPA-style `pushState` (caller falls back to framework router).
52
+ *
53
+ * 5. **Parse failure**: full-nav fallback; browser does its best.
54
+ */
55
+ export declare function resolveNavTarget(args: ResolveNavTargetArgs): NavTarget;
56
+ /**
57
+ * Helper: detect whether the current window is mounted in an iframe.
58
+ * Cross-origin parent access can throw — treat that as "in iframe."
59
+ */
60
+ export declare function detectIsIframe(): boolean;
61
+ //# sourceMappingURL=resolveNavTarget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveNavTarget.d.ts","sourceRoot":"","sources":["../src/resolveNavTarget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAE,CAAC;AAE9B,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,SAAS,CAwBtE;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAOxC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resolveNavTarget.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveNavTarget.test.d.ts","sourceRoot":"","sources":["../src/resolveNavTarget.test.ts"],"names":[],"mappings":""}
package/dist/runtime.d.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  * Adaptive Nav - Runtime Module
3
3
  *
4
4
  * Runtime manifest for the navigation tips accordion adaptive.
5
+ * Mounts the `<syntro-nav-tips>` Lit web component.
5
6
  * Includes widget-based nav tips and navigation action executors
6
7
  * (scrollTo, navigate) previously in adaptive-navigation.
7
8
  */
@@ -26,8 +27,6 @@ export declare function navigateWithFrameworkRouter(url: string): boolean;
26
27
  export declare const executeNavigate: ActionExecutor<NavigateAction>;
27
28
  /**
28
29
  * NavWidgetLitMountable — Mounts the `<syntro-nav-tips>` Lit web component.
29
- *
30
- * Drop-in companion to NavMountableWidget that avoids React/ReactDOM entirely.
31
30
  * Self-registers the custom element on first use.
32
31
  */
33
32
  export declare const NavWidgetLitMountable: {
@@ -52,7 +51,7 @@ export declare const executors: readonly [{
52
51
  *
53
52
  * Provides:
54
53
  * - Navigation action executors (scrollTo, navigate)
55
- * - Widget-based nav tips accordion (compositional nav:tip actions)
54
+ * - Widget-based nav tips accordion using the Lit web component
56
55
  */
57
56
  export declare const runtime: {
58
57
  id: string;
@@ -78,7 +77,7 @@ export declare const runtime: {
78
77
  mount(container: HTMLElement, config?: NavConfig & {
79
78
  runtime?: NavWidgetRuntime;
80
79
  instanceId?: string;
81
- }): (() => void) | undefined;
80
+ }): () => void;
82
81
  };
83
82
  metadata: {
84
83
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,cAAc,EAEd,SAAS,EACT,cAAc,EAEd,gBAAgB,EAChB,cAAc,EACf,MAAM,SAAS,CAAC;AAMjB;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,cAAc,CA+B1D,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgDhE;AAgBD;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,cAAc,CAuC1D,CAAC;AAMF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;qBAEnB,WAAW,WACb,SAAS,GAAG;QAAE,OAAO,CAAC,EAAE,gBAAgB,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;CA2B3E,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,SAAS;;;;;;EAGZ,CAAC;AAMX;;;;;;GAMG;AACH,eAAO,MAAM,OAAO;;;;;IAMlB;;OAEG;;;;;;;;IAGH;;OAEG;;;;;uBAqC68Y,CAAC;0BAA8B,CAAC;;;;;;;;;IAxBh/Y;;;;OAIG;0BACmB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;CAgB9C,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,cAAc,EAEd,SAAS,EACT,cAAc,EAEd,gBAAgB,EAChB,cAAc,EACf,MAAM,SAAS,CAAC;AAMjB;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,cAAc,CA+B1D,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgDhE;AAgBD;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,cAAc,CAuC1D,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,qBAAqB;qBAEnB,WAAW,WACb,SAAS,GAAG;QAAE,OAAO,CAAC,EAAE,gBAAgB,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;CA2B3E,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,SAAS;;;;;;EAGZ,CAAC;AAMX;;;;;;GAMG;AACH,eAAO,MAAM,OAAO;;;;;IAMlB;;OAEG;;;;;;;;IAGH;;OAEG;;;;6BAnEU,WAAW,WACb,SAAS,GAAG;gBAAE,OAAO,CAAC,EAAE,gBAAgB,CAAC;gBAAC,UAAU,CAAC,EAAE,MAAM,CAAA;aAAE;;;;;;;;IA+E1E;;;;OAIG;0BACmB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;CAgB9C,CAAC;AAEF,eAAe,OAAO,CAAC"}