@carlonicora/nextjs-jsonapi 1.107.1 → 1.109.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 (168) hide show
  1. package/dist/{AssistantInterface-BYgI5z1-.d.mts → AssistantInterface-B1c8FhGA.d.mts} +2 -0
  2. package/dist/{AssistantInterface-DfDcz0gJ.d.ts → AssistantInterface-BBUHxOCd.d.ts} +2 -0
  3. package/dist/{AssistantMessageInterface-BpEhx2pC.d.ts → AssistantMessageInterface-Cs1yb-gF.d.ts} +3 -1
  4. package/dist/{AssistantMessageInterface-DJ3Me16Y.d.mts → AssistantMessageInterface-DQ3mH5L8.d.mts} +3 -1
  5. package/dist/{AuthComponent-B6DIk8Vf.d.ts → AuthComponent-Cd7lcYif.d.ts} +1 -1
  6. package/dist/{AuthComponent-BKI0ZbtD.d.mts → AuthComponent-DdxCFgUZ.d.mts} +1 -1
  7. package/dist/{BlockNoteEditor-RWRVIEZC.js → BlockNoteEditor-3XYBZLWO.js} +20 -19
  8. package/dist/BlockNoteEditor-3XYBZLWO.js.map +1 -0
  9. package/dist/{BlockNoteEditor-7TSK7PNG.mjs → BlockNoteEditor-EBFZG7AL.mjs} +5 -4
  10. package/dist/{BlockNoteEditor-7TSK7PNG.mjs.map → BlockNoteEditor-EBFZG7AL.mjs.map} +1 -1
  11. package/dist/{auth.interface-BBUgMZzs.d.ts → auth.interface-8b601idJ.d.ts} +1 -1
  12. package/dist/{auth.interface-XYEREOD6.d.mts → auth.interface-CXBF8Mhi.d.mts} +1 -1
  13. package/dist/billing/index.js +347 -346
  14. package/dist/billing/index.js.map +1 -1
  15. package/dist/billing/index.mjs +4 -3
  16. package/dist/billing/index.mjs.map +1 -1
  17. package/dist/chunk-3J7RQBF3.js +123 -0
  18. package/dist/chunk-3J7RQBF3.js.map +1 -0
  19. package/dist/{chunk-VLDLERJN.js → chunk-7E3O52U5.js} +15 -8
  20. package/dist/chunk-7E3O52U5.js.map +1 -0
  21. package/dist/{chunk-RXXZGPC3.js → chunk-CFI4WZ5R.js} +159 -113
  22. package/dist/chunk-CFI4WZ5R.js.map +1 -0
  23. package/dist/chunk-CQID6RCF.mjs +38 -0
  24. package/dist/chunk-CQID6RCF.mjs.map +1 -0
  25. package/dist/{chunk-WSOPEIRP.mjs → chunk-CRTVAQEK.mjs} +46 -27
  26. package/dist/chunk-CRTVAQEK.mjs.map +1 -0
  27. package/dist/{chunk-N3NVIPSU.mjs → chunk-MSNNAHDB.mjs} +129 -83
  28. package/dist/{chunk-N3NVIPSU.mjs.map → chunk-MSNNAHDB.mjs.map} +1 -1
  29. package/dist/chunk-MZTKPPET.mjs +123 -0
  30. package/dist/chunk-MZTKPPET.mjs.map +1 -0
  31. package/dist/{chunk-2IRWQVG4.js → chunk-UHO3KUUH.js} +842 -823
  32. package/dist/chunk-UHO3KUUH.js.map +1 -0
  33. package/dist/{chunk-CFECWLHH.mjs → chunk-UOYIWJEJ.mjs} +10 -3
  34. package/dist/chunk-UOYIWJEJ.mjs.map +1 -0
  35. package/dist/chunk-YQQHAFBS.js +38 -0
  36. package/dist/chunk-YQQHAFBS.js.map +1 -0
  37. package/dist/client/index.d.mts +8 -16
  38. package/dist/client/index.d.ts +8 -16
  39. package/dist/client/index.js +5 -4
  40. package/dist/client/index.js.map +1 -1
  41. package/dist/client/index.mjs +4 -3
  42. package/dist/components/index.d.mts +8 -7
  43. package/dist/components/index.d.ts +8 -7
  44. package/dist/components/index.js +5 -4
  45. package/dist/components/index.js.map +1 -1
  46. package/dist/components/index.mjs +4 -3
  47. package/dist/{config-CLQynoaa.d.ts → config-CN23v3eJ.d.ts} +4 -1
  48. package/dist/{config-k61pe_o2.d.mts → config-gh88Qn4h.d.mts} +4 -1
  49. package/dist/contexts/index.d.mts +18 -7
  50. package/dist/contexts/index.d.ts +18 -7
  51. package/dist/contexts/index.js +5 -4
  52. package/dist/contexts/index.js.map +1 -1
  53. package/dist/contexts/index.mjs +4 -3
  54. package/dist/core/index.d.mts +44 -11
  55. package/dist/core/index.d.ts +44 -11
  56. package/dist/core/index.js +2 -2
  57. package/dist/core/index.mjs +1 -1
  58. package/dist/features/help/index.css +29 -0
  59. package/dist/features/help/index.css.map +1 -0
  60. package/dist/features/help/index.d.mts +115 -0
  61. package/dist/features/help/index.d.ts +115 -0
  62. package/dist/features/help/index.js +532 -0
  63. package/dist/features/help/index.js.map +1 -0
  64. package/dist/features/help/index.mjs +532 -0
  65. package/dist/features/help/index.mjs.map +1 -0
  66. package/dist/features/help/server/createHelpAssetRouteHandler.d.mts +11 -0
  67. package/dist/features/help/server/createHelpAssetRouteHandler.d.ts +11 -0
  68. package/dist/features/help/server/createHelpAssetRouteHandler.js +43 -0
  69. package/dist/features/help/server/createHelpAssetRouteHandler.js.map +1 -0
  70. package/dist/features/help/server/createHelpAssetRouteHandler.mjs +43 -0
  71. package/dist/features/help/server/createHelpAssetRouteHandler.mjs.map +1 -0
  72. package/dist/features/help/server.d.mts +71 -0
  73. package/dist/features/help/server.d.ts +71 -0
  74. package/dist/features/help/server.js +123 -0
  75. package/dist/features/help/server.js.map +1 -0
  76. package/dist/features/help/server.mjs +123 -0
  77. package/dist/features/help/server.mjs.map +1 -0
  78. package/dist/help-content-config.interface-B9L02u9i.d.mts +50 -0
  79. package/dist/help-content-config.interface-B9L02u9i.d.ts +50 -0
  80. package/dist/index.d.mts +10 -8
  81. package/dist/index.d.ts +10 -8
  82. package/dist/index.js +4 -3
  83. package/dist/index.js.map +1 -1
  84. package/dist/index.mjs +3 -2
  85. package/dist/{notification.interface-aLEJbA_g.d.ts → notification.interface-C1T1C2ee.d.ts} +1 -100
  86. package/dist/{notification.interface-DLZGtV7Z.d.mts → notification.interface-DIxR23eS.d.mts} +1 -100
  87. package/dist/{s3.service-CVgLWaDc.d.mts → s3.service-0BTClOYO.d.mts} +2 -2
  88. package/dist/{s3.service-SLlX0Zbz.d.ts → s3.service-CT27Fm1s.d.ts} +2 -2
  89. package/dist/server/index.d.mts +4 -3
  90. package/dist/server/index.d.ts +4 -3
  91. package/dist/server/index.js +3 -3
  92. package/dist/server/index.mjs +1 -1
  93. package/dist/types-CQSjy7et.d.mts +101 -0
  94. package/dist/types-DHOxe8rc.d.ts +101 -0
  95. package/dist/usePageUrlGenerator-tjq2mlDV.d.ts +14 -0
  96. package/dist/usePageUrlGenerator-uOnyJ6j2.d.mts +14 -0
  97. package/dist/{useSocket-BkxHHujj.d.mts → useSocket-B1fMIr17.d.mts} +1 -1
  98. package/dist/{useSocket-CMDjWFYm.d.ts → useSocket-BdJTBXKv.d.ts} +1 -1
  99. package/package.json +20 -1
  100. package/src/client/config.ts +9 -1
  101. package/src/core/registry/helpStore.ts +45 -0
  102. package/src/features/assistant/contexts/AssistantContext.tsx +35 -19
  103. package/src/features/assistant/contexts/__tests__/AssistantContext.spec.tsx +66 -6
  104. package/src/features/assistant/data/Assistant.ts +2 -0
  105. package/src/features/assistant/data/AssistantInterface.ts +2 -0
  106. package/src/features/assistant/data/AssistantService.ts +18 -8
  107. package/src/features/assistant-message/components/parts/MessageSourcesPanel.tsx +6 -4
  108. package/src/features/assistant-message/components/parts/tabs/ContentsTab.tsx +5 -1
  109. package/src/features/assistant-message/components/parts/tabs/ReferencesTab.tsx +2 -1
  110. package/src/features/assistant-message/data/AssistantMessage.ts +27 -1
  111. package/src/features/assistant-message/data/AssistantMessageInterface.ts +1 -0
  112. package/src/features/assistant-message/data/__tests__/AssistantMessage.spec.ts +7 -3
  113. package/src/features/help/components/HelpArticleBody.tsx +54 -0
  114. package/src/features/help/components/HelpAskAi.tsx +36 -0
  115. package/src/features/help/components/HelpAssistantSheet.tsx +53 -0
  116. package/src/features/help/components/HelpHeader.tsx +40 -0
  117. package/src/features/help/components/HelpHint.tsx +77 -0
  118. package/src/features/help/components/HelpSearchResultRow.tsx +51 -0
  119. package/src/features/help/components/HelpSideNav.tsx +84 -0
  120. package/src/features/help/components/HelpTOC.tsx +49 -0
  121. package/src/features/help/components/__tests__/HelpAskAi.spec.tsx +68 -0
  122. package/src/features/help/components/__tests__/HelpAssistantSheet.spec.tsx +36 -0
  123. package/src/features/help/components/__tests__/HelpHint.spec.tsx +50 -0
  124. package/src/features/help/components/__tests__/HelpSearchResultRow.spec.tsx +59 -0
  125. package/src/features/help/components/__tests__/HelpSideNav.spec.tsx +52 -0
  126. package/src/features/help/components/mdx/Callout.tsx +21 -0
  127. package/src/features/help/components/mdx/EntityRef.tsx +18 -0
  128. package/src/features/help/components/mdx/KeyBinding.tsx +6 -0
  129. package/src/features/help/components/mdx/Related.tsx +33 -0
  130. package/src/features/help/components/mdx/Screenshot.tsx +9 -0
  131. package/src/features/help/components/mdx/Steps.tsx +21 -0
  132. package/src/features/help/components/mdx/Video.tsx +8 -0
  133. package/src/features/help/components/mdx/mdx-server-components.ts +23 -0
  134. package/src/features/help/components/mdx/mdxComponents.ts +9 -0
  135. package/src/features/help/contexts/HelpContext.spec.tsx +28 -0
  136. package/src/features/help/contexts/HelpContext.tsx +24 -0
  137. package/src/features/help/hooks/useHelp.ts +1 -0
  138. package/src/features/help/hooks/useHelpArticle.ts +7 -0
  139. package/src/features/help/hooks/useHelpFilter.ts +27 -0
  140. package/src/features/help/hooks/useHelpManifest.ts +5 -0
  141. package/src/features/help/i18n-keys.ts +34 -0
  142. package/src/features/help/index.ts +27 -0
  143. package/src/features/help/interfaces/help-content-config.interface.ts +17 -0
  144. package/src/features/help/server/__tests__/createHelpAssetRouteHandler.spec.ts +43 -0
  145. package/src/features/help/server/createHelpAssetRouteHandler.ts +35 -0
  146. package/src/features/help/server/generateHelpArticleMetadata.ts +18 -0
  147. package/src/features/help/server/generateHelpArticleStaticParams.ts +7 -0
  148. package/src/features/help/server/generateHelpModeStaticParams.ts +5 -0
  149. package/src/features/help/server/getHelpContent.ts +17 -0
  150. package/src/features/help/server/index.ts +8 -0
  151. package/src/features/help/server/serializeHelpArticle.tsx +46 -0
  152. package/src/features/help/server-entry.ts +20 -0
  153. package/src/features/help/types/help-article.types.ts +37 -0
  154. package/src/features/help/utils/__tests__/helpNavigation.spec.ts +70 -0
  155. package/src/features/help/utils/articleUrl.ts +13 -0
  156. package/src/features/help/utils/helpNavigation.ts +29 -0
  157. package/src/features/how-to/HowToModule.ts +1 -1
  158. package/src/features/how-to/data/HowTo.ts +21 -3
  159. package/src/features/how-to/data/HowToInterface.ts +1 -0
  160. package/src/index.ts +4 -0
  161. package/src/shadcnui/ui/context-menu.tsx +3 -1
  162. package/src/shadcnui/ui/popover.tsx +3 -1
  163. package/dist/BlockNoteEditor-RWRVIEZC.js.map +0 -1
  164. package/dist/chunk-2IRWQVG4.js.map +0 -1
  165. package/dist/chunk-CFECWLHH.mjs.map +0 -1
  166. package/dist/chunk-RXXZGPC3.js.map +0 -1
  167. package/dist/chunk-VLDLERJN.js.map +0 -1
  168. package/dist/chunk-WSOPEIRP.mjs.map +0 -1
@@ -0,0 +1,532 @@
1
+ "use client";
2
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+ var _chunk3J7RQBF3js = require('../../chunk-3J7RQBF3.js');
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+ var _chunkUHO3KUUHjs = require('../../chunk-UHO3KUUH.js');
35
+ require('../../chunk-7E3O52U5.js');
36
+
37
+
38
+ var _chunkYQQHAFBSjs = require('../../chunk-YQQHAFBS.js');
39
+ require('../../chunk-CFI4WZ5R.js');
40
+ require('../../chunk-LXKSUWAV.js');
41
+ require('../../chunk-IBS6NI7D.js');
42
+ require('../../chunk-J5LROFGL.js');
43
+ require('../../chunk-3EPNHTMH.js');
44
+
45
+
46
+ var _chunk7QVYU63Ejs = require('../../chunk-7QVYU63E.js');
47
+
48
+ // src/features/help/contexts/HelpContext.tsx
49
+ var _react = require('react');
50
+ var _jsxruntime = require('react/jsx-runtime');
51
+ var HelpContext = _react.createContext.call(void 0, null);
52
+ function HelpProvider({ children }) {
53
+ const cfg = _chunkYQQHAFBSjs._getStaticHelpContent.call(void 0, );
54
+ if (!cfg) {
55
+ throw new Error(
56
+ "Help content not configured \u2014 call configureJsonApi({ helpContent: {...} }) before importing help components."
57
+ );
58
+ }
59
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpContext.Provider, { value: cfg, children });
60
+ }
61
+ _chunk7QVYU63Ejs.__name.call(void 0, HelpProvider, "HelpProvider");
62
+ function useHelp() {
63
+ const ctx = _react.useContext.call(void 0, HelpContext);
64
+ if (!ctx) {
65
+ throw new Error("useHelp() called outside <HelpProvider>. Wrap your help route group with <HelpProvider>.");
66
+ }
67
+ return ctx;
68
+ }
69
+ _chunk7QVYU63Ejs.__name.call(void 0, useHelp, "useHelp");
70
+
71
+ // src/features/help/components/HelpHeader.tsx
72
+ var _link = require('next/link'); var _link2 = _interopRequireDefault(_link);
73
+ var _image = require('next/image'); var _image2 = _interopRequireDefault(_image);
74
+ var _nextintl = require('next-intl');
75
+
76
+ // src/features/help/components/HelpAskAi.tsx
77
+
78
+ var _lucidereact = require('lucide-react');
79
+
80
+
81
+ // src/features/help/components/HelpAssistantSheet.tsx
82
+
83
+
84
+ function HelpAssistantSheet({ open, onOpenChange }) {
85
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.Sheet, { open, onOpenChange, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
86
+ _chunkUHO3KUUHjs.SheetContent,
87
+ {
88
+ side: "right",
89
+ className: "flex w-full flex-col data-[side=right]:sm:max-w-2xl data-[side=right]:lg:max-w-3xl",
90
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.AssistantProvider, { manageUrl: false, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpAssistantSheetBody, {}) })
91
+ }
92
+ ) });
93
+ }
94
+ _chunk7QVYU63Ejs.__name.call(void 0, HelpAssistantSheet, "HelpAssistantSheet");
95
+ function HelpAssistantSheetBody() {
96
+ const t = _nextintl.useTranslations.call(void 0, );
97
+ const ctx = _chunkUHO3KUUHjs.useAssistantContext.call(void 0, );
98
+ const showThread = !!ctx.assistant || ctx.sending || ctx.messages.length > 0;
99
+ const send = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (content) => ctx.sendMessage(content, { howToMode: true }), "send");
100
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
101
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkUHO3KUUHjs.SheetHeader, { children: [
102
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.SheetTitle, { children: t("help.askAi.sheet.title") }),
103
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.SheetDescription, { children: t("help.askAi.sheet.subtitle") })
104
+ ] }),
105
+ !showThread ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.AssistantEmptyState, { onSend: send }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
106
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
107
+ _chunkUHO3KUUHjs.AssistantThread,
108
+ {
109
+ messages: ctx.messages,
110
+ sending: ctx.sending,
111
+ status: ctx.status,
112
+ onSelectFollowUp: send,
113
+ failedMessageIds: ctx.failedMessageIds,
114
+ onRetry: ctx.retrySend
115
+ }
116
+ ),
117
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.AssistantComposer, { onSend: send, disabled: ctx.sending })
118
+ ] })
119
+ ] });
120
+ }
121
+ _chunk7QVYU63Ejs.__name.call(void 0, HelpAssistantSheetBody, "HelpAssistantSheetBody");
122
+
123
+ // src/features/help/components/HelpAskAi.tsx
124
+
125
+ function HelpAskAi() {
126
+ const t = _nextintl.useTranslations.call(void 0, );
127
+ const { currentUser } = _chunkUHO3KUUHjs.useCurrentUserContext.call(void 0, );
128
+ const [open, setOpen] = _react.useState.call(void 0, false);
129
+ const disabled = !currentUser;
130
+ if (disabled) {
131
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkUHO3KUUHjs.Tooltip, { children: [
132
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkUHO3KUUHjs.TooltipTrigger, { render: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.Button, { variant: "outline", size: "sm", disabled: true }), children: [
133
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.SparklesIcon, { className: "h-4 w-4" }),
134
+ t("help.askAi.button")
135
+ ] }),
136
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.TooltipContent, { children: t("help.askAi.loginTooltip") })
137
+ ] });
138
+ }
139
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
140
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkUHO3KUUHjs.Button, { variant: "outline", size: "sm", onClick: () => setOpen(true), children: [
141
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.SparklesIcon, { className: "h-4 w-4" }),
142
+ t("help.askAi.button")
143
+ ] }),
144
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpAssistantSheet, { open, onOpenChange: setOpen })
145
+ ] });
146
+ }
147
+ _chunk7QVYU63Ejs.__name.call(void 0, HelpAskAi, "HelpAskAi");
148
+
149
+ // src/features/help/components/HelpHeader.tsx
150
+
151
+ function HelpHeader() {
152
+ const t = _nextintl.useTranslations.call(void 0, );
153
+ const { currentUser } = _chunkUHO3KUUHjs.useCurrentUserContext.call(void 0, );
154
+ const { brand } = useHelp();
155
+ const logo = _optionalChain([brand, 'optionalAccess', _ => _.logo]);
156
+ const label = _nullishCoalesce(_optionalChain([brand, 'optionalAccess', _2 => _2.label]), () => ( "Help"));
157
+ const appHref = _nullishCoalesce(_optionalChain([brand, 'optionalAccess', _3 => _3.appHref]), () => ( "/"));
158
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "header", { className: "border-border bg-background flex items-center justify-between border-b px-4 py-3", children: [
159
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _link2.default, { href: "/help", className: "flex items-center gap-2", children: [
160
+ logo ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _image2.default, { src: logo, alt: label, width: 28, height: 28 }) : null,
161
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "text-base font-semibold", children: [
162
+ label,
163
+ " \xB7 ",
164
+ t("help.footerLink")
165
+ ] })
166
+ ] }),
167
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2", children: [
168
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpAskAi, {}),
169
+ currentUser ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.Button, { render: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: appHref }), nativeButton: false, variant: "outline", size: "sm", children: t("help.header.openApp") }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.Button, { render: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: "/login" }), nativeButton: false, variant: "outline", size: "sm", children: t("help.header.login") })
170
+ ] })
171
+ ] });
172
+ }
173
+ _chunk7QVYU63Ejs.__name.call(void 0, HelpHeader, "HelpHeader");
174
+
175
+ // src/features/help/components/HelpSideNav.tsx
176
+
177
+
178
+ var _navigation = require('next/navigation');
179
+
180
+ // src/features/help/hooks/useHelpFilter.ts
181
+
182
+ var _fusejs = require('fuse.js'); var _fusejs2 = _interopRequireDefault(_fusejs);
183
+ function useHelpFilter(articles) {
184
+ const [query, setQuery] = _react.useState.call(void 0, "");
185
+ const fuse = _react.useMemo.call(void 0,
186
+ () => new (0, _fusejs2.default)([...articles], {
187
+ keys: [
188
+ { name: "title", weight: 0.5 },
189
+ { name: "summary", weight: 0.3 },
190
+ { name: "tags", weight: 0.1 },
191
+ { name: "headings.text", weight: 0.1 }
192
+ ],
193
+ threshold: 0.4,
194
+ ignoreLocation: true
195
+ }),
196
+ [articles]
197
+ );
198
+ const filtered = _react.useMemo.call(void 0, () => {
199
+ if (!query.trim()) return [...articles];
200
+ return fuse.search(query).map((r) => r.item);
201
+ }, [query, articles, fuse]);
202
+ return { query, setQuery, filtered };
203
+ }
204
+ _chunk7QVYU63Ejs.__name.call(void 0, useHelpFilter, "useHelpFilter");
205
+
206
+ // src/features/help/utils/articleUrl.ts
207
+ function articleUrl(generateUrl, article) {
208
+ return generateUrl({ page: `/help/${article.mode}/${article.slug}` });
209
+ }
210
+ _chunk7QVYU63Ejs.__name.call(void 0, articleUrl, "articleUrl");
211
+ function modeUrl(generateUrl, mode) {
212
+ return generateUrl({ page: `/help/${mode}` });
213
+ }
214
+ _chunk7QVYU63Ejs.__name.call(void 0, modeUrl, "modeUrl");
215
+
216
+ // src/features/help/components/HelpSideNav.tsx
217
+
218
+ function HelpSideNav() {
219
+ const t = _nextintl.useTranslations.call(void 0, );
220
+ const generateUrl = _chunkUHO3KUUHjs.usePageUrlGenerator.call(void 0, );
221
+ const pathname = _navigation.usePathname.call(void 0, );
222
+ const { manifest } = useHelp();
223
+ const groups = _chunk3J7RQBF3js.buildHelpNav.call(void 0, manifest);
224
+ const allArticles = groups.flatMap((g) => g.articles);
225
+ const { query, setQuery, filtered } = useHelpFilter(allArticles);
226
+ const filtering = query.trim().length > 0;
227
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "nav", { "aria-label": "Help navigation", className: "flex h-full flex-col gap-3 overflow-y-auto p-4", children: [
228
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
229
+ "input",
230
+ {
231
+ type: "search",
232
+ value: query,
233
+ onChange: (e) => setQuery(e.target.value),
234
+ placeholder: t("help.sideNav.filterPlaceholder"),
235
+ className: "border-input bg-background w-full rounded-md border px-3 py-2 text-sm"
236
+ }
237
+ ),
238
+ filtering ? filtered.length === 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-sm", children: t("help.sideNav.noMatches") }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "ul", { className: "space-y-1", children: filtered.map((a) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
239
+ _link2.default,
240
+ {
241
+ href: articleUrl(generateUrl, a),
242
+ className: "hover:bg-muted block rounded px-2 py-1 text-sm " + (pathname.endsWith(`/help/${a.mode}/${a.slug}`) ? "bg-muted font-medium" : ""),
243
+ children: a.title
244
+ }
245
+ ) }, a.id)) }) : _chunk3J7RQBF3js.HELP_MODES.map((mode) => {
246
+ const group = groups.find((g) => g.mode === mode);
247
+ if (group.articles.length === 0) return null;
248
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { children: [
249
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
250
+ _link2.default,
251
+ {
252
+ href: modeUrl(generateUrl, mode),
253
+ className: "text-muted-foreground hover:text-foreground mb-1 block text-xs font-semibold tracking-wider uppercase",
254
+ children: t(`help.modes.${mode}`)
255
+ }
256
+ ),
257
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "ul", { className: "space-y-0.5", children: group.articles.map((a) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
258
+ _link2.default,
259
+ {
260
+ href: articleUrl(generateUrl, a),
261
+ className: "hover:bg-muted block rounded px-2 py-1 text-sm " + (pathname.endsWith(`/help/${a.mode}/${a.slug}`) ? "bg-muted font-medium" : ""),
262
+ children: a.title
263
+ }
264
+ ) }, a.id)) })
265
+ ] }, mode);
266
+ })
267
+ ] });
268
+ }
269
+ _chunk7QVYU63Ejs.__name.call(void 0, HelpSideNav, "HelpSideNav");
270
+
271
+ // src/features/help/components/HelpArticleBody.tsx
272
+
273
+
274
+
275
+ function HelpArticleBody({ article, children }) {
276
+ const t = _nextintl.useTranslations.call(void 0, );
277
+ const format = _nextintl.useFormatter.call(void 0, );
278
+ const generateUrl = _chunkUHO3KUUHjs.usePageUrlGenerator.call(void 0, );
279
+ const { manifest } = useHelp();
280
+ const { prev, next } = _chunk3J7RQBF3js.prevNextWithinMode.call(void 0, manifest, article);
281
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "article", { className: "prose dark:prose-invert max-w-none", children: [
282
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "nav", { className: "text-muted-foreground mb-2 text-xs", children: [
283
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: generateUrl({ page: "/help" }), children: "Help" }),
284
+ " \xB7 ",
285
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: generateUrl({ page: `/help/${article.mode}` }), children: t(`help.modes.${article.mode}`) })
286
+ ] }),
287
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h1", { children: article.title }),
288
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground !mt-0 text-base", children: article.summary }),
289
+ children,
290
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "hr", { className: "my-6" }),
291
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-muted-foreground text-xs", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: t("help.article.lastUpdated", {
292
+ date: format.dateTime(new Date(article.lastUpdated), { dateStyle: "short" })
293
+ }) }) }),
294
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mt-4 flex justify-between text-sm", children: [
295
+ prev ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _link2.default, { href: articleUrl(generateUrl, prev), className: "hover:underline", children: [
296
+ "\u2190 ",
297
+ t("help.article.previous"),
298
+ ": ",
299
+ prev.title
300
+ ] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", {}),
301
+ next ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _link2.default, { href: articleUrl(generateUrl, next), className: "hover:underline", children: [
302
+ t("help.article.next"),
303
+ ": ",
304
+ next.title,
305
+ " \u2192"
306
+ ] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", {})
307
+ ] })
308
+ ] });
309
+ }
310
+ _chunk7QVYU63Ejs.__name.call(void 0, HelpArticleBody, "HelpArticleBody");
311
+
312
+ // src/features/help/components/HelpTOC.tsx
313
+
314
+
315
+
316
+ function HelpTOC({ headings }) {
317
+ const t = _nextintl.useTranslations.call(void 0, );
318
+ const [active, setActive] = _react.useState.call(void 0, null);
319
+ _react.useEffect.call(void 0, () => {
320
+ const observer = new IntersectionObserver(
321
+ (entries) => {
322
+ for (const e of entries) {
323
+ if (e.isIntersecting) setActive(e.target.id);
324
+ }
325
+ },
326
+ { rootMargin: "0px 0px -70% 0px", threshold: 0 }
327
+ );
328
+ headings.forEach((h) => {
329
+ const el = document.getElementById(h.slug);
330
+ if (el) observer.observe(el);
331
+ });
332
+ return () => observer.disconnect();
333
+ }, [headings]);
334
+ if (headings.length === 0) return null;
335
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "nav", { "aria-label": t("help.toc.title"), className: "hidden lg:block", children: [
336
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-muted-foreground mb-2 text-xs font-semibold tracking-wider uppercase", children: t("help.toc.title") }),
337
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "ul", { className: "space-y-1 text-sm", children: headings.map((h) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { style: { paddingLeft: `${(h.depth - 2) * 0.75}rem` }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
338
+ "a",
339
+ {
340
+ href: `#${h.slug}`,
341
+ className: "block truncate hover:text-foreground " + (active === h.slug ? "text-foreground font-medium" : "text-muted-foreground"),
342
+ children: h.text
343
+ }
344
+ ) }, h.slug)) })
345
+ ] });
346
+ }
347
+ _chunk7QVYU63Ejs.__name.call(void 0, HelpTOC, "HelpTOC");
348
+
349
+ // src/features/help/components/HelpHint.tsx
350
+
351
+
352
+
353
+
354
+
355
+ function HelpHint({ contextKey }) {
356
+ const t = _nextintl.useTranslations.call(void 0, );
357
+ const generateUrl = _chunkUHO3KUUHjs.usePageUrlGenerator.call(void 0, );
358
+ const { manifest } = useHelp();
359
+ const [open, setOpen] = _react.useState.call(void 0, false);
360
+ const [picked, setPicked] = _react.useState.call(void 0, null);
361
+ const matches = _react.useMemo.call(void 0,
362
+ () => manifest.filter((a) => a.contextualKeys.includes(contextKey) && !a.draft),
363
+ [manifest, contextKey]
364
+ );
365
+ if (matches.length === 0) return null;
366
+ const active = _nullishCoalesce(picked, () => ( (matches.length === 1 ? matches[0] : null)));
367
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
368
+ _chunkUHO3KUUHjs.Sheet,
369
+ {
370
+ open,
371
+ onOpenChange: (o) => {
372
+ setOpen(o);
373
+ if (!o) setPicked(null);
374
+ },
375
+ children: [
376
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.SheetTrigger, { render: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.Button, { variant: "ghost", size: "icon-sm", "aria-label": t("help.hint.trigger") }), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.HelpCircleIcon, { className: "h-4 w-4" }) }),
377
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkUHO3KUUHjs.SheetContent, { side: "right", className: "w-full max-w-md sm:max-w-lg", children: [
378
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkUHO3KUUHjs.SheetHeader, { children: [
379
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.SheetTitle, { children: active ? active.title : t("help.hint.pickArticle") }),
380
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.SheetDescription, { children: _nullishCoalesce(_optionalChain([active, 'optionalAccess', _4 => _4.summary]), () => ( "")) })
381
+ ] }),
382
+ active ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mt-4 space-y-3", children: [
383
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-sm", children: active.summary }),
384
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: articleUrl(generateUrl, active), className: "text-sm", children: t("help.hint.viewArticle") })
385
+ ] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "ul", { className: "mt-4 space-y-1", children: matches.map((a) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
386
+ "button",
387
+ {
388
+ type: "button",
389
+ onClick: () => setPicked(a),
390
+ className: "hover:bg-muted block w-full rounded px-2 py-1 text-left text-sm",
391
+ children: [
392
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "font-medium", children: a.title }),
393
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-muted-foreground text-xs", children: a.summary })
394
+ ]
395
+ }
396
+ ) }, a.id)) })
397
+ ] })
398
+ ]
399
+ }
400
+ );
401
+ }
402
+ _chunk7QVYU63Ejs.__name.call(void 0, HelpHint, "HelpHint");
403
+
404
+ // src/features/help/components/HelpSearchResultRow.tsx
405
+
406
+
407
+
408
+
409
+ function HelpSearchResultRow({ result, onSelect }) {
410
+ const t = _nextintl.useTranslations.call(void 0, );
411
+ const generateUrl = _chunkUHO3KUUHjs.usePageUrlGenerator.call(void 0, );
412
+ const { manifest } = useHelp();
413
+ const article = manifest.find((a) => a.id === result.id);
414
+ if (!article) {
415
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
416
+ _chunkUHO3KUUHjs.CommandItem,
417
+ {
418
+ value: result.id,
419
+ disabled: true,
420
+ className: "text-muted-foreground cursor-not-allowed px-3 py-1.5 text-sm italic",
421
+ children: t("help.search.removed")
422
+ }
423
+ );
424
+ }
425
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUHO3KUUHjs.CommandItem, { value: result.id, onSelect, className: "cursor-pointer p-0", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
426
+ _link2.default,
427
+ {
428
+ href: generateUrl({ page: `/help/${article.mode}/${article.slug}` }),
429
+ className: "hover:bg-muted flex w-full items-center gap-3 rounded px-3 py-2",
430
+ children: [
431
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "bg-muted text-muted-foreground flex h-10 w-10 shrink-0 items-center justify-center rounded-full", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.LifeBuoyIcon, { className: "h-5 w-5" }) }),
432
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex min-w-0 flex-1 flex-col", children: [
433
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-foreground truncate text-sm font-semibold", children: article.title }),
434
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "text-muted-foreground truncate text-xs", children: [
435
+ t(`help.modes.${article.mode}`),
436
+ " \xB7 ",
437
+ article.summary
438
+ ] })
439
+ ] }),
440
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ArrowUpRightIcon, { className: "text-muted-foreground h-5 w-5 shrink-0" })
441
+ ]
442
+ }
443
+ ) });
444
+ }
445
+ _chunk7QVYU63Ejs.__name.call(void 0, HelpSearchResultRow, "HelpSearchResultRow");
446
+
447
+ // src/features/help/components/mdx/Related.tsx
448
+
449
+
450
+
451
+ function Related({ slugs }) {
452
+ const t = _nextintl.useTranslations.call(void 0, );
453
+ const generateUrl = _chunkUHO3KUUHjs.usePageUrlGenerator.call(void 0, );
454
+ const { manifest } = useHelp();
455
+ const items = slugs.map((s) => manifest.find((a) => `${a.mode}/${a.slug}` === s)).filter((a) => Boolean(a));
456
+ if (items.length === 0) return null;
457
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "aside", { className: "my-6", children: [
458
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "text-muted-foreground mb-2 text-xs font-semibold tracking-wider uppercase", children: t("help.article.related") }),
459
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "ul", { className: "grid gap-2 sm:grid-cols-2", children: items.map((a) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _link2.default, { href: articleUrl(generateUrl, a), className: "hover:bg-muted block rounded border p-3", children: [
460
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "font-medium", children: a.title }),
461
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-muted-foreground text-xs", children: a.summary })
462
+ ] }) }, a.id)) })
463
+ ] });
464
+ }
465
+ _chunk7QVYU63Ejs.__name.call(void 0, Related, "Related");
466
+
467
+ // src/features/help/components/mdx/mdxComponents.ts
468
+ var MDX_COMPONENTS = { Callout: _chunk3J7RQBF3js.Callout, Steps: _chunk3J7RQBF3js.Steps, Step: _chunk3J7RQBF3js.Step, Screenshot: _chunk3J7RQBF3js.Screenshot, EntityRef: _chunk3J7RQBF3js.EntityRef, KeyBinding: _chunk3J7RQBF3js.KeyBinding, Video: _chunk3J7RQBF3js.Video, Related };
469
+
470
+ // src/features/help/hooks/useHelpManifest.ts
471
+ function useHelpManifest() {
472
+ return useHelp().manifest;
473
+ }
474
+ _chunk7QVYU63Ejs.__name.call(void 0, useHelpManifest, "useHelpManifest");
475
+
476
+ // src/features/help/hooks/useHelpArticle.ts
477
+ function useHelpArticle(mode, slug) {
478
+ return _chunk3J7RQBF3js.findHelpArticle.call(void 0, useHelp().manifest, mode, slug);
479
+ }
480
+ _chunk7QVYU63Ejs.__name.call(void 0, useHelpArticle, "useHelpArticle");
481
+
482
+ // src/features/help/i18n-keys.ts
483
+ var HELP_I18N_KEYS = [
484
+ "help.modes.tutorial",
485
+ "help.modes.how-to",
486
+ "help.modes.reference",
487
+ "help.modes.explanation",
488
+ "help.sideNav.filterPlaceholder",
489
+ "help.sideNav.noMatches",
490
+ "help.toc.title",
491
+ "help.article.lastUpdated",
492
+ "help.article.previous",
493
+ "help.article.next",
494
+ "help.article.related",
495
+ "help.askAi.button",
496
+ "help.askAi.loginTooltip",
497
+ "help.askAi.sheet.title",
498
+ "help.askAi.sheet.subtitle",
499
+ "help.header.search",
500
+ "help.header.login",
501
+ "help.header.openApp",
502
+ "help.hint.trigger",
503
+ "help.hint.viewArticle",
504
+ "help.hint.pickArticle",
505
+ "help.landing.heading",
506
+ "help.landing.subheading",
507
+ "help.landing.featuredTutorials",
508
+ "help.landing.browseByMode",
509
+ "help.modeIndex.empty",
510
+ "help.search.removed",
511
+ "help.footerLink"
512
+ ];
513
+
514
+
515
+
516
+
517
+
518
+
519
+
520
+
521
+
522
+
523
+
524
+
525
+
526
+
527
+
528
+
529
+
530
+
531
+ exports.HELP_I18N_KEYS = HELP_I18N_KEYS; exports.HELP_MODES = _chunk3J7RQBF3js.HELP_MODES; exports.HelpArticleBody = HelpArticleBody; exports.HelpAskAi = HelpAskAi; exports.HelpHeader = HelpHeader; exports.HelpHint = HelpHint; exports.HelpProvider = HelpProvider; exports.HelpSearchResultRow = HelpSearchResultRow; exports.HelpSideNav = HelpSideNav; exports.HelpTOC = HelpTOC; exports.MDX_COMPONENTS = MDX_COMPONENTS; exports.articleUrl = articleUrl; exports.modeUrl = modeUrl; exports.useHelp = useHelp; exports.useHelpArticle = useHelpArticle; exports.useHelpFilter = useHelpFilter; exports.useHelpManifest = useHelpManifest;
532
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/features/help/index.js","../../../src/features/help/contexts/HelpContext.tsx","../../../src/features/help/components/HelpHeader.tsx","../../../src/features/help/components/HelpAskAi.tsx","../../../src/features/help/components/HelpAssistantSheet.tsx","../../../src/features/help/components/HelpSideNav.tsx","../../../src/features/help/hooks/useHelpFilter.ts","../../../src/features/help/utils/articleUrl.ts","../../../src/features/help/components/HelpArticleBody.tsx","../../../src/features/help/components/HelpTOC.tsx","../../../src/features/help/components/HelpHint.tsx","../../../src/features/help/components/HelpSearchResultRow.tsx","../../../src/features/help/components/mdx/Related.tsx","../../../src/features/help/components/mdx/mdxComponents.ts","../../../src/features/help/hooks/useHelpManifest.ts","../../../src/features/help/hooks/useHelpArticle.ts","../../../src/features/help/i18n-keys.ts"],"names":["jsx","useTranslations","jsxs","Fragment","useState","Link","useMemo"],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/features/help/index.js","sourcesContent":[null,"\"use client\";\nimport { createContext, useContext, ReactNode } from \"react\";\nimport { _getStaticHelpContent } from \"../../../core/registry/helpStore\";\nimport type { HelpContentConfig } from \"../interfaces/help-content-config.interface\";\n\nconst HelpContext = createContext<HelpContentConfig | null>(null);\n\nexport function HelpProvider({ children }: { children: ReactNode }) {\n const cfg = _getStaticHelpContent<HelpContentConfig>();\n if (!cfg) {\n throw new Error(\n \"Help content not configured — call configureJsonApi({ helpContent: {...} }) before importing help components.\",\n );\n }\n return <HelpContext.Provider value={cfg}>{children}</HelpContext.Provider>;\n}\n\nexport function useHelp(): HelpContentConfig {\n const ctx = useContext(HelpContext);\n if (!ctx) {\n throw new Error(\"useHelp() called outside <HelpProvider>. Wrap your help route group with <HelpProvider>.\");\n }\n return ctx;\n}\n","\"use client\";\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport { useTranslations } from \"next-intl\";\nimport { useCurrentUserContext } from \"../../user/contexts/CurrentUserContext\";\nimport { Button } from \"../../../shadcnui\";\nimport { useHelp } from \"../contexts/HelpContext\";\nimport { HelpAskAi } from \"./HelpAskAi\";\n\nexport function HelpHeader() {\n const t = useTranslations();\n const { currentUser } = useCurrentUserContext();\n const { brand } = useHelp();\n const logo = brand?.logo;\n const label = brand?.label ?? \"Help\";\n const appHref = brand?.appHref ?? \"/\";\n\n return (\n <header className=\"border-border bg-background flex items-center justify-between border-b px-4 py-3\">\n <Link href=\"/help\" className=\"flex items-center gap-2\">\n {logo ? <Image src={logo} alt={label} width={28} height={28} /> : null}\n <span className=\"text-base font-semibold\">\n {label} · {t(\"help.footerLink\")}\n </span>\n </Link>\n <div className=\"flex items-center gap-2\">\n <HelpAskAi />\n {currentUser ? (\n <Button render={<Link href={appHref} />} nativeButton={false} variant=\"outline\" size=\"sm\">\n {t(\"help.header.openApp\")}\n </Button>\n ) : (\n <Button render={<Link href=\"/login\" />} nativeButton={false} variant=\"outline\" size=\"sm\">\n {t(\"help.header.login\")}\n </Button>\n )}\n </div>\n </header>\n );\n}\n","\"use client\";\nimport { useState } from \"react\";\nimport { SparklesIcon } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport { useCurrentUserContext } from \"../../user/contexts/CurrentUserContext\";\nimport { Button, Tooltip, TooltipTrigger, TooltipContent } from \"../../../shadcnui\";\nimport { HelpAssistantSheet } from \"./HelpAssistantSheet\";\n\nexport function HelpAskAi() {\n const t = useTranslations();\n const { currentUser } = useCurrentUserContext();\n const [open, setOpen] = useState(false);\n const disabled = !currentUser;\n\n if (disabled) {\n return (\n <Tooltip>\n <TooltipTrigger render={<Button variant=\"outline\" size=\"sm\" disabled />}>\n <SparklesIcon className=\"h-4 w-4\" />\n {t(\"help.askAi.button\")}\n </TooltipTrigger>\n <TooltipContent>{t(\"help.askAi.loginTooltip\")}</TooltipContent>\n </Tooltip>\n );\n }\n\n return (\n <>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setOpen(true)}>\n <SparklesIcon className=\"h-4 w-4\" />\n {t(\"help.askAi.button\")}\n </Button>\n <HelpAssistantSheet open={open} onOpenChange={setOpen} />\n </>\n );\n}\n","\"use client\";\nimport { useTranslations } from \"next-intl\";\nimport { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from \"../../../shadcnui\";\nimport { AssistantProvider, useAssistantContext } from \"../../assistant/contexts/AssistantContext\";\nimport { AssistantThread } from \"../../assistant/components/parts/AssistantThread\";\nimport { AssistantComposer } from \"../../assistant/components/parts/AssistantComposer\";\nimport { AssistantEmptyState } from \"../../assistant/components/parts/AssistantEmptyState\";\n\nexport function HelpAssistantSheet({ open, onOpenChange }: { open: boolean; onOpenChange: (o: boolean) => void }) {\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent\n side=\"right\"\n className=\"flex w-full flex-col data-[side=right]:sm:max-w-2xl data-[side=right]:lg:max-w-3xl\"\n >\n <AssistantProvider manageUrl={false}>\n <HelpAssistantSheetBody />\n </AssistantProvider>\n </SheetContent>\n </Sheet>\n );\n}\n\nfunction HelpAssistantSheetBody() {\n const t = useTranslations();\n const ctx = useAssistantContext();\n const showThread = !!ctx.assistant || ctx.sending || ctx.messages.length > 0;\n const send = (content: string) => ctx.sendMessage(content, { howToMode: true });\n\n return (\n <>\n <SheetHeader>\n <SheetTitle>{t(\"help.askAi.sheet.title\")}</SheetTitle>\n <SheetDescription>{t(\"help.askAi.sheet.subtitle\")}</SheetDescription>\n </SheetHeader>\n {!showThread ? (\n <AssistantEmptyState onSend={send} />\n ) : (\n <>\n <AssistantThread\n messages={ctx.messages}\n sending={ctx.sending}\n status={ctx.status}\n onSelectFollowUp={send}\n failedMessageIds={ctx.failedMessageIds}\n onRetry={ctx.retrySend}\n />\n <AssistantComposer onSend={send} disabled={ctx.sending} />\n </>\n )}\n </>\n );\n}\n","\"use client\";\nimport { useTranslations } from \"next-intl\";\nimport Link from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport { HELP_MODES } from \"../types/help-article.types\";\nimport { usePageUrlGenerator } from \"../../../client\";\nimport { useHelp } from \"../contexts/HelpContext\";\nimport { useHelpFilter } from \"../hooks/useHelpFilter\";\nimport { buildHelpNav } from \"../utils/helpNavigation\";\nimport { articleUrl, modeUrl } from \"../utils/articleUrl\";\n\nexport function HelpSideNav() {\n const t = useTranslations();\n const generateUrl = usePageUrlGenerator();\n const pathname = usePathname();\n const { manifest } = useHelp();\n const groups = buildHelpNav(manifest);\n const allArticles = groups.flatMap((g) => g.articles);\n const { query, setQuery, filtered } = useHelpFilter(allArticles);\n const filtering = query.trim().length > 0;\n\n return (\n <nav aria-label=\"Help navigation\" className=\"flex h-full flex-col gap-3 overflow-y-auto p-4\">\n <input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={t(\"help.sideNav.filterPlaceholder\")}\n className=\"border-input bg-background w-full rounded-md border px-3 py-2 text-sm\"\n />\n {filtering ? (\n filtered.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">{t(\"help.sideNav.noMatches\")}</p>\n ) : (\n <ul className=\"space-y-1\">\n {filtered.map((a) => (\n <li key={a.id}>\n <Link\n href={articleUrl(generateUrl, a)}\n className={\n \"hover:bg-muted block rounded px-2 py-1 text-sm \" +\n (pathname.endsWith(`/help/${a.mode}/${a.slug}`) ? \"bg-muted font-medium\" : \"\")\n }\n >\n {a.title}\n </Link>\n </li>\n ))}\n </ul>\n )\n ) : (\n HELP_MODES.map((mode) => {\n const group = groups.find((g) => g.mode === mode)!;\n if (group.articles.length === 0) return null;\n return (\n <div key={mode}>\n <Link\n href={modeUrl(generateUrl, mode)}\n className=\"text-muted-foreground hover:text-foreground mb-1 block text-xs font-semibold tracking-wider uppercase\"\n >\n {t(`help.modes.${mode}`)}\n </Link>\n <ul className=\"space-y-0.5\">\n {group.articles.map((a) => (\n <li key={a.id}>\n <Link\n href={articleUrl(generateUrl, a)}\n className={\n \"hover:bg-muted block rounded px-2 py-1 text-sm \" +\n (pathname.endsWith(`/help/${a.mode}/${a.slug}`) ? \"bg-muted font-medium\" : \"\")\n }\n >\n {a.title}\n </Link>\n </li>\n ))}\n </ul>\n </div>\n );\n })\n )}\n </nav>\n );\n}\n","\"use client\";\nimport { useMemo, useState } from \"react\";\nimport Fuse from \"fuse.js\";\nimport type { HelpArticle } from \"../types/help-article.types\";\n\nexport function useHelpFilter(articles: readonly HelpArticle[]) {\n const [query, setQuery] = useState(\"\");\n const fuse = useMemo(\n () =>\n new Fuse([...articles], {\n keys: [\n { name: \"title\", weight: 0.5 },\n { name: \"summary\", weight: 0.3 },\n { name: \"tags\", weight: 0.1 },\n { name: \"headings.text\", weight: 0.1 },\n ],\n threshold: 0.4,\n ignoreLocation: true,\n }),\n [articles],\n );\n const filtered = useMemo(() => {\n if (!query.trim()) return [...articles];\n return fuse.search(query).map((r) => r.item);\n }, [query, articles, fuse]);\n return { query, setQuery, filtered };\n}\n","import type { HelpMode } from \"../types/help-article.types\";\nimport type { usePageUrlGenerator } from \"../../../client\";\n\nexport function articleUrl(\n generateUrl: ReturnType<typeof usePageUrlGenerator>,\n article: { mode: HelpMode; slug: string },\n): string {\n return generateUrl({ page: `/help/${article.mode}/${article.slug}` });\n}\n\nexport function modeUrl(generateUrl: ReturnType<typeof usePageUrlGenerator>, mode: HelpMode): string {\n return generateUrl({ page: `/help/${mode}` });\n}\n","\"use client\";\nimport { ReactNode } from \"react\";\nimport Link from \"next/link\";\nimport { useFormatter, useTranslations } from \"next-intl\";\nimport type { HelpArticle } from \"../types/help-article.types\";\nimport { usePageUrlGenerator } from \"../../../client\";\nimport { useHelp } from \"../contexts/HelpContext\";\nimport { articleUrl } from \"../utils/articleUrl\";\nimport { prevNextWithinMode } from \"../utils/helpNavigation\";\n\nexport function HelpArticleBody({ article, children }: { article: HelpArticle; children: ReactNode }) {\n const t = useTranslations();\n const format = useFormatter();\n const generateUrl = usePageUrlGenerator();\n const { manifest } = useHelp();\n const { prev, next } = prevNextWithinMode(manifest, article);\n\n return (\n <article className=\"prose dark:prose-invert max-w-none\">\n <nav className=\"text-muted-foreground mb-2 text-xs\">\n <Link href={generateUrl({ page: \"/help\" })}>Help</Link>\n {\" · \"}\n <Link href={generateUrl({ page: `/help/${article.mode}` })}>{t(`help.modes.${article.mode}`)}</Link>\n </nav>\n <h1>{article.title}</h1>\n <p className=\"text-muted-foreground !mt-0 text-base\">{article.summary}</p>\n {children}\n <hr className=\"my-6\" />\n <div className=\"text-muted-foreground text-xs\">\n <span>\n {t(\"help.article.lastUpdated\", {\n date: format.dateTime(new Date(article.lastUpdated), { dateStyle: \"short\" }),\n })}\n </span>\n </div>\n <div className=\"mt-4 flex justify-between text-sm\">\n {prev ? (\n <Link href={articleUrl(generateUrl, prev)} className=\"hover:underline\">\n ← {t(\"help.article.previous\")}: {prev.title}\n </Link>\n ) : (\n <span />\n )}\n {next ? (\n <Link href={articleUrl(generateUrl, next)} className=\"hover:underline\">\n {t(\"help.article.next\")}: {next.title} →\n </Link>\n ) : (\n <span />\n )}\n </div>\n </article>\n );\n}\n","\"use client\";\nimport { useEffect, useState } from \"react\";\nimport { useTranslations } from \"next-intl\";\nimport type { HelpHeading } from \"../types/help-article.types\";\n\nexport function HelpTOC({ headings }: { headings: readonly HelpHeading[] }) {\n const t = useTranslations();\n const [active, setActive] = useState<string | null>(null);\n\n useEffect(() => {\n const observer = new IntersectionObserver(\n (entries) => {\n for (const e of entries) {\n if (e.isIntersecting) setActive(e.target.id);\n }\n },\n { rootMargin: \"0px 0px -70% 0px\", threshold: 0 },\n );\n headings.forEach((h) => {\n const el = document.getElementById(h.slug);\n if (el) observer.observe(el);\n });\n return () => observer.disconnect();\n }, [headings]);\n\n if (headings.length === 0) return null;\n return (\n <nav aria-label={t(\"help.toc.title\")} className=\"hidden lg:block\">\n <div className=\"text-muted-foreground mb-2 text-xs font-semibold tracking-wider uppercase\">\n {t(\"help.toc.title\")}\n </div>\n <ul className=\"space-y-1 text-sm\">\n {headings.map((h) => (\n <li key={h.slug} style={{ paddingLeft: `${(h.depth - 2) * 0.75}rem` }}>\n <a\n href={`#${h.slug}`}\n className={\n \"block truncate hover:text-foreground \" +\n (active === h.slug ? \"text-foreground font-medium\" : \"text-muted-foreground\")\n }\n >\n {h.text}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n","\"use client\";\nimport { useMemo, useState } from \"react\";\nimport { useTranslations } from \"next-intl\";\nimport Link from \"next/link\";\nimport { HelpCircleIcon } from \"lucide-react\";\nimport {\n Button,\n Sheet,\n SheetContent,\n SheetTrigger,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n} from \"../../../shadcnui\";\nimport { usePageUrlGenerator } from \"../../../client\";\nimport { useHelp } from \"../contexts/HelpContext\";\nimport { articleUrl } from \"../utils/articleUrl\";\nimport type { HelpArticle } from \"../types/help-article.types\";\n\nexport function HelpHint({ contextKey }: { contextKey: string }) {\n const t = useTranslations();\n const generateUrl = usePageUrlGenerator();\n const { manifest } = useHelp();\n const [open, setOpen] = useState(false);\n const [picked, setPicked] = useState<HelpArticle | null>(null);\n\n const matches = useMemo(\n () => manifest.filter((a) => a.contextualKeys.includes(contextKey) && !a.draft),\n [manifest, contextKey],\n );\n\n if (matches.length === 0) return null;\n const active = picked ?? (matches.length === 1 ? matches[0] : null);\n\n return (\n <Sheet\n open={open}\n onOpenChange={(o) => {\n setOpen(o);\n if (!o) setPicked(null);\n }}\n >\n <SheetTrigger render={<Button variant=\"ghost\" size=\"icon-sm\" aria-label={t(\"help.hint.trigger\")} />}>\n <HelpCircleIcon className=\"h-4 w-4\" />\n </SheetTrigger>\n <SheetContent side=\"right\" className=\"w-full max-w-md sm:max-w-lg\">\n <SheetHeader>\n <SheetTitle>{active ? active.title : t(\"help.hint.pickArticle\")}</SheetTitle>\n <SheetDescription>{active?.summary ?? \"\"}</SheetDescription>\n </SheetHeader>\n {active ? (\n <div className=\"mt-4 space-y-3\">\n <p className=\"text-muted-foreground text-sm\">{active.summary}</p>\n <Link href={articleUrl(generateUrl, active)} className=\"text-sm\">\n {t(\"help.hint.viewArticle\")}\n </Link>\n </div>\n ) : (\n <ul className=\"mt-4 space-y-1\">\n {matches.map((a) => (\n <li key={a.id}>\n <button\n type=\"button\"\n onClick={() => setPicked(a)}\n className=\"hover:bg-muted block w-full rounded px-2 py-1 text-left text-sm\"\n >\n <div className=\"font-medium\">{a.title}</div>\n <div className=\"text-muted-foreground text-xs\">{a.summary}</div>\n </button>\n </li>\n ))}\n </ul>\n )}\n </SheetContent>\n </Sheet>\n );\n}\n","\"use client\";\nimport Link from \"next/link\";\nimport { useTranslations } from \"next-intl\";\nimport { LifeBuoyIcon, ArrowUpRightIcon } from \"lucide-react\";\nimport { CommandItem } from \"../../../shadcnui\";\nimport { usePageUrlGenerator } from \"../../../client\";\nimport { useHelp } from \"../contexts/HelpContext\";\n\nexport interface HelpSearchResultRowProps {\n result: { id: string; name: string; entityType: string };\n onSelect?: () => void;\n}\n\nexport function HelpSearchResultRow({ result, onSelect }: HelpSearchResultRowProps) {\n const t = useTranslations();\n const generateUrl = usePageUrlGenerator();\n const { manifest } = useHelp();\n const article = manifest.find((a) => a.id === result.id);\n\n if (!article) {\n return (\n <CommandItem\n value={result.id}\n disabled\n className=\"text-muted-foreground cursor-not-allowed px-3 py-1.5 text-sm italic\"\n >\n {t(\"help.search.removed\")}\n </CommandItem>\n );\n }\n\n return (\n <CommandItem value={result.id} onSelect={onSelect} className=\"cursor-pointer p-0\">\n <Link\n href={generateUrl({ page: `/help/${article.mode}/${article.slug}` })}\n className=\"hover:bg-muted flex w-full items-center gap-3 rounded px-3 py-2\"\n >\n <div className=\"bg-muted text-muted-foreground flex h-10 w-10 shrink-0 items-center justify-center rounded-full\">\n <LifeBuoyIcon className=\"h-5 w-5\" />\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"text-foreground truncate text-sm font-semibold\">{article.title}</span>\n <span className=\"text-muted-foreground truncate text-xs\">\n {t(`help.modes.${article.mode}`)} · {article.summary}\n </span>\n </div>\n <ArrowUpRightIcon className=\"text-muted-foreground h-5 w-5 shrink-0\" />\n </Link>\n </CommandItem>\n );\n}\n","\"use client\";\nimport Link from \"next/link\";\nimport { useTranslations } from \"next-intl\";\nimport { useHelp } from \"../../contexts/HelpContext\";\nimport { usePageUrlGenerator } from \"../../../../client\";\nimport { articleUrl } from \"../../utils/articleUrl\";\n\nexport function Related({ slugs }: { slugs: string[] }) {\n const t = useTranslations();\n const generateUrl = usePageUrlGenerator();\n const { manifest } = useHelp();\n const items = slugs\n .map((s) => manifest.find((a) => `${a.mode}/${a.slug}` === s))\n .filter((a): a is NonNullable<typeof a> => Boolean(a));\n if (items.length === 0) return null;\n return (\n <aside className=\"my-6\">\n <h3 className=\"text-muted-foreground mb-2 text-xs font-semibold tracking-wider uppercase\">\n {t(\"help.article.related\")}\n </h3>\n <ul className=\"grid gap-2 sm:grid-cols-2\">\n {items.map((a) => (\n <li key={a.id}>\n <Link href={articleUrl(generateUrl, a)} className=\"hover:bg-muted block rounded border p-3\">\n <div className=\"font-medium\">{a.title}</div>\n <div className=\"text-muted-foreground text-xs\">{a.summary}</div>\n </Link>\n </li>\n ))}\n </ul>\n </aside>\n );\n}\n","import { Callout } from \"./Callout\";\nimport { Steps, Step } from \"./Steps\";\nimport { Screenshot } from \"./Screenshot\";\nimport { EntityRef } from \"./EntityRef\";\nimport { KeyBinding } from \"./KeyBinding\";\nimport { Video } from \"./Video\";\nimport { Related } from \"./Related\";\n\nexport const MDX_COMPONENTS = { Callout, Steps, Step, Screenshot, EntityRef, KeyBinding, Video, Related };\n","\"use client\";\nimport { useHelp } from \"../contexts/HelpContext\";\nexport function useHelpManifest() {\n return useHelp().manifest;\n}\n","\"use client\";\nimport { useHelp } from \"../contexts/HelpContext\";\nimport { findHelpArticle } from \"../utils/helpNavigation\";\n\nexport function useHelpArticle(mode: string, slug: string) {\n return findHelpArticle(useHelp().manifest, mode, slug);\n}\n","/**\n * The fixed namespace of i18n keys this feature reads via useTranslations/getTranslations.\n * Consuming apps must define each entry in their messages/<locale>.json.\n */\nexport const HELP_I18N_KEYS = [\n \"help.modes.tutorial\",\n \"help.modes.how-to\",\n \"help.modes.reference\",\n \"help.modes.explanation\",\n \"help.sideNav.filterPlaceholder\",\n \"help.sideNav.noMatches\",\n \"help.toc.title\",\n \"help.article.lastUpdated\",\n \"help.article.previous\",\n \"help.article.next\",\n \"help.article.related\",\n \"help.askAi.button\",\n \"help.askAi.loginTooltip\",\n \"help.askAi.sheet.title\",\n \"help.askAi.sheet.subtitle\",\n \"help.header.search\",\n \"help.header.login\",\n \"help.header.openApp\",\n \"help.hint.trigger\",\n \"help.hint.viewArticle\",\n \"help.hint.pickArticle\",\n \"help.landing.heading\",\n \"help.landing.subheading\",\n \"help.landing.featuredTutorials\",\n \"help.landing.browseByMode\",\n \"help.modeIndex.empty\",\n \"help.search.removed\",\n \"help.footerLink\",\n] as const;\n"]}