@alfadocs/ui-kit-debug 1.102.0 → 1.103.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 (136) hide show
  1. package/dist/_chunks/{agenda-card-bRQ4j6U6.js → agenda-card-B8hV3dZV.js} +2 -2
  2. package/dist/_chunks/{agenda-card-bRQ4j6U6.js.map → agenda-card-B8hV3dZV.js.map} +1 -1
  3. package/dist/_chunks/{agenda-tray-CzE3E8GU.js → agenda-tray-Bu46s3dI.js} +2 -2
  4. package/dist/_chunks/{agenda-tray-CzE3E8GU.js.map → agenda-tray-Bu46s3dI.js.map} +1 -1
  5. package/dist/_chunks/{alia-sidebar-B5mu44g2.js → alia-sidebar-CKkg3gc8.js} +3 -3
  6. package/dist/_chunks/{alia-sidebar-B5mu44g2.js.map → alia-sidebar-CKkg3gc8.js.map} +1 -1
  7. package/dist/_chunks/{appointment-card-zPr0brha.js → appointment-card-FKOnH1uJ.js} +2 -2
  8. package/dist/_chunks/{appointment-card-zPr0brha.js.map → appointment-card-FKOnH1uJ.js.map} +1 -1
  9. package/dist/_chunks/{appointment-peek-xFTBany4.js → appointment-peek-DWfcpoGy.js} +2 -2
  10. package/dist/_chunks/{appointment-peek-xFTBany4.js.map → appointment-peek-DWfcpoGy.js.map} +1 -1
  11. package/dist/_chunks/{appointment-timeline-AKkVx9AN.js → appointment-timeline-eOi-y8m3.js} +2 -2
  12. package/dist/_chunks/{appointment-timeline-AKkVx9AN.js.map → appointment-timeline-eOi-y8m3.js.map} +1 -1
  13. package/dist/_chunks/{appointment-tray-B8qQBW65.js → appointment-tray-C6oBvsG5.js} +2 -2
  14. package/dist/_chunks/{appointment-tray-B8qQBW65.js.map → appointment-tray-C6oBvsG5.js.map} +1 -1
  15. package/dist/_chunks/{avatar-BoqdWsNe.js → avatar-Dp5apm1d.js} +61 -47
  16. package/dist/_chunks/{avatar-BoqdWsNe.js.map → avatar-Dp5apm1d.js.map} +1 -1
  17. package/dist/_chunks/{balance-badge-cell-C-Rz616n.js → balance-badge-cell-DGFm2jfP.js} +2 -2
  18. package/dist/_chunks/{balance-badge-cell-C-Rz616n.js.map → balance-badge-cell-DGFm2jfP.js.map} +1 -1
  19. package/dist/_chunks/{calendar-DVe5eArk.js → calendar-_sgjuH3L.js} +2 -2
  20. package/dist/_chunks/{calendar-DVe5eArk.js.map → calendar-_sgjuH3L.js.map} +1 -1
  21. package/dist/_chunks/{calendar-appointment-editor-dialog-EYyVorFR.js → calendar-appointment-editor-dialog-DL6V6xfj.js} +8 -8
  22. package/dist/_chunks/{calendar-appointment-editor-dialog-EYyVorFR.js.map → calendar-appointment-editor-dialog-DL6V6xfj.js.map} +1 -1
  23. package/dist/_chunks/{care-plan-header-lROoTjYn.js → care-plan-header-F4l0st2X.js} +2 -2
  24. package/dist/_chunks/{care-plan-header-lROoTjYn.js.map → care-plan-header-F4l0st2X.js.map} +1 -1
  25. package/dist/_chunks/{chat-message-CkBCAcwn.js → chat-message-CfIyXrxA.js} +2 -2
  26. package/dist/_chunks/{chat-message-CkBCAcwn.js.map → chat-message-CfIyXrxA.js.map} +1 -1
  27. package/dist/_chunks/{clinical-note-card--juv_ELr.js → clinical-note-card-BVkxGiGl.js} +2 -2
  28. package/dist/_chunks/{clinical-note-card--juv_ELr.js.map → clinical-note-card-BVkxGiGl.js.map} +1 -1
  29. package/dist/_chunks/{contact-profile-card-D0KqxoE5.js → contact-profile-card-LXbmhx48.js} +126 -128
  30. package/dist/_chunks/contact-profile-card-LXbmhx48.js.map +1 -0
  31. package/dist/_chunks/{dependent-selector-DRN0P0Kr.js → dependent-selector-D6y4Kjg5.js} +2 -2
  32. package/dist/_chunks/{dependent-selector-DRN0P0Kr.js.map → dependent-selector-D6y4Kjg5.js.map} +1 -1
  33. package/dist/_chunks/{entity-summary-B4p8zP1J.js → entity-summary-BKfR4Vws.js} +2 -2
  34. package/dist/_chunks/{entity-summary-B4p8zP1J.js.map → entity-summary-BKfR4Vws.js.map} +1 -1
  35. package/dist/_chunks/key-value-pair-Cg7gjL7J.js +287 -0
  36. package/dist/_chunks/key-value-pair-Cg7gjL7J.js.map +1 -0
  37. package/dist/_chunks/{link-cell-renderer-DKMgD-2v.js → link-cell-renderer-BRek9kz7.js} +2 -2
  38. package/dist/_chunks/{link-cell-renderer-DKMgD-2v.js.map → link-cell-renderer-BRek9kz7.js.map} +1 -1
  39. package/dist/_chunks/{marketplace-app-shell-D2qgIuXX.js → marketplace-app-shell-BsctSegT.js} +2 -2
  40. package/dist/_chunks/{marketplace-app-shell-D2qgIuXX.js.map → marketplace-app-shell-BsctSegT.js.map} +1 -1
  41. package/dist/_chunks/{message-card-BzJEITml.js → message-card-BG3_3nN1.js} +2 -2
  42. package/dist/_chunks/{message-card-BzJEITml.js.map → message-card-BG3_3nN1.js.map} +1 -1
  43. package/dist/_chunks/{message-tray-DiPgJbOb.js → message-tray-BjZv0Fsk.js} +2 -2
  44. package/dist/_chunks/{message-tray-DiPgJbOb.js.map → message-tray-BjZv0Fsk.js.map} +1 -1
  45. package/dist/_chunks/{notes-panel-BbNLYcdv.js → notes-panel-BjTpaz8d.js} +2 -2
  46. package/dist/_chunks/{notes-panel-BbNLYcdv.js.map → notes-panel-BjTpaz8d.js.map} +1 -1
  47. package/dist/_chunks/{operator-hero-BcuPTzS_.js → operator-hero-BELhrv9o.js} +37 -35
  48. package/dist/_chunks/{operator-hero-BcuPTzS_.js.map → operator-hero-BELhrv9o.js.map} +1 -1
  49. package/dist/_chunks/{patient-details-DoIOWP6j.js → patient-details-BXM3dRKb.js} +2 -2
  50. package/dist/_chunks/{patient-details-DoIOWP6j.js.map → patient-details-BXM3dRKb.js.map} +1 -1
  51. package/dist/_chunks/{patient-summary-card-B1jvxdY8.js → patient-summary-card-B4Ijw_ig.js} +3 -3
  52. package/dist/_chunks/{patient-summary-card-B1jvxdY8.js.map → patient-summary-card-B4Ijw_ig.js.map} +1 -1
  53. package/dist/_chunks/{payment-request-card-DPN5yklX.js → payment-request-card-CrXhB5H-.js} +2 -2
  54. package/dist/_chunks/{payment-request-card-DPN5yklX.js.map → payment-request-card-CrXhB5H-.js.map} +1 -1
  55. package/dist/_chunks/{periodontal-chart-X4_4WPK8.js → periodontal-chart-JmsaYYb7.js} +2 -2
  56. package/dist/_chunks/{periodontal-chart-X4_4WPK8.js.map → periodontal-chart-JmsaYYb7.js.map} +1 -1
  57. package/dist/_chunks/{periodontal-chart-card-BzL3YkEW.js → periodontal-chart-card-TxZBO6kb.js} +2 -2
  58. package/dist/_chunks/{periodontal-chart-card-BzL3YkEW.js.map → periodontal-chart-card-TxZBO6kb.js.map} +1 -1
  59. package/dist/_chunks/{practice-profile-hero-B8vykoci.js → practice-profile-hero-BAvGdQmt.js} +24 -20
  60. package/dist/_chunks/{practice-profile-hero-B8vykoci.js.map → practice-profile-hero-BAvGdQmt.js.map} +1 -1
  61. package/dist/_chunks/{practice-results-U-5kpnJa.js → practice-results-ChBP9x2r.js} +8 -4
  62. package/dist/_chunks/practice-results-ChBP9x2r.js.map +1 -0
  63. package/dist/_chunks/{public-footer-t6gx6sjn.js → public-footer-3Jy1zHSs.js} +248 -204
  64. package/dist/_chunks/public-footer-3Jy1zHSs.js.map +1 -0
  65. package/dist/_chunks/{signature-request-CQ0torGq.js → signature-request-DB6kePIm.js} +2 -2
  66. package/dist/_chunks/{signature-request-CQ0torGq.js.map → signature-request-DB6kePIm.js.map} +1 -1
  67. package/dist/_chunks/{signed-out-frame-BcQE00H1.js → signed-out-frame-Bs_LSPWe.js} +2 -2
  68. package/dist/_chunks/{signed-out-frame-BcQE00H1.js.map → signed-out-frame-Bs_LSPWe.js.map} +1 -1
  69. package/dist/_chunks/{timeline-tn5QQJdS.js → timeline-CKUaBZOx.js} +2 -2
  70. package/dist/_chunks/{timeline-tn5QQJdS.js.map → timeline-CKUaBZOx.js.map} +1 -1
  71. package/dist/_chunks/{use-appointment-details-read-BNtTap_B.js → use-appointment-details-read-DawTb1SQ.js} +4 -4
  72. package/dist/_chunks/{use-appointment-details-read-BNtTap_B.js.map → use-appointment-details-read-DawTb1SQ.js.map} +1 -1
  73. package/dist/_chunks/{workflow-map-Dm27iPKB.js → workflow-map-D_pyYK1B.js} +2 -2
  74. package/dist/_chunks/{workflow-map-Dm27iPKB.js.map → workflow-map-D_pyYK1B.js.map} +1 -1
  75. package/dist/agent-catalog.json +1 -1
  76. package/dist/components/agenda-card/index.js +1 -1
  77. package/dist/components/agenda-tray/index.js +1 -1
  78. package/dist/components/appointment-card/index.js +2 -2
  79. package/dist/components/appointment-details-panel/index.js +1 -1
  80. package/dist/components/appointment-peek/index.js +1 -1
  81. package/dist/components/appointment-timeline/index.js +1 -1
  82. package/dist/components/avatar/avatar.d.ts +10 -0
  83. package/dist/components/avatar/avatar.d.ts.map +1 -1
  84. package/dist/components/avatar/index.js +1 -1
  85. package/dist/components/calendar/index.js +1 -1
  86. package/dist/components/care-plan-header/index.js +1 -1
  87. package/dist/components/chat-message/index.js +1 -1
  88. package/dist/components/clinical-note-card/index.js +1 -1
  89. package/dist/components/contact-profile-card/contact-profile-card.d.ts +9 -0
  90. package/dist/components/contact-profile-card/contact-profile-card.d.ts.map +1 -1
  91. package/dist/components/contact-profile-card/index.js +1 -1
  92. package/dist/components/data-table/index.js +1 -1
  93. package/dist/components/dependent-selector/index.js +1 -1
  94. package/dist/components/entity-summary/index.js +1 -1
  95. package/dist/components/key-value-pair/index.d.ts +1 -1
  96. package/dist/components/key-value-pair/index.d.ts.map +1 -1
  97. package/dist/components/key-value-pair/index.js +3 -2
  98. package/dist/components/key-value-pair/key-value-pair.d.ts +20 -0
  99. package/dist/components/key-value-pair/key-value-pair.d.ts.map +1 -1
  100. package/dist/components/message-card/index.js +1 -1
  101. package/dist/components/message-tray/index.js +1 -1
  102. package/dist/components/notes-panel/index.js +1 -1
  103. package/dist/components/operator-hero/index.js +1 -1
  104. package/dist/components/operator-hero/operator-hero.d.ts.map +1 -1
  105. package/dist/components/patient-details/index.js +1 -1
  106. package/dist/components/patient-summary-card/index.js +1 -1
  107. package/dist/components/patient-table/index.js +1 -1
  108. package/dist/components/payment-card/index.js +1 -1
  109. package/dist/components/periodontal-chart/index.js +1 -1
  110. package/dist/components/periodontal-chart-card/index.js +1 -1
  111. package/dist/components/practice-profile-hero/index.js +1 -1
  112. package/dist/components/practice-profile-hero/practice-profile-hero.d.ts.map +1 -1
  113. package/dist/components/practice-results/index.js +1 -1
  114. package/dist/components/practice-results/practice-results.d.ts.map +1 -1
  115. package/dist/components/public-footer/index.d.ts +1 -1
  116. package/dist/components/public-footer/index.d.ts.map +1 -1
  117. package/dist/components/public-footer/index.js +1 -1
  118. package/dist/components/public-footer/public-footer.d.ts +29 -0
  119. package/dist/components/public-footer/public-footer.d.ts.map +1 -1
  120. package/dist/components/timeline/index.js +1 -1
  121. package/dist/components/workflow/index.js +1 -1
  122. package/dist/core.css +1 -1
  123. package/dist/host-compat.css +4 -1
  124. package/dist/index.js +865 -864
  125. package/dist/patterns/alia-assistant/index.js +1 -1
  126. package/dist/patterns/calendar/index.js +1 -1
  127. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  128. package/dist/patterns/signature-request/index.js +1 -1
  129. package/dist/patterns/signed-out-frame/index.js +1 -1
  130. package/dist/tokens.css +1 -1
  131. package/package.json +1 -1
  132. package/dist/_chunks/contact-profile-card-D0KqxoE5.js.map +0 -1
  133. package/dist/_chunks/key-value-pair-CB37UXsz.js +0 -210
  134. package/dist/_chunks/key-value-pair-CB37UXsz.js.map +0 -1
  135. package/dist/_chunks/practice-results-U-5kpnJa.js.map +0 -1
  136. package/dist/_chunks/public-footer-t6gx6sjn.js.map +0 -1
@@ -2,7 +2,7 @@ import { jsxs as d, jsx as e, Fragment as v } from "react/jsx-runtime";
2
2
  import { forwardRef as y } from "react";
3
3
  import { c as H } from "./index-D2ZczOXr.js";
4
4
  import { A as S } from "./app-frame-DUPEwu4E.js";
5
- import { P as x } from "./public-footer-t6gx6sjn.js";
5
+ import { P as x } from "./public-footer-3Jy1zHSs.js";
6
6
  import { useTranslation as b } from "react-i18next";
7
7
  import { B as u } from "./button-DohK_Ak_.js";
8
8
  import { H as N, g as O, f as F, a as z, d as B } from "./header-l_B8MV0g.js";
@@ -168,4 +168,4 @@ export {
168
168
  V as S,
169
169
  w as a
170
170
  };
171
- //# sourceMappingURL=signed-out-frame-BcQE00H1.js.map
171
+ //# sourceMappingURL=signed-out-frame-Bs_LSPWe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signed-out-frame-BcQE00H1.js","sources":["../../src/patterns/signed-out-frame/signed-out-header.tsx","../../src/patterns/signed-out-frame/signed-out-frame.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* SignedOutHeader — the app's Header as a visitor sees it before */\n/* sign-in: the brand, the skip link and the way to the other */\n/* signed-out pages. No search, inbox or account menu. */\n/* */\n/* A link shows only when the host gives its address. On the login page */\n/* that is the two ways to register; on a registration page it is the */\n/* way back to the login. */\n/* -------------------------------------------------------------------- */\n\nimport { forwardRef } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { LogIn, Stethoscope, User } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '../../components/button';\nimport {\n Header,\n HeaderBrand,\n HeaderEnd,\n HeaderSkipLink,\n HeaderStart,\n} from '../../components/header';\nimport { Logo } from '../../components/logo';\nimport { isSafeHref } from '../../components/_shared/safe-href';\n\nexport interface SignedOutHeaderProps {\n /** Where the brand leads. Default `/`. */\n homeHref?: string;\n /** The id of the `<main>` the skip link lands on. Default\n * `main-content`, `AppFrame`'s own default. */\n mainId?: string;\n /**\n * Adds \"Sign in\". For a registration page. A path on the same site, or\n * an address written in full (`https://…`); anything else shows no\n * link. The same rule holds for the two addresses below.\n */\n loginHref?: string;\n /** Adds \"Register as a doctor\". For the login page. */\n registerDoctorHref?: string;\n /** Adds \"Register as a patient\". For the login page. */\n registerPatientHref?: string;\n}\n\n// The header's buttons are the header turned inside out: the bar's ink as\n// the fill, the bar's own colour (`--header-brand-surface`) as the text.\n// Light: white with violet text (4.75:1). Dark: the bar is the page's navy,\n// so the text is navy too; fuchsia on the cream fill would be 2.75:1.\n//\n// Hover tints the fill with the bar. In the light theme that alone would\n// drop the violet text to 4.07:1, so the text deepens with it (4.76:1):\n// `--header-brand-surface-hover` is --primary-hover in light and stays the\n// navy in dark. The buttons carry no `--secondary-border` edge: the fill is\n// already the bar's ink.\n//\n// A small button is 32px tall from `sm` up and drops its wider hit box\n// there. These keep the hit box at every width: the bar is 64px tall, and\n// a tablet is touched as much as a phone.\nconst linksVariants = cva(\n 'ds:items-center ds:gap-[var(--spacing-sm)] ds:[--secondary:var(--header-foreground)] ds:[--secondary-hover:color-mix(in_srgb,var(--header-foreground)_88%,transparent)] ds:[--secondary-border:transparent] ds:[--secondary-foreground:var(--header-brand-surface,var(--primary))] ds:[&_a:hover]:[--secondary-foreground:var(--header-brand-surface-hover,var(--primary-hover))] ds:[&_a]:sm:before:block',\n {\n variants: {\n /** Labelled buttons from `md` up; icons only below it. */\n show: {\n wide: 'ds:hidden ds:md:inline-flex',\n narrow: 'ds:inline-flex ds:md:hidden',\n always: 'ds:inline-flex',\n },\n },\n defaultVariants: { show: 'always' },\n },\n);\n\n/** An address a link may use, or nothing. */\nconst linkTo = (href: string | undefined): string | undefined =>\n href && isSafeHref(href) ? href : undefined;\n\ninterface RegisterLinksProps {\n doctorHref: string | undefined;\n patientHref: string | undefined;\n hideLabel?: boolean;\n}\n\n/** The ways to open an account. Links, not buttons: each goes to its own\n * registration page. */\nfunction RegisterLinks({\n doctorHref,\n patientHref,\n hideLabel = false,\n}: RegisterLinksProps) {\n const { t } = useTranslation('ui');\n return (\n <>\n {doctorHref && (\n <Button\n asChild\n intent=\"secondary\"\n size=\"sm\"\n startIcon={<Stethoscope />}\n hideLabel={hideLabel}\n >\n <a href={doctorHref} data-action=\"register-doctor\">\n {t('signedOutHeader.registerDoctor')}\n </a>\n </Button>\n )}\n {patientHref && (\n <Button\n asChild\n intent=\"secondary\"\n size=\"sm\"\n startIcon={<User />}\n hideLabel={hideLabel}\n >\n <a href={patientHref} data-action=\"register-patient\">\n {t('signedOutHeader.registerPatient')}\n </a>\n </Button>\n )}\n </>\n );\n}\n\n/**\n * The signed-out header. `SignedOutFrame` renders it; use it on its own\n * only with a frame of your own.\n */\nexport const SignedOutHeader = forwardRef<HTMLElement, SignedOutHeaderProps>(\n (\n {\n homeHref = '/',\n mainId = 'main-content',\n loginHref,\n registerDoctorHref,\n registerPatientHref,\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const loginLink = linkTo(loginHref);\n const doctorLink = linkTo(registerDoctorHref);\n const patientLink = linkTo(registerPatientHref);\n const hasRegister = Boolean(doctorLink || patientLink);\n\n return (\n <Header ref={ref}>\n <HeaderStart>\n <HeaderSkipLink href={`#${mainId}`} />\n <HeaderBrand\n href={linkTo(homeHref) ?? '/'}\n logo={<Logo variant=\"monochrome\" size=\"md\" decorative />}\n aria-label={t('publicHeader.homeLabel')}\n />\n </HeaderStart>\n {(loginLink || hasRegister) && (\n <HeaderEnd>\n {/* One short label: it keeps its text on a phone. */}\n {loginLink && (\n <div className={linksVariants()}>\n <Button\n asChild\n intent=\"secondary\"\n size=\"sm\"\n startIcon={<LogIn />}\n >\n <a href={loginLink} data-action=\"login\">\n {t('signedOutHeader.login')}\n </a>\n </Button>\n </div>\n )}\n {/* Two labelled buttons and the brand do not fit a phone, so\n below `md` each folds to its icon and keeps its name for a\n screen reader. */}\n {hasRegister && (\n <>\n <div className={linksVariants({ show: 'wide' })}>\n <RegisterLinks\n doctorHref={doctorLink}\n patientHref={patientLink}\n />\n </div>\n <div className={linksVariants({ show: 'narrow' })}>\n <RegisterLinks\n doctorHref={doctorLink}\n patientHref={patientLink}\n hideLabel\n />\n </div>\n </>\n )}\n </HeaderEnd>\n )}\n </Header>\n );\n },\n);\nSignedOutHeader.displayName = 'SignedOutHeader';\n","/* -------------------------------------------------------------------- */\n/* SignedOutFrame — the app frame as a visitor sees it before sign-in. */\n/* */\n/* The signed-out header on top, no sidebar, the page's content centred */\n/* on the app's canvas, and the minimal footer with the privacy policy */\n/* and the terms. The login, forgot-password and registration pages */\n/* wear it, so they read as one family. */\n/* -------------------------------------------------------------------- */\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { AppFrame } from '../../components/app-frame';\nimport {\n PublicFooter,\n type LegalUrlOverrides,\n} from '../../components/public-footer';\nimport {\n SignedOutHeader,\n type SignedOutHeaderProps,\n} from './signed-out-header';\n\nexport interface SignedOutFrameProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n SignedOutHeaderProps {\n /** The page: a card such as `LoginForm`, centred in `<main>`. */\n children: ReactNode;\n /** Shows the footer with the privacy policy and the terms. Default\n * true. */\n showFooter?: boolean;\n /**\n * Adds the footer's copyright line: the year, the company's registered\n * name and its VAT number. Default false.\n */\n showCopyright?: boolean;\n /** The site the footer's legal links lead to. Default: the footer's\n * own, `https://www.alfadocs.com`. */\n marketingBaseUrl?: string;\n /** The footer's legal links, per language, where they differ from its\n * defaults. */\n legalUrlOverrides?: LegalUrlOverrides;\n}\n\n// The wrapper is only a marker: the frame inside it is the box. It has\n// no box of its own (`display: contents`), so a `className` that sizes or\n// spaces it does nothing, and a ref to it measures nothing.\nconst signedOutFrameVariants = cva('ds:contents');\n\n/**\n * The signed-out app frame. It is one viewport tall: the header and the\n * footer stay put and the content scrolls between them.\n */\nexport const SignedOutFrame = forwardRef<HTMLDivElement, SignedOutFrameProps>(\n (\n {\n children,\n homeHref,\n mainId = 'main-content',\n loginHref,\n registerDoctorHref,\n registerPatientHref,\n showFooter = true,\n showCopyright = false,\n marketingBaseUrl,\n legalUrlOverrides,\n className,\n ...rest\n },\n ref,\n ) => (\n <div\n ref={ref}\n {...rest}\n data-component=\"signed-out-frame\"\n className={signedOutFrameVariants({ className })}\n >\n {/* `<main>` is a size container, so the content can be exactly as\n tall as the space between the header and the footer (`100cqh`)\n and centre in it, whatever height the footer wraps to on a\n phone. */}\n <AppFrame\n header={\n <SignedOutHeader\n homeHref={homeHref}\n mainId={mainId}\n loginHref={loginHref}\n registerDoctorHref={registerDoctorHref}\n registerPatientHref={registerPatientHref}\n />\n }\n sidebar={null}\n footer={\n showFooter ? (\n <PublicFooter\n variant=\"minimal\"\n showCopyright={showCopyright}\n marketingBaseUrl={marketingBaseUrl}\n legalUrlOverrides={legalUrlOverrides}\n />\n ) : undefined\n }\n mainId={mainId}\n padded={false}\n mainClassName=\"ds:bg-[color:var(--app-shell-background)] ds:[container-type:size]\"\n >\n <div className=\"ds:flex ds:min-h-[100cqh] ds:w-full ds:items-center ds:justify-center ds:p-0 ds:sm:p-[var(--spacing-lg)]\">\n {children}\n </div>\n </AppFrame>\n </div>\n ),\n);\nSignedOutFrame.displayName = 'SignedOutFrame';\n"],"names":["linksVariants","cva","linkTo","href","isSafeHref","RegisterLinks","doctorHref","patientHref","hideLabel","t","useTranslation","jsxs","Fragment","jsx","Button","Stethoscope","User","SignedOutHeader","forwardRef","homeHref","mainId","loginHref","registerDoctorHref","registerPatientHref","ref","loginLink","doctorLink","patientLink","hasRegister","Header","HeaderStart","HeaderSkipLink","HeaderBrand","Logo","HeaderEnd","LogIn","signedOutFrameVariants","SignedOutFrame","children","showFooter","showCopyright","marketingBaseUrl","legalUrlOverrides","className","rest","AppFrame","PublicFooter"],"mappings":"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"}
1
+ {"version":3,"file":"signed-out-frame-Bs_LSPWe.js","sources":["../../src/patterns/signed-out-frame/signed-out-header.tsx","../../src/patterns/signed-out-frame/signed-out-frame.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* SignedOutHeader — the app's Header as a visitor sees it before */\n/* sign-in: the brand, the skip link and the way to the other */\n/* signed-out pages. No search, inbox or account menu. */\n/* */\n/* A link shows only when the host gives its address. On the login page */\n/* that is the two ways to register; on a registration page it is the */\n/* way back to the login. */\n/* -------------------------------------------------------------------- */\n\nimport { forwardRef } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { LogIn, Stethoscope, User } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '../../components/button';\nimport {\n Header,\n HeaderBrand,\n HeaderEnd,\n HeaderSkipLink,\n HeaderStart,\n} from '../../components/header';\nimport { Logo } from '../../components/logo';\nimport { isSafeHref } from '../../components/_shared/safe-href';\n\nexport interface SignedOutHeaderProps {\n /** Where the brand leads. Default `/`. */\n homeHref?: string;\n /** The id of the `<main>` the skip link lands on. Default\n * `main-content`, `AppFrame`'s own default. */\n mainId?: string;\n /**\n * Adds \"Sign in\". For a registration page. A path on the same site, or\n * an address written in full (`https://…`); anything else shows no\n * link. The same rule holds for the two addresses below.\n */\n loginHref?: string;\n /** Adds \"Register as a doctor\". For the login page. */\n registerDoctorHref?: string;\n /** Adds \"Register as a patient\". For the login page. */\n registerPatientHref?: string;\n}\n\n// The header's buttons are the header turned inside out: the bar's ink as\n// the fill, the bar's own colour (`--header-brand-surface`) as the text.\n// Light: white with violet text (4.75:1). Dark: the bar is the page's navy,\n// so the text is navy too; fuchsia on the cream fill would be 2.75:1.\n//\n// Hover tints the fill with the bar. In the light theme that alone would\n// drop the violet text to 4.07:1, so the text deepens with it (4.76:1):\n// `--header-brand-surface-hover` is --primary-hover in light and stays the\n// navy in dark. The buttons carry no `--secondary-border` edge: the fill is\n// already the bar's ink.\n//\n// A small button is 32px tall from `sm` up and drops its wider hit box\n// there. These keep the hit box at every width: the bar is 64px tall, and\n// a tablet is touched as much as a phone.\nconst linksVariants = cva(\n 'ds:items-center ds:gap-[var(--spacing-sm)] ds:[--secondary:var(--header-foreground)] ds:[--secondary-hover:color-mix(in_srgb,var(--header-foreground)_88%,transparent)] ds:[--secondary-border:transparent] ds:[--secondary-foreground:var(--header-brand-surface,var(--primary))] ds:[&_a:hover]:[--secondary-foreground:var(--header-brand-surface-hover,var(--primary-hover))] ds:[&_a]:sm:before:block',\n {\n variants: {\n /** Labelled buttons from `md` up; icons only below it. */\n show: {\n wide: 'ds:hidden ds:md:inline-flex',\n narrow: 'ds:inline-flex ds:md:hidden',\n always: 'ds:inline-flex',\n },\n },\n defaultVariants: { show: 'always' },\n },\n);\n\n/** An address a link may use, or nothing. */\nconst linkTo = (href: string | undefined): string | undefined =>\n href && isSafeHref(href) ? href : undefined;\n\ninterface RegisterLinksProps {\n doctorHref: string | undefined;\n patientHref: string | undefined;\n hideLabel?: boolean;\n}\n\n/** The ways to open an account. Links, not buttons: each goes to its own\n * registration page. */\nfunction RegisterLinks({\n doctorHref,\n patientHref,\n hideLabel = false,\n}: RegisterLinksProps) {\n const { t } = useTranslation('ui');\n return (\n <>\n {doctorHref && (\n <Button\n asChild\n intent=\"secondary\"\n size=\"sm\"\n startIcon={<Stethoscope />}\n hideLabel={hideLabel}\n >\n <a href={doctorHref} data-action=\"register-doctor\">\n {t('signedOutHeader.registerDoctor')}\n </a>\n </Button>\n )}\n {patientHref && (\n <Button\n asChild\n intent=\"secondary\"\n size=\"sm\"\n startIcon={<User />}\n hideLabel={hideLabel}\n >\n <a href={patientHref} data-action=\"register-patient\">\n {t('signedOutHeader.registerPatient')}\n </a>\n </Button>\n )}\n </>\n );\n}\n\n/**\n * The signed-out header. `SignedOutFrame` renders it; use it on its own\n * only with a frame of your own.\n */\nexport const SignedOutHeader = forwardRef<HTMLElement, SignedOutHeaderProps>(\n (\n {\n homeHref = '/',\n mainId = 'main-content',\n loginHref,\n registerDoctorHref,\n registerPatientHref,\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const loginLink = linkTo(loginHref);\n const doctorLink = linkTo(registerDoctorHref);\n const patientLink = linkTo(registerPatientHref);\n const hasRegister = Boolean(doctorLink || patientLink);\n\n return (\n <Header ref={ref}>\n <HeaderStart>\n <HeaderSkipLink href={`#${mainId}`} />\n <HeaderBrand\n href={linkTo(homeHref) ?? '/'}\n logo={<Logo variant=\"monochrome\" size=\"md\" decorative />}\n aria-label={t('publicHeader.homeLabel')}\n />\n </HeaderStart>\n {(loginLink || hasRegister) && (\n <HeaderEnd>\n {/* One short label: it keeps its text on a phone. */}\n {loginLink && (\n <div className={linksVariants()}>\n <Button\n asChild\n intent=\"secondary\"\n size=\"sm\"\n startIcon={<LogIn />}\n >\n <a href={loginLink} data-action=\"login\">\n {t('signedOutHeader.login')}\n </a>\n </Button>\n </div>\n )}\n {/* Two labelled buttons and the brand do not fit a phone, so\n below `md` each folds to its icon and keeps its name for a\n screen reader. */}\n {hasRegister && (\n <>\n <div className={linksVariants({ show: 'wide' })}>\n <RegisterLinks\n doctorHref={doctorLink}\n patientHref={patientLink}\n />\n </div>\n <div className={linksVariants({ show: 'narrow' })}>\n <RegisterLinks\n doctorHref={doctorLink}\n patientHref={patientLink}\n hideLabel\n />\n </div>\n </>\n )}\n </HeaderEnd>\n )}\n </Header>\n );\n },\n);\nSignedOutHeader.displayName = 'SignedOutHeader';\n","/* -------------------------------------------------------------------- */\n/* SignedOutFrame — the app frame as a visitor sees it before sign-in. */\n/* */\n/* The signed-out header on top, no sidebar, the page's content centred */\n/* on the app's canvas, and the minimal footer with the privacy policy */\n/* and the terms. The login, forgot-password and registration pages */\n/* wear it, so they read as one family. */\n/* -------------------------------------------------------------------- */\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { AppFrame } from '../../components/app-frame';\nimport {\n PublicFooter,\n type LegalUrlOverrides,\n} from '../../components/public-footer';\nimport {\n SignedOutHeader,\n type SignedOutHeaderProps,\n} from './signed-out-header';\n\nexport interface SignedOutFrameProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n SignedOutHeaderProps {\n /** The page: a card such as `LoginForm`, centred in `<main>`. */\n children: ReactNode;\n /** Shows the footer with the privacy policy and the terms. Default\n * true. */\n showFooter?: boolean;\n /**\n * Adds the footer's copyright line: the year, the company's registered\n * name and its VAT number. Default false.\n */\n showCopyright?: boolean;\n /** The site the footer's legal links lead to. Default: the footer's\n * own, `https://www.alfadocs.com`. */\n marketingBaseUrl?: string;\n /** The footer's legal links, per language, where they differ from its\n * defaults. */\n legalUrlOverrides?: LegalUrlOverrides;\n}\n\n// The wrapper is only a marker: the frame inside it is the box. It has\n// no box of its own (`display: contents`), so a `className` that sizes or\n// spaces it does nothing, and a ref to it measures nothing.\nconst signedOutFrameVariants = cva('ds:contents');\n\n/**\n * The signed-out app frame. It is one viewport tall: the header and the\n * footer stay put and the content scrolls between them.\n */\nexport const SignedOutFrame = forwardRef<HTMLDivElement, SignedOutFrameProps>(\n (\n {\n children,\n homeHref,\n mainId = 'main-content',\n loginHref,\n registerDoctorHref,\n registerPatientHref,\n showFooter = true,\n showCopyright = false,\n marketingBaseUrl,\n legalUrlOverrides,\n className,\n ...rest\n },\n ref,\n ) => (\n <div\n ref={ref}\n {...rest}\n data-component=\"signed-out-frame\"\n className={signedOutFrameVariants({ className })}\n >\n {/* `<main>` is a size container, so the content can be exactly as\n tall as the space between the header and the footer (`100cqh`)\n and centre in it, whatever height the footer wraps to on a\n phone. */}\n <AppFrame\n header={\n <SignedOutHeader\n homeHref={homeHref}\n mainId={mainId}\n loginHref={loginHref}\n registerDoctorHref={registerDoctorHref}\n registerPatientHref={registerPatientHref}\n />\n }\n sidebar={null}\n footer={\n showFooter ? (\n <PublicFooter\n variant=\"minimal\"\n showCopyright={showCopyright}\n marketingBaseUrl={marketingBaseUrl}\n legalUrlOverrides={legalUrlOverrides}\n />\n ) : undefined\n }\n mainId={mainId}\n padded={false}\n mainClassName=\"ds:bg-[color:var(--app-shell-background)] ds:[container-type:size]\"\n >\n <div className=\"ds:flex ds:min-h-[100cqh] ds:w-full ds:items-center ds:justify-center ds:p-0 ds:sm:p-[var(--spacing-lg)]\">\n {children}\n </div>\n </AppFrame>\n </div>\n ),\n);\nSignedOutFrame.displayName = 'SignedOutFrame';\n"],"names":["linksVariants","cva","linkTo","href","isSafeHref","RegisterLinks","doctorHref","patientHref","hideLabel","t","useTranslation","jsxs","Fragment","jsx","Button","Stethoscope","User","SignedOutHeader","forwardRef","homeHref","mainId","loginHref","registerDoctorHref","registerPatientHref","ref","loginLink","doctorLink","patientLink","hasRegister","Header","HeaderStart","HeaderSkipLink","HeaderBrand","Logo","HeaderEnd","LogIn","signedOutFrameVariants","SignedOutFrame","children","showFooter","showCopyright","marketingBaseUrl","legalUrlOverrides","className","rest","AppFrame","PublicFooter"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as c } from "react/jsx-runtime";
2
2
  import { forwardRef as m, useMemo as p, useRef as w, useState as V, useCallback as I, useImperativeHandle as O, useContext as v, createContext as C } from "react";
3
3
  import { c as b } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as A } from "react-i18next";
5
- import { A as P } from "./avatar-BoqdWsNe.js";
5
+ import { A as P } from "./avatar-Dp5apm1d.js";
6
6
  import { C as N } from "./card-C85_Ndhb.js";
7
7
  import { T as q } from "./timestamp-DPLDWdxA.js";
8
8
  import { u as B } from "./registry-DvAUVLHh.js";
@@ -293,4 +293,4 @@ export {
293
293
  le as T,
294
294
  K as t
295
295
  };
296
- //# sourceMappingURL=timeline-tn5QQJdS.js.map
296
+ //# sourceMappingURL=timeline-CKUaBZOx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timeline-tn5QQJdS.js","sources":["../../src/components/timeline/timeline.agent.ts","../../src/components/timeline/timeline.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — Timeline. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TimelineHandle } from './timeline';\n\nexport const timelineAgent: AgentAdapter<TimelineHandle> = {\n id: 'timeline',\n // `select_event` persists `selectedEvent` state, so this is single-selection\n // (`select_single`), not a transient `pick`. See PRS §26 §4.\n capabilities: ['select_single'],\n state: {\n selectedEvent: {\n type: 'string | null',\n descriptionKey: 'ui.agent.timeline.state.selectedEvent',\n description: 'Opaque event id of the currently-active event, or null.',\n read: (handle) => handle.getSelectedEvent(),\n },\n },\n actions: {\n select_event: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.timeline.actions.selectEvent',\n description: 'Scroll the given event into view and mark it as selected.',\n invoke: (handle, args: { id: string }) => {\n handle.selectEvent(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'timeline',\n description: 'Marks the Timeline root.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-event-id',\n description:\n 'Opaque event id emitted on each Timeline.Event when the `eventId` prop is provided.',\n },\n },\n};\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type LiHTMLAttributes,\n type OlHTMLAttributes,\n type ReactNode,\n type TimeHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { TriangleAlert, Check, Circle, Info, X } from 'lucide-react';\nimport { Avatar } from '../avatar';\nimport { Card } from '../card';\nimport { Timestamp } from '../timestamp';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { timelineAgent } from './timeline.agent';\n\n// TODO: optional @tanstack/react-virtual integration for 500+ events\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ntype EventType = 'info' | 'success' | 'warning' | 'error' | 'neutral';\ntype Layout = 'rail-start' | 'rail-end' | 'alternating';\n\ninterface TimelineContextValue {\n layout: Layout;\n order: 'newest-first' | 'oldest-first';\n}\n\nconst TimelineContext = createContext<TimelineContextValue>({\n layout: 'rail-start',\n order: 'newest-first',\n});\n\ninterface TimelineEventContextValue {\n type: EventType;\n}\n\nconst TimelineEventContext = createContext<TimelineEventContextValue>({\n type: 'neutral',\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — root */\n/* ------------------------------------------------------------------ */\n\nconst timelineVariants = cva('ds:flex ds:flex-col', {\n variants: {\n layout: {\n 'rail-start': 'ds:ps-4',\n 'rail-end': 'ds:pe-4',\n alternating:\n 'ds:grid ds:grid-cols-[1fr_2rem_1fr] ds:gap-x-[var(--spacing-md)]',\n },\n order: {\n 'newest-first': 'ds:flex-col',\n 'oldest-first': 'ds:flex-col-reverse',\n },\n },\n defaultVariants: { layout: 'rail-start', order: 'newest-first' },\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — event item */\n/* ------------------------------------------------------------------ */\n\nconst eventVariants = cva(\n 'ds:relative ds:flex ds:gap-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n {\n variants: {\n layout: {\n 'rail-start': [\n 'ds:flex-row',\n // Rail: continuous line from this dot centre to the next dot centre\n 'ds:before:absolute ds:before:[inset-block-start:var(--spacing-md)] ds:before:[inset-block-end:calc(var(--spacing-md)*-1)]',\n 'ds:before:[inline-size:var(--border-width-md)] ds:before:bg-[var(--border)]',\n 'ds:before:[inset-inline-start:calc(var(--spacing-md)_-_var(--border-width-md)/2)]',\n 'ds:last:before:hidden',\n ].join(' '),\n 'rail-end': [\n 'ds:flex-row-reverse',\n 'ds:before:absolute ds:before:[inset-block-start:var(--spacing-md)] ds:before:[inset-block-end:calc(var(--spacing-md)*-1)]',\n 'ds:before:[inline-size:var(--border-width-md)] ds:before:bg-[var(--border)]',\n 'ds:before:[inset-inline-end:calc(var(--spacing-md)_-_var(--border-width-md)/2)]',\n 'ds:last:before:hidden',\n ].join(' '),\n alternating: 'ds:contents',\n },\n },\n defaultVariants: { layout: 'rail-start' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* CVA — dot */\n/* ------------------------------------------------------------------ */\n\nconst dotVariants = cva(\n [\n 'ds:relative ds:z-10 ds:flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-full)] ds:shrink-0',\n 'ds:size-8',\n 'ds:ring-2 ds:ring-[var(--background)]',\n ].join(' '),\n {\n variants: {\n type: {\n info: 'ds:bg-[var(--info)] ds:text-[var(--info-solid-foreground)]',\n success:\n 'ds:bg-[var(--success)] ds:text-[var(--success-solid-foreground)]',\n warning:\n 'ds:bg-[var(--warning)] ds:text-[var(--warning-solid-foreground)]',\n error:\n 'ds:bg-[var(--destructive)] ds:text-[var(--destructive-foreground)]',\n neutral: 'ds:bg-[var(--muted)] ds:text-[var(--muted-foreground)]',\n },\n },\n defaultVariants: { type: 'neutral' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface TimelineProps\n extends\n Omit<OlHTMLAttributes<HTMLOListElement>, 'color'>,\n VariantProps<typeof timelineVariants> {\n layout?: Layout;\n order?: 'newest-first' | 'oldest-first';\n children: ReactNode;\n className?: string;\n}\n\nexport interface TimelineEventProps extends LiHTMLAttributes<HTMLLIElement> {\n type?: EventType;\n /** Opaque event id — when set, the component emits `data-event-id` for agent addressing. */\n eventId?: string;\n children: ReactNode;\n className?: string;\n}\n\n/** Curated imperative handle for agent / external automation. */\nexport interface TimelineHandle {\n getSelectedEvent: () => string | null;\n selectEvent: (id: string) => void;\n}\n\nexport interface TimelineDotProps extends HTMLAttributes<HTMLDivElement> {\n icon?: ReactNode;\n className?: string;\n}\n\nexport interface TimelineContentProps extends HTMLAttributes<HTMLDivElement> {\n title: string;\n description?: ReactNode;\n actor?: { name: string; src?: string };\n children?: ReactNode;\n className?: string;\n}\n\nexport interface TimelineTimestampProps extends TimeHTMLAttributes<HTMLTimeElement> {\n date: Date | string;\n /** Overrides the active language for date and time formatting. */\n locale?: string;\n relative?: boolean;\n format?: Intl.DateTimeFormatOptions;\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Default icons per type */\n/* ------------------------------------------------------------------ */\n\nconst TYPE_ICONS: Record<EventType, ReactNode> = {\n info: <Info size={16} aria-hidden=\"true\" />,\n success: <Check size={16} aria-hidden=\"true\" />,\n warning: <TriangleAlert size={16} aria-hidden=\"true\" />,\n error: <X size={16} aria-hidden=\"true\" />,\n neutral: <Circle size={16} aria-hidden=\"true\" />,\n};\n\n/* ------------------------------------------------------------------ */\n/* Timeline root */\n/* ------------------------------------------------------------------ */\n\nconst TimelineRoot = forwardRef<HTMLOListElement, TimelineProps>(\n (\n {\n layout = 'rail-start',\n order = 'newest-first',\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const ctx = useMemo(() => ({ layout, order }), [layout, order]);\n const olRef = useRef<HTMLOListElement | null>(null);\n const [selectedEvent, setSelectedEvent] = useState<string | null>(null);\n const latestRef = useRef<string | null>(null);\n latestRef.current = selectedEvent;\n\n const selectEvent = useCallback((id: string) => {\n setSelectedEvent(id);\n const target = olRef.current?.querySelector(\n `[data-event-id=\"${id}\"]`,\n ) as HTMLElement | null;\n target?.scrollIntoView({ block: 'center', behavior: 'auto' });\n }, []);\n\n const agentHandle = useMemo<TimelineHandle>(\n () => ({\n getSelectedEvent: () => latestRef.current,\n selectEvent,\n }),\n [selectEvent],\n );\n useImperativeHandle(ref, () => olRef.current as HTMLOListElement, []);\n useAgentRegistration(timelineAgent, agentHandle, props.id);\n\n return (\n <TimelineContext.Provider value={ctx}>\n <ol\n ref={olRef}\n data-component=\"timeline\"\n data-component-id={props.id}\n data-selected-event={selectedEvent ?? undefined}\n className={timelineVariants({ layout, order, className })}\n {...props}\n >\n {children}\n </ol>\n </TimelineContext.Provider>\n );\n },\n);\nTimelineRoot.displayName = 'Timeline';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Event */\n/* ------------------------------------------------------------------ */\n\nconst TimelineEvent = forwardRef<HTMLLIElement, TimelineEventProps>(\n ({ type = 'neutral', eventId, className, children, ...props }, ref) => {\n const { layout } = useContext(TimelineContext);\n const { t } = useTranslation('ui');\n\n const evtCtx = useMemo(() => ({ type }), [type]);\n\n if (layout === 'alternating') {\n // In alternating layout the <li> uses `contents` so its children\n // participate directly in the parent grid.\n return (\n <TimelineEventContext.Provider value={evtCtx}>\n <li\n ref={ref}\n data-event-id={eventId}\n className={['ds:contents', className].filter(Boolean).join(' ')}\n {...props}\n >\n {/* Visually-hidden type prefix for screen readers */}\n <span className=\"ds:sr-only\">{t(`timeline.type.${type}`)}</span>\n {children}\n </li>\n </TimelineEventContext.Provider>\n );\n }\n\n return (\n <TimelineEventContext.Provider value={evtCtx}>\n <li\n ref={ref}\n data-event-id={eventId}\n className={eventVariants({ layout, className })}\n {...props}\n >\n {/* Visually-hidden type prefix for screen readers */}\n <span className=\"ds:sr-only\">{t(`timeline.type.${type}`)}</span>\n {children}\n </li>\n </TimelineEventContext.Provider>\n );\n },\n);\nTimelineEvent.displayName = 'Timeline.Event';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Dot */\n/* ------------------------------------------------------------------ */\n\nconst TimelineDot = forwardRef<HTMLDivElement, TimelineDotProps>(\n ({ icon, className, ...props }, ref) => {\n const { type } = useContext(TimelineEventContext);\n const { layout } = useContext(TimelineContext);\n\n const dot = (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={dotVariants({ type, className })}\n {...props}\n >\n {icon ?? TYPE_ICONS[type]}\n </div>\n );\n\n if (layout === 'alternating') {\n // In alternating grid: col 2 (centre) for the dot with the rail line\n return (\n <div\n aria-hidden=\"true\"\n className=\"ds:col-start-2 ds:flex ds:flex-col ds:items-center\"\n >\n {/* Rail segment above the dot */}\n <div className=\"ds:w-[var(--border-width-md)] ds:flex-1 ds:bg-[var(--border)] ds:first:hidden\" />\n {dot}\n {/* Rail segment below the dot */}\n <div className=\"ds:w-[var(--border-width-md)] ds:flex-1 ds:bg-[var(--border)]\" />\n </div>\n );\n }\n\n return dot;\n },\n);\nTimelineDot.displayName = 'Timeline.Dot';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Content */\n/* ------------------------------------------------------------------ */\n\nconst TimelineContent = forwardRef<HTMLDivElement, TimelineContentProps>(\n ({ title, description, actor, children, className, ...props }, ref) => {\n const { layout } = useContext(TimelineContext);\n\n const inner = (\n <div\n ref={ref}\n className={[\n 'ds:flex-1 ds:min-w-0 ds:pb-[var(--spacing-md)]',\n // Wrap policy: `break-word` (not `anywhere`) preserves word-\n // boundary wrapping for natural-language titles / descriptions;\n // only genuinely unbreakable strings (URLs, hashes) break mid-\n // word when they would otherwise overflow. `anywhere` introduces\n // a soft-wrap opportunity at every character boundary, which\n // chopped Italian / German labels mid-word when an event card\n // sat in a narrow context.\n 'ds:[&_*]:break-normal ds:[&_*]:[overflow-wrap:break-word]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n <Card variant=\"outlined\">\n <Card.Body>\n <p className=\"type-label ds:text-[var(--foreground)]\">{title}</p>\n {description && (\n <div className=\"ds:mt-[var(--spacing-xs)] type-body-sm ds:text-[var(--muted-foreground)]\">\n {description}\n </div>\n )}\n {actor && (\n <div className=\"ds:mt-[var(--spacing-sm)] ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <Avatar size=\"xs\" name={actor.name} src={actor.src} />\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {actor.name}\n </span>\n </div>\n )}\n {children}\n </Card.Body>\n </Card>\n </div>\n );\n\n if (layout === 'alternating') {\n // Alternating: odd events in col 1 (start), even events in col 3 (end).\n // We use CSS nth-child targeting via a wrapper that sets col placement.\n return (\n <div className=\"ds:col-span-1 ds:[li:nth-child(even)_&]:col-start-3 ds:[li:nth-child(odd)_&]:col-start-1\">\n {inner}\n </div>\n );\n }\n\n return inner;\n },\n);\nTimelineContent.displayName = 'Timeline.Content';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Timestamp — thin wrapper over the shared Timestamp */\n/* component. Keeps the existing API (`date`, `relative`, `format`) */\n/* for backward compatibility; adds tabular-nums because timeline */\n/* timestamps sit in a rail gutter and benefit from column-aligned */\n/* digits. */\n/* ------------------------------------------------------------------ */\n\nconst TWENTY_FOUR_HOURS_MS = 24 * 60 * 60 * 1000;\n\nconst TimelineTimestamp = forwardRef<HTMLTimeElement, TimelineTimestampProps>(\n (\n {\n date,\n locale,\n relative = true,\n format = { dateStyle: 'medium', timeStyle: 'short' },\n className,\n ...props\n },\n ref,\n ) => (\n <Timestamp\n ref={ref}\n value={date}\n locale={locale}\n format={relative ? 'relative' : 'absolute'}\n relativeWindow={relative ? TWENTY_FOUR_HOURS_MS : undefined}\n absoluteFormat={format}\n className={[\n 'ds:text-[var(--muted-foreground)]',\n 'ds:[font-variant-numeric:var(--font-feature-tabular)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nTimelineTimestamp.displayName = 'Timeline.Timestamp';\n\n/* ------------------------------------------------------------------ */\n/* Compound export */\n/* ------------------------------------------------------------------ */\n\nexport const Timeline = Object.assign(TimelineRoot, {\n Event: TimelineEvent,\n Dot: TimelineDot,\n Content: TimelineContent,\n Timestamp: TimelineTimestamp,\n});\n"],"names":["timelineAgent","handle","args","TimelineContext","createContext","TimelineEventContext","timelineVariants","cva","eventVariants","dotVariants","TYPE_ICONS","jsx","Info","Check","TriangleAlert","X","Circle","TimelineRoot","forwardRef","layout","order","className","children","props","ref","ctx","useMemo","olRef","useRef","selectedEvent","setSelectedEvent","useState","latestRef","selectEvent","useCallback","id","target","_a","agentHandle","useImperativeHandle","useAgentRegistration","TimelineEvent","type","eventId","useContext","t","useTranslation","evtCtx","jsxs","TimelineDot","icon","dot","TimelineContent","title","description","actor","inner","Card","Avatar","TWENTY_FOUR_HOURS_MS","TimelineTimestamp","date","locale","relative","format","Timestamp","Timeline"],"mappings":"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"}
1
+ {"version":3,"file":"timeline-CKUaBZOx.js","sources":["../../src/components/timeline/timeline.agent.ts","../../src/components/timeline/timeline.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — Timeline. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TimelineHandle } from './timeline';\n\nexport const timelineAgent: AgentAdapter<TimelineHandle> = {\n id: 'timeline',\n // `select_event` persists `selectedEvent` state, so this is single-selection\n // (`select_single`), not a transient `pick`. See PRS §26 §4.\n capabilities: ['select_single'],\n state: {\n selectedEvent: {\n type: 'string | null',\n descriptionKey: 'ui.agent.timeline.state.selectedEvent',\n description: 'Opaque event id of the currently-active event, or null.',\n read: (handle) => handle.getSelectedEvent(),\n },\n },\n actions: {\n select_event: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.timeline.actions.selectEvent',\n description: 'Scroll the given event into view and mark it as selected.',\n invoke: (handle, args: { id: string }) => {\n handle.selectEvent(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'timeline',\n description: 'Marks the Timeline root.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-event-id',\n description:\n 'Opaque event id emitted on each Timeline.Event when the `eventId` prop is provided.',\n },\n },\n};\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type LiHTMLAttributes,\n type OlHTMLAttributes,\n type ReactNode,\n type TimeHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { TriangleAlert, Check, Circle, Info, X } from 'lucide-react';\nimport { Avatar } from '../avatar';\nimport { Card } from '../card';\nimport { Timestamp } from '../timestamp';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { timelineAgent } from './timeline.agent';\n\n// TODO: optional @tanstack/react-virtual integration for 500+ events\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ntype EventType = 'info' | 'success' | 'warning' | 'error' | 'neutral';\ntype Layout = 'rail-start' | 'rail-end' | 'alternating';\n\ninterface TimelineContextValue {\n layout: Layout;\n order: 'newest-first' | 'oldest-first';\n}\n\nconst TimelineContext = createContext<TimelineContextValue>({\n layout: 'rail-start',\n order: 'newest-first',\n});\n\ninterface TimelineEventContextValue {\n type: EventType;\n}\n\nconst TimelineEventContext = createContext<TimelineEventContextValue>({\n type: 'neutral',\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — root */\n/* ------------------------------------------------------------------ */\n\nconst timelineVariants = cva('ds:flex ds:flex-col', {\n variants: {\n layout: {\n 'rail-start': 'ds:ps-4',\n 'rail-end': 'ds:pe-4',\n alternating:\n 'ds:grid ds:grid-cols-[1fr_2rem_1fr] ds:gap-x-[var(--spacing-md)]',\n },\n order: {\n 'newest-first': 'ds:flex-col',\n 'oldest-first': 'ds:flex-col-reverse',\n },\n },\n defaultVariants: { layout: 'rail-start', order: 'newest-first' },\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — event item */\n/* ------------------------------------------------------------------ */\n\nconst eventVariants = cva(\n 'ds:relative ds:flex ds:gap-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n {\n variants: {\n layout: {\n 'rail-start': [\n 'ds:flex-row',\n // Rail: continuous line from this dot centre to the next dot centre\n 'ds:before:absolute ds:before:[inset-block-start:var(--spacing-md)] ds:before:[inset-block-end:calc(var(--spacing-md)*-1)]',\n 'ds:before:[inline-size:var(--border-width-md)] ds:before:bg-[var(--border)]',\n 'ds:before:[inset-inline-start:calc(var(--spacing-md)_-_var(--border-width-md)/2)]',\n 'ds:last:before:hidden',\n ].join(' '),\n 'rail-end': [\n 'ds:flex-row-reverse',\n 'ds:before:absolute ds:before:[inset-block-start:var(--spacing-md)] ds:before:[inset-block-end:calc(var(--spacing-md)*-1)]',\n 'ds:before:[inline-size:var(--border-width-md)] ds:before:bg-[var(--border)]',\n 'ds:before:[inset-inline-end:calc(var(--spacing-md)_-_var(--border-width-md)/2)]',\n 'ds:last:before:hidden',\n ].join(' '),\n alternating: 'ds:contents',\n },\n },\n defaultVariants: { layout: 'rail-start' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* CVA — dot */\n/* ------------------------------------------------------------------ */\n\nconst dotVariants = cva(\n [\n 'ds:relative ds:z-10 ds:flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-full)] ds:shrink-0',\n 'ds:size-8',\n 'ds:ring-2 ds:ring-[var(--background)]',\n ].join(' '),\n {\n variants: {\n type: {\n info: 'ds:bg-[var(--info)] ds:text-[var(--info-solid-foreground)]',\n success:\n 'ds:bg-[var(--success)] ds:text-[var(--success-solid-foreground)]',\n warning:\n 'ds:bg-[var(--warning)] ds:text-[var(--warning-solid-foreground)]',\n error:\n 'ds:bg-[var(--destructive)] ds:text-[var(--destructive-foreground)]',\n neutral: 'ds:bg-[var(--muted)] ds:text-[var(--muted-foreground)]',\n },\n },\n defaultVariants: { type: 'neutral' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface TimelineProps\n extends\n Omit<OlHTMLAttributes<HTMLOListElement>, 'color'>,\n VariantProps<typeof timelineVariants> {\n layout?: Layout;\n order?: 'newest-first' | 'oldest-first';\n children: ReactNode;\n className?: string;\n}\n\nexport interface TimelineEventProps extends LiHTMLAttributes<HTMLLIElement> {\n type?: EventType;\n /** Opaque event id — when set, the component emits `data-event-id` for agent addressing. */\n eventId?: string;\n children: ReactNode;\n className?: string;\n}\n\n/** Curated imperative handle for agent / external automation. */\nexport interface TimelineHandle {\n getSelectedEvent: () => string | null;\n selectEvent: (id: string) => void;\n}\n\nexport interface TimelineDotProps extends HTMLAttributes<HTMLDivElement> {\n icon?: ReactNode;\n className?: string;\n}\n\nexport interface TimelineContentProps extends HTMLAttributes<HTMLDivElement> {\n title: string;\n description?: ReactNode;\n actor?: { name: string; src?: string };\n children?: ReactNode;\n className?: string;\n}\n\nexport interface TimelineTimestampProps extends TimeHTMLAttributes<HTMLTimeElement> {\n date: Date | string;\n /** Overrides the active language for date and time formatting. */\n locale?: string;\n relative?: boolean;\n format?: Intl.DateTimeFormatOptions;\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Default icons per type */\n/* ------------------------------------------------------------------ */\n\nconst TYPE_ICONS: Record<EventType, ReactNode> = {\n info: <Info size={16} aria-hidden=\"true\" />,\n success: <Check size={16} aria-hidden=\"true\" />,\n warning: <TriangleAlert size={16} aria-hidden=\"true\" />,\n error: <X size={16} aria-hidden=\"true\" />,\n neutral: <Circle size={16} aria-hidden=\"true\" />,\n};\n\n/* ------------------------------------------------------------------ */\n/* Timeline root */\n/* ------------------------------------------------------------------ */\n\nconst TimelineRoot = forwardRef<HTMLOListElement, TimelineProps>(\n (\n {\n layout = 'rail-start',\n order = 'newest-first',\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const ctx = useMemo(() => ({ layout, order }), [layout, order]);\n const olRef = useRef<HTMLOListElement | null>(null);\n const [selectedEvent, setSelectedEvent] = useState<string | null>(null);\n const latestRef = useRef<string | null>(null);\n latestRef.current = selectedEvent;\n\n const selectEvent = useCallback((id: string) => {\n setSelectedEvent(id);\n const target = olRef.current?.querySelector(\n `[data-event-id=\"${id}\"]`,\n ) as HTMLElement | null;\n target?.scrollIntoView({ block: 'center', behavior: 'auto' });\n }, []);\n\n const agentHandle = useMemo<TimelineHandle>(\n () => ({\n getSelectedEvent: () => latestRef.current,\n selectEvent,\n }),\n [selectEvent],\n );\n useImperativeHandle(ref, () => olRef.current as HTMLOListElement, []);\n useAgentRegistration(timelineAgent, agentHandle, props.id);\n\n return (\n <TimelineContext.Provider value={ctx}>\n <ol\n ref={olRef}\n data-component=\"timeline\"\n data-component-id={props.id}\n data-selected-event={selectedEvent ?? undefined}\n className={timelineVariants({ layout, order, className })}\n {...props}\n >\n {children}\n </ol>\n </TimelineContext.Provider>\n );\n },\n);\nTimelineRoot.displayName = 'Timeline';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Event */\n/* ------------------------------------------------------------------ */\n\nconst TimelineEvent = forwardRef<HTMLLIElement, TimelineEventProps>(\n ({ type = 'neutral', eventId, className, children, ...props }, ref) => {\n const { layout } = useContext(TimelineContext);\n const { t } = useTranslation('ui');\n\n const evtCtx = useMemo(() => ({ type }), [type]);\n\n if (layout === 'alternating') {\n // In alternating layout the <li> uses `contents` so its children\n // participate directly in the parent grid.\n return (\n <TimelineEventContext.Provider value={evtCtx}>\n <li\n ref={ref}\n data-event-id={eventId}\n className={['ds:contents', className].filter(Boolean).join(' ')}\n {...props}\n >\n {/* Visually-hidden type prefix for screen readers */}\n <span className=\"ds:sr-only\">{t(`timeline.type.${type}`)}</span>\n {children}\n </li>\n </TimelineEventContext.Provider>\n );\n }\n\n return (\n <TimelineEventContext.Provider value={evtCtx}>\n <li\n ref={ref}\n data-event-id={eventId}\n className={eventVariants({ layout, className })}\n {...props}\n >\n {/* Visually-hidden type prefix for screen readers */}\n <span className=\"ds:sr-only\">{t(`timeline.type.${type}`)}</span>\n {children}\n </li>\n </TimelineEventContext.Provider>\n );\n },\n);\nTimelineEvent.displayName = 'Timeline.Event';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Dot */\n/* ------------------------------------------------------------------ */\n\nconst TimelineDot = forwardRef<HTMLDivElement, TimelineDotProps>(\n ({ icon, className, ...props }, ref) => {\n const { type } = useContext(TimelineEventContext);\n const { layout } = useContext(TimelineContext);\n\n const dot = (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={dotVariants({ type, className })}\n {...props}\n >\n {icon ?? TYPE_ICONS[type]}\n </div>\n );\n\n if (layout === 'alternating') {\n // In alternating grid: col 2 (centre) for the dot with the rail line\n return (\n <div\n aria-hidden=\"true\"\n className=\"ds:col-start-2 ds:flex ds:flex-col ds:items-center\"\n >\n {/* Rail segment above the dot */}\n <div className=\"ds:w-[var(--border-width-md)] ds:flex-1 ds:bg-[var(--border)] ds:first:hidden\" />\n {dot}\n {/* Rail segment below the dot */}\n <div className=\"ds:w-[var(--border-width-md)] ds:flex-1 ds:bg-[var(--border)]\" />\n </div>\n );\n }\n\n return dot;\n },\n);\nTimelineDot.displayName = 'Timeline.Dot';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Content */\n/* ------------------------------------------------------------------ */\n\nconst TimelineContent = forwardRef<HTMLDivElement, TimelineContentProps>(\n ({ title, description, actor, children, className, ...props }, ref) => {\n const { layout } = useContext(TimelineContext);\n\n const inner = (\n <div\n ref={ref}\n className={[\n 'ds:flex-1 ds:min-w-0 ds:pb-[var(--spacing-md)]',\n // Wrap policy: `break-word` (not `anywhere`) preserves word-\n // boundary wrapping for natural-language titles / descriptions;\n // only genuinely unbreakable strings (URLs, hashes) break mid-\n // word when they would otherwise overflow. `anywhere` introduces\n // a soft-wrap opportunity at every character boundary, which\n // chopped Italian / German labels mid-word when an event card\n // sat in a narrow context.\n 'ds:[&_*]:break-normal ds:[&_*]:[overflow-wrap:break-word]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n <Card variant=\"outlined\">\n <Card.Body>\n <p className=\"type-label ds:text-[var(--foreground)]\">{title}</p>\n {description && (\n <div className=\"ds:mt-[var(--spacing-xs)] type-body-sm ds:text-[var(--muted-foreground)]\">\n {description}\n </div>\n )}\n {actor && (\n <div className=\"ds:mt-[var(--spacing-sm)] ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <Avatar size=\"xs\" name={actor.name} src={actor.src} />\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {actor.name}\n </span>\n </div>\n )}\n {children}\n </Card.Body>\n </Card>\n </div>\n );\n\n if (layout === 'alternating') {\n // Alternating: odd events in col 1 (start), even events in col 3 (end).\n // We use CSS nth-child targeting via a wrapper that sets col placement.\n return (\n <div className=\"ds:col-span-1 ds:[li:nth-child(even)_&]:col-start-3 ds:[li:nth-child(odd)_&]:col-start-1\">\n {inner}\n </div>\n );\n }\n\n return inner;\n },\n);\nTimelineContent.displayName = 'Timeline.Content';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Timestamp — thin wrapper over the shared Timestamp */\n/* component. Keeps the existing API (`date`, `relative`, `format`) */\n/* for backward compatibility; adds tabular-nums because timeline */\n/* timestamps sit in a rail gutter and benefit from column-aligned */\n/* digits. */\n/* ------------------------------------------------------------------ */\n\nconst TWENTY_FOUR_HOURS_MS = 24 * 60 * 60 * 1000;\n\nconst TimelineTimestamp = forwardRef<HTMLTimeElement, TimelineTimestampProps>(\n (\n {\n date,\n locale,\n relative = true,\n format = { dateStyle: 'medium', timeStyle: 'short' },\n className,\n ...props\n },\n ref,\n ) => (\n <Timestamp\n ref={ref}\n value={date}\n locale={locale}\n format={relative ? 'relative' : 'absolute'}\n relativeWindow={relative ? TWENTY_FOUR_HOURS_MS : undefined}\n absoluteFormat={format}\n className={[\n 'ds:text-[var(--muted-foreground)]',\n 'ds:[font-variant-numeric:var(--font-feature-tabular)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nTimelineTimestamp.displayName = 'Timeline.Timestamp';\n\n/* ------------------------------------------------------------------ */\n/* Compound export */\n/* ------------------------------------------------------------------ */\n\nexport const Timeline = Object.assign(TimelineRoot, {\n Event: TimelineEvent,\n Dot: TimelineDot,\n Content: TimelineContent,\n Timestamp: TimelineTimestamp,\n});\n"],"names":["timelineAgent","handle","args","TimelineContext","createContext","TimelineEventContext","timelineVariants","cva","eventVariants","dotVariants","TYPE_ICONS","jsx","Info","Check","TriangleAlert","X","Circle","TimelineRoot","forwardRef","layout","order","className","children","props","ref","ctx","useMemo","olRef","useRef","selectedEvent","setSelectedEvent","useState","latestRef","selectEvent","useCallback","id","target","_a","agentHandle","useImperativeHandle","useAgentRegistration","TimelineEvent","type","eventId","useContext","t","useTranslation","evtCtx","jsxs","TimelineDot","icon","dot","TimelineContent","title","description","actor","inner","Card","Avatar","TWENTY_FOUR_HOURS_MS","TimelineTimestamp","date","locale","relative","format","Timestamp","Timeline"],"mappings":"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"}
@@ -16,7 +16,7 @@ import { E as zt } from "./editable-description-KU56SP4P.js";
16
16
  import { N as Xe } from "./note-timeline-BrjHBQfx.js";
17
17
  import { P as Ot } from "./panel-header-CbtlTe85.js";
18
18
  import { P as Ge } from "./panel-subview-DCyvn-49.js";
19
- import { P as _t } from "./patient-summary-card-B1jvxdY8.js";
19
+ import { P as _t } from "./patient-summary-card-B4Ijw_ig.js";
20
20
  import { S as ne } from "./section-card-D1sV4Voz.js";
21
21
  import { C as nn, S as ue } from "./skeleton-tTWJpvAq.js";
22
22
  import { T as an } from "./text-area-COMVJ1yE.js";
@@ -26,7 +26,7 @@ import { a as Nt } from "./whatsapp-button-DV9JFmtq.js";
26
26
  import { a as Ft, W as on } from "./workflow-status-9wb7iWUd.js";
27
27
  import { u as ot, a as At, i as rn } from "./appointment-workflow-status-DMjuIK90.js";
28
28
  import { E as dn } from "./empty-state-DwJ5YNzz.js";
29
- import { T as Ae } from "./timeline-tn5QQJdS.js";
29
+ import { T as Ae } from "./timeline-CKUaBZOx.js";
30
30
  import { C as rt } from "./calendar-clock-hbObjfGY.js";
31
31
  import { T as $t } from "./trash-2-uumy3fy1.js";
32
32
  import { A as Ve } from "./entity-card-fpm-KUKc.js";
@@ -35,7 +35,7 @@ import { P as me } from "./pencil-B1sKKyuT.js";
35
35
  import { C as Je } from "./clock-Drd4Wtis.js";
36
36
  import { c as Fe } from "./createLucideIcon-DhHxpK9K.js";
37
37
  import { A as cn } from "./arrow-right-KsIrLdt0.js";
38
- import { A as Ze } from "./avatar-BoqdWsNe.js";
38
+ import { A as Ze } from "./avatar-Dp5apm1d.js";
39
39
  import { B as $e } from "./badge-BUk4RjTS.js";
40
40
  import { H as dt } from "./heart-pulse-BCppJyN2.js";
41
41
  import { G as un } from "./globe-sHBW1JN5.js";
@@ -2195,4 +2195,4 @@ export {
2195
2195
  Kn as s,
2196
2196
  _s as u
2197
2197
  };
2198
- //# sourceMappingURL=use-appointment-details-read-BNtTap_B.js.map
2198
+ //# sourceMappingURL=use-appointment-details-read-DawTb1SQ.js.map