@alfadocs/ui-kit-debug 1.5.0 → 1.6.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 (122) hide show
  1. package/dist/_chunks/{booking-CGKof8QU.js → booking-D84O6H2X.js} +553 -546
  2. package/dist/_chunks/booking-D84O6H2X.js.map +1 -0
  3. package/dist/_chunks/practice-profile-hero-Bdd0bFqC.js +187 -0
  4. package/dist/_chunks/practice-profile-hero-Bdd0bFqC.js.map +1 -0
  5. package/dist/_chunks/{practice-results-DWUZRm2x.js → practice-results-CKoLD_x5.js} +220 -206
  6. package/dist/_chunks/practice-results-CKoLD_x5.js.map +1 -0
  7. package/dist/agent-catalog.json +33 -36
  8. package/dist/agent-i18n/en.json +6 -5
  9. package/dist/components/booking/booking-types.d.ts +9 -0
  10. package/dist/components/booking/booking-types.d.ts.map +1 -1
  11. package/dist/components/booking/booking.d.ts.map +1 -1
  12. package/dist/components/booking/index.js +1 -1
  13. package/dist/components/index.d.ts +1 -0
  14. package/dist/components/index.d.ts.map +1 -1
  15. package/dist/components/practice-profile-hero/index.d.ts +4 -0
  16. package/dist/components/practice-profile-hero/index.d.ts.map +1 -0
  17. package/dist/components/practice-profile-hero/index.js +6 -0
  18. package/dist/components/practice-profile-hero/index.js.map +1 -0
  19. package/dist/components/practice-profile-hero/practice-profile-hero.agent.d.ts +4 -0
  20. package/dist/components/practice-profile-hero/practice-profile-hero.agent.d.ts.map +1 -0
  21. package/dist/components/practice-profile-hero/practice-profile-hero.d.ts +60 -0
  22. package/dist/components/practice-profile-hero/practice-profile-hero.d.ts.map +1 -0
  23. package/dist/components/practice-results/index.js +1 -1
  24. package/dist/components/practice-results/practice-results.d.ts +15 -1
  25. package/dist/components/practice-results/practice-results.d.ts.map +1 -1
  26. package/dist/host-compat.css +1 -4
  27. package/dist/i18n/locales/ar.d.ts +1 -0
  28. package/dist/i18n/locales/ar.d.ts.map +1 -1
  29. package/dist/i18n/locales/ar.js +1 -0
  30. package/dist/i18n/locales/ar.js.map +1 -1
  31. package/dist/i18n/locales/de.d.ts +1 -0
  32. package/dist/i18n/locales/de.d.ts.map +1 -1
  33. package/dist/i18n/locales/de.js +1 -0
  34. package/dist/i18n/locales/de.js.map +1 -1
  35. package/dist/i18n/locales/el.d.ts +1 -0
  36. package/dist/i18n/locales/el.d.ts.map +1 -1
  37. package/dist/i18n/locales/el.js +1 -0
  38. package/dist/i18n/locales/el.js.map +1 -1
  39. package/dist/i18n/locales/en.d.ts +1 -0
  40. package/dist/i18n/locales/en.d.ts.map +1 -1
  41. package/dist/i18n/locales/en.js +1 -0
  42. package/dist/i18n/locales/en.js.map +1 -1
  43. package/dist/i18n/locales/es.d.ts +1 -0
  44. package/dist/i18n/locales/es.d.ts.map +1 -1
  45. package/dist/i18n/locales/es.js +1 -0
  46. package/dist/i18n/locales/es.js.map +1 -1
  47. package/dist/i18n/locales/fr.d.ts +1 -0
  48. package/dist/i18n/locales/fr.d.ts.map +1 -1
  49. package/dist/i18n/locales/fr.js +1 -0
  50. package/dist/i18n/locales/fr.js.map +1 -1
  51. package/dist/i18n/locales/hi.d.ts +1 -0
  52. package/dist/i18n/locales/hi.d.ts.map +1 -1
  53. package/dist/i18n/locales/hi.js +1 -0
  54. package/dist/i18n/locales/hi.js.map +1 -1
  55. package/dist/i18n/locales/it.d.ts +1 -0
  56. package/dist/i18n/locales/it.d.ts.map +1 -1
  57. package/dist/i18n/locales/it.js +1 -0
  58. package/dist/i18n/locales/it.js.map +1 -1
  59. package/dist/i18n/locales/ja.d.ts +1 -0
  60. package/dist/i18n/locales/ja.d.ts.map +1 -1
  61. package/dist/i18n/locales/ja.js +1 -0
  62. package/dist/i18n/locales/ja.js.map +1 -1
  63. package/dist/i18n/locales/nl.d.ts +1 -0
  64. package/dist/i18n/locales/nl.d.ts.map +1 -1
  65. package/dist/i18n/locales/nl.js +1 -0
  66. package/dist/i18n/locales/nl.js.map +1 -1
  67. package/dist/i18n/locales/pl.d.ts +1 -0
  68. package/dist/i18n/locales/pl.d.ts.map +1 -1
  69. package/dist/i18n/locales/pl.js +1 -0
  70. package/dist/i18n/locales/pl.js.map +1 -1
  71. package/dist/i18n/locales/pt.d.ts +1 -0
  72. package/dist/i18n/locales/pt.d.ts.map +1 -1
  73. package/dist/i18n/locales/pt.js +1 -0
  74. package/dist/i18n/locales/pt.js.map +1 -1
  75. package/dist/i18n/locales/ro.d.ts +1 -0
  76. package/dist/i18n/locales/ro.d.ts.map +1 -1
  77. package/dist/i18n/locales/ro.js +1 -0
  78. package/dist/i18n/locales/ro.js.map +1 -1
  79. package/dist/i18n/locales/ru.d.ts +1 -0
  80. package/dist/i18n/locales/ru.d.ts.map +1 -1
  81. package/dist/i18n/locales/ru.js +1 -0
  82. package/dist/i18n/locales/ru.js.map +1 -1
  83. package/dist/i18n/locales/sq.d.ts +1 -0
  84. package/dist/i18n/locales/sq.d.ts.map +1 -1
  85. package/dist/i18n/locales/sq.js +1 -0
  86. package/dist/i18n/locales/sq.js.map +1 -1
  87. package/dist/i18n/locales/sv.d.ts +1 -0
  88. package/dist/i18n/locales/sv.d.ts.map +1 -1
  89. package/dist/i18n/locales/sv.js +1 -0
  90. package/dist/i18n/locales/sv.js.map +1 -1
  91. package/dist/i18n/locales/tr.d.ts +1 -0
  92. package/dist/i18n/locales/tr.d.ts.map +1 -1
  93. package/dist/i18n/locales/tr.js +1 -0
  94. package/dist/i18n/locales/tr.js.map +1 -1
  95. package/dist/i18n/locales/zh.d.ts +1 -0
  96. package/dist/i18n/locales/zh.d.ts.map +1 -1
  97. package/dist/i18n/locales/zh.js +1 -0
  98. package/dist/i18n/locales/zh.js.map +1 -1
  99. package/dist/index.js +346 -343
  100. package/dist/index.js.map +1 -1
  101. package/dist/locales/ar.json +1 -0
  102. package/dist/locales/de.json +1 -0
  103. package/dist/locales/el.json +1 -0
  104. package/dist/locales/en.json +1 -0
  105. package/dist/locales/es.json +1 -0
  106. package/dist/locales/fr.json +1 -0
  107. package/dist/locales/hi.json +1 -0
  108. package/dist/locales/it.json +1 -0
  109. package/dist/locales/ja.json +1 -0
  110. package/dist/locales/nl.json +1 -0
  111. package/dist/locales/pl.json +1 -0
  112. package/dist/locales/pt.json +1 -0
  113. package/dist/locales/ro.json +1 -0
  114. package/dist/locales/ru.json +1 -0
  115. package/dist/locales/sq.json +1 -0
  116. package/dist/locales/sv.json +1 -0
  117. package/dist/locales/tr.json +1 -0
  118. package/dist/locales/zh.json +1 -0
  119. package/dist/tokens.css +1 -1
  120. package/package.json +5 -1
  121. package/dist/_chunks/booking-CGKof8QU.js.map +0 -1
  122. package/dist/_chunks/practice-results-DWUZRm2x.js.map +0 -1
@@ -0,0 +1,187 @@
1
+ import { jsxs as s, jsx as e, Fragment as w } from "react/jsx-runtime";
2
+ import { forwardRef as k, useId as C, useMemo as R, useRef as j } from "react";
3
+ import { c as A } from "./index-D2ZczOXr.js";
4
+ import { A as x } from "./avatar-BNQNhoyL.js";
5
+ import { B } from "./badge-sTusUqZD.js";
6
+ import { C as y } from "./card-DPmk26CL.js";
7
+ import { R as z } from "./rating-BYbUowdK.js";
8
+ import { u as I } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
9
+ import { u as K } from "./registry-DvAUVLHh.js";
10
+ const M = {
11
+ id: "practice-profile-hero",
12
+ // Purely observable hero region — no interactive affordances and no
13
+ // imperative actions on the handle (getName / getHasCover are read-only
14
+ // projections).
15
+ capabilities: [],
16
+ state: {
17
+ name: {
18
+ type: "string",
19
+ descriptionKey: "ui.agent.practiceProfileHero.state.name",
20
+ description: "Practice display name currently rendered.",
21
+ read: (r) => r.getName()
22
+ },
23
+ hasCover: {
24
+ type: "boolean",
25
+ descriptionKey: "ui.agent.practiceProfileHero.state.hasCover",
26
+ description: "Whether a cover-image strip is rendered. Structural flag only — never the image URL or any PHI.",
27
+ read: (r) => r.getHasCover()
28
+ }
29
+ },
30
+ actions: {},
31
+ domHooks: {
32
+ root: {
33
+ attr: "data-component",
34
+ value: "practice-profile-hero",
35
+ description: "Marks the PracticeProfileHero root region."
36
+ },
37
+ instanceId: {
38
+ attr: "data-component-id",
39
+ sourceProp: "id",
40
+ description: "Sourced from the id prop."
41
+ }
42
+ }
43
+ }, V = A("ds:w-full ds:text-[color:var(--foreground)]", {
44
+ variants: {
45
+ // Matches the kit's other `surface` props (Booking, ReviewsPanel,
46
+ // OperatorHero). `'elevated'` wraps in `<Card>`.
47
+ surface: {
48
+ flat: "",
49
+ elevated: ""
50
+ }
51
+ },
52
+ defaultVariants: {
53
+ surface: "elevated"
54
+ }
55
+ }), E = k(
56
+ ({
57
+ name: r,
58
+ tagline: c,
59
+ imageUrl: n,
60
+ coverImageUrl: t,
61
+ rating: o,
62
+ badges: d,
63
+ actionSlot: p,
64
+ surface: m = "elevated",
65
+ "aria-label": f,
66
+ id: l,
67
+ className: N,
68
+ ...P
69
+ }, H) => {
70
+ const v = C(), i = !!t, b = R(
71
+ () => ({ getName: () => r, getHasCover: () => i }),
72
+ [r, i]
73
+ );
74
+ K(M, b, l);
75
+ const h = j(null);
76
+ I(() => {
77
+ const a = h.current;
78
+ a && (t ? a.style.setProperty(
79
+ "--practice-profile-hero-cover",
80
+ `url("${t.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}")`
81
+ ) : a.style.removeProperty("--practice-profile-hero-cover"));
82
+ }, [t]);
83
+ const u = i ? /* @__PURE__ */ e(
84
+ "div",
85
+ {
86
+ ref: h,
87
+ "aria-hidden": "true",
88
+ "data-slot": "cover",
89
+ className: [
90
+ "ds:h-32 ds:sm:h-40 ds:w-full",
91
+ // Cover image layered over the brand gradient — the gradient is
92
+ // the visible underlay while the image streams in (or 404s). The
93
+ // `none` fallback keeps the declaration valid before the layout
94
+ // effect sets the custom property (SSR / first paint).
95
+ "ds:bg-[image:var(--practice-profile-hero-cover,none),var(--gradient-hero-brand)]",
96
+ "ds:bg-cover ds:bg-center"
97
+ ].join(" ")
98
+ }
99
+ ) : null, g = /* @__PURE__ */ s(
100
+ "div",
101
+ {
102
+ className: [
103
+ // Phones: stacked column, smaller avatar — the practice name,
104
+ // tagline and rating keep the full line width instead of being
105
+ // squeezed beside a 3xl avatar. sm+: classic row layout.
106
+ "ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-md)]",
107
+ "ds:sm:flex-row ds:sm:gap-[var(--spacing-lg)]"
108
+ ].join(" "),
109
+ children: [
110
+ /* @__PURE__ */ e("div", { className: "ds:shrink-0 ds:sm:hidden", children: /* @__PURE__ */ e(x, { size: "xl", name: r, src: n, "aria-hidden": "true" }) }),
111
+ /* @__PURE__ */ e("div", { className: "ds:hidden ds:shrink-0 ds:sm:block", children: /* @__PURE__ */ e(x, { size: "3xl", name: r, src: n, "aria-hidden": "true" }) }),
112
+ /* @__PURE__ */ s("div", { className: "ds:flex ds:w-full ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
113
+ /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-wrap ds:items-start ds:gap-[var(--spacing-md)]", children: [
114
+ /* @__PURE__ */ e(
115
+ "h1",
116
+ {
117
+ id: v,
118
+ className: "type-title-page ds:m-0 ds:text-[color:var(--foreground)]",
119
+ children: r
120
+ }
121
+ ),
122
+ p ? /* @__PURE__ */ e("div", { className: "ds:ms-auto ds:flex ds:shrink-0 ds:items-center ds:gap-[var(--spacing-xs)]", children: p }) : null
123
+ ] }),
124
+ c ? /* @__PURE__ */ e("p", { className: "type-body ds:m-0 ds:text-[color:var(--foreground)]", children: c }) : null,
125
+ o ? (
126
+ // Rating owns the whole line: locale-formatted value, plural-
127
+ // aware review count, and a single role="img" announcement.
128
+ /* @__PURE__ */ e(
129
+ z,
130
+ {
131
+ value: o.value,
132
+ max: 5,
133
+ size: "md",
134
+ reviews: { count: o.count }
135
+ }
136
+ )
137
+ ) : null,
138
+ d && d.length > 0 ? /* @__PURE__ */ e(
139
+ "div",
140
+ {
141
+ role: "list",
142
+ className: "ds:mt-[var(--spacing-2xs)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)]",
143
+ children: d.map((a) => /* @__PURE__ */ e(
144
+ B,
145
+ {
146
+ variant: a.variant ?? "neutral",
147
+ role: "listitem",
148
+ children: a.label
149
+ },
150
+ a.key
151
+ ))
152
+ }
153
+ ) : null
154
+ ] })
155
+ ]
156
+ }
157
+ );
158
+ return /* @__PURE__ */ e(
159
+ "div",
160
+ {
161
+ ref: H,
162
+ role: "region",
163
+ "aria-label": f,
164
+ "aria-labelledby": f ? void 0 : v,
165
+ "data-component": "practice-profile-hero",
166
+ "data-component-id": l,
167
+ "data-has-cover": i ? "true" : "false",
168
+ id: l,
169
+ className: V({ surface: m, className: N }),
170
+ ...P,
171
+ children: m === "elevated" ? /* @__PURE__ */ s(y, { variant: "elevated", children: [
172
+ u,
173
+ /* @__PURE__ */ e(y.Body, { children: g })
174
+ ] }) : /* @__PURE__ */ s(w, { children: [
175
+ u,
176
+ /* @__PURE__ */ e("div", { className: "ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]", children: g })
177
+ ] })
178
+ }
179
+ );
180
+ }
181
+ );
182
+ E.displayName = "PracticeProfileHero";
183
+ export {
184
+ E as P,
185
+ M as p
186
+ };
187
+ //# sourceMappingURL=practice-profile-hero-Bdd0bFqC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"practice-profile-hero-Bdd0bFqC.js","sources":["../../src/components/practice-profile-hero/practice-profile-hero.agent.ts","../../src/components/practice-profile-hero/practice-profile-hero.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PracticeProfileHeroHandle } from './practice-profile-hero';\n\nexport const practiceProfileHeroAgent: AgentAdapter<PracticeProfileHeroHandle> =\n {\n id: 'practice-profile-hero',\n // Purely observable hero region — no interactive affordances and no\n // imperative actions on the handle (getName / getHasCover are read-only\n // projections).\n capabilities: [],\n state: {\n name: {\n type: 'string',\n descriptionKey: 'ui.agent.practiceProfileHero.state.name',\n description: 'Practice display name currently rendered.',\n read: (handle) => handle.getName(),\n },\n hasCover: {\n type: 'boolean',\n descriptionKey: 'ui.agent.practiceProfileHero.state.hasCover',\n description:\n 'Whether a cover-image strip is rendered. Structural flag only — never the image URL or any PHI.',\n read: (handle) => handle.getHasCover(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'practice-profile-hero',\n description: 'Marks the PracticeProfileHero root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n };\n","import {\n forwardRef,\n useId,\n useMemo,\n useRef,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { Avatar } from '../avatar/avatar';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { Rating } from '../rating/rating';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { practiceProfileHeroAgent } from './practice-profile-hero.agent';\n\n/* -------------------------------------------------------------------- */\n/* PracticeProfileHero */\n/* */\n/* The practice-page counterpart to `<OperatorHero>` — the top-of-page */\n/* hero for a practice profile (booking site `/p/<seoUrl>`, marketplace */\n/* practice views). Differences from the operator hero: */\n/* */\n/* - Optional cover strip: renders ONLY when `coverImageUrl` is set. */\n/* A practice without a configured cover image gets no strip at all */\n/* — never an empty brand-gradient band eating page space. */\n/* - Larger avatar at desktop widths (3xl), stepped down to xl and */\n/* stacked above the text on small viewports so the practice name, */\n/* tagline and rating keep the full line width on phones. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n // Matches the kit's other `surface` props (Booking, ReviewsPanel,\n // OperatorHero). `'elevated'` wraps in `<Card>`.\n surface: {\n flat: '',\n elevated: '',\n },\n },\n defaultVariants: {\n surface: 'elevated',\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\nexport interface PracticeProfileHeroBadge {\n /** Display key — i18n is up to the consumer. */\n key: string;\n /** Display label. */\n label: string;\n /** Badge variant — falls back to `neutral`. */\n variant?: 'neutral' | 'info' | 'success' | 'warning' | 'error';\n}\n\nexport interface PracticeProfileHeroRating {\n /** Mean rating, 0–5. */\n value: number;\n /** Total number of reviews. */\n count: number;\n}\n\nexport interface PracticeProfileHeroHandle {\n getName: () => string;\n /** Structural flag — whether a cover strip is rendered. No PHI. */\n getHasCover: () => boolean;\n}\n\nexport interface PracticeProfileHeroProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children'\n> {\n /** Practice display name. Rendered as the H1 heading. */\n name: string;\n /** Slogan / tagline subtitle (e.g. \"15 anni di esperienza nel cuore di Brera\"). */\n tagline?: string;\n /**\n * Optional practice photo / logo URL. The kit always renders an\n * `<Avatar>` — when `imageUrl` is missing the avatar falls back to\n * initials.\n */\n imageUrl?: string;\n /**\n * Optional cover image painted as a full-width strip above the body.\n * The strip renders ONLY when this is set — a practice without a cover\n * image gets no strip (and no empty gradient band). While the image\n * loads, the brand gradient shows underneath it.\n */\n coverImageUrl?: string;\n /** Rating summary — when present, renders a Rating + numeric breakdown line. */\n rating?: PracticeProfileHeroRating;\n /**\n * Optional badge row beneath the rating. Use sparingly — 1–3 chips\n * suit the hero's density; longer lists belong in `<ContactProfileCard>`.\n */\n badges?: PracticeProfileHeroBadge[];\n\n /* ----- Slots ----- */\n\n /**\n * Rendered at the inline-end of the heading row (right side on LTR).\n * Use for a \"Book an appointment\" `<Button>` or a share action.\n */\n actionSlot?: ReactNode;\n\n /* ----- Styling ----- */\n\n /**\n * `elevated` (default) wraps in `<Card variant=\"elevated\">`. `flat`\n * drops the Card — use inside another card / sheet.\n */\n surface?: 'flat' | 'elevated';\n\n /* ----- a11y ----- */\n\n 'aria-label'?: string;\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const PracticeProfileHero = forwardRef<\n HTMLDivElement,\n PracticeProfileHeroProps\n>(\n (\n {\n name,\n tagline,\n imageUrl,\n coverImageUrl,\n rating,\n badges,\n actionSlot,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const headingId = useId();\n const hasCover = Boolean(coverImageUrl);\n\n // Memoised so the registry doesn't see a fresh handle identity (and\n // fire unregister+register) on every render — mirrors Booking.\n const agentHandle = useMemo(\n () => ({ getName: () => name, getHasCover: () => hasCover }),\n [name, hasCover],\n );\n useAgentRegistration(practiceProfileHeroAgent, agentHandle, id);\n\n // Cover image URL lands as a component-scoped CSS custom property set\n // imperatively on a ref — mirrors the Avatar `--avatar-color-override`\n // idiom so no `style={{…}}` attribute lands on the JSX (constraint §4).\n const coverRef = useRef<HTMLDivElement>(null);\n useIsomorphicLayoutEffect(() => {\n const el = coverRef.current;\n if (!el) return;\n if (coverImageUrl) {\n el.style.setProperty(\n '--practice-profile-hero-cover',\n `url(\"${coverImageUrl.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\")`,\n );\n } else {\n el.style.removeProperty('--practice-profile-hero-cover');\n }\n }, [coverImageUrl]);\n\n const cover = hasCover ? (\n <div\n ref={coverRef}\n aria-hidden=\"true\"\n data-slot=\"cover\"\n className={[\n 'ds:h-32 ds:sm:h-40 ds:w-full',\n // Cover image layered over the brand gradient — the gradient is\n // the visible underlay while the image streams in (or 404s). The\n // `none` fallback keeps the declaration valid before the layout\n // effect sets the custom property (SSR / first paint).\n 'ds:bg-[image:var(--practice-profile-hero-cover,none),var(--gradient-hero-brand)]',\n 'ds:bg-cover ds:bg-center',\n ].join(' ')}\n />\n ) : null;\n\n const body = (\n <div\n className={[\n // Phones: stacked column, smaller avatar — the practice name,\n // tagline and rating keep the full line width instead of being\n // squeezed beside a 3xl avatar. sm+: classic row layout.\n 'ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-md)]',\n 'ds:sm:flex-row ds:sm:gap-[var(--spacing-lg)]',\n ].join(' ')}\n >\n {/* Responsive avatar — `ds:hidden` removes the inactive size from\n both the layout and the accessibility tree. Both renders are\n aria-hidden: the H1 right beside them already carries the\n practice name, so the avatar is decorative here. */}\n <div className=\"ds:shrink-0 ds:sm:hidden\">\n <Avatar size=\"xl\" name={name} src={imageUrl} aria-hidden=\"true\" />\n </div>\n <div className=\"ds:hidden ds:shrink-0 ds:sm:block\">\n <Avatar size=\"3xl\" name={name} src={imageUrl} aria-hidden=\"true\" />\n </div>\n <div className=\"ds:flex ds:w-full ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-start ds:gap-[var(--spacing-md)]\">\n <h1\n id={headingId}\n className=\"type-title-page ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {name}\n </h1>\n {actionSlot ? (\n <div className=\"ds:ms-auto ds:flex ds:shrink-0 ds:items-center ds:gap-[var(--spacing-xs)]\">\n {actionSlot}\n </div>\n ) : null}\n </div>\n {tagline ? (\n <p className=\"type-body ds:m-0 ds:text-[color:var(--foreground)]\">\n {tagline}\n </p>\n ) : null}\n {rating ? (\n // Rating owns the whole line: locale-formatted value, plural-\n // aware review count, and a single role=\"img\" announcement.\n <Rating\n value={rating.value}\n max={5}\n size=\"md\"\n reviews={{ count: rating.count }}\n />\n ) : null}\n {badges && badges.length > 0 ? (\n <div\n role=\"list\"\n className=\"ds:mt-[var(--spacing-2xs)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)]\"\n >\n {badges.map((badge) => (\n <Badge\n key={badge.key}\n variant={badge.variant ?? 'neutral'}\n role=\"listitem\"\n >\n {badge.label}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"region\"\n // A consumer-supplied aria-label wins; otherwise the region is\n // named by the practice-name H1 via aria-labelledby.\n aria-label={ariaLabel}\n aria-labelledby={ariaLabel ? undefined : headingId}\n data-component=\"practice-profile-hero\"\n data-component-id={id}\n data-has-cover={hasCover ? 'true' : 'false'}\n id={id}\n className={rootVariants({ surface, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">\n {cover}\n <Card.Body>{body}</Card.Body>\n </Card>\n ) : (\n <>\n {cover}\n <div className=\"ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]\">\n {body}\n </div>\n </>\n )}\n </div>\n );\n },\n);\n\nPracticeProfileHero.displayName = 'PracticeProfileHero';\n"],"names":["practiceProfileHeroAgent","handle","rootVariants","cva","PracticeProfileHero","forwardRef","name","tagline","imageUrl","coverImageUrl","rating","badges","actionSlot","surface","ariaLabel","id","className","rest","ref","headingId","useId","hasCover","agentHandle","useMemo","useAgentRegistration","coverRef","useRef","useIsomorphicLayoutEffect","el","cover","jsx","body","jsxs","Avatar","Rating","badge","Badge","Card","Fragment"],"mappings":"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"}