@alfadocs/ui-kit 0.75.0 → 0.77.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 (91) hide show
  1. package/dist/_chunks/{address-fields-COyjgqxA.js → address-fields-7k59FnJ6.js} +2 -2
  2. package/dist/_chunks/{booking-B1Qkcl3c.js → booking-CLmeXtGv.js} +2 -2
  3. package/dist/_chunks/{country-select-DYHDLEjG.js → country-select-BN9nedAp.js} +2 -2
  4. package/dist/_chunks/document-preview-CvHnHf6T.js +243 -0
  5. package/dist/_chunks/{file-manager-UF8dkQF1.js → file-manager-DfTG7bxx.js} +394 -399
  6. package/dist/_chunks/flag-Cnmivlrl.js +641 -0
  7. package/dist/_chunks/{header-settings-4cwQzeFc.js → header-settings-DMfdx0Vq.js} +2 -2
  8. package/dist/_chunks/{locale-picker-GNF3lo8K.js → locale-picker-EyvPrwDc.js} +2 -2
  9. package/dist/_chunks/{marketplace-app-shell-D_1tF4La.js → marketplace-app-shell-Bxq1PYAj.js} +2 -2
  10. package/dist/_chunks/{patient-details-DP4wKyq4.js → patient-details-zy76MRh7.js} +3 -3
  11. package/dist/_chunks/periodontal-chart-CYBhr9vc.js +1305 -0
  12. package/dist/_chunks/{phone-input-dtnrvnZf.js → phone-input-D00ZBAm-.js} +2 -2
  13. package/dist/agent-catalog.json +149 -1
  14. package/dist/agent-i18n/en.json +2 -0
  15. package/dist/components/address-fields/index.js +1 -1
  16. package/dist/components/booking/index.js +1 -1
  17. package/dist/components/country-select/index.js +1 -1
  18. package/dist/components/document-preview/document-preview.d.ts +25 -2
  19. package/dist/components/document-preview/index.d.ts +1 -1
  20. package/dist/components/document-preview/index.js +1 -1
  21. package/dist/components/file-manager/index.js +1 -1
  22. package/dist/components/flag/index.js +1 -1
  23. package/dist/components/header-settings/index.js +1 -1
  24. package/dist/components/locale-picker/index.js +1 -1
  25. package/dist/components/patient-details/index.js +1 -1
  26. package/dist/components/periodontal-chart/index.d.ts +2 -2
  27. package/dist/components/periodontal-chart/index.js +8 -7
  28. package/dist/components/periodontal-chart/periodontal-chart-data.d.ts +45 -0
  29. package/dist/components/periodontal-chart/periodontal-chart.d.ts +3 -1
  30. package/dist/components/phone-input/index.js +1 -1
  31. package/dist/i18n/locales/ar.d.ts +2 -1
  32. package/dist/i18n/locales/ar.js +2 -1
  33. package/dist/i18n/locales/de.d.ts +2 -1
  34. package/dist/i18n/locales/de.js +2 -1
  35. package/dist/i18n/locales/el.d.ts +2 -1
  36. package/dist/i18n/locales/el.js +2 -1
  37. package/dist/i18n/locales/en.d.ts +2 -1
  38. package/dist/i18n/locales/en.js +2 -1
  39. package/dist/i18n/locales/es.d.ts +2 -1
  40. package/dist/i18n/locales/es.js +2 -1
  41. package/dist/i18n/locales/fr.d.ts +2 -1
  42. package/dist/i18n/locales/fr.js +2 -1
  43. package/dist/i18n/locales/hi.d.ts +2 -1
  44. package/dist/i18n/locales/hi.js +2 -1
  45. package/dist/i18n/locales/it.d.ts +2 -1
  46. package/dist/i18n/locales/it.js +2 -1
  47. package/dist/i18n/locales/ja.d.ts +2 -1
  48. package/dist/i18n/locales/ja.js +2 -1
  49. package/dist/i18n/locales/nl.d.ts +2 -1
  50. package/dist/i18n/locales/nl.js +2 -1
  51. package/dist/i18n/locales/pl.d.ts +2 -1
  52. package/dist/i18n/locales/pl.js +2 -1
  53. package/dist/i18n/locales/pt.d.ts +2 -1
  54. package/dist/i18n/locales/pt.js +2 -1
  55. package/dist/i18n/locales/ro.d.ts +2 -1
  56. package/dist/i18n/locales/ro.js +2 -1
  57. package/dist/i18n/locales/ru.d.ts +2 -1
  58. package/dist/i18n/locales/ru.js +2 -1
  59. package/dist/i18n/locales/sq.d.ts +2 -1
  60. package/dist/i18n/locales/sq.js +2 -1
  61. package/dist/i18n/locales/sv.d.ts +2 -1
  62. package/dist/i18n/locales/sv.js +2 -1
  63. package/dist/i18n/locales/tr.d.ts +2 -1
  64. package/dist/i18n/locales/tr.js +2 -1
  65. package/dist/i18n/locales/zh.d.ts +2 -1
  66. package/dist/i18n/locales/zh.js +2 -1
  67. package/dist/index.js +217 -216
  68. package/dist/locales/ar.json +2 -1
  69. package/dist/locales/de.json +2 -1
  70. package/dist/locales/el.json +2 -1
  71. package/dist/locales/en.json +2 -1
  72. package/dist/locales/es.json +2 -1
  73. package/dist/locales/fr.json +2 -1
  74. package/dist/locales/hi.json +2 -1
  75. package/dist/locales/it.json +2 -1
  76. package/dist/locales/ja.json +2 -1
  77. package/dist/locales/nl.json +2 -1
  78. package/dist/locales/pl.json +2 -1
  79. package/dist/locales/pt.json +2 -1
  80. package/dist/locales/ro.json +2 -1
  81. package/dist/locales/ru.json +2 -1
  82. package/dist/locales/sq.json +2 -1
  83. package/dist/locales/sv.json +2 -1
  84. package/dist/locales/tr.json +2 -1
  85. package/dist/locales/zh.json +2 -1
  86. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  87. package/dist/tokens.css +1 -1
  88. package/package.json +1 -1
  89. package/dist/_chunks/document-preview-CGSM_au9.js +0 -181
  90. package/dist/_chunks/flag-DZ6V7-hU.js +0 -637
  91. package/dist/_chunks/periodontal-chart-D8hOFmde.js +0 -1173
@@ -10,7 +10,7 @@ import { getCountries as qe, parsePhoneNumberFromString as L, AsYouType as q, ge
10
10
  import { u as He, F as _e } from "./form-field-context-B3APVHKx.js";
11
11
  import { c as Ge } from "./compose-refs-C0k0tdqF.js";
12
12
  import { n as J } from "./normalize-diacritics-BNGbFNlJ.js";
13
- import { a as Q } from "./flag-DZ6V7-hU.js";
13
+ import { a as Q } from "./flag-Cnmivlrl.js";
14
14
  import { C as Oe } from "./chevron-down-DWE7GSq9.js";
15
15
  const Ue = {
16
16
  id: "phone-input",
@@ -577,4 +577,4 @@ export {
577
577
  pe as c,
578
578
  We as p
579
579
  };
580
- //# sourceMappingURL=phone-input-dtnrvnZf.js.map
580
+ //# sourceMappingURL=phone-input-D00ZBAm-.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "0.75.0",
3
+ "packageVersion": "0.77.0",
4
4
  "components": [
5
5
  {
6
6
  "kind": "component",
@@ -7765,6 +7765,12 @@
7765
7765
  "description": "Derived whole-mouth indices: mean probing depth, mean attachment level, plaque %, bleeding %, scored-site and deep-pocket counts. Aggregates only — no per-site or patient data.",
7766
7766
  "descriptionKey": "ui.agent.periodontalChart.state.indices"
7767
7767
  },
7768
+ {
7769
+ "name": "findings",
7770
+ "type": "object[]",
7771
+ "description": "Narratable per-tooth problem list — one entry per flagged tooth (missing, implant, a pocket at/above the moderate threshold, bleeding, suppuration, mobility ≥ 1, or furcation), in clinical order with each tooth’s pockets deepest-first. Each entry carries fdi, status, severity, maxPocketDepthMm, pockets, bleeding/plaque/suppuration sites, maxRecessionMm, mobility and furcation. Read this to summarise the chart aloud. Structural readings + FDI ids only — never the free-text note or patient identity.",
7772
+ "descriptionKey": "ui.agent.periodontalChart.state.findings"
7773
+ },
7768
7774
  {
7769
7775
  "name": "missingTeeth",
7770
7776
  "type": "string[]",
@@ -7893,6 +7899,148 @@
7893
7899
  "description": "Read the derived whole-mouth summary indices.",
7894
7900
  "descriptionKey": "ui.agent.periodontalChart.actions.getIndices"
7895
7901
  },
7902
+ {
7903
+ "name": "get_findings",
7904
+ "safety": "read",
7905
+ "argsType": "{}",
7906
+ "argsSchema": {
7907
+ "type": "object",
7908
+ "properties": {}
7909
+ },
7910
+ "returns": "PeriodontalToothFinding[]",
7911
+ "returnsSchema": {
7912
+ "type": "array",
7913
+ "description": "One entry per flagged tooth, in clinical order; each tooth’s pockets are deepest-first.",
7914
+ "items": {
7915
+ "type": "object",
7916
+ "properties": {
7917
+ "fdi": {
7918
+ "type": "string",
7919
+ "description": "FDI tooth id ('11'–'48' permanent, '51'–'85' primary)."
7920
+ },
7921
+ "status": {
7922
+ "enum": [
7923
+ "present",
7924
+ "missing",
7925
+ "implant"
7926
+ ],
7927
+ "description": "Structural status of the tooth."
7928
+ },
7929
+ "severity": {
7930
+ "enum": [
7931
+ "normal",
7932
+ "moderate",
7933
+ "severe"
7934
+ ],
7935
+ "description": "Worst pocket severity band across the tooth."
7936
+ },
7937
+ "maxPocketDepthMm": {
7938
+ "type": [
7939
+ "integer",
7940
+ "null"
7941
+ ]
7942
+ },
7943
+ "pockets": {
7944
+ "type": "array",
7945
+ "description": "Sites at/above the moderate threshold, deepest first.",
7946
+ "items": {
7947
+ "type": "object",
7948
+ "properties": {
7949
+ "site": {
7950
+ "enum": [
7951
+ "db",
7952
+ "b",
7953
+ "mb",
7954
+ "dl",
7955
+ "l",
7956
+ "ml"
7957
+ ],
7958
+ "description": "Probing site: (m/d)b = mesio-/disto-/mid buccal, (m/d)l = mesio-/disto-/mid lingual."
7959
+ },
7960
+ "pocketDepthMm": {
7961
+ "type": "integer",
7962
+ "description": "Whole millimetres — perio probing is recorded in integer mm."
7963
+ },
7964
+ "severity": {
7965
+ "enum": [
7966
+ "moderate",
7967
+ "severe"
7968
+ ]
7969
+ }
7970
+ }
7971
+ }
7972
+ },
7973
+ "bleedingSites": {
7974
+ "type": "array",
7975
+ "items": {
7976
+ "enum": [
7977
+ "db",
7978
+ "b",
7979
+ "mb",
7980
+ "dl",
7981
+ "l",
7982
+ "ml"
7983
+ ],
7984
+ "description": "Probing site: (m/d)b = mesio-/disto-/mid buccal, (m/d)l = mesio-/disto-/mid lingual."
7985
+ }
7986
+ },
7987
+ "plaqueSites": {
7988
+ "type": "array",
7989
+ "items": {
7990
+ "enum": [
7991
+ "db",
7992
+ "b",
7993
+ "mb",
7994
+ "dl",
7995
+ "l",
7996
+ "ml"
7997
+ ],
7998
+ "description": "Probing site: (m/d)b = mesio-/disto-/mid buccal, (m/d)l = mesio-/disto-/mid lingual."
7999
+ }
8000
+ },
8001
+ "suppurationSites": {
8002
+ "type": "array",
8003
+ "items": {
8004
+ "enum": [
8005
+ "db",
8006
+ "b",
8007
+ "mb",
8008
+ "dl",
8009
+ "l",
8010
+ "ml"
8011
+ ],
8012
+ "description": "Probing site: (m/d)b = mesio-/disto-/mid buccal, (m/d)l = mesio-/disto-/mid lingual."
8013
+ }
8014
+ },
8015
+ "maxRecessionMm": {
8016
+ "type": [
8017
+ "number",
8018
+ "null"
8019
+ ]
8020
+ },
8021
+ "mobility": {
8022
+ "type": [
8023
+ "integer",
8024
+ "null"
8025
+ ],
8026
+ "description": "Miller mobility grade 1–3, or null when none."
8027
+ },
8028
+ "furcation": {
8029
+ "type": "array",
8030
+ "items": {
8031
+ "enum": [
8032
+ "buccal",
8033
+ "lingual"
8034
+ ]
8035
+ }
8036
+ }
8037
+ }
8038
+ }
8039
+ },
8040
+ "idempotent": true,
8041
+ "description": "Read the narratable per-tooth problem list (flagged teeth only). Use it to summarise the chart aloud — e.g. “46: 8 mm disto-buccal pocket, bleeding, grade 2 mobility”. Structural readings and FDI ids only; the free-text note is never returned.",
8042
+ "descriptionKey": "ui.agent.periodontalChart.actions.getFindings"
8043
+ },
7896
8044
  {
7897
8045
  "name": "set_depth",
7898
8046
  "safety": "write",
@@ -806,6 +806,7 @@
806
806
  "periodontalChart": {
807
807
  "state": {
808
808
  "indices": "Derived whole-mouth indices: mean probing depth, mean attachment level, plaque %, bleeding %, scored-site and deep-pocket counts. Aggregates only — no per-site or patient data.",
809
+ "findings": "Narratable per-tooth problem list — one entry per flagged tooth (missing, implant, a pocket at/above the moderate threshold, bleeding, suppuration, mobility ≥ 1, or furcation), in clinical order with each tooth’s pockets deepest-first. Each entry carries fdi, status, severity, maxPocketDepthMm, pockets, bleeding/plaque/suppuration sites, maxRecessionMm, mobility and furcation. Read this to summarise the chart aloud. Structural readings + FDI ids only — never the free-text note or patient identity.",
809
810
  "missingTeeth": "FDI ids of every tooth flagged as missing.",
810
811
  "chartedTeeth": "FDI ids of teeth carrying at least one probing reading or flag. Identifiers only — never patient identity or the free-text note."
811
812
  },
@@ -813,6 +814,7 @@
813
814
  "focusSite": "Move focus to a specific probing-measurement input.",
814
815
  "getTooth": "Read one tooth’s structural readings (sites, flags, mobility, furcation). The free-text note is never returned.",
815
816
  "getIndices": "Read the derived whole-mouth summary indices.",
817
+ "getFindings": "Read the narratable per-tooth problem list (flagged teeth only). Use it to summarise the chart aloud — e.g. “46: 8 mm disto-buccal pocket, bleeding, grade 2 mobility”. Structural readings and FDI ids only; the free-text note is never returned.",
816
818
  "setDepth": "Record the probing pocket depth (mm) at a site.",
817
819
  "setRecession": "Record the gingival recession (mm) at a site.",
818
820
  "toggleBleeding": "Set bleeding on probing at a site.",
@@ -1,4 +1,4 @@
1
- import { A as e, a } from "../../_chunks/address-fields-COyjgqxA.js";
1
+ import { A as e, a } from "../../_chunks/address-fields-7k59FnJ6.js";
2
2
  export {
3
3
  e as AddressFields,
4
4
  a as addressFieldsAgent
@@ -1,4 +1,4 @@
1
- import { B as A, C as R, O as a, b as s } from "../../_chunks/booking-B1Qkcl3c.js";
1
+ import { B as A, C as R, O as a, b as s } from "../../_chunks/booking-CLmeXtGv.js";
2
2
  export {
3
3
  A as Booking,
4
4
  R as CONFIRMATION_CHANNEL_ORDER,
@@ -1,4 +1,4 @@
1
- import { C as o, I as t, a, c as n, r as s } from "../../_chunks/country-select-DYHDLEjG.js";
1
+ import { C as o, I as t, a, c as n, r as s } from "../../_chunks/country-select-BN9nedAp.js";
2
2
  export {
3
3
  o as CountrySelect,
4
4
  t as ISO_3166_ALPHA2,
@@ -16,10 +16,26 @@ export interface DocumentPreviewMetadata {
16
16
  /** ISO 8601 expiry (e.g. identification documents). */
17
17
  expiresAt?: string;
18
18
  }
19
+ /**
20
+ * A single previewable document. In multi-document mode each becomes a tab;
21
+ * `id` is the tab value (never a patient name) and `name` is the tab label.
22
+ */
23
+ export interface DocumentPreviewDocument {
24
+ /** Stable, non-identifying id. Emitted as the tab value — never PHI. */
25
+ id: string;
26
+ /** Display name (PHI). Also the tab label in multi-document mode. */
27
+ name: string;
28
+ /** MIME type — drives the render branch and the fallback icon. */
29
+ mimeType?: string;
30
+ /** Resolved URL / data URI for the PDF or image viewer. */
31
+ src?: string;
32
+ /** Structural metadata rendered by the metadata-card branch. */
33
+ metadata?: DocumentPreviewMetadata;
34
+ }
19
35
  export interface DocumentPreviewProps extends VariantProps<typeof documentPreviewVariants> {
20
36
  /** Opaque instance id — emitted as `data-component-id` for the agent registry. */
21
37
  id?: string;
22
- /** Display name. Absent → empty state. Treated as PHI by the agent contract. */
38
+ /** Display name. Absent (and no `documents`) → empty state. PHI. */
23
39
  name?: string;
24
40
  /** MIME type — drives the render branch and the fallback icon. */
25
41
  mimeType?: string;
@@ -27,12 +43,19 @@ export interface DocumentPreviewProps extends VariantProps<typeof documentPrevie
27
43
  src?: string;
28
44
  /** Structural metadata rendered by the metadata-card branch. */
29
45
  metadata?: DocumentPreviewMetadata;
46
+ /**
47
+ * Multiple documents to preview as tabs — e.g. a multi-row selection. Two
48
+ * or more render a tab per document (label = name) with the active one
49
+ * shown below; a single entry renders without a tab strip. When non-empty
50
+ * this takes precedence over the single-document props. Names are PHI.
51
+ */
52
+ documents?: DocumentPreviewDocument[];
30
53
  className?: string;
31
54
  }
32
55
  export interface DocumentPreviewHandle {
33
56
  /** Which render branch is active — structural, safe for always-on reads. */
34
57
  getKind: () => DocumentPreviewKind;
35
- /** The document display name (PHI). Surfaced by the adapter as a `phi` action. */
58
+ /** The active document's display name (PHI). Surfaced by the adapter as a `phi` action. */
36
59
  getName: () => string | undefined;
37
60
  }
38
61
  declare const documentPreviewVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
@@ -1,4 +1,4 @@
1
1
  export { DocumentPreview } from './document-preview';
2
- export type { DocumentPreviewProps, DocumentPreviewHandle, DocumentPreviewKind, DocumentPreviewMetadata, DocumentPreviewSignatureStatus, } from './document-preview';
2
+ export type { DocumentPreviewProps, DocumentPreviewHandle, DocumentPreviewKind, DocumentPreviewMetadata, DocumentPreviewDocument, DocumentPreviewSignatureStatus, } from './document-preview';
3
3
  export { documentPreviewAgent } from './document-preview.agent';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- import { D as r, d as t } from "../../_chunks/document-preview-CGSM_au9.js";
1
+ import { D as r, d as t } from "../../_chunks/document-preview-CvHnHf6T.js";
2
2
  export {
3
3
  r as DocumentPreview,
4
4
  t as documentPreviewAgent
@@ -1,4 +1,4 @@
1
- import { F as r, f } from "../../_chunks/file-manager-UF8dkQF1.js";
1
+ import { F as r, f } from "../../_chunks/file-manager-DfTG7bxx.js";
2
2
  export {
3
3
  r as FileManager,
4
4
  f as fileManagerAgent
@@ -1,4 +1,4 @@
1
- import { F, a as g, h } from "../../_chunks/flag-DZ6V7-hU.js";
1
+ import { F, a as g, h } from "../../_chunks/flag-Cnmivlrl.js";
2
2
  export {
3
3
  F as FLAG_COUNTRIES,
4
4
  g as Flag,
@@ -1,4 +1,4 @@
1
- import { H as t } from "../../_chunks/header-settings-4cwQzeFc.js";
1
+ import { H as t } from "../../_chunks/header-settings-DMfdx0Vq.js";
2
2
  export {
3
3
  t as HeaderSettings
4
4
  };
@@ -1,4 +1,4 @@
1
- import { L, a as c, b as r } from "../../_chunks/locale-picker-GNF3lo8K.js";
1
+ import { L, a as c, b as r } from "../../_chunks/locale-picker-EyvPrwDc.js";
2
2
  export {
3
3
  L as LOCALE_STORAGE_KEY,
4
4
  c as LocalePicker,
@@ -1,4 +1,4 @@
1
- import { P as e, p as i } from "../../_chunks/patient-details-DP4wKyq4.js";
1
+ import { P as e, p as i } from "../../_chunks/patient-details-zy76MRh7.js";
2
2
  export {
3
3
  e as PatientDetails,
4
4
  i as patientDetailsAgent
@@ -1,6 +1,6 @@
1
1
  export { PeriodontalChart } from './periodontal-chart';
2
2
  export type { PeriodontalChartProps, PeriodontalChartHandle, PeriodontalChartDisabled, } from './periodontal-chart';
3
3
  export { periodontalChartAgent } from './periodontal-chart.agent';
4
- export { PERIODONTAL_BUCCAL_SITES, PERIODONTAL_LINGUAL_SITES, PERIODONTAL_FURCATION_MAP, MODERATE_POCKET_MM, SEVERE_POCKET_MM, PLAQUE_WARN_PERCENT, BLEEDING_WARN_PERCENT, furcationSlots, sitesForSide, periodontalArches, periodontalToothLabel, pocketSeverity, computePeriodontalIndices, emptyPeriodontalChart, toPeriodontalSiteList, toMobilityMap, } from './periodontal-chart-data';
5
- export type { PeriodontalChartValue, PeriodontalToothState, PeriodontalSiteState, PeriodontalSide, PeriodontalNumbering, PeriodontalDentition, PeriodontalIndices, PeriodontalArches, } from './periodontal-chart-data';
4
+ export { PERIODONTAL_BUCCAL_SITES, PERIODONTAL_LINGUAL_SITES, PERIODONTAL_FURCATION_MAP, MODERATE_POCKET_MM, SEVERE_POCKET_MM, PLAQUE_WARN_PERCENT, BLEEDING_WARN_PERCENT, furcationSlots, sitesForSide, periodontalArches, periodontalToothLabel, pocketSeverity, computePeriodontalIndices, computePeriodontalFindings, emptyPeriodontalChart, toPeriodontalSiteList, toMobilityMap, } from './periodontal-chart-data';
5
+ export type { PeriodontalChartValue, PeriodontalToothState, PeriodontalSiteState, PeriodontalSide, PeriodontalNumbering, PeriodontalDentition, PeriodontalIndices, PeriodontalArches, PeriodontalToothFinding, PeriodontalSiteFinding, PeriodontalToothStatus, } from './periodontal-chart-data';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1,18 +1,19 @@
1
- import { B as t, M as s, P as e, a as E, b as i, c as r, d as P, S as _, e as A, f as T, g as d, p as l, h as n, i as C, j as L, s as N, t as O, k as R } from "../../_chunks/periodontal-chart-D8hOFmde.js";
1
+ import { B as t, M as s, P as e, a as i, b as E, c as r, d as P, S as _, e as n, f as A, g as d, h as l, p as T, i as p, j as C, k as L, s as N, t as O, l as R } from "../../_chunks/periodontal-chart-CYBhr9vc.js";
2
2
  export {
3
3
  t as BLEEDING_WARN_PERCENT,
4
4
  s as MODERATE_POCKET_MM,
5
5
  e as PERIODONTAL_BUCCAL_SITES,
6
- E as PERIODONTAL_FURCATION_MAP,
7
- i as PERIODONTAL_LINGUAL_SITES,
6
+ i as PERIODONTAL_FURCATION_MAP,
7
+ E as PERIODONTAL_LINGUAL_SITES,
8
8
  r as PLAQUE_WARN_PERCENT,
9
9
  P as PeriodontalChart,
10
10
  _ as SEVERE_POCKET_MM,
11
+ n as computePeriodontalFindings,
11
12
  A as computePeriodontalIndices,
12
- T as emptyPeriodontalChart,
13
- d as furcationSlots,
14
- l as periodontalArches,
15
- n as periodontalChartAgent,
13
+ d as emptyPeriodontalChart,
14
+ l as furcationSlots,
15
+ T as periodontalArches,
16
+ p as periodontalChartAgent,
16
17
  C as periodontalToothLabel,
17
18
  L as pocketSeverity,
18
19
  N as sitesForSide,
@@ -107,6 +107,51 @@ export interface PeriodontalIndices {
107
107
  * are skipped entirely.
108
108
  */
109
109
  export declare function computePeriodontalIndices(value: PeriodontalChartValue): PeriodontalIndices;
110
+ /** Structural status worth narrating for a tooth. */
111
+ export type PeriodontalToothStatus = 'present' | 'missing' | 'implant';
112
+ /** One flagged probing site within a tooth finding. */
113
+ export interface PeriodontalSiteFinding {
114
+ site: PeriodontalSiteId;
115
+ pocketDepthMm: number;
116
+ severity: 'moderate' | 'severe';
117
+ }
118
+ /** A single tooth's notable findings — one narratable problem-list entry. */
119
+ export interface PeriodontalToothFinding {
120
+ /** FDI tooth id. */
121
+ fdi: string;
122
+ /** Structural status. `'present'` teeth appear only when they carry a finding. */
123
+ status: PeriodontalToothStatus;
124
+ /** Worst severity band across the tooth's scored sites. */
125
+ severity: 'normal' | 'moderate' | 'severe';
126
+ /** Deepest probing depth on the tooth (mm), or null when unscored. */
127
+ maxPocketDepthMm: number | null;
128
+ /** Sites at/above the moderate threshold, deepest first. */
129
+ pockets: PeriodontalSiteFinding[];
130
+ /** Sites bleeding on probing. */
131
+ bleedingSites: PeriodontalSiteId[];
132
+ /** Sites with visible plaque. */
133
+ plaqueSites: PeriodontalSiteId[];
134
+ /** Sites with suppuration. */
135
+ suppurationSites: PeriodontalSiteId[];
136
+ /** Greatest *positive* recession on the tooth (mm); ≤ 0 values ignored. Null when none. */
137
+ maxRecessionMm: number | null;
138
+ /** Miller mobility grade when ≥ 1, else null. */
139
+ mobility: PeriodontalMobility | null;
140
+ /** Aspects with any furcation involvement flagged. */
141
+ furcation: PeriodontalSide[];
142
+ }
143
+ /**
144
+ * Derive the narratable per-tooth problem list from a chart value. A tooth is
145
+ * included only when it carries a notable finding — missing, implant, a pocket
146
+ * at/above the moderate threshold, bleeding, suppuration, mobility ≥ 1, or
147
+ * furcation involvement. Entries are returned in clinical (arch) order; each
148
+ * tooth's `pockets` are ordered deepest first. Plaque and shallow recession are
149
+ * reported as detail on already-flagged teeth but never flag a tooth alone.
150
+ */
151
+ export declare function computePeriodontalFindings(value: PeriodontalChartValue, options?: {
152
+ moderate?: number;
153
+ severe?: number;
154
+ }): PeriodontalToothFinding[];
110
155
  /** An empty chart with every tooth present but unscored. */
111
156
  export declare function emptyPeriodontalChart(dentition?: PeriodontalDentition): PeriodontalChartValue;
112
157
  /**
@@ -1,6 +1,6 @@
1
1
  import { type ComponentPropsWithoutRef } from 'react';
2
2
  import { type VariantProps } from 'class-variance-authority';
3
- import { type PeriodontalChartValue, type PeriodontalDentition, type PeriodontalIndices, type PeriodontalNumbering, type PeriodontalSiteId, type PeriodontalSiteState, type PeriodontalToothState } from './periodontal-chart-data';
3
+ import { type PeriodontalChartValue, type PeriodontalDentition, type PeriodontalIndices, type PeriodontalNumbering, type PeriodontalSiteId, type PeriodontalSiteState, type PeriodontalToothFinding, type PeriodontalToothState } from './periodontal-chart-data';
4
4
  declare const rootVariants: (props?: ({
5
5
  disabled?: boolean | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
@@ -12,6 +12,8 @@ export interface PeriodontalChartHandle {
12
12
  getTooth: (fdi: string) => PeriodontalToothState | undefined;
13
13
  /** Derived whole-mouth indices (mean PD/CAL, plaque %, BoP %). */
14
14
  getIndices: () => PeriodontalIndices;
15
+ /** Narratable per-tooth problem list — flagged teeth only, never the note. */
16
+ getFindings: () => PeriodontalToothFinding[];
15
17
  /** FDI ids of every tooth flagged missing. */
16
18
  missingTeeth: () => string[];
17
19
  /** Patch one probing site. */
@@ -1,4 +1,4 @@
1
- import { P as n, c as p, p as t, a as e } from "../../_chunks/phone-input-dtnrvnZf.js";
1
+ import { P as n, c as p, p as t, a as e } from "../../_chunks/phone-input-D00ZBAm-.js";
2
2
  export {
3
3
  n as PhoneInput,
4
4
  p as countryTriggerVariants,
@@ -983,10 +983,11 @@ export declare const arUi: {
983
983
  };
984
984
  };
985
985
  readonly documentPreview: {
986
+ readonly multiTitle: "المستندات";
987
+ readonly tabsLabel: "المستندات المحددة";
986
988
  readonly regionLabel: "معاينة المستند";
987
989
  readonly emptyTitle: "لم يُحدَّد أي مستند";
988
990
  readonly emptyDescription: "حدِّد مستنداً لمعاينته هنا.";
989
- readonly pdfLabel: "معاينة المستند";
990
991
  readonly imageAlt: "معاينة {{name}}";
991
992
  readonly noPreview: "المعاينة غير متاحة.";
992
993
  readonly clinical: "سريري";
@@ -972,10 +972,11 @@ const e = {
972
972
  }
973
973
  },
974
974
  documentPreview: {
975
+ multiTitle: "المستندات",
976
+ tabsLabel: "المستندات المحددة",
975
977
  regionLabel: "معاينة المستند",
976
978
  emptyTitle: "لم يُحدَّد أي مستند",
977
979
  emptyDescription: "حدِّد مستنداً لمعاينته هنا.",
978
- pdfLabel: "معاينة المستند",
979
980
  imageAlt: "معاينة {{name}}",
980
981
  noPreview: "المعاينة غير متاحة.",
981
982
  clinical: "سريري",
@@ -983,10 +983,11 @@ export declare const deUi: {
983
983
  };
984
984
  };
985
985
  readonly documentPreview: {
986
+ readonly multiTitle: "Dokumente";
987
+ readonly tabsLabel: "Ausgewählte Dokumente";
986
988
  readonly regionLabel: "Dokumentvorschau";
987
989
  readonly emptyTitle: "Kein Dokument ausgewählt";
988
990
  readonly emptyDescription: "Wählen Sie ein Dokument aus, um es hier in der Vorschau anzuzeigen.";
989
- readonly pdfLabel: "Dokumentvorschau";
990
991
  readonly imageAlt: "Vorschau von {{name}}";
991
992
  readonly noPreview: "Keine Vorschau verfügbar.";
992
993
  readonly clinical: "Klinisch";
@@ -972,10 +972,11 @@ const e = {
972
972
  }
973
973
  },
974
974
  documentPreview: {
975
+ multiTitle: "Dokumente",
976
+ tabsLabel: "Ausgewählte Dokumente",
975
977
  regionLabel: "Dokumentvorschau",
976
978
  emptyTitle: "Kein Dokument ausgewählt",
977
979
  emptyDescription: "Wählen Sie ein Dokument aus, um es hier in der Vorschau anzuzeigen.",
978
- pdfLabel: "Dokumentvorschau",
979
980
  imageAlt: "Vorschau von {{name}}",
980
981
  noPreview: "Keine Vorschau verfügbar.",
981
982
  clinical: "Klinisch",
@@ -980,10 +980,11 @@ export declare const elUi: {
980
980
  };
981
981
  };
982
982
  readonly documentPreview: {
983
+ readonly multiTitle: "Έγγραφα";
984
+ readonly tabsLabel: "Επιλεγμένα έγγραφα";
983
985
  readonly regionLabel: "Προεπισκόπηση εγγράφου";
984
986
  readonly emptyTitle: "Δεν έχει επιλεγεί έγγραφο";
985
987
  readonly emptyDescription: "Επιλέξτε ένα έγγραφο για προεπισκόπηση εδώ.";
986
- readonly pdfLabel: "Προεπισκόπηση εγγράφου";
987
988
  readonly imageAlt: "Προεπισκόπηση του {{name}}";
988
989
  readonly noPreview: "Δεν υπάρχει διαθέσιμη προεπισκόπηση.";
989
990
  readonly clinical: "Κλινικό";
@@ -972,10 +972,11 @@ const e = {
972
972
  }
973
973
  },
974
974
  documentPreview: {
975
+ multiTitle: "Έγγραφα",
976
+ tabsLabel: "Επιλεγμένα έγγραφα",
975
977
  regionLabel: "Προεπισκόπηση εγγράφου",
976
978
  emptyTitle: "Δεν έχει επιλεγεί έγγραφο",
977
979
  emptyDescription: "Επιλέξτε ένα έγγραφο για προεπισκόπηση εδώ.",
978
- pdfLabel: "Προεπισκόπηση εγγράφου",
979
980
  imageAlt: "Προεπισκόπηση του {{name}}",
980
981
  noPreview: "Δεν υπάρχει διαθέσιμη προεπισκόπηση.",
981
982
  clinical: "Κλινικό",
@@ -980,10 +980,11 @@ export declare const enUi: {
980
980
  };
981
981
  };
982
982
  readonly documentPreview: {
983
+ readonly multiTitle: "Documents";
984
+ readonly tabsLabel: "Selected documents";
983
985
  readonly regionLabel: "Document preview";
984
986
  readonly emptyTitle: "No document selected";
985
987
  readonly emptyDescription: "Select a document to preview it here.";
986
- readonly pdfLabel: "Document preview";
987
988
  readonly imageAlt: "Preview of {{name}}";
988
989
  readonly noPreview: "No preview available.";
989
990
  readonly clinical: "Clinical";
@@ -952,10 +952,11 @@ const e = {
952
952
  }
953
953
  },
954
954
  documentPreview: {
955
+ multiTitle: "Documents",
956
+ tabsLabel: "Selected documents",
955
957
  regionLabel: "Document preview",
956
958
  emptyTitle: "No document selected",
957
959
  emptyDescription: "Select a document to preview it here.",
958
- pdfLabel: "Document preview",
959
960
  imageAlt: "Preview of {{name}}",
960
961
  noPreview: "No preview available.",
961
962
  clinical: "Clinical",
@@ -980,10 +980,11 @@ export declare const esUi: {
980
980
  };
981
981
  };
982
982
  readonly documentPreview: {
983
+ readonly multiTitle: "Documentos";
984
+ readonly tabsLabel: "Documentos seleccionados";
983
985
  readonly regionLabel: "Vista previa del documento";
984
986
  readonly emptyTitle: "Ningún documento seleccionado";
985
987
  readonly emptyDescription: "Seleccione un documento para verlo aquí en vista previa.";
986
- readonly pdfLabel: "Vista previa del documento";
987
988
  readonly imageAlt: "Vista previa de {{name}}";
988
989
  readonly noPreview: "Vista previa no disponible.";
989
990
  readonly clinical: "Clínico";
@@ -972,10 +972,11 @@ const e = {
972
972
  }
973
973
  },
974
974
  documentPreview: {
975
+ multiTitle: "Documentos",
976
+ tabsLabel: "Documentos seleccionados",
975
977
  regionLabel: "Vista previa del documento",
976
978
  emptyTitle: "Ningún documento seleccionado",
977
979
  emptyDescription: "Seleccione un documento para verlo aquí en vista previa.",
978
- pdfLabel: "Vista previa del documento",
979
980
  imageAlt: "Vista previa de {{name}}",
980
981
  noPreview: "Vista previa no disponible.",
981
982
  clinical: "Clínico",
@@ -980,10 +980,11 @@ export declare const frUi: {
980
980
  };
981
981
  };
982
982
  readonly documentPreview: {
983
+ readonly multiTitle: "Documents";
984
+ readonly tabsLabel: "Documents sélectionnés";
983
985
  readonly regionLabel: "Aperçu du document";
984
986
  readonly emptyTitle: "Aucun document sélectionné";
985
987
  readonly emptyDescription: "Sélectionnez un document pour l’afficher ici en aperçu.";
986
- readonly pdfLabel: "Aperçu du document";
987
988
  readonly imageAlt: "Aperçu de {{name}}";
988
989
  readonly noPreview: "Aperçu non disponible.";
989
990
  readonly clinical: "Clinique";
@@ -972,10 +972,11 @@ const e = {
972
972
  }
973
973
  },
974
974
  documentPreview: {
975
+ multiTitle: "Documents",
976
+ tabsLabel: "Documents sélectionnés",
975
977
  regionLabel: "Aperçu du document",
976
978
  emptyTitle: "Aucun document sélectionné",
977
979
  emptyDescription: "Sélectionnez un document pour l’afficher ici en aperçu.",
978
- pdfLabel: "Aperçu du document",
979
980
  imageAlt: "Aperçu de {{name}}",
980
981
  noPreview: "Aperçu non disponible.",
981
982
  clinical: "Clinique",
@@ -980,10 +980,11 @@ export declare const hiUi: {
980
980
  };
981
981
  };
982
982
  readonly documentPreview: {
983
+ readonly multiTitle: "दस्तावेज़";
984
+ readonly tabsLabel: "चयनित दस्तावेज़";
983
985
  readonly regionLabel: "दस्तावेज़ पूर्वावलोकन";
984
986
  readonly emptyTitle: "कोई दस्तावेज़ चयनित नहीं";
985
987
  readonly emptyDescription: "यहाँ पूर्वावलोकन देखने के लिए कोई दस्तावेज़ चुनें।";
986
- readonly pdfLabel: "दस्तावेज़ पूर्वावलोकन";
987
988
  readonly imageAlt: "{{name}} का पूर्वावलोकन";
988
989
  readonly noPreview: "कोई पूर्वावलोकन उपलब्ध नहीं।";
989
990
  readonly clinical: "नैदानिक";
@@ -972,10 +972,11 @@ const e = {
972
972
  }
973
973
  },
974
974
  documentPreview: {
975
+ multiTitle: "दस्तावेज़",
976
+ tabsLabel: "चयनित दस्तावेज़",
975
977
  regionLabel: "दस्तावेज़ पूर्वावलोकन",
976
978
  emptyTitle: "कोई दस्तावेज़ चयनित नहीं",
977
979
  emptyDescription: "यहाँ पूर्वावलोकन देखने के लिए कोई दस्तावेज़ चुनें।",
978
- pdfLabel: "दस्तावेज़ पूर्वावलोकन",
979
980
  imageAlt: "{{name}} का पूर्वावलोकन",
980
981
  noPreview: "कोई पूर्वावलोकन उपलब्ध नहीं।",
981
982
  clinical: "नैदानिक",