@alfadocs/ui-kit-debug 0.84.1 → 0.85.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 (135) hide show
  1. package/dist/_chunks/actions-cell-renderer-DaL80uqL.js.map +1 -1
  2. package/dist/_chunks/{ai-consent-banner-DUhr1yNj.js → ai-consent-banner-BXD7W6FI.js} +2 -2
  3. package/dist/_chunks/{ai-consent-banner-DUhr1yNj.js.map → ai-consent-banner-BXD7W6FI.js.map} +1 -1
  4. package/dist/_chunks/{alert-KJbsPYkI.js → alert-Cxaqd-QO.js} +12 -12
  5. package/dist/_chunks/alert-Cxaqd-QO.js.map +1 -0
  6. package/dist/_chunks/anamnesis-card-CJ5MNbkc.js.map +1 -1
  7. package/dist/_chunks/{audio-recorder-Cc3KuL9y.js → audio-recorder-BjnB7V8n.js} +2 -2
  8. package/dist/_chunks/{audio-recorder-Cc3KuL9y.js.map → audio-recorder-BjnB7V8n.js.map} +1 -1
  9. package/dist/_chunks/{booking-CLmeXtGv.js → booking-BvCu2XWY.js} +2 -2
  10. package/dist/_chunks/{booking-CLmeXtGv.js.map → booking-BvCu2XWY.js.map} +1 -1
  11. package/dist/_chunks/breadcrumb-agut0PwN.js.map +1 -1
  12. package/dist/_chunks/calendar-event-card-C6qGtywL.js.map +1 -1
  13. package/dist/_chunks/chat-input-QpHxBEnN.js.map +1 -1
  14. package/dist/_chunks/chat-message-CdjWqZjo.js.map +1 -1
  15. package/dist/_chunks/checkbox-group-CfqMv57d.js.map +1 -1
  16. package/dist/_chunks/dependent-selector-DyFpdzZV.js.map +1 -1
  17. package/dist/_chunks/{document-preview-nwfulDEs.js → document-preview-DXl9migE.js} +2 -2
  18. package/dist/_chunks/{document-preview-nwfulDEs.js.map → document-preview-DXl9migE.js.map} +1 -1
  19. package/dist/_chunks/{document-scanner-B6h1Ir56.js → document-scanner-cS_ispQs.js} +3 -3
  20. package/dist/_chunks/document-scanner-cS_ispQs.js.map +1 -0
  21. package/dist/_chunks/editable-currency-cell-renderer-Dus_sBvX.js.map +1 -1
  22. package/dist/_chunks/email-input-Dpe63k0K.js.map +1 -1
  23. package/dist/_chunks/{entity-summary--vP698Jn.js → entity-summary-BILN4wEG.js} +2 -2
  24. package/dist/_chunks/{entity-summary--vP698Jn.js.map → entity-summary-BILN4wEG.js.map} +1 -1
  25. package/dist/_chunks/{field-value-DHG6gEKS.js → field-value-BRVbZJej.js} +133 -144
  26. package/dist/_chunks/field-value-BRVbZJej.js.map +1 -0
  27. package/dist/_chunks/{file-manager-DLJlinIO.js → file-manager-B9LZzT5E.js} +129 -129
  28. package/dist/_chunks/file-manager-B9LZzT5E.js.map +1 -0
  29. package/dist/_chunks/{file-upload-DENvuhfs.js → file-upload-CwxdqkMK.js} +134 -146
  30. package/dist/_chunks/file-upload-CwxdqkMK.js.map +1 -0
  31. package/dist/_chunks/finished-terminal-C0_mefrf.js.map +1 -1
  32. package/dist/_chunks/fiscal-code-input-QP9gkyDE.js.map +1 -1
  33. package/dist/_chunks/form-field-M5UpX65Z.js.map +1 -1
  34. package/dist/_chunks/{freemium-paywall-CmV642PA.js → freemium-paywall-Dr2342_S.js} +2 -2
  35. package/dist/_chunks/{freemium-paywall-CmV642PA.js.map → freemium-paywall-Dr2342_S.js.map} +1 -1
  36. package/dist/_chunks/iban-input-DXIA8Ln_.js.map +1 -1
  37. package/dist/_chunks/{marketplace-app-shell-Br2yebEK.js → marketplace-app-shell-Chcj4q4z.js} +2 -2
  38. package/dist/_chunks/{marketplace-app-shell-Br2yebEK.js.map → marketplace-app-shell-Chcj4q4z.js.map} +1 -1
  39. package/dist/_chunks/message-square-Bye4ATvx.js +20 -0
  40. package/dist/_chunks/message-square-Bye4ATvx.js.map +1 -0
  41. package/dist/_chunks/{notes-panel-Cvdp818a.js → notes-panel-BLjlYBt-.js} +2 -2
  42. package/dist/_chunks/{notes-panel-Cvdp818a.js.map → notes-panel-BLjlYBt-.js.map} +1 -1
  43. package/dist/_chunks/pagination-EkD5SiCK.js.map +1 -1
  44. package/dist/_chunks/{patient-details-COvYWp2e.js → patient-details-B9LCdyWW.js} +2 -2
  45. package/dist/_chunks/{patient-details-COvYWp2e.js.map → patient-details-B9LCdyWW.js.map} +1 -1
  46. package/dist/_chunks/{patient-search-BaUJ_Y-N.js → patient-search-vtRTSdf6.js} +2 -2
  47. package/dist/_chunks/{patient-search-BaUJ_Y-N.js.map → patient-search-vtRTSdf6.js.map} +1 -1
  48. package/dist/_chunks/{patient-summary-card-D6kgdTNn.js → patient-summary-card-vn1H4xWj.js} +2 -2
  49. package/dist/_chunks/patient-summary-card-vn1H4xWj.js.map +1 -0
  50. package/dist/_chunks/{patient-table-BHzmUbzu.js → patient-table-B6AKMTm3.js} +182 -196
  51. package/dist/_chunks/patient-table-B6AKMTm3.js.map +1 -0
  52. package/dist/_chunks/{payment-form-DL9xk9BA.js → payment-form-BoGxEmGn.js} +2 -2
  53. package/dist/_chunks/{payment-form-DL9xk9BA.js.map → payment-form-BoGxEmGn.js.map} +1 -1
  54. package/dist/_chunks/{payment-request-card-d-RmzsUd.js → payment-request-card-CygO1anM.js} +72 -70
  55. package/dist/_chunks/payment-request-card-CygO1anM.js.map +1 -0
  56. package/dist/_chunks/{pdf-viewer-DF3VMaPo.js → pdf-viewer-CcOuR2wj.js} +2 -2
  57. package/dist/_chunks/{pdf-viewer-DF3VMaPo.js.map → pdf-viewer-CcOuR2wj.js.map} +1 -1
  58. package/dist/_chunks/postal-code-input-BznBxVxf.js.map +1 -1
  59. package/dist/_chunks/{practice-results-BCr7jMt1.js → practice-results-yKbwIxqa.js} +2 -2
  60. package/dist/_chunks/{practice-results-BCr7jMt1.js.map → practice-results-yKbwIxqa.js.map} +1 -1
  61. package/dist/_chunks/radio-group-CI-6SmSw.js.map +1 -1
  62. package/dist/_chunks/{radiograph-panel.agent-CxF9pVxd.js → radiograph-panel.agent-M9XD4ze4.js} +2 -2
  63. package/dist/_chunks/{radiograph-panel.agent-CxF9pVxd.js.map → radiograph-panel.agent-M9XD4ze4.js.map} +1 -1
  64. package/dist/_chunks/{rich-text-editor-CCWjNkbx.js → rich-text-editor-RRkBN_WB.js} +2 -2
  65. package/dist/_chunks/rich-text-editor-RRkBN_WB.js.map +1 -0
  66. package/dist/_chunks/{session-countdown-C8AsE072.js → session-countdown-Bc70VXN1.js} +58 -48
  67. package/dist/_chunks/session-countdown-Bc70VXN1.js.map +1 -0
  68. package/dist/_chunks/{sign-document-Bfk0WpWV.js → sign-document-DI561d1C.js} +2 -2
  69. package/dist/_chunks/sign-document-DI561d1C.js.map +1 -0
  70. package/dist/_chunks/{signature-request-CEOrCDyk.js → signature-request-D_6jgDZd.js} +60 -77
  71. package/dist/_chunks/signature-request-D_6jgDZd.js.map +1 -0
  72. package/dist/_chunks/task-card-BUgK6yZT.js.map +1 -1
  73. package/dist/_chunks/{task-tray-Br3vc0O1.js → task-tray-CLIqIXUZ.js} +58 -70
  74. package/dist/_chunks/task-tray-CLIqIXUZ.js.map +1 -0
  75. package/dist/_chunks/tasks-panel-CjGAhIN8.js.map +1 -1
  76. package/dist/_chunks/timeline-r-8IUoBS.js.map +1 -1
  77. package/dist/_chunks/{toast.agent-uV8CeAy6.js → toast.agent-Iw2jWdce.js} +2 -2
  78. package/dist/_chunks/{toast.agent-uV8CeAy6.js.map → toast.agent-Iw2jWdce.js.map} +1 -1
  79. package/dist/_chunks/use-password-requirements-Bwtqx1qN.js.map +1 -1
  80. package/dist/_chunks/{warning-stack-BlG_Ujy3.js → warning-stack-CAHQ0xxS.js} +2 -2
  81. package/dist/_chunks/{warning-stack-BlG_Ujy3.js.map → warning-stack-CAHQ0xxS.js.map} +1 -1
  82. package/dist/_chunks/{workflow-map-C643Q43h.js → workflow-map-SIfAhmWz.js} +2 -2
  83. package/dist/_chunks/workflow-map-SIfAhmWz.js.map +1 -0
  84. package/dist/agent-catalog.json +1 -1
  85. package/dist/components/ai-consent-banner/index.js +1 -1
  86. package/dist/components/alert/index.js +1 -1
  87. package/dist/components/audio-recorder/index.js +1 -1
  88. package/dist/components/booking/index.js +1 -1
  89. package/dist/components/document-preview/index.js +1 -1
  90. package/dist/components/document-scanner/index.js +1 -1
  91. package/dist/components/entity-summary/index.js +1 -1
  92. package/dist/components/file-manager/index.js +1 -1
  93. package/dist/components/file-upload/file-upload.d.ts.map +1 -1
  94. package/dist/components/file-upload/index.js +1 -1
  95. package/dist/components/freemium-paywall/index.js +1 -1
  96. package/dist/components/notes-panel/index.js +1 -1
  97. package/dist/components/patient-details/index.js +1 -1
  98. package/dist/components/patient-search/index.js +1 -1
  99. package/dist/components/patient-summary-card/index.js +1 -1
  100. package/dist/components/patient-table/index.js +1 -1
  101. package/dist/components/payment-card/index.js +1 -1
  102. package/dist/components/payment-form/index.js +1 -1
  103. package/dist/components/pdf-viewer/index.js +1 -1
  104. package/dist/components/practice-results/index.js +1 -1
  105. package/dist/components/radiograph-panel/index.js +1 -1
  106. package/dist/components/rich-text-editor/index.js +1 -1
  107. package/dist/components/session-countdown/index.js +1 -1
  108. package/dist/components/sign-document/index.js +1 -1
  109. package/dist/components/task-card/task-card.d.ts.map +1 -1
  110. package/dist/components/task-tray/index.js +1 -1
  111. package/dist/components/toast/index.js +1 -1
  112. package/dist/components/warning-stack/index.js +1 -1
  113. package/dist/components/workflow/index.js +1 -1
  114. package/dist/index.js +434 -445
  115. package/dist/index.js.map +1 -1
  116. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  117. package/dist/patterns/signature-request/index.js +1 -1
  118. package/dist/tokens.css +1 -1
  119. package/package.json +5 -3
  120. package/dist/_chunks/alert-KJbsPYkI.js.map +0 -1
  121. package/dist/_chunks/circle-x-W8Enq3i4.js +0 -16
  122. package/dist/_chunks/circle-x-W8Enq3i4.js.map +0 -1
  123. package/dist/_chunks/document-scanner-B6h1Ir56.js.map +0 -1
  124. package/dist/_chunks/field-value-DHG6gEKS.js.map +0 -1
  125. package/dist/_chunks/file-manager-DLJlinIO.js.map +0 -1
  126. package/dist/_chunks/file-upload-DENvuhfs.js.map +0 -1
  127. package/dist/_chunks/patient-summary-card-D6kgdTNn.js.map +0 -1
  128. package/dist/_chunks/patient-table-BHzmUbzu.js.map +0 -1
  129. package/dist/_chunks/payment-request-card-d-RmzsUd.js.map +0 -1
  130. package/dist/_chunks/rich-text-editor-CCWjNkbx.js.map +0 -1
  131. package/dist/_chunks/session-countdown-C8AsE072.js.map +0 -1
  132. package/dist/_chunks/sign-document-Bfk0WpWV.js.map +0 -1
  133. package/dist/_chunks/signature-request-CEOrCDyk.js.map +0 -1
  134. package/dist/_chunks/task-tray-Br3vc0O1.js.map +0 -1
  135. package/dist/_chunks/workflow-map-C643Q43h.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"radio-group-CI-6SmSw.js","sources":["../../src/components/radio-group/radio-group.agent.ts","../../src/components/radio-group/radio-group.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — RadioGroup. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { RadioGroupHandle } from './radio-group';\n\nexport const radioGroupAgent: AgentAdapter<RadioGroupHandle> = {\n id: 'radio-group',\n capabilities: ['select_single'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.radioGroup.state.value',\n description: 'Currently selected radio value, or empty string when none.',\n read: (handle) => handle.getValue(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n descriptionKey: 'ui.agent.radioGroup.actions.setValue',\n description: 'Select the radio with the given value.',\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'radio-group',\n description: 'Marks the RadioGroup 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-option-id',\n description: 'Stable opaque value emitted on each rendered Radio child.',\n },\n },\n};\n","import {\n forwardRef,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { AlertCircle } from 'lucide-react';\nimport {\n RadioGroupInternalContext,\n type RadioGroupInternalContextShape,\n type RadioGroupVariant,\n} from './radio-group-context';\nimport { useDirection } from '../_shared/use-direction';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { useAgentRegistration } from '../../agent';\nimport { radioGroupAgent } from './radio-group.agent';\n\n/** Agent-readiness curated handle for RadioGroup. */\nexport interface RadioGroupHandle {\n getValue: () => string;\n setValue: (value: string) => void;\n}\n\nconst radioGroupVariants = cva('ds:flex', {\n variants: {\n variant: {\n vertical: 'ds:flex-col ds:gap-[var(--spacing-sm)]',\n horizontal: 'ds:flex-row ds:flex-wrap ds:gap-[var(--spacing-md)]',\n card: 'ds:flex-col ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: {\n variant: 'vertical',\n },\n});\n\ntype RadixRootProps = ComponentPropsWithoutRef<typeof RadixRadioGroup.Root>;\n\nexport interface RadioGroupProps\n extends\n Omit<RadixRootProps, 'children' | 'orientation'>,\n VariantProps<typeof radioGroupVariants> {\n children: React.ReactNode;\n variant?: RadioGroupVariant;\n label?: string;\n description?: string;\n error?: string;\n required?: boolean;\n}\n\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n children,\n variant = 'vertical',\n label,\n description,\n error,\n required,\n disabled,\n className,\n id,\n value,\n defaultValue,\n onValueChange,\n ...props\n },\n ref,\n ) => {\n const baseId = useId();\n const legendId = `${baseId}-legend`;\n const descriptionId = `${baseId}-description`;\n const errorId = `${baseId}-error`;\n\n const describedBy =\n [description ? descriptionId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined;\n\n // When a visible label is provided it names the inner radiogroup via\n // aria-labelledby. The outer <fieldset> is neutralised to role=\"presentation\"\n // (below) so screen readers announce ONE named radiogroup, not a named group\n // wrapping a named radiogroup.\n const labelledBy = label ? legendId : undefined;\n\n const orientation: 'vertical' | 'horizontal' =\n variant === 'horizontal' ? 'horizontal' : 'vertical';\n\n const ctxValue: RadioGroupInternalContextShape = useMemo(\n () => ({ variant }),\n [variant],\n );\n\n const descriptionNode = description ? (\n <p id={descriptionId} className=\"type-body-sm ds:text-muted-foreground\">\n {description}\n </p>\n ) : null;\n\n const errorNode = error ? (\n <p\n id={errorId}\n role=\"alert\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-destructive\"\n >\n <AlertCircle aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0\" />\n <span>{error}</span>\n </p>\n ) : null;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = composeRefs(ref, rootRef);\n const dir = useDirection(rootRef);\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? '',\n );\n const currentValue = isControlled ? (value ?? '') : internalValue;\n const currentValueRef = useRef<string>(currentValue);\n currentValueRef.current = currentValue;\n\n const handleValueChange = (next: string) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n };\n\n const agentHandle = useMemo<RadioGroupHandle>(\n () => ({\n getValue: () => currentValueRef.current,\n setValue: (next) => handleValueChange(next),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isControlled, onValueChange],\n );\n useAgentRegistration(radioGroupAgent, agentHandle, id);\n\n const root = (\n <RadixRadioGroup.Root\n ref={composedRef}\n id={id}\n orientation={orientation}\n dir={dir}\n disabled={disabled}\n required={required}\n value={isControlled ? value : undefined}\n defaultValue={!isControlled ? defaultValue : undefined}\n onValueChange={handleValueChange}\n aria-labelledby={labelledBy}\n aria-describedby={describedBy}\n aria-invalid={Boolean(error) || undefined}\n aria-required={required || undefined}\n className={radioGroupVariants({ variant, className })}\n data-component=\"radio-group\"\n data-component-id={id}\n {...props}\n >\n {children}\n </RadixRadioGroup.Root>\n );\n\n const outerClasses =\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:min-w-0';\n\n if (label) {\n return (\n <RadioGroupInternalContext.Provider value={ctxValue}>\n <fieldset\n role=\"presentation\"\n className={`${outerClasses} ds:border-0 ds:p-0 ds:m-0`}\n >\n <legend\n id={legendId}\n className=\"type-label ds:text-foreground ds:p-0\"\n >\n {label}\n {required ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-destructive ds:ms-[var(--spacing-xs)]\"\n >\n *\n </span>\n ) : null}\n </legend>\n {descriptionNode}\n {root}\n {errorNode}\n </fieldset>\n </RadioGroupInternalContext.Provider>\n );\n }\n\n return (\n <RadioGroupInternalContext.Provider value={ctxValue}>\n <div className={outerClasses}>\n {descriptionNode}\n {root}\n {errorNode}\n </div>\n </RadioGroupInternalContext.Provider>\n );\n },\n);\n\nRadioGroup.displayName = 'RadioGroup';\n"],"names":["radioGroupAgent","handle","args","radioGroupVariants","cva","RadioGroup","forwardRef","children","variant","label","description","error","required","disabled","className","id","value","defaultValue","onValueChange","props","ref","baseId","useId","legendId","descriptionId","errorId","describedBy","labelledBy","orientation","ctxValue","useMemo","descriptionNode","jsx","errorNode","jsxs","AlertCircle","rootRef","useRef","composedRef","composeRefs","dir","useDirection","isControlled","internalValue","setInternalValue","useState","currentValue","currentValueRef","handleValueChange","next","agentHandle","useAgentRegistration","root","RadixRadioGroup","outerClasses","RadioGroupInternalContext"],"mappings":"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"}
1
+ {"version":3,"file":"radio-group-CI-6SmSw.js","sources":["../../src/components/radio-group/radio-group.agent.ts","../../src/components/radio-group/radio-group.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — RadioGroup. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { RadioGroupHandle } from './radio-group';\n\nexport const radioGroupAgent: AgentAdapter<RadioGroupHandle> = {\n id: 'radio-group',\n capabilities: ['select_single'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.radioGroup.state.value',\n description: 'Currently selected radio value, or empty string when none.',\n read: (handle) => handle.getValue(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n descriptionKey: 'ui.agent.radioGroup.actions.setValue',\n description: 'Select the radio with the given value.',\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'radio-group',\n description: 'Marks the RadioGroup 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-option-id',\n description: 'Stable opaque value emitted on each rendered Radio child.',\n },\n },\n};\n","import {\n forwardRef,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { CircleAlert } from 'lucide-react';\nimport {\n RadioGroupInternalContext,\n type RadioGroupInternalContextShape,\n type RadioGroupVariant,\n} from './radio-group-context';\nimport { useDirection } from '../_shared/use-direction';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { useAgentRegistration } from '../../agent';\nimport { radioGroupAgent } from './radio-group.agent';\n\n/** Agent-readiness curated handle for RadioGroup. */\nexport interface RadioGroupHandle {\n getValue: () => string;\n setValue: (value: string) => void;\n}\n\nconst radioGroupVariants = cva('ds:flex', {\n variants: {\n variant: {\n vertical: 'ds:flex-col ds:gap-[var(--spacing-sm)]',\n horizontal: 'ds:flex-row ds:flex-wrap ds:gap-[var(--spacing-md)]',\n card: 'ds:flex-col ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: {\n variant: 'vertical',\n },\n});\n\ntype RadixRootProps = ComponentPropsWithoutRef<typeof RadixRadioGroup.Root>;\n\nexport interface RadioGroupProps\n extends\n Omit<RadixRootProps, 'children' | 'orientation'>,\n VariantProps<typeof radioGroupVariants> {\n children: React.ReactNode;\n variant?: RadioGroupVariant;\n label?: string;\n description?: string;\n error?: string;\n required?: boolean;\n}\n\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n children,\n variant = 'vertical',\n label,\n description,\n error,\n required,\n disabled,\n className,\n id,\n value,\n defaultValue,\n onValueChange,\n ...props\n },\n ref,\n ) => {\n const baseId = useId();\n const legendId = `${baseId}-legend`;\n const descriptionId = `${baseId}-description`;\n const errorId = `${baseId}-error`;\n\n const describedBy =\n [description ? descriptionId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined;\n\n // When a visible label is provided it names the inner radiogroup via\n // aria-labelledby. The outer <fieldset> is neutralised to role=\"presentation\"\n // (below) so screen readers announce ONE named radiogroup, not a named group\n // wrapping a named radiogroup.\n const labelledBy = label ? legendId : undefined;\n\n const orientation: 'vertical' | 'horizontal' =\n variant === 'horizontal' ? 'horizontal' : 'vertical';\n\n const ctxValue: RadioGroupInternalContextShape = useMemo(\n () => ({ variant }),\n [variant],\n );\n\n const descriptionNode = description ? (\n <p id={descriptionId} className=\"type-body-sm ds:text-muted-foreground\">\n {description}\n </p>\n ) : null;\n\n const errorNode = error ? (\n <p\n id={errorId}\n role=\"alert\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-destructive\"\n >\n <CircleAlert aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0\" />\n <span>{error}</span>\n </p>\n ) : null;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = composeRefs(ref, rootRef);\n const dir = useDirection(rootRef);\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? '',\n );\n const currentValue = isControlled ? (value ?? '') : internalValue;\n const currentValueRef = useRef<string>(currentValue);\n currentValueRef.current = currentValue;\n\n const handleValueChange = (next: string) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n };\n\n const agentHandle = useMemo<RadioGroupHandle>(\n () => ({\n getValue: () => currentValueRef.current,\n setValue: (next) => handleValueChange(next),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isControlled, onValueChange],\n );\n useAgentRegistration(radioGroupAgent, agentHandle, id);\n\n const root = (\n <RadixRadioGroup.Root\n ref={composedRef}\n id={id}\n orientation={orientation}\n dir={dir}\n disabled={disabled}\n required={required}\n value={isControlled ? value : undefined}\n defaultValue={!isControlled ? defaultValue : undefined}\n onValueChange={handleValueChange}\n aria-labelledby={labelledBy}\n aria-describedby={describedBy}\n aria-invalid={Boolean(error) || undefined}\n aria-required={required || undefined}\n className={radioGroupVariants({ variant, className })}\n data-component=\"radio-group\"\n data-component-id={id}\n {...props}\n >\n {children}\n </RadixRadioGroup.Root>\n );\n\n const outerClasses =\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:min-w-0';\n\n if (label) {\n return (\n <RadioGroupInternalContext.Provider value={ctxValue}>\n <fieldset\n role=\"presentation\"\n className={`${outerClasses} ds:border-0 ds:p-0 ds:m-0`}\n >\n <legend\n id={legendId}\n className=\"type-label ds:text-foreground ds:p-0\"\n >\n {label}\n {required ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-destructive ds:ms-[var(--spacing-xs)]\"\n >\n *\n </span>\n ) : null}\n </legend>\n {descriptionNode}\n {root}\n {errorNode}\n </fieldset>\n </RadioGroupInternalContext.Provider>\n );\n }\n\n return (\n <RadioGroupInternalContext.Provider value={ctxValue}>\n <div className={outerClasses}>\n {descriptionNode}\n {root}\n {errorNode}\n </div>\n </RadioGroupInternalContext.Provider>\n );\n },\n);\n\nRadioGroup.displayName = 'RadioGroup';\n"],"names":["radioGroupAgent","handle","args","radioGroupVariants","cva","RadioGroup","forwardRef","children","variant","label","description","error","required","disabled","className","id","value","defaultValue","onValueChange","props","ref","baseId","useId","legendId","descriptionId","errorId","describedBy","labelledBy","orientation","ctxValue","useMemo","descriptionNode","jsx","errorNode","jsxs","CircleAlert","rootRef","useRef","composedRef","composeRefs","dir","useDirection","isControlled","internalValue","setInternalValue","useState","currentValue","currentValueRef","handleValueChange","next","agentHandle","useAgentRegistration","root","RadixRadioGroup","outerClasses","RadioGroupInternalContext"],"mappings":"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"}
@@ -7,7 +7,7 @@ import { I as v } from "./icon-button-C_kbcd7I.js";
7
7
  import { B as L } from "./badge-DCOqV9mI.js";
8
8
  import { F as V } from "./form-field-M5UpX65Z.js";
9
9
  import { T as oe } from "./text-area-Bt3p7Pt0.js";
10
- import { F as de } from "./file-upload-DENvuhfs.js";
10
+ import { F as de } from "./file-upload-CwxdqkMK.js";
11
11
  import { D as te } from "./date-picker-DzQS8mvt.js";
12
12
  import { D as le } from "./date-range-picker-Cbz1SKhm.js";
13
13
  import { E } from "./empty-state-CrLsi0XI.js";
@@ -533,4 +533,4 @@ export {
533
533
  qe as R,
534
534
  Ae as r
535
535
  };
536
- //# sourceMappingURL=radiograph-panel.agent-CxF9pVxd.js.map
536
+ //# sourceMappingURL=radiograph-panel.agent-M9XD4ze4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"radiograph-panel.agent-CxF9pVxd.js","sources":["../../node_modules/lucide-react/dist/esm/icons/git-compare-arrows.mjs","../../node_modules/lucide-react/dist/esm/icons/images.mjs","../../src/components/radiograph-panel/radiograph-panel.tsx","../../src/components/radiograph-panel/radiograph-panel.agent.ts"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"5\", cy: \"6\", r: \"3\", key: \"1qnov2\" }],\n [\"path\", { d: \"M12 6h5a2 2 0 0 1 2 2v7\", key: \"1yj91y\" }],\n [\"path\", { d: \"m15 9-3-3 3-3\", key: \"1lwv8l\" }],\n [\"circle\", { cx: \"19\", cy: \"18\", r: \"3\", key: \"1qljk2\" }],\n [\"path\", { d: \"M12 18H7a2 2 0 0 1-2-2V9\", key: \"16sdep\" }],\n [\"path\", { d: \"m9 15 3 3-3 3\", key: \"1m3kbl\" }]\n];\nconst GitCompareArrows = createLucideIcon(\"git-compare-arrows\", __iconNode);\n\nexport { __iconNode, GitCompareArrows as default };\n//# sourceMappingURL=git-compare-arrows.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m22 11-1.296-1.296a2.4 2.4 0 0 0-3.408 0L11 16\", key: \"9kzy35\" }],\n [\"path\", { d: \"M4 8a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2\", key: \"1t0f0t\" }],\n [\"circle\", { cx: \"13\", cy: \"7\", r: \"1\", fill: \"currentColor\", key: \"1obus6\" }],\n [\"rect\", { x: \"8\", y: \"2\", width: \"14\", height: \"14\", rx: \"2\", key: \"1gvhby\" }]\n];\nconst Images = createLucideIcon(\"images\", __iconNode);\n\nexport { __iconNode, Images as default };\n//# sourceMappingURL=images.mjs.map\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactElement,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Upload,\n ZoomIn,\n ZoomOut,\n ChevronLeft,\n ChevronRight,\n Trash2,\n Eye,\n GitCompareArrows,\n Images,\n} from 'lucide-react';\nimport type { FdiId, Radiograph, RadiographKind } from '../tooth-scheme';\nimport { Dialog } from '../dialog';\nimport { Button } from '../button';\nimport { IconButton } from '../icon-button';\nimport { Badge } from '../badge';\nimport { FormField } from '../form-field';\nimport { TextArea } from '../text-area';\nimport { FileUpload } from '../file-upload';\nimport { DatePicker } from '../date-picker';\nimport { DateRangePicker, type DateRangeValue } from '../date-range-picker';\nimport { EmptyState } from '../empty-state';\nimport { PanelHeader } from '../panel-header';\n\n/* ------------------------------------------------------------------ */\n/* RadiographPanel — the Imaging tool for the Control Room rail. */\n/* */\n/* Shows one tooth's radiographs (x-rays / endorali): an upload */\n/* composer, a sortable + date-filtered history, and a fullscreen */\n/* viewer that zooms / steps / compares films. Drops into a */\n/* `ControlRoomRail` tool `panel`, the patient profile, or a care-plan */\n/* editor — anywhere a selected tooth's imaging belongs. The host owns */\n/* the films (`radiographs`) and persistence (`onAddRadiograph` / */\n/* `onDeleteRadiograph`); the panel owns only view state. The chart */\n/* drives selection via `ToothScheme.onOpenRadiographs(toothId)`. */\n/* */\n/* Image urls are opaque / consumer-hosted — never bundled. Real */\n/* radiographs are PHI; stories use synthetic placeholders only. */\n/* ------------------------------------------------------------------ */\n\nconst ZOOM_CLASS = ['ds:scale-100', 'ds:scale-150', 'ds:scale-200'] as const;\n\n/** Sort films newest-first (or oldest-first); undated films sink to the end in\n * BOTH directions — mirrors `ToothScheme.sortByDateDesc`. */\nfunction sortByDate(films: Radiograph[], desc: boolean): Radiograph[] {\n return [...films].sort((a, b) => {\n if (a.date === b.date) return 0;\n if (!a.date) return 1;\n if (!b.date) return -1;\n return (a.date < b.date ? -1 : 1) * (desc ? -1 : 1);\n });\n}\n\n/** Date-range membership. ISO `YYYY-MM-DD` is parsed at LOCAL midnight (the\n * `+'T00:00:00'`) so the filter agrees with the local-midnight `Date` objects\n * the DateRangePicker emits — without it, films are off-by-one west of UTC. */\nfunction inRange(film: Radiograph, range: DateRangeValue): boolean {\n if (!film.date) return !range.from && !range.to;\n const d = new Date(`${film.date}T00:00:00`);\n if (range.from && d < range.from) return false;\n if (range.to && d > range.to) return false;\n return true;\n}\n\n/** Local `YYYY-MM-DD` — avoids the UTC shift `Date.toISOString()` introduces\n * west of UTC for the local-midnight Date the DatePicker emits. */\nfunction toLocalIsoDate(d: Date): string {\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\nexport interface RadiographPanelHandle {\n /** Read the films currently shown (after the host's `radiographs` prop). */\n getRadiographs: () => Radiograph[];\n /** Open the fullscreen viewer on a film by id. */\n openViewer: (id: string) => void;\n /** Close the fullscreen viewer. */\n closeViewer: () => void;\n}\n\nexport interface RadiographPanelProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'title' | 'children'\n> {\n /** Instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** The tooth whose films are shown (FDI id). Null → a \"select a tooth\" prompt. */\n toothId?: FdiId | null;\n /** Display label for the selected tooth. Defaults to the localised \"Tooth {{id}}\". */\n toothLabel?: string;\n /** The selected tooth's films. The panel sorts + filters; order in is irrelevant. */\n radiographs?: Radiograph[];\n /** Commit a new film (the host persists it). Omit to hide the upload composer. */\n onAddRadiograph?: (draft: {\n fileName: string;\n date?: string;\n note?: string;\n }) => void;\n /** Remove a film by id. Omit to hide the delete affordance. */\n onDeleteRadiograph?: (id: string) => void;\n /** Panel heading. Defaults to the localised \"Imaging\". */\n title?: string;\n /** Accessible name for the panel region (defaults to `title`). */\n 'aria-label'?: string;\n}\n\nfunction KindBadge({ kind }: { kind: RadiographKind }): ReactElement {\n const { t } = useTranslation();\n const label = t(`radiographPanel.kind.${kind}`, {\n defaultValue: {\n periapical: 'Periapical',\n bitewing: 'Bitewing',\n panoramic: 'Panoramic',\n other: 'Other',\n }[kind],\n });\n return (\n <Badge variant=\"neutral\" size=\"sm\">\n {label}\n </Badge>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Fullscreen viewer — lightbox + compare */\n/* ------------------------------------------------------------------ */\n\ninterface ViewerState {\n films: Radiograph[];\n index: number;\n compare: boolean;\n}\n\nfunction RadiographViewer({\n state,\n toothLabel,\n onClose,\n onIndexChange,\n}: {\n state: ViewerState | null;\n toothLabel: string;\n onClose: () => void;\n onIndexChange: (index: number) => void;\n}): ReactElement {\n const { t } = useTranslation();\n const [zoom, setZoom] = useState(0);\n // Reset zoom when the viewed film changes (prev/next) or the mode flips, so a\n // user doesn't carry one film's zoom into the next.\n useEffect(() => {\n setZoom(0);\n }, [state?.index, state?.compare]);\n const films = state?.films ?? [];\n const current = state ? films[state.index] : undefined;\n\n return (\n <Dialog.Root\n open={state !== null}\n onOpenChange={(next) => {\n if (!next) {\n setZoom(0);\n onClose();\n }\n }}\n >\n <Dialog.Content size=\"fullscreen\" aria-describedby={undefined}>\n <Dialog.Header>\n <Dialog.Title>\n {state?.compare\n ? t('radiographPanel.viewer.compareTitle', {\n defaultValue: '{{tooth}} — comparison',\n tooth: toothLabel,\n })\n : t('radiographPanel.viewer.title', {\n defaultValue: '{{tooth}} — radiograph',\n tooth: toothLabel,\n })}\n </Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n {state?.compare ? (\n <div className=\"ds:grid ds:grid-cols-2 ds:gap-[var(--spacing-md)]\">\n {films.slice(0, 2).map((film) => (\n <figure\n key={film.id}\n className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n <div className=\"ds:flex ds:items-center ds:justify-center ds:overflow-hidden ds:rounded-[var(--radius-md)] ds:bg-[var(--muted)] ds:p-[var(--spacing-xs)]\">\n <img\n src={film.thumbnailUrl ?? film.url}\n alt={film.alt ?? toothLabel}\n className=\"ds:max-h-full ds:max-w-full ds:object-contain\"\n />\n </div>\n <figcaption className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {film.date}\n </figcaption>\n </figure>\n ))}\n </div>\n ) : (\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:max-h-full ds:items-center ds:justify-center ds:overflow-hidden ds:rounded-[var(--radius-md)] ds:bg-[var(--muted)] ds:p-[var(--spacing-sm)]\">\n <img\n src={current?.thumbnailUrl ?? current?.url}\n alt={current?.alt ?? toothLabel}\n className={[\n 'ds:max-h-full ds:max-w-full ds:object-contain',\n 'ds:origin-center ds:transition-transform ds:motion-reduce:transition-none',\n ZOOM_CLASS[zoom],\n ].join(' ')}\n />\n </div>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <IconButton\n icon={<ChevronLeft aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.prev', {\n defaultValue: 'Previous radiograph',\n })}\n size=\"sm\"\n flipIconInRtl\n disabled={!state || state.index === 0}\n onClick={() =>\n state && onIndexChange(Math.max(0, state.index - 1))\n }\n />\n <span\n aria-live=\"polite\"\n className=\"type-meta ds:text-[color:var(--muted-foreground)]\"\n >\n {t('radiographPanel.viewer.position', {\n defaultValue: '{{current}} / {{total}}',\n current: (state?.index ?? 0) + 1,\n total: films.length,\n })}\n </span>\n <IconButton\n icon={<ChevronRight aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.next', {\n defaultValue: 'Next radiograph',\n })}\n size=\"sm\"\n flipIconInRtl\n disabled={!state || state.index >= films.length - 1}\n onClick={() =>\n state &&\n onIndexChange(Math.min(films.length - 1, state.index + 1))\n }\n />\n <span\n aria-hidden=\"true\"\n className=\"ds:ms-[var(--spacing-xs)] ds:me-[var(--spacing-xs)] ds:h-[var(--spacing-md)] ds:w-px ds:bg-[var(--border)]\"\n />\n <IconButton\n icon={<ZoomOut aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.zoomOut', {\n defaultValue: 'Zoom out',\n })}\n size=\"sm\"\n disabled={zoom === 0}\n onClick={() => setZoom((z) => Math.max(0, z - 1))}\n />\n <IconButton\n icon={<ZoomIn aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.zoomIn', {\n defaultValue: 'Zoom in',\n })}\n size=\"sm\"\n disabled={zoom === ZOOM_CLASS.length - 1}\n onClick={() =>\n setZoom((z) => Math.min(ZOOM_CLASS.length - 1, z + 1))\n }\n />\n </div>\n {current?.note ? (\n <p className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {current.note}\n </p>\n ) : null}\n </div>\n )}\n </Dialog.Body>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* RadiographPanel */\n/* ------------------------------------------------------------------ */\n\nexport const RadiographPanel = forwardRef<\n RadiographPanelHandle,\n RadiographPanelProps\n>(function RadiographPanel(\n {\n id,\n toothId,\n toothLabel: toothLabelProp,\n radiographs = [],\n onAddRadiograph,\n onDeleteRadiograph,\n title,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n) {\n const { t } = useTranslation();\n\n const [viewer, setViewer] = useState<ViewerState | null>(null);\n const [compareIds, setCompareIds] = useState<string[]>([]);\n const [sortDesc, setSortDesc] = useState(true);\n const [range, setRange] = useState<DateRangeValue>({});\n const [pendingFile, setPendingFile] = useState<string | null>(null);\n const [date, setDate] = useState<Date | undefined>(undefined);\n const [note, setNote] = useState('');\n\n // Stable, current snapshot for the imperative handle.\n const filmsRef = useRef<Radiograph[]>(radiographs);\n filmsRef.current = radiographs;\n\n useImperativeHandle(\n ref,\n () => ({\n getRadiographs: () => filmsRef.current,\n openViewer: (filmId) => {\n const index = filmsRef.current.findIndex((f) => f.id === filmId);\n if (index >= 0) {\n setViewer({ films: filmsRef.current, index, compare: false });\n }\n },\n closeViewer: () => setViewer(null),\n }),\n [],\n );\n\n const heading =\n title ?? t('radiographPanel.title', { defaultValue: 'Imaging' });\n const toothLabel =\n toothLabelProp ??\n (toothId\n ? t('radiographPanel.toothLabel', {\n defaultValue: 'Tooth {{id}}',\n id: toothId,\n })\n : '');\n\n const visible = useMemo(\n () =>\n sortByDate(\n radiographs.filter((f) => inRange(f, range)),\n sortDesc,\n ),\n [radiographs, range, sortDesc],\n );\n\n const toggleCompare = useCallback((filmId: string) => {\n setCompareIds((ids) =>\n ids.includes(filmId)\n ? ids.filter((x) => x !== filmId)\n : [...ids, filmId].slice(-2),\n );\n }, []);\n\n const handleUpload = useCallback(() => {\n if (!pendingFile || !onAddRadiograph) return;\n onAddRadiograph({\n fileName: pendingFile,\n date: date ? toLocalIsoDate(date) : undefined,\n note: note || undefined,\n });\n setPendingFile(null);\n setNote('');\n setDate(undefined);\n }, [pendingFile, date, note, onAddRadiograph]);\n\n // History filter controls — pinned in the PanelHeader's filters row (only\n // meaningful once a tooth is selected) so they stay put as the list scrolls.\n const historyFilters = toothId ? (\n <>\n <FormField\n label={t('radiographPanel.history.range', {\n defaultValue: 'Date range',\n })}\n >\n <DateRangePicker value={range} onChange={setRange} />\n </FormField>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <Button intent=\"ghost\" size=\"sm\" onClick={() => setSortDesc((s) => !s)}>\n {sortDesc\n ? t('radiographPanel.history.sortNewest', {\n defaultValue: 'Newest first',\n })\n : t('radiographPanel.history.sortOldest', {\n defaultValue: 'Oldest first',\n })}\n </Button>\n <Button\n intent=\"ghost\"\n size=\"sm\"\n startIcon={<GitCompareArrows aria-hidden=\"true\" />}\n disabled={compareIds.length !== 2}\n onClick={() => {\n const films = radiographs.filter((f) => compareIds.includes(f.id));\n if (films.length === 2) {\n setViewer({ films, index: 0, compare: true });\n }\n }}\n >\n {t('radiographPanel.history.compare', {\n defaultValue: 'Compare',\n })}\n </Button>\n </div>\n </>\n ) : undefined;\n\n return (\n <section\n data-component=\"radiograph-panel\"\n data-component-id={id}\n data-tooth={toothId ?? undefined}\n aria-label={ariaLabel ?? heading}\n className={['ds:flex ds:flex-col', className].filter(Boolean).join(' ')}\n {...rest}\n >\n {/* Shared rail-panel header: title + film-count badge, history filters\n pinned beneath, divider, sticky so it stays visible as the list\n scrolls. The rail injects favourite/close into the action cluster. */}\n <PanelHeader\n sticky\n icon={<Images aria-hidden=\"true\" />}\n title={\n <>\n {toothId ? toothLabel : heading}\n {toothId ? (\n <Badge variant=\"info\" size=\"sm\">\n {radiographs.length}\n </Badge>\n ) : null}\n </>\n }\n filters={historyFilters}\n />\n\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:p-[var(--spacing-md)]\">\n {!toothId ? (\n <EmptyState\n variant=\"first-use\"\n title={t('radiographPanel.noTooth.title', {\n defaultValue: 'No tooth selected',\n })}\n description={t('radiographPanel.noTooth.body', {\n defaultValue:\n 'Select a tooth on the chart to view its radiographs.',\n })}\n />\n ) : (\n <>\n {/* Upload */}\n {onAddRadiograph ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <FormField\n label={t('radiographPanel.upload.file', {\n defaultValue: 'Image file',\n })}\n >\n <FileUpload\n accept={{ 'image/*': ['.png', '.jpg', '.jpeg', '.webp'] }}\n variant=\"both\"\n showPreview\n onDrop={(accepted) =>\n setPendingFile(accepted[0]?.name ?? null)\n }\n />\n </FormField>\n <FormField\n label={t('radiographPanel.upload.date', {\n defaultValue: 'Acquisition date',\n })}\n >\n <DatePicker value={date} onChange={(d) => setDate(d)} />\n </FormField>\n <FormField\n label={t('radiographPanel.upload.note', {\n defaultValue: 'Note (optional)',\n })}\n >\n <TextArea\n rows={2}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder={t('radiographPanel.upload.notePlaceholder', {\n defaultValue: 'E.g. routine check, apical lesion…',\n })}\n />\n </FormField>\n <Button\n intent=\"primary\"\n size=\"sm\"\n startIcon={<Upload aria-hidden=\"true\" />}\n disabled={!pendingFile}\n onClick={handleUpload}\n className=\"ds:self-start\"\n >\n {t('radiographPanel.upload.submit', {\n defaultValue: 'Upload',\n })}\n </Button>\n </div>\n ) : null}\n\n {/* History */}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {visible.length === 0 ? (\n <EmptyState\n variant=\"first-use\"\n title={t('radiographPanel.history.emptyTitle', {\n defaultValue: 'No radiographs yet',\n })}\n description={t('radiographPanel.history.emptyBody', {\n defaultValue: 'Upload the first film for this tooth.',\n })}\n />\n ) : (\n <ul className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-xs)] ds:p-0\">\n {visible.map((film, visibleIndex) => {\n const selected = compareIds.includes(film.id);\n // Disambiguate the repeated row actions for screen readers by\n // the film's date (falls back to its 1-based position).\n const filmLabel = film.date ?? String(visibleIndex + 1);\n return (\n <li\n key={film.id}\n data-radiograph-id={film.id}\n data-selected={selected}\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)] ds:bg-[var(--card)] ds:p-[var(--spacing-xs)] ds:data-[selected=true]:border-[color:var(--info-foreground)]\"\n >\n <img\n src={film.thumbnailUrl ?? film.url}\n alt={film.alt ?? ''}\n className=\"ds:h-16 ds:w-12 ds:shrink-0 ds:rounded-[var(--radius-sm)] ds:object-cover\"\n />\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-body-sm ds:text-[color:var(--foreground)]\">\n {film.date}\n </span>\n <KindBadge kind={film.kind ?? 'periapical'} />\n </div>\n <IconButton\n icon={<Eye aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.history.view', {\n defaultValue: 'View radiograph {{film}}',\n film: filmLabel,\n })}\n size=\"sm\"\n intent=\"ghost\"\n // Step the viewer through the FILTERED + sorted list the\n // user is looking at, not every film on the tooth.\n onClick={() =>\n setViewer({\n films: visible,\n index: visibleIndex,\n compare: false,\n })\n }\n />\n <IconButton\n icon={<GitCompareArrows aria-hidden=\"true\" />}\n aria-label={\n selected\n ? t('radiographPanel.history.compareRemove', {\n defaultValue:\n 'Remove {{film}} from comparison',\n film: filmLabel,\n })\n : t('radiographPanel.history.compareAdd', {\n defaultValue:\n 'Select {{film}} for comparison',\n film: filmLabel,\n })\n }\n aria-pressed={selected}\n size=\"sm\"\n intent={selected ? 'secondary' : 'ghost'}\n onClick={() => toggleCompare(film.id)}\n />\n {onDeleteRadiograph ? (\n <IconButton\n icon={<Trash2 aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.history.delete', {\n defaultValue: 'Delete radiograph {{film}}',\n film: filmLabel,\n })}\n size=\"sm\"\n intent=\"ghost\"\n onClick={() => onDeleteRadiograph(film.id)}\n />\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </>\n )}\n </div>\n\n <RadiographViewer\n state={viewer}\n toothLabel={toothLabel}\n onClose={() => setViewer(null)}\n onIndexChange={(index) => setViewer((v) => (v ? { ...v, index } : v))}\n />\n </section>\n );\n});\n\n// `Images` is the panel's imaging glyph (a films archive, not a radiation\n// hazard) — re-exported so a host registering the Control Room tool can use\n// the same icon as the panel.\nexport { Images as RadiographPanelIcon };\n","import type { AgentAdapter } from '../../agent/types';\nimport type { RadiographPanelHandle } from './radiograph-panel';\nimport type { Radiograph } from '../tooth-scheme';\n\n/**\n * The Imaging panel for the Control Room rail. It DISPLAYS the selected tooth's\n * radiographs and drives the fullscreen viewer; uploads and deletes are the\n * host's responsibility (the `onAddRadiograph` / `onDeleteRadiograph` props),\n * so they are not exposed here — the consuming pattern/app owns those `write` /\n * `destructive` workflows and their `radiograph.*` API contracts.\n */\nexport const radiographPanelAgent: AgentAdapter<RadiographPanelHandle> = {\n id: 'radiograph-panel',\n // pick — open a specific film in the viewer; view_change — the viewer is a\n // view surface over the host-owned films.\n capabilities: ['pick', 'view_change'],\n state: {\n radiographs: {\n // A9: structural refs only (id + kind) — never the free-text `note`,\n // service dates, or consumer-hosted image URLs in the always-on snapshot.\n type: 'Array<{ id: string; kind?: string }>',\n descriptionKey: 'ui.agent.radiographPanel.state.radiographs',\n description:\n 'Structural references (id + kind) to the films shown for the selected tooth.',\n read: (handle) =>\n handle\n .getRadiographs()\n .map((film) => ({ id: film.id, kind: film.kind ?? 'periapical' })),\n },\n },\n actions: {\n view_radiograph: {\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.radiographPanel.actions.viewRadiograph',\n description: 'Open a film in the fullscreen viewer by id.',\n invoke: (handle, args: { id: string }) => {\n handle.openViewer(args.id);\n },\n },\n close_viewer: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.radiographPanel.actions.closeViewer',\n description: 'Close the fullscreen radiograph viewer.',\n invoke: (handle) => {\n handle.closeViewer();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'radiograph-panel' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-radiograph-id',\n description:\n \"Each film row (`<li>`) carries its radiograph id as `data-radiograph-id`. The panel root additionally carries the selected tooth's FDI id as `data-tooth`.\",\n },\n },\n};\n\n// Re-exported for callers building typed reads against the adapter.\nexport type { Radiograph };\n"],"names":["__iconNode","GitCompareArrows","createLucideIcon","Images","ZOOM_CLASS","sortByDate","films","desc","a","b","inRange","film","range","d","toLocalIsoDate","pad","n","KindBadge","kind","t","useTranslation","label","Badge","RadiographViewer","state","toothLabel","onClose","onIndexChange","zoom","setZoom","useState","useEffect","current","jsx","Dialog","next","jsxs","IconButton","ChevronLeft","ChevronRight","ZoomOut","z","ZoomIn","RadiographPanel","forwardRef","id","toothId","toothLabelProp","radiographs","onAddRadiograph","onDeleteRadiograph","title","ariaLabel","className","rest","ref","viewer","setViewer","compareIds","setCompareIds","sortDesc","setSortDesc","setRange","pendingFile","setPendingFile","date","setDate","note","setNote","filmsRef","useRef","useImperativeHandle","filmId","index","f","heading","visible","useMemo","toggleCompare","useCallback","ids","x","handleUpload","historyFilters","Fragment","FormField","DateRangePicker","Button","s","PanelHeader","FileUpload","accepted","_a","DatePicker","TextArea","e","Upload","EmptyState","visibleIndex","selected","filmLabel","Eye","Trash2","v","radiographPanelAgent","handle","args"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"radiograph-panel.agent-M9XD4ze4.js","sources":["../../node_modules/lucide-react/dist/esm/icons/git-compare-arrows.mjs","../../node_modules/lucide-react/dist/esm/icons/images.mjs","../../src/components/radiograph-panel/radiograph-panel.tsx","../../src/components/radiograph-panel/radiograph-panel.agent.ts"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"5\", cy: \"6\", r: \"3\", key: \"1qnov2\" }],\n [\"path\", { d: \"M12 6h5a2 2 0 0 1 2 2v7\", key: \"1yj91y\" }],\n [\"path\", { d: \"m15 9-3-3 3-3\", key: \"1lwv8l\" }],\n [\"circle\", { cx: \"19\", cy: \"18\", r: \"3\", key: \"1qljk2\" }],\n [\"path\", { d: \"M12 18H7a2 2 0 0 1-2-2V9\", key: \"16sdep\" }],\n [\"path\", { d: \"m9 15 3 3-3 3\", key: \"1m3kbl\" }]\n];\nconst GitCompareArrows = createLucideIcon(\"git-compare-arrows\", __iconNode);\n\nexport { __iconNode, GitCompareArrows as default };\n//# sourceMappingURL=git-compare-arrows.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m22 11-1.296-1.296a2.4 2.4 0 0 0-3.408 0L11 16\", key: \"9kzy35\" }],\n [\"path\", { d: \"M4 8a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2\", key: \"1t0f0t\" }],\n [\"circle\", { cx: \"13\", cy: \"7\", r: \"1\", fill: \"currentColor\", key: \"1obus6\" }],\n [\"rect\", { x: \"8\", y: \"2\", width: \"14\", height: \"14\", rx: \"2\", key: \"1gvhby\" }]\n];\nconst Images = createLucideIcon(\"images\", __iconNode);\n\nexport { __iconNode, Images as default };\n//# sourceMappingURL=images.mjs.map\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactElement,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Upload,\n ZoomIn,\n ZoomOut,\n ChevronLeft,\n ChevronRight,\n Trash2,\n Eye,\n GitCompareArrows,\n Images,\n} from 'lucide-react';\nimport type { FdiId, Radiograph, RadiographKind } from '../tooth-scheme';\nimport { Dialog } from '../dialog';\nimport { Button } from '../button';\nimport { IconButton } from '../icon-button';\nimport { Badge } from '../badge';\nimport { FormField } from '../form-field';\nimport { TextArea } from '../text-area';\nimport { FileUpload } from '../file-upload';\nimport { DatePicker } from '../date-picker';\nimport { DateRangePicker, type DateRangeValue } from '../date-range-picker';\nimport { EmptyState } from '../empty-state';\nimport { PanelHeader } from '../panel-header';\n\n/* ------------------------------------------------------------------ */\n/* RadiographPanel — the Imaging tool for the Control Room rail. */\n/* */\n/* Shows one tooth's radiographs (x-rays / endorali): an upload */\n/* composer, a sortable + date-filtered history, and a fullscreen */\n/* viewer that zooms / steps / compares films. Drops into a */\n/* `ControlRoomRail` tool `panel`, the patient profile, or a care-plan */\n/* editor — anywhere a selected tooth's imaging belongs. The host owns */\n/* the films (`radiographs`) and persistence (`onAddRadiograph` / */\n/* `onDeleteRadiograph`); the panel owns only view state. The chart */\n/* drives selection via `ToothScheme.onOpenRadiographs(toothId)`. */\n/* */\n/* Image urls are opaque / consumer-hosted — never bundled. Real */\n/* radiographs are PHI; stories use synthetic placeholders only. */\n/* ------------------------------------------------------------------ */\n\nconst ZOOM_CLASS = ['ds:scale-100', 'ds:scale-150', 'ds:scale-200'] as const;\n\n/** Sort films newest-first (or oldest-first); undated films sink to the end in\n * BOTH directions — mirrors `ToothScheme.sortByDateDesc`. */\nfunction sortByDate(films: Radiograph[], desc: boolean): Radiograph[] {\n return [...films].sort((a, b) => {\n if (a.date === b.date) return 0;\n if (!a.date) return 1;\n if (!b.date) return -1;\n return (a.date < b.date ? -1 : 1) * (desc ? -1 : 1);\n });\n}\n\n/** Date-range membership. ISO `YYYY-MM-DD` is parsed at LOCAL midnight (the\n * `+'T00:00:00'`) so the filter agrees with the local-midnight `Date` objects\n * the DateRangePicker emits — without it, films are off-by-one west of UTC. */\nfunction inRange(film: Radiograph, range: DateRangeValue): boolean {\n if (!film.date) return !range.from && !range.to;\n const d = new Date(`${film.date}T00:00:00`);\n if (range.from && d < range.from) return false;\n if (range.to && d > range.to) return false;\n return true;\n}\n\n/** Local `YYYY-MM-DD` — avoids the UTC shift `Date.toISOString()` introduces\n * west of UTC for the local-midnight Date the DatePicker emits. */\nfunction toLocalIsoDate(d: Date): string {\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\nexport interface RadiographPanelHandle {\n /** Read the films currently shown (after the host's `radiographs` prop). */\n getRadiographs: () => Radiograph[];\n /** Open the fullscreen viewer on a film by id. */\n openViewer: (id: string) => void;\n /** Close the fullscreen viewer. */\n closeViewer: () => void;\n}\n\nexport interface RadiographPanelProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'title' | 'children'\n> {\n /** Instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** The tooth whose films are shown (FDI id). Null → a \"select a tooth\" prompt. */\n toothId?: FdiId | null;\n /** Display label for the selected tooth. Defaults to the localised \"Tooth {{id}}\". */\n toothLabel?: string;\n /** The selected tooth's films. The panel sorts + filters; order in is irrelevant. */\n radiographs?: Radiograph[];\n /** Commit a new film (the host persists it). Omit to hide the upload composer. */\n onAddRadiograph?: (draft: {\n fileName: string;\n date?: string;\n note?: string;\n }) => void;\n /** Remove a film by id. Omit to hide the delete affordance. */\n onDeleteRadiograph?: (id: string) => void;\n /** Panel heading. Defaults to the localised \"Imaging\". */\n title?: string;\n /** Accessible name for the panel region (defaults to `title`). */\n 'aria-label'?: string;\n}\n\nfunction KindBadge({ kind }: { kind: RadiographKind }): ReactElement {\n const { t } = useTranslation();\n const label = t(`radiographPanel.kind.${kind}`, {\n defaultValue: {\n periapical: 'Periapical',\n bitewing: 'Bitewing',\n panoramic: 'Panoramic',\n other: 'Other',\n }[kind],\n });\n return (\n <Badge variant=\"neutral\" size=\"sm\">\n {label}\n </Badge>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Fullscreen viewer — lightbox + compare */\n/* ------------------------------------------------------------------ */\n\ninterface ViewerState {\n films: Radiograph[];\n index: number;\n compare: boolean;\n}\n\nfunction RadiographViewer({\n state,\n toothLabel,\n onClose,\n onIndexChange,\n}: {\n state: ViewerState | null;\n toothLabel: string;\n onClose: () => void;\n onIndexChange: (index: number) => void;\n}): ReactElement {\n const { t } = useTranslation();\n const [zoom, setZoom] = useState(0);\n // Reset zoom when the viewed film changes (prev/next) or the mode flips, so a\n // user doesn't carry one film's zoom into the next.\n useEffect(() => {\n setZoom(0);\n }, [state?.index, state?.compare]);\n const films = state?.films ?? [];\n const current = state ? films[state.index] : undefined;\n\n return (\n <Dialog.Root\n open={state !== null}\n onOpenChange={(next) => {\n if (!next) {\n setZoom(0);\n onClose();\n }\n }}\n >\n <Dialog.Content size=\"fullscreen\" aria-describedby={undefined}>\n <Dialog.Header>\n <Dialog.Title>\n {state?.compare\n ? t('radiographPanel.viewer.compareTitle', {\n defaultValue: '{{tooth}} — comparison',\n tooth: toothLabel,\n })\n : t('radiographPanel.viewer.title', {\n defaultValue: '{{tooth}} — radiograph',\n tooth: toothLabel,\n })}\n </Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n {state?.compare ? (\n <div className=\"ds:grid ds:grid-cols-2 ds:gap-[var(--spacing-md)]\">\n {films.slice(0, 2).map((film) => (\n <figure\n key={film.id}\n className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n <div className=\"ds:flex ds:items-center ds:justify-center ds:overflow-hidden ds:rounded-[var(--radius-md)] ds:bg-[var(--muted)] ds:p-[var(--spacing-xs)]\">\n <img\n src={film.thumbnailUrl ?? film.url}\n alt={film.alt ?? toothLabel}\n className=\"ds:max-h-full ds:max-w-full ds:object-contain\"\n />\n </div>\n <figcaption className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {film.date}\n </figcaption>\n </figure>\n ))}\n </div>\n ) : (\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:max-h-full ds:items-center ds:justify-center ds:overflow-hidden ds:rounded-[var(--radius-md)] ds:bg-[var(--muted)] ds:p-[var(--spacing-sm)]\">\n <img\n src={current?.thumbnailUrl ?? current?.url}\n alt={current?.alt ?? toothLabel}\n className={[\n 'ds:max-h-full ds:max-w-full ds:object-contain',\n 'ds:origin-center ds:transition-transform ds:motion-reduce:transition-none',\n ZOOM_CLASS[zoom],\n ].join(' ')}\n />\n </div>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <IconButton\n icon={<ChevronLeft aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.prev', {\n defaultValue: 'Previous radiograph',\n })}\n size=\"sm\"\n flipIconInRtl\n disabled={!state || state.index === 0}\n onClick={() =>\n state && onIndexChange(Math.max(0, state.index - 1))\n }\n />\n <span\n aria-live=\"polite\"\n className=\"type-meta ds:text-[color:var(--muted-foreground)]\"\n >\n {t('radiographPanel.viewer.position', {\n defaultValue: '{{current}} / {{total}}',\n current: (state?.index ?? 0) + 1,\n total: films.length,\n })}\n </span>\n <IconButton\n icon={<ChevronRight aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.next', {\n defaultValue: 'Next radiograph',\n })}\n size=\"sm\"\n flipIconInRtl\n disabled={!state || state.index >= films.length - 1}\n onClick={() =>\n state &&\n onIndexChange(Math.min(films.length - 1, state.index + 1))\n }\n />\n <span\n aria-hidden=\"true\"\n className=\"ds:ms-[var(--spacing-xs)] ds:me-[var(--spacing-xs)] ds:h-[var(--spacing-md)] ds:w-px ds:bg-[var(--border)]\"\n />\n <IconButton\n icon={<ZoomOut aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.zoomOut', {\n defaultValue: 'Zoom out',\n })}\n size=\"sm\"\n disabled={zoom === 0}\n onClick={() => setZoom((z) => Math.max(0, z - 1))}\n />\n <IconButton\n icon={<ZoomIn aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.zoomIn', {\n defaultValue: 'Zoom in',\n })}\n size=\"sm\"\n disabled={zoom === ZOOM_CLASS.length - 1}\n onClick={() =>\n setZoom((z) => Math.min(ZOOM_CLASS.length - 1, z + 1))\n }\n />\n </div>\n {current?.note ? (\n <p className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {current.note}\n </p>\n ) : null}\n </div>\n )}\n </Dialog.Body>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* RadiographPanel */\n/* ------------------------------------------------------------------ */\n\nexport const RadiographPanel = forwardRef<\n RadiographPanelHandle,\n RadiographPanelProps\n>(function RadiographPanel(\n {\n id,\n toothId,\n toothLabel: toothLabelProp,\n radiographs = [],\n onAddRadiograph,\n onDeleteRadiograph,\n title,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n) {\n const { t } = useTranslation();\n\n const [viewer, setViewer] = useState<ViewerState | null>(null);\n const [compareIds, setCompareIds] = useState<string[]>([]);\n const [sortDesc, setSortDesc] = useState(true);\n const [range, setRange] = useState<DateRangeValue>({});\n const [pendingFile, setPendingFile] = useState<string | null>(null);\n const [date, setDate] = useState<Date | undefined>(undefined);\n const [note, setNote] = useState('');\n\n // Stable, current snapshot for the imperative handle.\n const filmsRef = useRef<Radiograph[]>(radiographs);\n filmsRef.current = radiographs;\n\n useImperativeHandle(\n ref,\n () => ({\n getRadiographs: () => filmsRef.current,\n openViewer: (filmId) => {\n const index = filmsRef.current.findIndex((f) => f.id === filmId);\n if (index >= 0) {\n setViewer({ films: filmsRef.current, index, compare: false });\n }\n },\n closeViewer: () => setViewer(null),\n }),\n [],\n );\n\n const heading =\n title ?? t('radiographPanel.title', { defaultValue: 'Imaging' });\n const toothLabel =\n toothLabelProp ??\n (toothId\n ? t('radiographPanel.toothLabel', {\n defaultValue: 'Tooth {{id}}',\n id: toothId,\n })\n : '');\n\n const visible = useMemo(\n () =>\n sortByDate(\n radiographs.filter((f) => inRange(f, range)),\n sortDesc,\n ),\n [radiographs, range, sortDesc],\n );\n\n const toggleCompare = useCallback((filmId: string) => {\n setCompareIds((ids) =>\n ids.includes(filmId)\n ? ids.filter((x) => x !== filmId)\n : [...ids, filmId].slice(-2),\n );\n }, []);\n\n const handleUpload = useCallback(() => {\n if (!pendingFile || !onAddRadiograph) return;\n onAddRadiograph({\n fileName: pendingFile,\n date: date ? toLocalIsoDate(date) : undefined,\n note: note || undefined,\n });\n setPendingFile(null);\n setNote('');\n setDate(undefined);\n }, [pendingFile, date, note, onAddRadiograph]);\n\n // History filter controls — pinned in the PanelHeader's filters row (only\n // meaningful once a tooth is selected) so they stay put as the list scrolls.\n const historyFilters = toothId ? (\n <>\n <FormField\n label={t('radiographPanel.history.range', {\n defaultValue: 'Date range',\n })}\n >\n <DateRangePicker value={range} onChange={setRange} />\n </FormField>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <Button intent=\"ghost\" size=\"sm\" onClick={() => setSortDesc((s) => !s)}>\n {sortDesc\n ? t('radiographPanel.history.sortNewest', {\n defaultValue: 'Newest first',\n })\n : t('radiographPanel.history.sortOldest', {\n defaultValue: 'Oldest first',\n })}\n </Button>\n <Button\n intent=\"ghost\"\n size=\"sm\"\n startIcon={<GitCompareArrows aria-hidden=\"true\" />}\n disabled={compareIds.length !== 2}\n onClick={() => {\n const films = radiographs.filter((f) => compareIds.includes(f.id));\n if (films.length === 2) {\n setViewer({ films, index: 0, compare: true });\n }\n }}\n >\n {t('radiographPanel.history.compare', {\n defaultValue: 'Compare',\n })}\n </Button>\n </div>\n </>\n ) : undefined;\n\n return (\n <section\n data-component=\"radiograph-panel\"\n data-component-id={id}\n data-tooth={toothId ?? undefined}\n aria-label={ariaLabel ?? heading}\n className={['ds:flex ds:flex-col', className].filter(Boolean).join(' ')}\n {...rest}\n >\n {/* Shared rail-panel header: title + film-count badge, history filters\n pinned beneath, divider, sticky so it stays visible as the list\n scrolls. The rail injects favourite/close into the action cluster. */}\n <PanelHeader\n sticky\n icon={<Images aria-hidden=\"true\" />}\n title={\n <>\n {toothId ? toothLabel : heading}\n {toothId ? (\n <Badge variant=\"info\" size=\"sm\">\n {radiographs.length}\n </Badge>\n ) : null}\n </>\n }\n filters={historyFilters}\n />\n\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:p-[var(--spacing-md)]\">\n {!toothId ? (\n <EmptyState\n variant=\"first-use\"\n title={t('radiographPanel.noTooth.title', {\n defaultValue: 'No tooth selected',\n })}\n description={t('radiographPanel.noTooth.body', {\n defaultValue:\n 'Select a tooth on the chart to view its radiographs.',\n })}\n />\n ) : (\n <>\n {/* Upload */}\n {onAddRadiograph ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <FormField\n label={t('radiographPanel.upload.file', {\n defaultValue: 'Image file',\n })}\n >\n <FileUpload\n accept={{ 'image/*': ['.png', '.jpg', '.jpeg', '.webp'] }}\n variant=\"both\"\n showPreview\n onDrop={(accepted) =>\n setPendingFile(accepted[0]?.name ?? null)\n }\n />\n </FormField>\n <FormField\n label={t('radiographPanel.upload.date', {\n defaultValue: 'Acquisition date',\n })}\n >\n <DatePicker value={date} onChange={(d) => setDate(d)} />\n </FormField>\n <FormField\n label={t('radiographPanel.upload.note', {\n defaultValue: 'Note (optional)',\n })}\n >\n <TextArea\n rows={2}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder={t('radiographPanel.upload.notePlaceholder', {\n defaultValue: 'E.g. routine check, apical lesion…',\n })}\n />\n </FormField>\n <Button\n intent=\"primary\"\n size=\"sm\"\n startIcon={<Upload aria-hidden=\"true\" />}\n disabled={!pendingFile}\n onClick={handleUpload}\n className=\"ds:self-start\"\n >\n {t('radiographPanel.upload.submit', {\n defaultValue: 'Upload',\n })}\n </Button>\n </div>\n ) : null}\n\n {/* History */}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {visible.length === 0 ? (\n <EmptyState\n variant=\"first-use\"\n title={t('radiographPanel.history.emptyTitle', {\n defaultValue: 'No radiographs yet',\n })}\n description={t('radiographPanel.history.emptyBody', {\n defaultValue: 'Upload the first film for this tooth.',\n })}\n />\n ) : (\n <ul className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-xs)] ds:p-0\">\n {visible.map((film, visibleIndex) => {\n const selected = compareIds.includes(film.id);\n // Disambiguate the repeated row actions for screen readers by\n // the film's date (falls back to its 1-based position).\n const filmLabel = film.date ?? String(visibleIndex + 1);\n return (\n <li\n key={film.id}\n data-radiograph-id={film.id}\n data-selected={selected}\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)] ds:bg-[var(--card)] ds:p-[var(--spacing-xs)] ds:data-[selected=true]:border-[color:var(--info-foreground)]\"\n >\n <img\n src={film.thumbnailUrl ?? film.url}\n alt={film.alt ?? ''}\n className=\"ds:h-16 ds:w-12 ds:shrink-0 ds:rounded-[var(--radius-sm)] ds:object-cover\"\n />\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-body-sm ds:text-[color:var(--foreground)]\">\n {film.date}\n </span>\n <KindBadge kind={film.kind ?? 'periapical'} />\n </div>\n <IconButton\n icon={<Eye aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.history.view', {\n defaultValue: 'View radiograph {{film}}',\n film: filmLabel,\n })}\n size=\"sm\"\n intent=\"ghost\"\n // Step the viewer through the FILTERED + sorted list the\n // user is looking at, not every film on the tooth.\n onClick={() =>\n setViewer({\n films: visible,\n index: visibleIndex,\n compare: false,\n })\n }\n />\n <IconButton\n icon={<GitCompareArrows aria-hidden=\"true\" />}\n aria-label={\n selected\n ? t('radiographPanel.history.compareRemove', {\n defaultValue:\n 'Remove {{film}} from comparison',\n film: filmLabel,\n })\n : t('radiographPanel.history.compareAdd', {\n defaultValue:\n 'Select {{film}} for comparison',\n film: filmLabel,\n })\n }\n aria-pressed={selected}\n size=\"sm\"\n intent={selected ? 'secondary' : 'ghost'}\n onClick={() => toggleCompare(film.id)}\n />\n {onDeleteRadiograph ? (\n <IconButton\n icon={<Trash2 aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.history.delete', {\n defaultValue: 'Delete radiograph {{film}}',\n film: filmLabel,\n })}\n size=\"sm\"\n intent=\"ghost\"\n onClick={() => onDeleteRadiograph(film.id)}\n />\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </>\n )}\n </div>\n\n <RadiographViewer\n state={viewer}\n toothLabel={toothLabel}\n onClose={() => setViewer(null)}\n onIndexChange={(index) => setViewer((v) => (v ? { ...v, index } : v))}\n />\n </section>\n );\n});\n\n// `Images` is the panel's imaging glyph (a films archive, not a radiation\n// hazard) — re-exported so a host registering the Control Room tool can use\n// the same icon as the panel.\nexport { Images as RadiographPanelIcon };\n","import type { AgentAdapter } from '../../agent/types';\nimport type { RadiographPanelHandle } from './radiograph-panel';\nimport type { Radiograph } from '../tooth-scheme';\n\n/**\n * The Imaging panel for the Control Room rail. It DISPLAYS the selected tooth's\n * radiographs and drives the fullscreen viewer; uploads and deletes are the\n * host's responsibility (the `onAddRadiograph` / `onDeleteRadiograph` props),\n * so they are not exposed here — the consuming pattern/app owns those `write` /\n * `destructive` workflows and their `radiograph.*` API contracts.\n */\nexport const radiographPanelAgent: AgentAdapter<RadiographPanelHandle> = {\n id: 'radiograph-panel',\n // pick — open a specific film in the viewer; view_change — the viewer is a\n // view surface over the host-owned films.\n capabilities: ['pick', 'view_change'],\n state: {\n radiographs: {\n // A9: structural refs only (id + kind) — never the free-text `note`,\n // service dates, or consumer-hosted image URLs in the always-on snapshot.\n type: 'Array<{ id: string; kind?: string }>',\n descriptionKey: 'ui.agent.radiographPanel.state.radiographs',\n description:\n 'Structural references (id + kind) to the films shown for the selected tooth.',\n read: (handle) =>\n handle\n .getRadiographs()\n .map((film) => ({ id: film.id, kind: film.kind ?? 'periapical' })),\n },\n },\n actions: {\n view_radiograph: {\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.radiographPanel.actions.viewRadiograph',\n description: 'Open a film in the fullscreen viewer by id.',\n invoke: (handle, args: { id: string }) => {\n handle.openViewer(args.id);\n },\n },\n close_viewer: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.radiographPanel.actions.closeViewer',\n description: 'Close the fullscreen radiograph viewer.',\n invoke: (handle) => {\n handle.closeViewer();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'radiograph-panel' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-radiograph-id',\n description:\n \"Each film row (`<li>`) carries its radiograph id as `data-radiograph-id`. The panel root additionally carries the selected tooth's FDI id as `data-tooth`.\",\n },\n },\n};\n\n// Re-exported for callers building typed reads against the adapter.\nexport type { Radiograph };\n"],"names":["__iconNode","GitCompareArrows","createLucideIcon","Images","ZOOM_CLASS","sortByDate","films","desc","a","b","inRange","film","range","d","toLocalIsoDate","pad","n","KindBadge","kind","t","useTranslation","label","Badge","RadiographViewer","state","toothLabel","onClose","onIndexChange","zoom","setZoom","useState","useEffect","current","jsx","Dialog","next","jsxs","IconButton","ChevronLeft","ChevronRight","ZoomOut","z","ZoomIn","RadiographPanel","forwardRef","id","toothId","toothLabelProp","radiographs","onAddRadiograph","onDeleteRadiograph","title","ariaLabel","className","rest","ref","viewer","setViewer","compareIds","setCompareIds","sortDesc","setSortDesc","setRange","pendingFile","setPendingFile","date","setDate","note","setNote","filmsRef","useRef","useImperativeHandle","filmId","index","f","heading","visible","useMemo","toggleCompare","useCallback","ids","x","handleUpload","historyFilters","Fragment","FormField","DateRangePicker","Button","s","PanelHeader","FileUpload","accepted","_a","DatePicker","TextArea","e","Upload","EmptyState","visibleIndex","selected","filmLabel","Eye","Trash2","v","radiographPanelAgent","handle","args"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -22,7 +22,7 @@ import { D as B } from "./dialog-UbKJCi1X.js";
22
22
  import { C as We } from "./color-picker-D-tUwxxT.js";
23
23
  import { T as Ie } from "./text-input-CUvCb6ST.js";
24
24
  import { C as Xt } from "./checkbox-BuZ1u__2.js";
25
- import { F as Ut } from "./file-upload-DENvuhfs.js";
25
+ import { F as Ut } from "./file-upload-CwxdqkMK.js";
26
26
  import { c as T } from "./createLucideIcon-DhHxpK9K.js";
27
27
  import { E as Qt } from "./ellipsis-dRo9ouSU.js";
28
28
  import { H as Zt } from "./highlighter-DSkckT2Q.js";
@@ -2618,4 +2618,4 @@ export {
2618
2618
  hn as r,
2619
2619
  Qn as w
2620
2620
  };
2621
- //# sourceMappingURL=rich-text-editor-CCWjNkbx.js.map
2621
+ //# sourceMappingURL=rich-text-editor-RRkBN_WB.js.map