@carlonicora/nextjs-jsonapi 4.1.1 → 4.2.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 (230) hide show
  1. package/dist/{AssistantMessageInterface-CubxuBIJ.d.ts → AssistantMessageInterface-DHJJO_Z_.d.ts} +1 -1
  2. package/dist/{AssistantMessageInterface-sHjI2zPN.d.mts → AssistantMessageInterface-S7oyERTT.d.mts} +1 -1
  3. package/dist/{BlockNoteEditor-VOYKZOP5.mjs → BlockNoteEditor-HXAHDJA7.mjs} +34 -27
  4. package/dist/BlockNoteEditor-HXAHDJA7.mjs.map +1 -0
  5. package/dist/{BlockNoteEditor-BENYTTCZ.js → BlockNoteEditor-LLCZDFLZ.js} +50 -43
  6. package/dist/BlockNoteEditor-LLCZDFLZ.js.map +1 -0
  7. package/dist/{BlockNoteViewer-USLR4Y7C.js → BlockNoteViewer-77CCTC2U.js} +3 -3
  8. package/dist/{BlockNoteViewer-USLR4Y7C.js.map → BlockNoteViewer-77CCTC2U.js.map} +1 -1
  9. package/dist/{BlockNoteViewer-Y2ZM4ESA.mjs → BlockNoteViewer-MDPO6BXN.mjs} +2 -2
  10. package/dist/{auth.interface-Df4vXbNz.d.mts → auth.interface-CeFCz9NU.d.mts} +1 -1
  11. package/dist/{auth.interface-BzI4onI_.d.ts → auth.interface-D1R7VVky.d.ts} +1 -1
  12. package/dist/billing/index.d.mts +40 -6
  13. package/dist/billing/index.d.ts +40 -6
  14. package/dist/billing/index.js +806 -774
  15. package/dist/billing/index.js.map +1 -1
  16. package/dist/billing/index.mjs +494 -462
  17. package/dist/billing/index.mjs.map +1 -1
  18. package/dist/{chunk-6ISF5KNQ.mjs → chunk-2VXDZRYY.mjs} +1103 -816
  19. package/dist/chunk-2VXDZRYY.mjs.map +1 -0
  20. package/dist/{chunk-4BZJ4LAB.js → chunk-4ORLPEK7.js} +136 -104
  21. package/dist/chunk-4ORLPEK7.js.map +1 -0
  22. package/dist/{chunk-ZZ6E33FO.mjs → chunk-6DRSSW5O.mjs} +36 -4
  23. package/dist/chunk-6DRSSW5O.mjs.map +1 -0
  24. package/dist/{chunk-KS6WZP2E.js → chunk-6SMJRAE3.js} +4 -4
  25. package/dist/{chunk-KS6WZP2E.js.map → chunk-6SMJRAE3.js.map} +1 -1
  26. package/dist/{chunk-WQ77CUUZ.js → chunk-GPXYQMOZ.js} +7 -7
  27. package/dist/{chunk-WQ77CUUZ.js.map → chunk-GPXYQMOZ.js.map} +1 -1
  28. package/dist/{chunk-46S3KPLU.mjs → chunk-ILFFC6BG.mjs} +2 -2
  29. package/dist/{chunk-HZVVRIJQ.mjs → chunk-IUS2RHCX.mjs} +2 -2
  30. package/dist/{chunk-F7RNBGHS.js → chunk-KJMMBUOA.js} +3 -3
  31. package/dist/{chunk-F7RNBGHS.js.map → chunk-KJMMBUOA.js.map} +1 -1
  32. package/dist/{chunk-ZO3QQ5CQ.mjs → chunk-MQDR6MEE.mjs} +2 -2
  33. package/dist/{chunk-ORU7KLCY.js → chunk-VDVIUDY5.js} +1445 -1158
  34. package/dist/chunk-VDVIUDY5.js.map +1 -0
  35. package/dist/client/index.d.mts +20 -6
  36. package/dist/client/index.d.ts +20 -6
  37. package/dist/client/index.js +6 -4
  38. package/dist/client/index.js.map +1 -1
  39. package/dist/client/index.mjs +5 -3
  40. package/dist/components/index.d.mts +59 -21
  41. package/dist/components/index.d.ts +59 -21
  42. package/dist/components/index.js +4 -4
  43. package/dist/components/index.mjs +3 -3
  44. package/dist/{config-CEAq4Ozy.d.mts → config-BP2vyddw.d.mts} +5 -0
  45. package/dist/{config-DydDHCfb.d.ts → config-BhW2QrRD.d.ts} +5 -0
  46. package/dist/contexts/index.d.mts +4 -4
  47. package/dist/contexts/index.d.ts +4 -4
  48. package/dist/contexts/index.js +4 -4
  49. package/dist/contexts/index.mjs +3 -3
  50. package/dist/core/index.d.mts +17 -9
  51. package/dist/core/index.d.ts +17 -9
  52. package/dist/core/index.js +4 -2
  53. package/dist/core/index.js.map +1 -1
  54. package/dist/core/index.mjs +3 -1
  55. package/dist/features/analytics/index.d.mts +1 -1
  56. package/dist/features/analytics/index.d.ts +1 -1
  57. package/dist/features/analytics/index.js +122 -122
  58. package/dist/features/analytics/index.mjs +4 -4
  59. package/dist/features/analytics/server.js +4 -4
  60. package/dist/features/analytics/server.mjs +2 -2
  61. package/dist/features/help/index.d.mts +1 -1
  62. package/dist/features/help/index.d.ts +1 -1
  63. package/dist/features/help/index.js +42 -40
  64. package/dist/features/help/index.js.map +1 -1
  65. package/dist/features/help/index.mjs +8 -6
  66. package/dist/features/help/index.mjs.map +1 -1
  67. package/dist/features/tokenusage/index.js +125 -125
  68. package/dist/features/tokenusage/index.mjs +4 -4
  69. package/dist/index.d.mts +7 -7
  70. package/dist/index.d.ts +7 -7
  71. package/dist/index.js +5 -3
  72. package/dist/index.js.map +1 -1
  73. package/dist/index.mjs +4 -2
  74. package/dist/{notification.interface-P_pNfzZQ.d.mts → notification.interface-BB6GPpZY.d.mts} +1 -1
  75. package/dist/{notification.interface-BNCvnVCW.d.ts → notification.interface-CmAGrijJ.d.ts} +1 -1
  76. package/dist/{s3.service-CbUa6a-8.d.ts → s3.service-C-4YpEMu.d.ts} +7 -3
  77. package/dist/{s3.service-DAp8FbuG.d.mts → s3.service-dVj-nxMl.d.mts} +7 -3
  78. package/dist/server/index.d.mts +4 -4
  79. package/dist/server/index.d.ts +4 -4
  80. package/dist/server/index.js +3 -3
  81. package/dist/server/index.mjs +2 -2
  82. package/dist/{useSocket-BHVIyigI.d.ts → useSocket-B0H9pmmH.d.ts} +1 -1
  83. package/dist/{useSocket-B9gTbuCj.d.mts → useSocket-B5RQb6v2.d.mts} +1 -1
  84. package/dist/{user.interface-CrmwJLYW.d.ts → user.interface-C0ZdsBZj.d.ts} +2 -0
  85. package/dist/{user.interface-CSaGWFbg.d.mts → user.interface-CIWGlbqM.d.mts} +2 -0
  86. package/package.json +1 -1
  87. package/scripts/vitest-slow-tests.reporter.spec.ts +54 -0
  88. package/src/components/containers/RoundPageContainer.tsx +3 -1
  89. package/src/components/containers/RoundPageContainerTitle.tsx +5 -2
  90. package/src/components/editors/BlockNoteEditor.tsx +31 -15
  91. package/src/components/editors/BlockNoteEditorAiActions.tsx +11 -7
  92. package/src/components/editors/__tests__/BlockNoteEditorAiActions.test.ts +10 -3
  93. package/src/components/errors/ErrorDetails.tsx +5 -2
  94. package/src/components/forms/CommonAssociationForm.tsx +1 -1
  95. package/src/components/forms/EntityMultiSelector.tsx +6 -2
  96. package/src/components/forms/EntitySelector.tsx +4 -1
  97. package/src/components/forms/FileUploader.tsx +3 -2
  98. package/src/components/forms/MultiFileUploader.tsx +3 -1
  99. package/src/components/navigations/Breadcrumb.tsx +3 -2
  100. package/src/components/navigations/Header.tsx +3 -1
  101. package/src/components/navigations/MobileNavigationBar.tsx +3 -1
  102. package/src/components/navigations/__tests__/Header.spec.tsx +2 -2
  103. package/src/components/tables/cells/cell.id.tsx +13 -2
  104. package/src/core/abstracts/AbstractService.ts +3 -3
  105. package/src/core/abstracts/ClientAbstractService.ts +3 -2
  106. package/src/features/assistant-action/components/ApprovalActionCard.tsx +74 -5
  107. package/src/features/assistant-action/components/__tests__/ApprovalActionCard.spec.tsx +81 -0
  108. package/src/features/assistant-message/components/parts/RelevanceMeter.tsx +4 -1
  109. package/src/features/assistant-message/components/parts/tabs/UsersTab.tsx +2 -1
  110. package/src/features/auth/components/buttons/GoogleSignInButton.tsx +4 -1
  111. package/src/features/auth/components/details/LandingComponent.tsx +1 -1
  112. package/src/features/auth/components/forms/ForgotPassword.tsx +1 -1
  113. package/src/features/auth/components/forms/Login.tsx +1 -1
  114. package/src/features/auth/components/forms/Register.tsx +1 -1
  115. package/src/features/auth/components/forms/ResetPassword.tsx +2 -2
  116. package/src/features/auth/components/two-factor/BackupCodesDialog.tsx +1 -1
  117. package/src/features/auth/components/two-factor/PasskeyButton.tsx +1 -1
  118. package/src/features/billing/components/cards/BillingUsageSummaryCard.tsx +21 -11
  119. package/src/features/billing/components/cards/CustomerInfoCard.tsx +16 -13
  120. package/src/features/billing/components/cards/InvoicesSummaryCard.tsx +33 -21
  121. package/src/features/billing/components/cards/PaymentMethodSummaryCard.tsx +20 -10
  122. package/src/features/billing/components/cards/SubscriptionSummaryCard.tsx +35 -22
  123. package/src/features/billing/components/containers/BillingDashboardContainer.tsx +24 -24
  124. package/src/features/billing/components/utils/__tests__/billing-formatters.spec.ts +63 -0
  125. package/src/features/billing/components/utils/currency.ts +67 -10
  126. package/src/features/billing/components/utils/date.ts +9 -4
  127. package/src/features/billing/components/utils/format-options.ts +20 -0
  128. package/src/features/billing/components/utils/index.ts +3 -1
  129. package/src/features/billing/components/utils/useBillingFormatOptions.ts +11 -0
  130. package/src/features/billing/components/widgets/BillingAlertBanner.tsx +8 -9
  131. package/src/features/billing/contexts/PriceContext.tsx +18 -6
  132. package/src/features/billing/i18n-keys.ts +212 -0
  133. package/src/features/billing/stripe-customer/components/containers/PaymentMethodsContainer.tsx +8 -8
  134. package/src/features/billing/stripe-customer/components/details/PaymentMethodCard.tsx +11 -9
  135. package/src/features/billing/stripe-customer/components/forms/PaymentMethodEditor.tsx +4 -4
  136. package/src/features/billing/stripe-customer/components/forms/PaymentMethodForm.tsx +9 -7
  137. package/src/features/billing/stripe-invoice/components/containers/InvoicesContainer.tsx +10 -8
  138. package/src/features/billing/stripe-invoice/components/details/InvoiceDetails.tsx +34 -29
  139. package/src/features/billing/stripe-invoice/components/lists/InvoicesList.tsx +12 -9
  140. package/src/features/billing/stripe-invoice/components/widgets/InvoiceStatusBadge.tsx +9 -6
  141. package/src/features/billing/stripe-price/components/details/PriceDetails.tsx +4 -3
  142. package/src/features/billing/stripe-price/components/forms/PriceArchiver.tsx +3 -1
  143. package/src/features/billing/stripe-price/components/forms/PriceEditor.tsx +3 -1
  144. package/src/features/billing/stripe-price/hooks/useStripePriceTableStructure.tsx +6 -5
  145. package/src/features/billing/stripe-promotion-code/components/PromoCodeInput.tsx +12 -7
  146. package/src/features/billing/stripe-promotion-code/data/stripe-promotion-code.service.ts +3 -1
  147. package/src/features/billing/stripe-subscription/components/containers/SubscriptionsContainer.tsx +10 -6
  148. package/src/features/billing/stripe-subscription/components/details/SubscriptionDetails.tsx +44 -29
  149. package/src/features/billing/stripe-subscription/components/forms/CancelSubscriptionDialog.tsx +14 -11
  150. package/src/features/billing/stripe-subscription/components/lists/SubscriptionsList.tsx +20 -17
  151. package/src/features/billing/stripe-subscription/components/widgets/IntervalToggle.tsx +4 -2
  152. package/src/features/billing/stripe-subscription/components/widgets/PricingCard.tsx +16 -7
  153. package/src/features/billing/stripe-subscription/components/widgets/ProductPricingList.tsx +3 -1
  154. package/src/features/billing/stripe-subscription/components/widgets/ProductPricingRow.tsx +3 -1
  155. package/src/features/billing/stripe-subscription/components/widgets/ProrationPreview.tsx +12 -7
  156. package/src/features/billing/stripe-subscription/components/widgets/SubscriptionConfirmation.tsx +11 -8
  157. package/src/features/billing/stripe-subscription/components/widgets/SubscriptionStatusBadge.tsx +13 -10
  158. package/src/features/billing/stripe-subscription/components/wizards/SubscriptionWizard.tsx +8 -6
  159. package/src/features/billing/stripe-subscription/components/wizards/WizardProgressIndicator.tsx +7 -4
  160. package/src/features/billing/stripe-subscription/components/wizards/WizardStepPaymentMethod.tsx +4 -2
  161. package/src/features/billing/stripe-subscription/components/wizards/WizardStepPlanSelection.tsx +3 -1
  162. package/src/features/billing/stripe-subscription/components/wizards/WizardStepReview.tsx +37 -28
  163. package/src/features/billing/stripe-subscription/hooks/useConfirmSubscriptionPayment.ts +9 -7
  164. package/src/features/billing/stripe-subscription/hooks/useSubscriptionWizard.ts +20 -9
  165. package/src/features/billing/stripe-usage/components/containers/UsageContainer.tsx +6 -6
  166. package/src/features/billing/stripe-usage/components/details/UsageSummaryCard.tsx +24 -9
  167. package/src/features/billing/stripe-usage/components/lists/UsageHistoryTable.tsx +16 -12
  168. package/src/features/company/components/details/TokenStatusIndicator.tsx +7 -5
  169. package/src/features/company/components/forms/CompanyEditor.tsx +2 -2
  170. package/src/features/help/components/HelpArticleBody.tsx +1 -1
  171. package/src/features/help/components/HelpHeader.tsx +1 -1
  172. package/src/features/help/components/HelpSideNav.tsx +1 -1
  173. package/src/features/help/i18n-keys.ts +2 -0
  174. package/src/features/notification/components/common/NotificationErrorBoundary.tsx +17 -12
  175. package/src/features/notification/components/containers/NotificationsListContainer.tsx +4 -2
  176. package/src/features/notification/components/notifications/Notification.tsx +6 -3
  177. package/src/features/notification/contexts/NotificationContext.tsx +9 -4
  178. package/src/features/notification/contexts/__tests__/NotificationContext.spec.tsx +13 -0
  179. package/src/features/notification/hooks/useNotificationTableStructure.tsx +4 -2
  180. package/src/features/oauth/components/OAuthClientCard.tsx +13 -7
  181. package/src/features/oauth/components/OAuthClientDetail.tsx +34 -30
  182. package/src/features/oauth/components/OAuthClientForm.tsx +24 -24
  183. package/src/features/oauth/components/OAuthClientList.tsx +10 -6
  184. package/src/features/oauth/components/OAuthClientSecretDisplay.tsx +10 -8
  185. package/src/features/oauth/components/OAuthRedirectUriInput.tsx +9 -13
  186. package/src/features/oauth/components/OAuthScopeSelector.tsx +15 -6
  187. package/src/features/oauth/components/__tests__/OAuthClientForm.spec.tsx +11 -9
  188. package/src/features/oauth/components/consent/OAuthScopeList.tsx +4 -2
  189. package/src/features/oauth/hooks/__tests__/useOAuthScopeText.spec.ts +30 -0
  190. package/src/features/oauth/hooks/index.ts +1 -0
  191. package/src/features/oauth/hooks/useOAuthClient.ts +11 -5
  192. package/src/features/oauth/hooks/useOAuthClients.ts +9 -3
  193. package/src/features/oauth/hooks/useOAuthConsent.ts +11 -5
  194. package/src/features/oauth/hooks/useOAuthScopeText.ts +33 -0
  195. package/src/features/rbac/components/RbacByRoleContainer.tsx +7 -6
  196. package/src/features/rbac/components/RbacContainer.tsx +7 -6
  197. package/src/features/rbac/contexts/RbacContext.tsx +3 -3
  198. package/src/features/user/components/containers/UserContainer.tsx +3 -1
  199. package/src/features/user/data/__tests__/user.test.ts +66 -0
  200. package/src/features/user/data/user.interface.ts +2 -0
  201. package/src/features/user/data/user.service.ts +9 -0
  202. package/src/features/user/data/user.ts +7 -0
  203. package/src/features/waitlist/components/forms/WaitlistForm.tsx +1 -1
  204. package/src/features/waitlist/components/lists/WaitlistList.tsx +1 -1
  205. package/src/i18n/__tests__/config.test.ts +21 -1
  206. package/src/i18n/config.ts +13 -0
  207. package/src/i18n/index.ts +1 -0
  208. package/src/shadcnui/custom/multi-select.tsx +47 -14
  209. package/src/shadcnui/custom/multiple-selector.tsx +14 -2
  210. package/src/shadcnui/ui/__tests__/use-ui-text.test.tsx +76 -0
  211. package/src/shadcnui/ui/breadcrumb.tsx +9 -2
  212. package/src/shadcnui/ui/carousel.tsx +15 -4
  213. package/src/shadcnui/ui/dialog.tsx +15 -2
  214. package/src/shadcnui/ui/sheet.tsx +6 -1
  215. package/src/shadcnui/ui/sidebar.tsx +33 -7
  216. package/src/shadcnui/ui/spinner.tsx +6 -1
  217. package/src/shadcnui/ui/use-ui-text.ts +49 -0
  218. package/src/utils/__tests__/date-formatter.test.ts +24 -1
  219. package/src/utils/date-formatter.ts +16 -0
  220. package/src/utils/index.ts +1 -1
  221. package/dist/BlockNoteEditor-BENYTTCZ.js.map +0 -1
  222. package/dist/BlockNoteEditor-VOYKZOP5.mjs.map +0 -1
  223. package/dist/chunk-4BZJ4LAB.js.map +0 -1
  224. package/dist/chunk-6ISF5KNQ.mjs.map +0 -1
  225. package/dist/chunk-ORU7KLCY.js.map +0 -1
  226. package/dist/chunk-ZZ6E33FO.mjs.map +0 -1
  227. /package/dist/{BlockNoteViewer-Y2ZM4ESA.mjs.map → BlockNoteViewer-MDPO6BXN.mjs.map} +0 -0
  228. /package/dist/{chunk-46S3KPLU.mjs.map → chunk-ILFFC6BG.mjs.map} +0 -0
  229. /package/dist/{chunk-HZVVRIJQ.mjs.map → chunk-IUS2RHCX.mjs.map} +0 -0
  230. /package/dist/{chunk-ZO3QQ5CQ.mjs.map → chunk-MQDR6MEE.mjs.map} +0 -0
@@ -3,7 +3,7 @@ import {
3
3
  percentageDelta,
4
4
  seriesColor,
5
5
  useUsageFormatters
6
- } from "../../chunk-HZVVRIJQ.mjs";
6
+ } from "../../chunk-IUS2RHCX.mjs";
7
7
  import {
8
8
  Badge,
9
9
  Button,
@@ -33,8 +33,8 @@ import {
33
33
  TabsList,
34
34
  TabsTrigger,
35
35
  usePageUrlGenerator
36
- } from "../../chunk-6ISF5KNQ.mjs";
37
- import "../../chunk-ZO3QQ5CQ.mjs";
36
+ } from "../../chunk-2VXDZRYY.mjs";
37
+ import "../../chunk-MQDR6MEE.mjs";
38
38
  import "../../chunk-PW42LRSL.mjs";
39
39
  import {
40
40
  AbstractService,
@@ -48,7 +48,7 @@ import {
48
48
  Modules,
49
49
  analyticsModules,
50
50
  cn
51
- } from "../../chunk-ZZ6E33FO.mjs";
51
+ } from "../../chunk-6DRSSW5O.mjs";
52
52
  import "../../chunk-AUXK7QSA.mjs";
53
53
  import "../../chunk-PI56A4DG.mjs";
54
54
  import "../../chunk-V5MI7RNB.mjs";
@@ -1,11 +1,11 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkKS6WZP2Ejs = require('../../chunk-KS6WZP2E.js');
3
+ var _chunk6SMJRAE3js = require('../../chunk-6SMJRAE3.js');
4
4
  require('../../chunk-YUO55Q5A.js');
5
5
  require('../../chunk-6TUB7Y6T.js');
6
6
  require('../../chunk-IK65TDQH.js');
7
7
  require('../../chunk-G4JR3SFV.js');
8
- require('../../chunk-4BZJ4LAB.js');
8
+ require('../../chunk-4ORLPEK7.js');
9
9
  require('../../chunk-LXKSUWAV.js');
10
10
  require('../../chunk-JTPRJNT2.js');
11
11
  require('../../chunk-GHE4VT2R.js');
@@ -18,7 +18,7 @@ var _navigation = require('next/navigation');
18
18
  var _analytics = require('@carlonicora/nextjs-jsonapi/analytics');
19
19
  var _jsxruntime = require('react/jsx-runtime');
20
20
  async function AnalyticsAdminPage({ adminRoleId, pageUrl, sessionPageUrl, deniedRedirect = "/" }) {
21
- if (!await _chunkKS6WZP2Ejs.ServerSession.hasRole(adminRoleId)) {
21
+ if (!await _chunk6SMJRAE3js.ServerSession.hasRole(adminRoleId)) {
22
22
  _navigation.redirect.call(void 0, deniedRedirect);
23
23
  }
24
24
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _analytics.AnalyticsAdminPageContainer, { pageUrl, sessionPageUrl });
@@ -30,7 +30,7 @@ _chunk7QVYU63Ejs.__name.call(void 0, AnalyticsAdminPage, "AnalyticsAdminPage");
30
30
 
31
31
 
32
32
  async function AnalyticsJourneyPage({ adminRoleId, sessionId, pageUrl, deniedRedirect = "/" }) {
33
- if (!await _chunkKS6WZP2Ejs.ServerSession.hasRole(adminRoleId)) {
33
+ if (!await _chunk6SMJRAE3js.ServerSession.hasRole(adminRoleId)) {
34
34
  _navigation.redirect.call(void 0, deniedRedirect);
35
35
  }
36
36
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _analytics.AnalyticsJourneyPageContainer, { sessionId, pageUrl });
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  ServerSession
3
- } from "../../chunk-46S3KPLU.mjs";
3
+ } from "../../chunk-ILFFC6BG.mjs";
4
4
  import "../../chunk-F5UNXZ3J.mjs";
5
5
  import "../../chunk-E2LENTUH.mjs";
6
6
  import "../../chunk-T7SAW3UW.mjs";
7
7
  import "../../chunk-PW42LRSL.mjs";
8
- import "../../chunk-ZZ6E33FO.mjs";
8
+ import "../../chunk-6DRSSW5O.mjs";
9
9
  import "../../chunk-AUXK7QSA.mjs";
10
10
  import "../../chunk-PI56A4DG.mjs";
11
11
  import "../../chunk-V5MI7RNB.mjs";
@@ -74,6 +74,6 @@ declare function modeUrl(generateUrl: ReturnType<typeof usePageUrlGenerator>, mo
74
74
  * The fixed namespace of i18n keys this feature reads via useTranslations/getTranslations.
75
75
  * Consuming apps must define each entry in their messages/<locale>.json.
76
76
  */
77
- declare const HELP_I18N_KEYS: readonly ["help.modes.tutorial", "help.modes.how-to", "help.modes.reference", "help.modes.explanation", "help.sideNav.filterPlaceholder", "help.sideNav.noMatches", "help.toc.title", "help.article.lastUpdated", "help.article.previous", "help.article.next", "help.article.related", "help.askAi.button", "help.askAi.loginTooltip", "help.askAi.sheet.title", "help.askAi.sheet.subtitle", "help.header.search", "help.header.login", "help.header.openApp", "help.hint.trigger", "help.hint.viewArticle", "help.hint.pickArticle", "help.landing.heading", "help.landing.subheading", "help.landing.featuredTutorials", "help.landing.browseByMode", "help.modeIndex.empty", "help.search.removed", "help.footerLink"];
77
+ declare const HELP_I18N_KEYS: readonly ["help.title", "help.modes.tutorial", "help.modes.how-to", "help.modes.reference", "help.modes.explanation", "help.sideNav.filterPlaceholder", "help.sideNav.noMatches", "help.sideNav.label", "help.toc.title", "help.article.lastUpdated", "help.article.previous", "help.article.next", "help.article.related", "help.askAi.button", "help.askAi.loginTooltip", "help.askAi.sheet.title", "help.askAi.sheet.subtitle", "help.header.search", "help.header.login", "help.header.openApp", "help.hint.trigger", "help.hint.viewArticle", "help.hint.pickArticle", "help.landing.heading", "help.landing.subheading", "help.landing.featuredTutorials", "help.landing.browseByMode", "help.modeIndex.empty", "help.search.removed", "help.footerLink"];
78
78
 
79
79
  export { HELP_I18N_KEYS, HelpArticle, HelpArticleBody, HelpAskAi, HelpAssistantSheet, HelpContentConfig, HelpHeader, HelpHeading, HelpHint, HelpMode, HelpProvider, HelpSearchResultRow, HelpSideNav, HelpTOC, articleUrl, modeUrl, useHelp, useHelpFilter };
@@ -74,6 +74,6 @@ declare function modeUrl(generateUrl: ReturnType<typeof usePageUrlGenerator>, mo
74
74
  * The fixed namespace of i18n keys this feature reads via useTranslations/getTranslations.
75
75
  * Consuming apps must define each entry in their messages/<locale>.json.
76
76
  */
77
- declare const HELP_I18N_KEYS: readonly ["help.modes.tutorial", "help.modes.how-to", "help.modes.reference", "help.modes.explanation", "help.sideNav.filterPlaceholder", "help.sideNav.noMatches", "help.toc.title", "help.article.lastUpdated", "help.article.previous", "help.article.next", "help.article.related", "help.askAi.button", "help.askAi.loginTooltip", "help.askAi.sheet.title", "help.askAi.sheet.subtitle", "help.header.search", "help.header.login", "help.header.openApp", "help.hint.trigger", "help.hint.viewArticle", "help.hint.pickArticle", "help.landing.heading", "help.landing.subheading", "help.landing.featuredTutorials", "help.landing.browseByMode", "help.modeIndex.empty", "help.search.removed", "help.footerLink"];
77
+ declare const HELP_I18N_KEYS: readonly ["help.title", "help.modes.tutorial", "help.modes.how-to", "help.modes.reference", "help.modes.explanation", "help.sideNav.filterPlaceholder", "help.sideNav.noMatches", "help.sideNav.label", "help.toc.title", "help.article.lastUpdated", "help.article.previous", "help.article.next", "help.article.related", "help.askAi.button", "help.askAi.loginTooltip", "help.askAi.sheet.title", "help.askAi.sheet.subtitle", "help.header.search", "help.header.login", "help.header.openApp", "help.hint.trigger", "help.hint.viewArticle", "help.hint.pickArticle", "help.landing.heading", "help.landing.subheading", "help.landing.featuredTutorials", "help.landing.browseByMode", "help.modeIndex.empty", "help.search.removed", "help.footerLink"];
78
78
 
79
79
  export { HELP_I18N_KEYS, HelpArticle, HelpArticleBody, HelpAskAi, HelpAssistantSheet, HelpContentConfig, HelpHeader, HelpHeading, HelpHint, HelpMode, HelpProvider, HelpSearchResultRow, HelpSideNav, HelpTOC, articleUrl, modeUrl, useHelp, useHelpFilter };
@@ -23,14 +23,14 @@ var _chunkYBZVWLPHjs = require('../../chunk-YBZVWLPH.js');
23
23
 
24
24
 
25
25
 
26
- var _chunkORU7KLCYjs = require('../../chunk-ORU7KLCY.js');
26
+ var _chunkVDVIUDY5js = require('../../chunk-VDVIUDY5.js');
27
27
 
28
28
 
29
- var _chunkWQ77CUUZjs = require('../../chunk-WQ77CUUZ.js');
29
+ var _chunkGPXYQMOZjs = require('../../chunk-GPXYQMOZ.js');
30
30
  require('../../chunk-G4JR3SFV.js');
31
31
 
32
32
 
33
- var _chunk4BZJ4LABjs = require('../../chunk-4BZJ4LAB.js');
33
+ var _chunk4ORLPEK7js = require('../../chunk-4ORLPEK7.js');
34
34
  require('../../chunk-LXKSUWAV.js');
35
35
  require('../../chunk-JTPRJNT2.js');
36
36
  require('../../chunk-GHE4VT2R.js');
@@ -44,7 +44,7 @@ var _react = require('react');
44
44
  var _jsxruntime = require('react/jsx-runtime');
45
45
  var HelpContext = _react.createContext.call(void 0, null);
46
46
  function HelpProvider({ children }) {
47
- const cfg = _chunkWQ77CUUZjs._getStaticHelpContent.call(void 0, );
47
+ const cfg = _chunkGPXYQMOZjs._getStaticHelpContent.call(void 0, );
48
48
  if (!cfg) {
49
49
  throw new Error(
50
50
  "Help content not configured \u2014 call configureJsonApi({ helpContent: {...} }) before importing help components."
@@ -76,29 +76,29 @@ var _lucidereact = require('lucide-react');
76
76
 
77
77
 
78
78
  function HelpAssistantSheet({ open, onOpenChange }) {
79
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.Sheet, { open, onOpenChange, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
80
- _chunkORU7KLCYjs.SheetContent,
79
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.Sheet, { open, onOpenChange, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
80
+ _chunkVDVIUDY5js.SheetContent,
81
81
  {
82
82
  side: "end",
83
83
  className: "flex w-full flex-col data-[side=right]:sm:max-w-2xl data-[side=right]:lg:max-w-3xl data-[side=left]:sm:max-w-2xl data-[side=left]:lg:max-w-3xl",
84
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.AssistantProvider, { manageUrl: false, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpAssistantSheetBody, {}) })
84
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.AssistantProvider, { manageUrl: false, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpAssistantSheetBody, {}) })
85
85
  }
86
86
  ) });
87
87
  }
88
88
  _chunk7QVYU63Ejs.__name.call(void 0, HelpAssistantSheet, "HelpAssistantSheet");
89
89
  function HelpAssistantSheetBody() {
90
90
  const t = _nextintl.useTranslations.call(void 0, );
91
- const ctx = _chunkORU7KLCYjs.useAssistantContext.call(void 0, );
91
+ const ctx = _chunkVDVIUDY5js.useAssistantContext.call(void 0, );
92
92
  const showThread = !!ctx.assistant || ctx.sending || ctx.messages.length > 0;
93
93
  const send = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (content) => ctx.sendMessage(content, { howToMode: true }), "send");
94
94
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
95
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkORU7KLCYjs.SheetHeader, { children: [
96
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.SheetTitle, { children: t("help.askAi.sheet.title") }),
97
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.SheetDescription, { children: t("help.askAi.sheet.subtitle") })
95
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkVDVIUDY5js.SheetHeader, { children: [
96
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.SheetTitle, { children: t("help.askAi.sheet.title") }),
97
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.SheetDescription, { children: t("help.askAi.sheet.subtitle") })
98
98
  ] }),
99
- !showThread ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.AssistantEmptyState, { onSend: send }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
99
+ !showThread ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.AssistantEmptyState, { onSend: send }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
100
100
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
101
- _chunkORU7KLCYjs.AssistantThread,
101
+ _chunkVDVIUDY5js.AssistantThread,
102
102
  {
103
103
  messages: ctx.messages,
104
104
  sending: ctx.sending,
@@ -108,7 +108,7 @@ function HelpAssistantSheetBody() {
108
108
  onRetry: ctx.retrySend
109
109
  }
110
110
  ),
111
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.AssistantComposer, { onSend: send, disabled: ctx.sending })
111
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.AssistantComposer, { onSend: send, disabled: ctx.sending })
112
112
  ] })
113
113
  ] });
114
114
  }
@@ -118,20 +118,20 @@ _chunk7QVYU63Ejs.__name.call(void 0, HelpAssistantSheetBody, "HelpAssistantSheet
118
118
 
119
119
  function HelpAskAi() {
120
120
  const t = _nextintl.useTranslations.call(void 0, );
121
- const { currentUser } = _chunkORU7KLCYjs.useCurrentUserContext.call(void 0, );
121
+ const { currentUser } = _chunkVDVIUDY5js.useCurrentUserContext.call(void 0, );
122
122
  const [open, setOpen] = _react.useState.call(void 0, false);
123
123
  const disabled = !currentUser;
124
124
  if (disabled) {
125
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkORU7KLCYjs.Tooltip, { children: [
126
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkORU7KLCYjs.TooltipTrigger, { render: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.Button, { variant: "outline", size: "sm", disabled: true }), children: [
125
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkVDVIUDY5js.Tooltip, { children: [
126
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkVDVIUDY5js.TooltipTrigger, { render: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.Button, { variant: "outline", size: "sm", disabled: true }), children: [
127
127
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.SparklesIcon, { className: "h-4 w-4" }),
128
128
  t("help.askAi.button")
129
129
  ] }),
130
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.TooltipContent, { children: t("help.askAi.loginTooltip") })
130
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.TooltipContent, { children: t("help.askAi.loginTooltip") })
131
131
  ] });
132
132
  }
133
133
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
134
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkORU7KLCYjs.Button, { variant: "outline", size: "sm", onClick: () => setOpen(true), children: [
134
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkVDVIUDY5js.Button, { variant: "outline", size: "sm", onClick: () => setOpen(true), children: [
135
135
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.SparklesIcon, { className: "h-4 w-4" }),
136
136
  t("help.askAi.button")
137
137
  ] }),
@@ -144,10 +144,10 @@ _chunk7QVYU63Ejs.__name.call(void 0, HelpAskAi, "HelpAskAi");
144
144
 
145
145
  function HelpHeader() {
146
146
  const t = _nextintl.useTranslations.call(void 0, );
147
- const { currentUser } = _chunkORU7KLCYjs.useCurrentUserContext.call(void 0, );
147
+ const { currentUser } = _chunkVDVIUDY5js.useCurrentUserContext.call(void 0, );
148
148
  const { brand } = useHelp();
149
149
  const logo = _optionalChain([brand, 'optionalAccess', _ => _.logo]);
150
- const label = _nullishCoalesce(_optionalChain([brand, 'optionalAccess', _2 => _2.label]), () => ( "Help"));
150
+ const label = _nullishCoalesce(_optionalChain([brand, 'optionalAccess', _2 => _2.label]), () => ( t("help.title")));
151
151
  const appHref = _nullishCoalesce(_optionalChain([brand, 'optionalAccess', _3 => _3.appHref]), () => ( "/"));
152
152
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "header", { className: "border-border bg-background flex items-center justify-between border-b px-4 py-3 max-md:gap-2", children: [
153
153
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _link2.default, { href: "/help", className: "flex items-center gap-2 max-md:min-w-0", children: [
@@ -160,7 +160,7 @@ function HelpHeader() {
160
160
  ] }),
161
161
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2 max-md:shrink-0", children: [
162
162
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpAskAi, {}),
163
- currentUser ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: appHref, className: _chunkORU7KLCYjs.buttonVariants.call(void 0, { variant: "outline", size: "sm" }), children: t("help.header.openApp") }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: "/login", className: _chunkORU7KLCYjs.buttonVariants.call(void 0, { variant: "outline", size: "sm" }), children: t("help.header.login") })
163
+ currentUser ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: appHref, className: _chunkVDVIUDY5js.buttonVariants.call(void 0, { variant: "outline", size: "sm" }), children: t("help.header.openApp") }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: "/login", className: _chunkVDVIUDY5js.buttonVariants.call(void 0, { variant: "outline", size: "sm" }), children: t("help.header.login") })
164
164
  ] })
165
165
  ] });
166
166
  }
@@ -202,12 +202,12 @@ _chunk7QVYU63Ejs.__name.call(void 0, useHelpFilter, "useHelpFilter");
202
202
 
203
203
  function HelpSideNav() {
204
204
  const t = _nextintl.useTranslations.call(void 0, );
205
- const generateUrl = _chunkORU7KLCYjs.usePageUrlGenerator.call(void 0, );
205
+ const generateUrl = _chunkVDVIUDY5js.usePageUrlGenerator.call(void 0, );
206
206
  const pathname = _navigation.usePathname.call(void 0, );
207
207
  const [articles, setArticles] = _react.useState.call(void 0, []);
208
208
  _react.useEffect.call(void 0, () => {
209
209
  let active = true;
210
- _chunk4BZJ4LABjs.HowToService.findPublished().then((list) => active && setArticles(list)).catch(() => active && setArticles([]));
210
+ _chunk4ORLPEK7js.HowToService.findPublished().then((list) => active && setArticles(list)).catch(() => active && setArticles([]));
211
211
  return () => {
212
212
  active = false;
213
213
  };
@@ -233,7 +233,7 @@ function HelpSideNav() {
233
233
  [articles]
234
234
  );
235
235
  const isActive = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (mode, slug) => pathname.endsWith(`/help/${mode}/${slug}`), "isActive");
236
- 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: [
236
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "nav", { "aria-label": t("help.sideNav.label"), className: "flex h-full flex-col gap-3 overflow-y-auto p-4", children: [
237
237
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
238
238
  "input",
239
239
  {
@@ -283,11 +283,11 @@ _chunk7QVYU63Ejs.__name.call(void 0, HelpSideNav, "HelpSideNav");
283
283
  function HelpArticleBody(props) {
284
284
  const t = _nextintl.useTranslations.call(void 0, );
285
285
  const format = _nextintl.useFormatter.call(void 0, );
286
- const generateUrl = _chunkORU7KLCYjs.usePageUrlGenerator.call(void 0, );
286
+ const generateUrl = _chunkVDVIUDY5js.usePageUrlGenerator.call(void 0, );
287
287
  const { howToType, title, summary, updatedAt, prev, next, children } = props;
288
288
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "article", { className: "prose dark:prose-invert max-w-none", children: [
289
289
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "nav", { className: "text-muted-foreground mb-2 text-xs", children: [
290
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: generateUrl({ page: "/help" }), children: "Help" }),
290
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: generateUrl({ page: "/help" }), children: t("help.title") }),
291
291
  " \xB7 ",
292
292
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: generateUrl({ page: `/help/${howToType}` }), children: t(`help.modes.${howToType}`) })
293
293
  ] }),
@@ -340,7 +340,7 @@ function HelpTOC({ headings }) {
340
340
  }, [headings]);
341
341
  if (headings.length === 0) return null;
342
342
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "nav", { "aria-label": t("help.toc.title"), className: "hidden lg:block", children: [
343
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.MicroLabel, { className: "mb-2", children: t("help.toc.title") }),
343
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.MicroLabel, { className: "mb-2", children: t("help.toc.title") }),
344
344
  /* @__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: { paddingInlineStart: `${(h.depth - 2) * 0.75}rem` }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
345
345
  "a",
346
346
  {
@@ -361,13 +361,13 @@ _chunk7QVYU63Ejs.__name.call(void 0, HelpTOC, "HelpTOC");
361
361
 
362
362
  function HelpHint({ contextKey }) {
363
363
  const t = _nextintl.useTranslations.call(void 0, );
364
- const generateUrl = _chunkORU7KLCYjs.usePageUrlGenerator.call(void 0, );
364
+ const generateUrl = _chunkVDVIUDY5js.usePageUrlGenerator.call(void 0, );
365
365
  const [open, setOpen] = _react.useState.call(void 0, false);
366
366
  const [picked, setPicked] = _react.useState.call(void 0, null);
367
367
  const [articles, setArticles] = _react.useState.call(void 0, []);
368
368
  _react.useEffect.call(void 0, () => {
369
369
  let active2 = true;
370
- _chunk4BZJ4LABjs.HowToService.findPublished().then((list) => active2 && setArticles(list)).catch(() => active2 && setArticles([]));
370
+ _chunk4ORLPEK7js.HowToService.findPublished().then((list) => active2 && setArticles(list)).catch(() => active2 && setArticles([]));
371
371
  return () => {
372
372
  active2 = false;
373
373
  };
@@ -379,7 +379,7 @@ function HelpHint({ contextKey }) {
379
379
  if (matches.length === 0) return null;
380
380
  const active = _nullishCoalesce(picked, () => ( (matches.length === 1 ? matches[0] : null)));
381
381
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
382
- _chunkORU7KLCYjs.Sheet,
382
+ _chunkVDVIUDY5js.Sheet,
383
383
  {
384
384
  open,
385
385
  onOpenChange: (o) => {
@@ -387,11 +387,11 @@ function HelpHint({ contextKey }) {
387
387
  if (!o) setPicked(null);
388
388
  },
389
389
  children: [
390
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.SheetTrigger, { render: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.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" }) }),
391
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkORU7KLCYjs.SheetContent, { side: "end", className: "w-full max-w-md sm:max-w-lg", children: [
392
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkORU7KLCYjs.SheetHeader, { children: [
393
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.SheetTitle, { children: active ? active.name : t("help.hint.pickArticle") }),
394
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.SheetDescription, { children: _nullishCoalesce(_optionalChain([active, 'optionalAccess', _4 => _4.summary]), () => ( "")) })
390
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.SheetTrigger, { render: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.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" }) }),
391
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkVDVIUDY5js.SheetContent, { side: "end", className: "w-full max-w-md sm:max-w-lg", children: [
392
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkVDVIUDY5js.SheetHeader, { children: [
393
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.SheetTitle, { children: active ? active.name : t("help.hint.pickArticle") }),
394
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.SheetDescription, { children: _nullishCoalesce(_optionalChain([active, 'optionalAccess', _4 => _4.summary]), () => ( "")) })
395
395
  ] }),
396
396
  active ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mt-4 space-y-3", children: [
397
397
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-sm", children: active.summary }),
@@ -423,18 +423,18 @@ _chunk7QVYU63Ejs.__name.call(void 0, HelpHint, "HelpHint");
423
423
 
424
424
  function HelpSearchResultRow({ result, onSelect }) {
425
425
  const t = _nextintl.useTranslations.call(void 0, );
426
- const generateUrl = _chunkORU7KLCYjs.usePageUrlGenerator.call(void 0, );
426
+ const generateUrl = _chunkVDVIUDY5js.usePageUrlGenerator.call(void 0, );
427
427
  const [article, setArticle] = _react.useState.call(void 0, null);
428
428
  _react.useEffect.call(void 0, () => {
429
429
  let active = true;
430
- _chunk4BZJ4LABjs.HowToService.findOne({ id: result.id }).then((a) => active && setArticle(a)).catch(() => active && setArticle(null));
430
+ _chunk4ORLPEK7js.HowToService.findOne({ id: result.id }).then((a) => active && setArticle(a)).catch(() => active && setArticle(null));
431
431
  return () => {
432
432
  active = false;
433
433
  };
434
434
  }, [result.id]);
435
435
  if (!article) {
436
436
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
437
- _chunkORU7KLCYjs.CommandItem,
437
+ _chunkVDVIUDY5js.CommandItem,
438
438
  {
439
439
  value: result.id,
440
440
  disabled: true,
@@ -443,7 +443,7 @@ function HelpSearchResultRow({ result, onSelect }) {
443
443
  }
444
444
  );
445
445
  }
446
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkORU7KLCYjs.CommandItem, { value: result.id, onSelect, className: "cursor-pointer p-0", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
446
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVDVIUDY5js.CommandItem, { value: result.id, onSelect, className: "cursor-pointer p-0", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
447
447
  _link2.default,
448
448
  {
449
449
  href: generateUrl({ page: `/help/${article.howToType}/${article.slug}` }),
@@ -477,12 +477,14 @@ _chunk7QVYU63Ejs.__name.call(void 0, modeUrl, "modeUrl");
477
477
 
478
478
  // src/features/help/i18n-keys.ts
479
479
  var HELP_I18N_KEYS = [
480
+ "help.title",
480
481
  "help.modes.tutorial",
481
482
  "help.modes.how-to",
482
483
  "help.modes.reference",
483
484
  "help.modes.explanation",
484
485
  "help.sideNav.filterPlaceholder",
485
486
  "help.sideNav.noMatches",
487
+ "help.sideNav.label",
486
488
  "help.toc.title",
487
489
  "help.article.lastUpdated",
488
490
  "help.article.previous",
@@ -1 +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/components/HelpArticleBody.tsx","../../../src/features/help/components/HelpTOC.tsx","../../../src/features/help/components/HelpHint.tsx","../../../src/features/help/components/HelpSearchResultRow.tsx","../../../src/features/help/utils/articleUrl.ts","../../../src/features/help/i18n-keys.ts"],"names":["jsx","useTranslations","jsxs","Fragment","useState","useMemo","Link","active"],"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 { buttonVariants } 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 max-md:gap-2\">\n {/* Phone: the title shrinks and the \"· Help & Documentation\" suffix\n truncates with an ellipsis instead of wrapping onto a second line. */}\n <Link href=\"/help\" className=\"flex items-center gap-2 max-md:min-w-0\">\n {logo ? <Image src={logo} alt={label} width={28} height={28} className=\"max-md:shrink-0\" /> : null}\n <span className=\"text-base font-semibold max-md:truncate\">\n {label} · {t(\"help.footerLink\")}\n </span>\n </Link>\n <div className=\"flex items-center gap-2 max-md:shrink-0\">\n <HelpAskAi />\n {/* Styled Links, not <Button render={<Link/>} nativeButton={false}>. Base UI's\n Button primitive warns when rendered as a non-button, and nativeButton={false}\n silences that by stamping role=\"button\" onto the anchor — so a control that\n navigates would announce as a button. Both of these navigate, so they stay\n real links and only borrow the button styling. */}\n {currentUser ? (\n <Link href={appHref} className={buttonVariants({ variant: \"outline\", size: \"sm\" })}>\n {t(\"help.header.openApp\")}\n </Link>\n ) : (\n <Link href=\"/login\" className={buttonVariants({ variant: \"outline\", size: \"sm\" })}>\n {t(\"help.header.login\")}\n </Link>\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=\"end\"\n /* rtl-ok: keyed to the resolved physical side (\"right\" in LTR, \"left\" in RTL) */\n className=\"flex w-full flex-col data-[side=right]:sm:max-w-2xl data-[side=right]:lg:max-w-3xl data-[side=left]:sm:max-w-2xl data-[side=left]: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\";\n\nimport { useEffect, useMemo, useState } from \"react\";\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 { useHelpFilter } from \"../hooks/useHelpFilter\";\nimport { HowToService } from \"../../how-to/data/HowToService\";\nimport type { HowToInterface } from \"../../how-to/data/HowToInterface\";\n\nexport function HelpSideNav() {\n const t = useTranslations();\n const generateUrl = usePageUrlGenerator();\n const pathname = usePathname();\n const [articles, setArticles] = useState<HowToInterface[]>([]);\n\n useEffect(() => {\n let active = true;\n HowToService.findPublished()\n .then((list) => active && setArticles(list))\n .catch(() => active && setArticles([]));\n return () => {\n active = false;\n };\n }, []);\n\n // useHelpFilter indexes by title/summary/tags — map HowTo getters into the shape it expects.\n const indexable = useMemo(\n () =>\n articles.map((a) => ({\n id: a.id,\n title: a.name,\n summary: a.summary ?? \"\",\n tags: a.tags,\n mode: a.howToType ?? \"\",\n slug: a.slug ?? \"\",\n })),\n [articles],\n );\n const { query, setQuery, filtered } = useHelpFilter(indexable as any);\n const filtering = query.trim().length > 0;\n\n const groups = useMemo(\n () =>\n HELP_MODES.map((mode) => ({\n mode,\n articles: articles\n .filter((a) => a.howToType === mode && !a.draft)\n .sort((x, y) => (x.order ?? 0) - (y.order ?? 0)),\n })),\n [articles],\n );\n\n const isActive = (mode: string, slug: string) => pathname.endsWith(`/help/${mode}/${slug}`);\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 as any[]).length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">{t(\"help.sideNav.noMatches\")}</p>\n ) : (\n <ul className=\"space-y-1\">\n {(filtered as any[]).map((a) => (\n <li key={a.id}>\n <Link\n href={generateUrl({ page: `/help/${a.mode}/${a.slug}` })}\n className={\n \"hover:bg-muted block rounded px-2 py-1 text-sm \" +\n (isActive(a.mode, a.slug) ? \"bg-muted font-medium\" : \"\")\n }\n >\n {a.title}\n </Link>\n </li>\n ))}\n </ul>\n )\n ) : (\n groups.map((group) => {\n if (group.articles.length === 0) return null;\n return (\n <div key={group.mode}>\n <Link\n href={generateUrl({ page: `/help/${group.mode}` })}\n className=\"text-muted-foreground hover:text-foreground mb-1 block text-xs font-semibold tracking-wider uppercase\"\n >\n {t(`help.modes.${group.mode}`)}\n </Link>\n <ul className=\"space-y-0.5\">\n {group.articles.map((a) => (\n <li key={a.id}>\n <Link\n href={generateUrl({ page: `/help/${a.howToType}/${a.slug}` })}\n className={\n \"hover:bg-muted block rounded px-2 py-1 text-sm \" +\n (isActive(a.howToType ?? \"\", a.slug ?? \"\") ? \"bg-muted font-medium\" : \"\")\n }\n >\n {a.name}\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","\"use client\";\n\nimport { ReactNode } from \"react\";\nimport Link from \"next/link\";\nimport { useFormatter, useTranslations } from \"next-intl\";\nimport { usePageUrlGenerator } from \"../../../client\";\n\ntype Sibling = { howToType: string; slug: string; title: string };\n\nexport function HelpArticleBody(props: {\n howToType: string;\n title: string;\n summary?: string;\n updatedAt?: string;\n prev?: Sibling | null;\n next?: Sibling | null;\n children: ReactNode;\n}) {\n const t = useTranslations();\n const format = useFormatter();\n const generateUrl = usePageUrlGenerator();\n const { howToType, title, summary, updatedAt, prev, next, children } = props;\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/${howToType}` })}>{t(`help.modes.${howToType}`)}</Link>\n </nav>\n <h1>{title}</h1>\n {summary ? <p className=\"text-muted-foreground !mt-0 text-base\">{summary}</p> : null}\n {children}\n <hr className=\"my-6\" />\n {updatedAt ? (\n <div className=\"text-muted-foreground text-xs\">\n <span>\n {t(\"help.article.lastUpdated\", {\n date: format.dateTime(new Date(updatedAt), { dateStyle: \"short\" }),\n })}\n </span>\n </div>\n ) : null}\n <div className=\"mt-4 flex justify-between text-sm\">\n {prev ? (\n <Link href={generateUrl({ page: `/help/${prev.howToType}/${prev.slug}` })}>\n ← {t(\"help.article.previous\")}: {prev.title}\n </Link>\n ) : (\n <span />\n )}\n {next ? (\n <Link href={generateUrl({ page: `/help/${next.howToType}/${next.slug}` })}>\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\";\nimport { MicroLabel } from \"../../../components/typography\";\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 <MicroLabel className=\"mb-2\">{t(\"help.toc.title\")}</MicroLabel>\n <ul className=\"space-y-1 text-sm\">\n {headings.map((h) => (\n <li key={h.slug} style={{ paddingInlineStart: `${(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 { useEffect, 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 { HowToService } from \"../../how-to/data/HowToService\";\nimport type { HowToInterface } from \"../../how-to/data/HowToInterface\";\n\nexport function HelpHint({ contextKey }: { contextKey: string }) {\n const t = useTranslations();\n const generateUrl = usePageUrlGenerator();\n const [open, setOpen] = useState(false);\n const [picked, setPicked] = useState<HowToInterface | null>(null);\n\n const [articles, setArticles] = useState<HowToInterface[]>([]);\n useEffect(() => {\n let active = true;\n HowToService.findPublished()\n .then((list) => active && setArticles(list))\n .catch(() => active && setArticles([]));\n return () => {\n active = false;\n };\n }, []);\n\n const matches = useMemo(\n () => articles.filter((a) => a.contextualKeys.includes(contextKey) && !a.draft),\n [articles, 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=\"end\" className=\"w-full max-w-md sm:max-w-lg\">\n <SheetHeader>\n <SheetTitle>{active ? active.name : 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={generateUrl({ page: `/help/${active.howToType}/${active.slug}` })} 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-start text-sm\"\n >\n <div className=\"font-medium\">{a.name}</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 { useEffect, useState } from \"react\";\nimport { LifeBuoyIcon, ArrowUpRightIcon } from \"lucide-react\";\nimport { CommandItem } from \"../../../shadcnui\";\nimport { usePageUrlGenerator } from \"../../../client\";\nimport { HowToService } from \"../../how-to/data/HowToService\";\nimport type { HowToInterface } from \"../../how-to/data/HowToInterface\";\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 [article, setArticle] = useState<HowToInterface | null>(null);\n useEffect(() => {\n let active = true;\n HowToService.findOne({ id: result.id })\n .then((a) => active && setArticle(a))\n .catch(() => active && setArticle(null));\n return () => {\n active = false;\n };\n }, [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.howToType}/${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.name}</span>\n <span className=\"text-muted-foreground truncate text-xs\">\n {t(`help.modes.${article.howToType}`)} · {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","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","/**\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"]}
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/components/HelpArticleBody.tsx","../../../src/features/help/components/HelpTOC.tsx","../../../src/features/help/components/HelpHint.tsx","../../../src/features/help/components/HelpSearchResultRow.tsx","../../../src/features/help/utils/articleUrl.ts","../../../src/features/help/i18n-keys.ts"],"names":["jsx","useTranslations","jsxs","Fragment","useState","useMemo","Link","active"],"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 { buttonVariants } 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 ?? t(\"help.title\");\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 max-md:gap-2\">\n {/* Phone: the title shrinks and the \"· Help & Documentation\" suffix\n truncates with an ellipsis instead of wrapping onto a second line. */}\n <Link href=\"/help\" className=\"flex items-center gap-2 max-md:min-w-0\">\n {logo ? <Image src={logo} alt={label} width={28} height={28} className=\"max-md:shrink-0\" /> : null}\n <span className=\"text-base font-semibold max-md:truncate\">\n {label} · {t(\"help.footerLink\")}\n </span>\n </Link>\n <div className=\"flex items-center gap-2 max-md:shrink-0\">\n <HelpAskAi />\n {/* Styled Links, not <Button render={<Link/>} nativeButton={false}>. Base UI's\n Button primitive warns when rendered as a non-button, and nativeButton={false}\n silences that by stamping role=\"button\" onto the anchor — so a control that\n navigates would announce as a button. Both of these navigate, so they stay\n real links and only borrow the button styling. */}\n {currentUser ? (\n <Link href={appHref} className={buttonVariants({ variant: \"outline\", size: \"sm\" })}>\n {t(\"help.header.openApp\")}\n </Link>\n ) : (\n <Link href=\"/login\" className={buttonVariants({ variant: \"outline\", size: \"sm\" })}>\n {t(\"help.header.login\")}\n </Link>\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=\"end\"\n /* rtl-ok: keyed to the resolved physical side (\"right\" in LTR, \"left\" in RTL) */\n className=\"flex w-full flex-col data-[side=right]:sm:max-w-2xl data-[side=right]:lg:max-w-3xl data-[side=left]:sm:max-w-2xl data-[side=left]: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\";\n\nimport { useEffect, useMemo, useState } from \"react\";\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 { useHelpFilter } from \"../hooks/useHelpFilter\";\nimport { HowToService } from \"../../how-to/data/HowToService\";\nimport type { HowToInterface } from \"../../how-to/data/HowToInterface\";\n\nexport function HelpSideNav() {\n const t = useTranslations();\n const generateUrl = usePageUrlGenerator();\n const pathname = usePathname();\n const [articles, setArticles] = useState<HowToInterface[]>([]);\n\n useEffect(() => {\n let active = true;\n HowToService.findPublished()\n .then((list) => active && setArticles(list))\n .catch(() => active && setArticles([]));\n return () => {\n active = false;\n };\n }, []);\n\n // useHelpFilter indexes by title/summary/tags — map HowTo getters into the shape it expects.\n const indexable = useMemo(\n () =>\n articles.map((a) => ({\n id: a.id,\n title: a.name,\n summary: a.summary ?? \"\",\n tags: a.tags,\n mode: a.howToType ?? \"\",\n slug: a.slug ?? \"\",\n })),\n [articles],\n );\n const { query, setQuery, filtered } = useHelpFilter(indexable as any);\n const filtering = query.trim().length > 0;\n\n const groups = useMemo(\n () =>\n HELP_MODES.map((mode) => ({\n mode,\n articles: articles\n .filter((a) => a.howToType === mode && !a.draft)\n .sort((x, y) => (x.order ?? 0) - (y.order ?? 0)),\n })),\n [articles],\n );\n\n const isActive = (mode: string, slug: string) => pathname.endsWith(`/help/${mode}/${slug}`);\n\n return (\n <nav aria-label={t(\"help.sideNav.label\")} 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 as any[]).length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">{t(\"help.sideNav.noMatches\")}</p>\n ) : (\n <ul className=\"space-y-1\">\n {(filtered as any[]).map((a) => (\n <li key={a.id}>\n <Link\n href={generateUrl({ page: `/help/${a.mode}/${a.slug}` })}\n className={\n \"hover:bg-muted block rounded px-2 py-1 text-sm \" +\n (isActive(a.mode, a.slug) ? \"bg-muted font-medium\" : \"\")\n }\n >\n {a.title}\n </Link>\n </li>\n ))}\n </ul>\n )\n ) : (\n groups.map((group) => {\n if (group.articles.length === 0) return null;\n return (\n <div key={group.mode}>\n <Link\n href={generateUrl({ page: `/help/${group.mode}` })}\n className=\"text-muted-foreground hover:text-foreground mb-1 block text-xs font-semibold tracking-wider uppercase\"\n >\n {t(`help.modes.${group.mode}`)}\n </Link>\n <ul className=\"space-y-0.5\">\n {group.articles.map((a) => (\n <li key={a.id}>\n <Link\n href={generateUrl({ page: `/help/${a.howToType}/${a.slug}` })}\n className={\n \"hover:bg-muted block rounded px-2 py-1 text-sm \" +\n (isActive(a.howToType ?? \"\", a.slug ?? \"\") ? \"bg-muted font-medium\" : \"\")\n }\n >\n {a.name}\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","\"use client\";\n\nimport { ReactNode } from \"react\";\nimport Link from \"next/link\";\nimport { useFormatter, useTranslations } from \"next-intl\";\nimport { usePageUrlGenerator } from \"../../../client\";\n\ntype Sibling = { howToType: string; slug: string; title: string };\n\nexport function HelpArticleBody(props: {\n howToType: string;\n title: string;\n summary?: string;\n updatedAt?: string;\n prev?: Sibling | null;\n next?: Sibling | null;\n children: ReactNode;\n}) {\n const t = useTranslations();\n const format = useFormatter();\n const generateUrl = usePageUrlGenerator();\n const { howToType, title, summary, updatedAt, prev, next, children } = props;\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\" })}>{t(\"help.title\")}</Link>\n {\" · \"}\n <Link href={generateUrl({ page: `/help/${howToType}` })}>{t(`help.modes.${howToType}`)}</Link>\n </nav>\n <h1>{title}</h1>\n {summary ? <p className=\"text-muted-foreground !mt-0 text-base\">{summary}</p> : null}\n {children}\n <hr className=\"my-6\" />\n {updatedAt ? (\n <div className=\"text-muted-foreground text-xs\">\n <span>\n {t(\"help.article.lastUpdated\", {\n date: format.dateTime(new Date(updatedAt), { dateStyle: \"short\" }),\n })}\n </span>\n </div>\n ) : null}\n <div className=\"mt-4 flex justify-between text-sm\">\n {prev ? (\n <Link href={generateUrl({ page: `/help/${prev.howToType}/${prev.slug}` })}>\n ← {t(\"help.article.previous\")}: {prev.title}\n </Link>\n ) : (\n <span />\n )}\n {next ? (\n <Link href={generateUrl({ page: `/help/${next.howToType}/${next.slug}` })}>\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\";\nimport { MicroLabel } from \"../../../components/typography\";\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 <MicroLabel className=\"mb-2\">{t(\"help.toc.title\")}</MicroLabel>\n <ul className=\"space-y-1 text-sm\">\n {headings.map((h) => (\n <li key={h.slug} style={{ paddingInlineStart: `${(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 { useEffect, 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 { HowToService } from \"../../how-to/data/HowToService\";\nimport type { HowToInterface } from \"../../how-to/data/HowToInterface\";\n\nexport function HelpHint({ contextKey }: { contextKey: string }) {\n const t = useTranslations();\n const generateUrl = usePageUrlGenerator();\n const [open, setOpen] = useState(false);\n const [picked, setPicked] = useState<HowToInterface | null>(null);\n\n const [articles, setArticles] = useState<HowToInterface[]>([]);\n useEffect(() => {\n let active = true;\n HowToService.findPublished()\n .then((list) => active && setArticles(list))\n .catch(() => active && setArticles([]));\n return () => {\n active = false;\n };\n }, []);\n\n const matches = useMemo(\n () => articles.filter((a) => a.contextualKeys.includes(contextKey) && !a.draft),\n [articles, 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=\"end\" className=\"w-full max-w-md sm:max-w-lg\">\n <SheetHeader>\n <SheetTitle>{active ? active.name : 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={generateUrl({ page: `/help/${active.howToType}/${active.slug}` })} 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-start text-sm\"\n >\n <div className=\"font-medium\">{a.name}</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 { useEffect, useState } from \"react\";\nimport { LifeBuoyIcon, ArrowUpRightIcon } from \"lucide-react\";\nimport { CommandItem } from \"../../../shadcnui\";\nimport { usePageUrlGenerator } from \"../../../client\";\nimport { HowToService } from \"../../how-to/data/HowToService\";\nimport type { HowToInterface } from \"../../how-to/data/HowToInterface\";\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 [article, setArticle] = useState<HowToInterface | null>(null);\n useEffect(() => {\n let active = true;\n HowToService.findOne({ id: result.id })\n .then((a) => active && setArticle(a))\n .catch(() => active && setArticle(null));\n return () => {\n active = false;\n };\n }, [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.howToType}/${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.name}</span>\n <span className=\"text-muted-foreground truncate text-xs\">\n {t(`help.modes.${article.howToType}`)} · {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","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","/**\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.title\",\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.sideNav.label\",\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"]}
@@ -23,14 +23,14 @@ import {
23
23
  useAssistantContext,
24
24
  useCurrentUserContext,
25
25
  usePageUrlGenerator
26
- } from "../../chunk-6ISF5KNQ.mjs";
26
+ } from "../../chunk-2VXDZRYY.mjs";
27
27
  import {
28
28
  _getStaticHelpContent
29
- } from "../../chunk-ZO3QQ5CQ.mjs";
29
+ } from "../../chunk-MQDR6MEE.mjs";
30
30
  import "../../chunk-PW42LRSL.mjs";
31
31
  import {
32
32
  HowToService
33
- } from "../../chunk-ZZ6E33FO.mjs";
33
+ } from "../../chunk-6DRSSW5O.mjs";
34
34
  import "../../chunk-AUXK7QSA.mjs";
35
35
  import "../../chunk-PI56A4DG.mjs";
36
36
  import "../../chunk-V5MI7RNB.mjs";
@@ -147,7 +147,7 @@ function HelpHeader() {
147
147
  const { currentUser } = useCurrentUserContext();
148
148
  const { brand } = useHelp();
149
149
  const logo = brand?.logo;
150
- const label = brand?.label ?? "Help";
150
+ const label = brand?.label ?? t("help.title");
151
151
  const appHref = brand?.appHref ?? "/";
152
152
  return /* @__PURE__ */ jsxs3("header", { className: "border-border bg-background flex items-center justify-between border-b px-4 py-3 max-md:gap-2", children: [
153
153
  /* @__PURE__ */ jsxs3(Link, { href: "/help", className: "flex items-center gap-2 max-md:min-w-0", children: [
@@ -233,7 +233,7 @@ function HelpSideNav() {
233
233
  [articles]
234
234
  );
235
235
  const isActive = /* @__PURE__ */ __name((mode, slug) => pathname.endsWith(`/help/${mode}/${slug}`), "isActive");
236
- return /* @__PURE__ */ jsxs4("nav", { "aria-label": "Help navigation", className: "flex h-full flex-col gap-3 overflow-y-auto p-4", children: [
236
+ return /* @__PURE__ */ jsxs4("nav", { "aria-label": t("help.sideNav.label"), className: "flex h-full flex-col gap-3 overflow-y-auto p-4", children: [
237
237
  /* @__PURE__ */ jsx5(
238
238
  "input",
239
239
  {
@@ -287,7 +287,7 @@ function HelpArticleBody(props) {
287
287
  const { howToType, title, summary, updatedAt, prev, next, children } = props;
288
288
  return /* @__PURE__ */ jsxs5("article", { className: "prose dark:prose-invert max-w-none", children: [
289
289
  /* @__PURE__ */ jsxs5("nav", { className: "text-muted-foreground mb-2 text-xs", children: [
290
- /* @__PURE__ */ jsx6(Link3, { href: generateUrl({ page: "/help" }), children: "Help" }),
290
+ /* @__PURE__ */ jsx6(Link3, { href: generateUrl({ page: "/help" }), children: t("help.title") }),
291
291
  " \xB7 ",
292
292
  /* @__PURE__ */ jsx6(Link3, { href: generateUrl({ page: `/help/${howToType}` }), children: t(`help.modes.${howToType}`) })
293
293
  ] }),
@@ -477,12 +477,14 @@ __name(modeUrl, "modeUrl");
477
477
 
478
478
  // src/features/help/i18n-keys.ts
479
479
  var HELP_I18N_KEYS = [
480
+ "help.title",
480
481
  "help.modes.tutorial",
481
482
  "help.modes.how-to",
482
483
  "help.modes.reference",
483
484
  "help.modes.explanation",
484
485
  "help.sideNav.filterPlaceholder",
485
486
  "help.sideNav.noMatches",
487
+ "help.sideNav.label",
486
488
  "help.toc.title",
487
489
  "help.article.lastUpdated",
488
490
  "help.article.previous",