@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.
- package/dist/{AssistantMessageInterface-CubxuBIJ.d.ts → AssistantMessageInterface-DHJJO_Z_.d.ts} +1 -1
- package/dist/{AssistantMessageInterface-sHjI2zPN.d.mts → AssistantMessageInterface-S7oyERTT.d.mts} +1 -1
- package/dist/{BlockNoteEditor-VOYKZOP5.mjs → BlockNoteEditor-HXAHDJA7.mjs} +34 -27
- package/dist/BlockNoteEditor-HXAHDJA7.mjs.map +1 -0
- package/dist/{BlockNoteEditor-BENYTTCZ.js → BlockNoteEditor-LLCZDFLZ.js} +50 -43
- package/dist/BlockNoteEditor-LLCZDFLZ.js.map +1 -0
- package/dist/{BlockNoteViewer-USLR4Y7C.js → BlockNoteViewer-77CCTC2U.js} +3 -3
- package/dist/{BlockNoteViewer-USLR4Y7C.js.map → BlockNoteViewer-77CCTC2U.js.map} +1 -1
- package/dist/{BlockNoteViewer-Y2ZM4ESA.mjs → BlockNoteViewer-MDPO6BXN.mjs} +2 -2
- package/dist/{auth.interface-Df4vXbNz.d.mts → auth.interface-CeFCz9NU.d.mts} +1 -1
- package/dist/{auth.interface-BzI4onI_.d.ts → auth.interface-D1R7VVky.d.ts} +1 -1
- package/dist/billing/index.d.mts +40 -6
- package/dist/billing/index.d.ts +40 -6
- package/dist/billing/index.js +806 -774
- package/dist/billing/index.js.map +1 -1
- package/dist/billing/index.mjs +494 -462
- package/dist/billing/index.mjs.map +1 -1
- package/dist/{chunk-6ISF5KNQ.mjs → chunk-2VXDZRYY.mjs} +1103 -816
- package/dist/chunk-2VXDZRYY.mjs.map +1 -0
- package/dist/{chunk-4BZJ4LAB.js → chunk-4ORLPEK7.js} +136 -104
- package/dist/chunk-4ORLPEK7.js.map +1 -0
- package/dist/{chunk-ZZ6E33FO.mjs → chunk-6DRSSW5O.mjs} +36 -4
- package/dist/chunk-6DRSSW5O.mjs.map +1 -0
- package/dist/{chunk-KS6WZP2E.js → chunk-6SMJRAE3.js} +4 -4
- package/dist/{chunk-KS6WZP2E.js.map → chunk-6SMJRAE3.js.map} +1 -1
- package/dist/{chunk-WQ77CUUZ.js → chunk-GPXYQMOZ.js} +7 -7
- package/dist/{chunk-WQ77CUUZ.js.map → chunk-GPXYQMOZ.js.map} +1 -1
- package/dist/{chunk-46S3KPLU.mjs → chunk-ILFFC6BG.mjs} +2 -2
- package/dist/{chunk-HZVVRIJQ.mjs → chunk-IUS2RHCX.mjs} +2 -2
- package/dist/{chunk-F7RNBGHS.js → chunk-KJMMBUOA.js} +3 -3
- package/dist/{chunk-F7RNBGHS.js.map → chunk-KJMMBUOA.js.map} +1 -1
- package/dist/{chunk-ZO3QQ5CQ.mjs → chunk-MQDR6MEE.mjs} +2 -2
- package/dist/{chunk-ORU7KLCY.js → chunk-VDVIUDY5.js} +1445 -1158
- package/dist/chunk-VDVIUDY5.js.map +1 -0
- package/dist/client/index.d.mts +20 -6
- package/dist/client/index.d.ts +20 -6
- package/dist/client/index.js +6 -4
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +5 -3
- package/dist/components/index.d.mts +59 -21
- package/dist/components/index.d.ts +59 -21
- package/dist/components/index.js +4 -4
- package/dist/components/index.mjs +3 -3
- package/dist/{config-CEAq4Ozy.d.mts → config-BP2vyddw.d.mts} +5 -0
- package/dist/{config-DydDHCfb.d.ts → config-BhW2QrRD.d.ts} +5 -0
- package/dist/contexts/index.d.mts +4 -4
- package/dist/contexts/index.d.ts +4 -4
- package/dist/contexts/index.js +4 -4
- package/dist/contexts/index.mjs +3 -3
- package/dist/core/index.d.mts +17 -9
- package/dist/core/index.d.ts +17 -9
- package/dist/core/index.js +4 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +3 -1
- package/dist/features/analytics/index.d.mts +1 -1
- package/dist/features/analytics/index.d.ts +1 -1
- package/dist/features/analytics/index.js +122 -122
- package/dist/features/analytics/index.mjs +4 -4
- package/dist/features/analytics/server.js +4 -4
- package/dist/features/analytics/server.mjs +2 -2
- package/dist/features/help/index.d.mts +1 -1
- package/dist/features/help/index.d.ts +1 -1
- package/dist/features/help/index.js +42 -40
- package/dist/features/help/index.js.map +1 -1
- package/dist/features/help/index.mjs +8 -6
- package/dist/features/help/index.mjs.map +1 -1
- package/dist/features/tokenusage/index.js +125 -125
- package/dist/features/tokenusage/index.mjs +4 -4
- package/dist/index.d.mts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -2
- package/dist/{notification.interface-P_pNfzZQ.d.mts → notification.interface-BB6GPpZY.d.mts} +1 -1
- package/dist/{notification.interface-BNCvnVCW.d.ts → notification.interface-CmAGrijJ.d.ts} +1 -1
- package/dist/{s3.service-CbUa6a-8.d.ts → s3.service-C-4YpEMu.d.ts} +7 -3
- package/dist/{s3.service-DAp8FbuG.d.mts → s3.service-dVj-nxMl.d.mts} +7 -3
- package/dist/server/index.d.mts +4 -4
- package/dist/server/index.d.ts +4 -4
- package/dist/server/index.js +3 -3
- package/dist/server/index.mjs +2 -2
- package/dist/{useSocket-BHVIyigI.d.ts → useSocket-B0H9pmmH.d.ts} +1 -1
- package/dist/{useSocket-B9gTbuCj.d.mts → useSocket-B5RQb6v2.d.mts} +1 -1
- package/dist/{user.interface-CrmwJLYW.d.ts → user.interface-C0ZdsBZj.d.ts} +2 -0
- package/dist/{user.interface-CSaGWFbg.d.mts → user.interface-CIWGlbqM.d.mts} +2 -0
- package/package.json +1 -1
- package/scripts/vitest-slow-tests.reporter.spec.ts +54 -0
- package/src/components/containers/RoundPageContainer.tsx +3 -1
- package/src/components/containers/RoundPageContainerTitle.tsx +5 -2
- package/src/components/editors/BlockNoteEditor.tsx +31 -15
- package/src/components/editors/BlockNoteEditorAiActions.tsx +11 -7
- package/src/components/editors/__tests__/BlockNoteEditorAiActions.test.ts +10 -3
- package/src/components/errors/ErrorDetails.tsx +5 -2
- package/src/components/forms/CommonAssociationForm.tsx +1 -1
- package/src/components/forms/EntityMultiSelector.tsx +6 -2
- package/src/components/forms/EntitySelector.tsx +4 -1
- package/src/components/forms/FileUploader.tsx +3 -2
- package/src/components/forms/MultiFileUploader.tsx +3 -1
- package/src/components/navigations/Breadcrumb.tsx +3 -2
- package/src/components/navigations/Header.tsx +3 -1
- package/src/components/navigations/MobileNavigationBar.tsx +3 -1
- package/src/components/navigations/__tests__/Header.spec.tsx +2 -2
- package/src/components/tables/cells/cell.id.tsx +13 -2
- package/src/core/abstracts/AbstractService.ts +3 -3
- package/src/core/abstracts/ClientAbstractService.ts +3 -2
- package/src/features/assistant-action/components/ApprovalActionCard.tsx +74 -5
- package/src/features/assistant-action/components/__tests__/ApprovalActionCard.spec.tsx +81 -0
- package/src/features/assistant-message/components/parts/RelevanceMeter.tsx +4 -1
- package/src/features/assistant-message/components/parts/tabs/UsersTab.tsx +2 -1
- package/src/features/auth/components/buttons/GoogleSignInButton.tsx +4 -1
- package/src/features/auth/components/details/LandingComponent.tsx +1 -1
- package/src/features/auth/components/forms/ForgotPassword.tsx +1 -1
- package/src/features/auth/components/forms/Login.tsx +1 -1
- package/src/features/auth/components/forms/Register.tsx +1 -1
- package/src/features/auth/components/forms/ResetPassword.tsx +2 -2
- package/src/features/auth/components/two-factor/BackupCodesDialog.tsx +1 -1
- package/src/features/auth/components/two-factor/PasskeyButton.tsx +1 -1
- package/src/features/billing/components/cards/BillingUsageSummaryCard.tsx +21 -11
- package/src/features/billing/components/cards/CustomerInfoCard.tsx +16 -13
- package/src/features/billing/components/cards/InvoicesSummaryCard.tsx +33 -21
- package/src/features/billing/components/cards/PaymentMethodSummaryCard.tsx +20 -10
- package/src/features/billing/components/cards/SubscriptionSummaryCard.tsx +35 -22
- package/src/features/billing/components/containers/BillingDashboardContainer.tsx +24 -24
- package/src/features/billing/components/utils/__tests__/billing-formatters.spec.ts +63 -0
- package/src/features/billing/components/utils/currency.ts +67 -10
- package/src/features/billing/components/utils/date.ts +9 -4
- package/src/features/billing/components/utils/format-options.ts +20 -0
- package/src/features/billing/components/utils/index.ts +3 -1
- package/src/features/billing/components/utils/useBillingFormatOptions.ts +11 -0
- package/src/features/billing/components/widgets/BillingAlertBanner.tsx +8 -9
- package/src/features/billing/contexts/PriceContext.tsx +18 -6
- package/src/features/billing/i18n-keys.ts +212 -0
- package/src/features/billing/stripe-customer/components/containers/PaymentMethodsContainer.tsx +8 -8
- package/src/features/billing/stripe-customer/components/details/PaymentMethodCard.tsx +11 -9
- package/src/features/billing/stripe-customer/components/forms/PaymentMethodEditor.tsx +4 -4
- package/src/features/billing/stripe-customer/components/forms/PaymentMethodForm.tsx +9 -7
- package/src/features/billing/stripe-invoice/components/containers/InvoicesContainer.tsx +10 -8
- package/src/features/billing/stripe-invoice/components/details/InvoiceDetails.tsx +34 -29
- package/src/features/billing/stripe-invoice/components/lists/InvoicesList.tsx +12 -9
- package/src/features/billing/stripe-invoice/components/widgets/InvoiceStatusBadge.tsx +9 -6
- package/src/features/billing/stripe-price/components/details/PriceDetails.tsx +4 -3
- package/src/features/billing/stripe-price/components/forms/PriceArchiver.tsx +3 -1
- package/src/features/billing/stripe-price/components/forms/PriceEditor.tsx +3 -1
- package/src/features/billing/stripe-price/hooks/useStripePriceTableStructure.tsx +6 -5
- package/src/features/billing/stripe-promotion-code/components/PromoCodeInput.tsx +12 -7
- package/src/features/billing/stripe-promotion-code/data/stripe-promotion-code.service.ts +3 -1
- package/src/features/billing/stripe-subscription/components/containers/SubscriptionsContainer.tsx +10 -6
- package/src/features/billing/stripe-subscription/components/details/SubscriptionDetails.tsx +44 -29
- package/src/features/billing/stripe-subscription/components/forms/CancelSubscriptionDialog.tsx +14 -11
- package/src/features/billing/stripe-subscription/components/lists/SubscriptionsList.tsx +20 -17
- package/src/features/billing/stripe-subscription/components/widgets/IntervalToggle.tsx +4 -2
- package/src/features/billing/stripe-subscription/components/widgets/PricingCard.tsx +16 -7
- package/src/features/billing/stripe-subscription/components/widgets/ProductPricingList.tsx +3 -1
- package/src/features/billing/stripe-subscription/components/widgets/ProductPricingRow.tsx +3 -1
- package/src/features/billing/stripe-subscription/components/widgets/ProrationPreview.tsx +12 -7
- package/src/features/billing/stripe-subscription/components/widgets/SubscriptionConfirmation.tsx +11 -8
- package/src/features/billing/stripe-subscription/components/widgets/SubscriptionStatusBadge.tsx +13 -10
- package/src/features/billing/stripe-subscription/components/wizards/SubscriptionWizard.tsx +8 -6
- package/src/features/billing/stripe-subscription/components/wizards/WizardProgressIndicator.tsx +7 -4
- package/src/features/billing/stripe-subscription/components/wizards/WizardStepPaymentMethod.tsx +4 -2
- package/src/features/billing/stripe-subscription/components/wizards/WizardStepPlanSelection.tsx +3 -1
- package/src/features/billing/stripe-subscription/components/wizards/WizardStepReview.tsx +37 -28
- package/src/features/billing/stripe-subscription/hooks/useConfirmSubscriptionPayment.ts +9 -7
- package/src/features/billing/stripe-subscription/hooks/useSubscriptionWizard.ts +20 -9
- package/src/features/billing/stripe-usage/components/containers/UsageContainer.tsx +6 -6
- package/src/features/billing/stripe-usage/components/details/UsageSummaryCard.tsx +24 -9
- package/src/features/billing/stripe-usage/components/lists/UsageHistoryTable.tsx +16 -12
- package/src/features/company/components/details/TokenStatusIndicator.tsx +7 -5
- package/src/features/company/components/forms/CompanyEditor.tsx +2 -2
- package/src/features/help/components/HelpArticleBody.tsx +1 -1
- package/src/features/help/components/HelpHeader.tsx +1 -1
- package/src/features/help/components/HelpSideNav.tsx +1 -1
- package/src/features/help/i18n-keys.ts +2 -0
- package/src/features/notification/components/common/NotificationErrorBoundary.tsx +17 -12
- package/src/features/notification/components/containers/NotificationsListContainer.tsx +4 -2
- package/src/features/notification/components/notifications/Notification.tsx +6 -3
- package/src/features/notification/contexts/NotificationContext.tsx +9 -4
- package/src/features/notification/contexts/__tests__/NotificationContext.spec.tsx +13 -0
- package/src/features/notification/hooks/useNotificationTableStructure.tsx +4 -2
- package/src/features/oauth/components/OAuthClientCard.tsx +13 -7
- package/src/features/oauth/components/OAuthClientDetail.tsx +34 -30
- package/src/features/oauth/components/OAuthClientForm.tsx +24 -24
- package/src/features/oauth/components/OAuthClientList.tsx +10 -6
- package/src/features/oauth/components/OAuthClientSecretDisplay.tsx +10 -8
- package/src/features/oauth/components/OAuthRedirectUriInput.tsx +9 -13
- package/src/features/oauth/components/OAuthScopeSelector.tsx +15 -6
- package/src/features/oauth/components/__tests__/OAuthClientForm.spec.tsx +11 -9
- package/src/features/oauth/components/consent/OAuthScopeList.tsx +4 -2
- package/src/features/oauth/hooks/__tests__/useOAuthScopeText.spec.ts +30 -0
- package/src/features/oauth/hooks/index.ts +1 -0
- package/src/features/oauth/hooks/useOAuthClient.ts +11 -5
- package/src/features/oauth/hooks/useOAuthClients.ts +9 -3
- package/src/features/oauth/hooks/useOAuthConsent.ts +11 -5
- package/src/features/oauth/hooks/useOAuthScopeText.ts +33 -0
- package/src/features/rbac/components/RbacByRoleContainer.tsx +7 -6
- package/src/features/rbac/components/RbacContainer.tsx +7 -6
- package/src/features/rbac/contexts/RbacContext.tsx +3 -3
- package/src/features/user/components/containers/UserContainer.tsx +3 -1
- package/src/features/user/data/__tests__/user.test.ts +66 -0
- package/src/features/user/data/user.interface.ts +2 -0
- package/src/features/user/data/user.service.ts +9 -0
- package/src/features/user/data/user.ts +7 -0
- package/src/features/waitlist/components/forms/WaitlistForm.tsx +1 -1
- package/src/features/waitlist/components/lists/WaitlistList.tsx +1 -1
- package/src/i18n/__tests__/config.test.ts +21 -1
- package/src/i18n/config.ts +13 -0
- package/src/i18n/index.ts +1 -0
- package/src/shadcnui/custom/multi-select.tsx +47 -14
- package/src/shadcnui/custom/multiple-selector.tsx +14 -2
- package/src/shadcnui/ui/__tests__/use-ui-text.test.tsx +76 -0
- package/src/shadcnui/ui/breadcrumb.tsx +9 -2
- package/src/shadcnui/ui/carousel.tsx +15 -4
- package/src/shadcnui/ui/dialog.tsx +15 -2
- package/src/shadcnui/ui/sheet.tsx +6 -1
- package/src/shadcnui/ui/sidebar.tsx +33 -7
- package/src/shadcnui/ui/spinner.tsx +6 -1
- package/src/shadcnui/ui/use-ui-text.ts +49 -0
- package/src/utils/__tests__/date-formatter.test.ts +24 -1
- package/src/utils/date-formatter.ts +16 -0
- package/src/utils/index.ts +1 -1
- package/dist/BlockNoteEditor-BENYTTCZ.js.map +0 -1
- package/dist/BlockNoteEditor-VOYKZOP5.mjs.map +0 -1
- package/dist/chunk-4BZJ4LAB.js.map +0 -1
- package/dist/chunk-6ISF5KNQ.mjs.map +0 -1
- package/dist/chunk-ORU7KLCY.js.map +0 -1
- package/dist/chunk-ZZ6E33FO.mjs.map +0 -1
- /package/dist/{BlockNoteViewer-Y2ZM4ESA.mjs.map → BlockNoteViewer-MDPO6BXN.mjs.map} +0 -0
- /package/dist/{chunk-46S3KPLU.mjs.map → chunk-ILFFC6BG.mjs.map} +0 -0
- /package/dist/{chunk-HZVVRIJQ.mjs.map → chunk-IUS2RHCX.mjs.map} +0 -0
- /package/dist/{chunk-ZO3QQ5CQ.mjs.map → chunk-MQDR6MEE.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../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"],"sourcesContent":["\"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"],"mappings":"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","names":["useTranslations","useTranslations","jsx","Fragment","jsx","jsxs","useTranslations","jsx","jsxs","useTranslations","useMemo","useState","useTranslations","Link","useState","useState","jsx","jsxs","useTranslations","useState","useMemo","Link","Link","useTranslations","jsx","jsxs","useTranslations","Link","useEffect","useState","useTranslations","jsx","jsxs","useTranslations","useState","useEffect","useEffect","useMemo","useState","useTranslations","Link","jsx","jsxs","useTranslations","useState","useEffect","active","useMemo","Link","Link","useTranslations","useEffect","useState","jsx","jsxs","useTranslations","useState","useEffect","Link"]}
|
|
1
|
+
{"version":3,"sources":["../../../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"],"sourcesContent":["\"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"],"mappings":"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","names":["useTranslations","useTranslations","jsx","Fragment","jsx","jsxs","useTranslations","jsx","jsxs","useTranslations","useMemo","useState","useTranslations","Link","useState","useState","jsx","jsxs","useTranslations","useState","useMemo","Link","Link","useTranslations","jsx","jsxs","useTranslations","Link","useEffect","useState","useTranslations","jsx","jsxs","useTranslations","useState","useEffect","useEffect","useMemo","useState","useTranslations","Link","jsx","jsxs","useTranslations","useState","useEffect","active","useMemo","Link","Link","useTranslations","useEffect","useState","jsx","jsxs","useTranslations","useState","useEffect","Link"]}
|