@mieweb/ui 0.6.1-dev.159 → 0.6.1-dev.165

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 (119) hide show
  1. package/dist/MedicationEditor-Bp4NLy7y.d.cts +352 -0
  2. package/dist/MedicationEditor-Bp4NLy7y.d.ts +352 -0
  3. package/dist/ag-grid.cjs +5 -5
  4. package/dist/ag-grid.js +1 -1
  5. package/dist/{chunk-H4T5T65N.cjs → chunk-2JQBPU3Y.cjs} +3 -3
  6. package/dist/{chunk-H4T5T65N.cjs.map → chunk-2JQBPU3Y.cjs.map} +1 -1
  7. package/dist/{chunk-6555OYRU.js → chunk-5BQE6BEL.js} +2 -2
  8. package/dist/{chunk-6555OYRU.js.map → chunk-5BQE6BEL.js.map} +1 -1
  9. package/dist/chunk-67CEEDAP.cjs +1605 -0
  10. package/dist/chunk-67CEEDAP.cjs.map +1 -0
  11. package/dist/{chunk-ULF4PWHW.cjs → chunk-7BARESXI.cjs} +3 -3
  12. package/dist/{chunk-ULF4PWHW.cjs.map → chunk-7BARESXI.cjs.map} +1 -1
  13. package/dist/chunk-7ZVTLTJF.js +109 -0
  14. package/dist/chunk-7ZVTLTJF.js.map +1 -0
  15. package/dist/{chunk-KX4NWZIR.cjs → chunk-CDMWZBDD.cjs} +3 -3
  16. package/dist/{chunk-KX4NWZIR.cjs.map → chunk-CDMWZBDD.cjs.map} +1 -1
  17. package/dist/chunk-DHKYGVP7.js +3 -0
  18. package/dist/{chunk-LEMY57MI.js.map → chunk-DHKYGVP7.js.map} +1 -1
  19. package/dist/{chunk-FSBFQBNE.cjs → chunk-DKGUOMBC.cjs} +2 -2
  20. package/dist/{chunk-FSBFQBNE.cjs.map → chunk-DKGUOMBC.cjs.map} +1 -1
  21. package/dist/{chunk-4FALCEJI.cjs → chunk-EL2RSQTJ.cjs} +2 -2
  22. package/dist/{chunk-4FALCEJI.cjs.map → chunk-EL2RSQTJ.cjs.map} +1 -1
  23. package/dist/{chunk-TQV5CGSA.js → chunk-ETGZ5DSA.js} +3 -3
  24. package/dist/{chunk-TQV5CGSA.js.map → chunk-ETGZ5DSA.js.map} +1 -1
  25. package/dist/{chunk-EYJDPYOP.js → chunk-FJG7KUDJ.js} +3 -3
  26. package/dist/{chunk-EYJDPYOP.js.map → chunk-FJG7KUDJ.js.map} +1 -1
  27. package/dist/{chunk-HMQ2PRTB.cjs → chunk-GBRPZGSI.cjs} +7 -7
  28. package/dist/{chunk-HMQ2PRTB.cjs.map → chunk-GBRPZGSI.cjs.map} +1 -1
  29. package/dist/{chunk-M7BLVBL4.js → chunk-GSOOPTGM.js} +3 -3
  30. package/dist/{chunk-M7BLVBL4.js.map → chunk-GSOOPTGM.js.map} +1 -1
  31. package/dist/chunk-HUXOASEB.js +1568 -0
  32. package/dist/chunk-HUXOASEB.js.map +1 -0
  33. package/dist/chunk-IQ4KQJAO.js +3 -0
  34. package/dist/{chunk-4ZU53GNR.cjs.map → chunk-IQ4KQJAO.js.map} +1 -1
  35. package/dist/{chunk-RUGWUQ47.js → chunk-NBD236EH.js} +48 -2
  36. package/dist/chunk-NBD236EH.js.map +1 -0
  37. package/dist/chunk-OF7NTZ2I.js +3 -0
  38. package/dist/chunk-OF7NTZ2I.js.map +1 -0
  39. package/dist/chunk-RHNPILZQ.cjs +4 -0
  40. package/dist/chunk-RHNPILZQ.cjs.map +1 -0
  41. package/dist/chunk-RI56YPED.cjs +201 -0
  42. package/dist/chunk-RI56YPED.cjs.map +1 -0
  43. package/dist/{chunk-DCER2QQB.js → chunk-T42BCIUA.js} +2 -2
  44. package/dist/{chunk-DCER2QQB.js.map → chunk-T42BCIUA.js.map} +1 -1
  45. package/dist/{chunk-4ZU53GNR.cjs → chunk-UTYUT5YY.cjs} +62 -2
  46. package/dist/chunk-UTYUT5YY.cjs.map +1 -0
  47. package/dist/{chunk-Q7NBJFEB.js → chunk-UVQEHZRF.js} +2 -2
  48. package/dist/{chunk-Q7NBJFEB.js.map → chunk-UVQEHZRF.js.map} +1 -1
  49. package/dist/chunk-VBWRH4UW.cjs +4 -0
  50. package/dist/chunk-VBWRH4UW.cjs.map +1 -0
  51. package/dist/{chunk-WJIANZPI.cjs → chunk-VJOVJTFP.cjs} +3 -3
  52. package/dist/chunk-VJOVJTFP.cjs.map +1 -0
  53. package/dist/{chunk-OVQKCUTZ.js → chunk-WFS6R2F5.js} +3 -3
  54. package/dist/{chunk-OVQKCUTZ.js.map → chunk-WFS6R2F5.js.map} +1 -1
  55. package/dist/chunk-Y5KEFV5O.js +192 -0
  56. package/dist/chunk-Y5KEFV5O.js.map +1 -0
  57. package/dist/{chunk-4N72FAQW.js → chunk-YBLIDESO.js} +3 -3
  58. package/dist/chunk-YBLIDESO.js.map +1 -0
  59. package/dist/chunk-YVPC65ZJ.cjs +134 -0
  60. package/dist/chunk-YVPC65ZJ.cjs.map +1 -0
  61. package/dist/{chunk-3AMNAMJA.cjs → chunk-YYDW3ZZS.cjs} +48 -2
  62. package/dist/chunk-YYDW3ZZS.cjs.map +1 -0
  63. package/dist/{chunk-3M4P2KMG.cjs → chunk-ZHBANUBI.cjs} +2 -2
  64. package/dist/{chunk-3M4P2KMG.cjs.map → chunk-ZHBANUBI.cjs.map} +1 -1
  65. package/dist/components/Badge/index.cjs +4 -3
  66. package/dist/components/Badge/index.js +2 -1
  67. package/dist/components/Card/index.cjs +16 -15
  68. package/dist/components/Card/index.js +2 -1
  69. package/dist/components/CountryCodeDropdown/index.cjs +5 -5
  70. package/dist/components/CountryCodeDropdown/index.js +2 -2
  71. package/dist/components/Dropdown/index.cjs +8 -8
  72. package/dist/components/Dropdown/index.js +2 -2
  73. package/dist/components/RichTextEditor/index.cjs +7 -7
  74. package/dist/components/RichTextEditor/index.js +4 -4
  75. package/dist/components/Skeleton/index.d.cts +1 -1
  76. package/dist/components/Skeleton/index.d.ts +1 -1
  77. package/dist/components/SuperChat/index.cjs +10 -9
  78. package/dist/components/SuperChat/index.cjs.map +1 -1
  79. package/dist/components/SuperChat/index.js +5 -4
  80. package/dist/components/SuperChat/index.js.map +1 -1
  81. package/dist/components/SuperChat/plugins/index.cjs +3 -3
  82. package/dist/components/SuperChat/plugins/index.js +2 -2
  83. package/dist/datavis.cjs +273 -5
  84. package/dist/datavis.cjs.map +1 -1
  85. package/dist/datavis.d.cts +61 -1
  86. package/dist/datavis.d.ts +61 -1
  87. package/dist/datavis.js +251 -1
  88. package/dist/datavis.js.map +1 -1
  89. package/dist/esheet.cjs +182 -0
  90. package/dist/esheet.cjs.map +1 -1
  91. package/dist/esheet.d.cts +117 -0
  92. package/dist/esheet.d.ts +117 -0
  93. package/dist/esheet.js +161 -0
  94. package/dist/esheet.js.map +1 -1
  95. package/dist/hooks/index.cjs +33 -16
  96. package/dist/hooks/index.d.cts +62 -1
  97. package/dist/hooks/index.d.ts +62 -1
  98. package/dist/hooks/index.js +3 -2
  99. package/dist/index.cjs +3923 -938
  100. package/dist/index.cjs.map +1 -1
  101. package/dist/index.d.cts +981 -2
  102. package/dist/index.d.ts +981 -2
  103. package/dist/index.js +3313 -452
  104. package/dist/index.js.map +1 -1
  105. package/dist/{nitroTableGrid-RQNSZQO4.cjs → nitroTableGrid-3J2GY6CK.cjs} +4 -4
  106. package/dist/{nitroTableGrid-RQNSZQO4.cjs.map → nitroTableGrid-3J2GY6CK.cjs.map} +1 -1
  107. package/dist/{nitroTableGrid-W6XWRFA7.js → nitroTableGrid-SIMT7635.js} +3 -3
  108. package/dist/{nitroTableGrid-W6XWRFA7.js.map → nitroTableGrid-SIMT7635.js.map} +1 -1
  109. package/dist/orderRows-BUJYgSc7.d.cts +221 -0
  110. package/dist/orderRows-BUJYgSc7.d.ts +221 -0
  111. package/dist/styles.css +1 -1
  112. package/dist/tailwind-preset.cjs +4 -4
  113. package/dist/tailwind-preset.js +1 -1
  114. package/package.json +3 -3
  115. package/dist/chunk-3AMNAMJA.cjs.map +0 -1
  116. package/dist/chunk-4N72FAQW.js.map +0 -1
  117. package/dist/chunk-LEMY57MI.js +0 -3
  118. package/dist/chunk-RUGWUQ47.js.map +0 -1
  119. package/dist/chunk-WJIANZPI.cjs.map +0 -1
@@ -0,0 +1,201 @@
1
+ 'use strict';
2
+
3
+ // src/components/HealthSurveillance/evaluate.ts
4
+ function normalizeOrders(orders) {
5
+ return (orders ?? []).map(
6
+ (o) => typeof o === "string" ? { keys: [o], after: [] } : { keys: o.alt ?? (o.key ? [o.key] : []), after: o.after ?? [] }
7
+ ).filter((s) => s.keys.length > 0);
8
+ }
9
+ function flattenOrderKeys(orders) {
10
+ return normalizeOrders(orders).flatMap((s) => s.keys);
11
+ }
12
+ function completedKeys(history) {
13
+ const done = /* @__PURE__ */ new Set();
14
+ for (const o of history.orders) {
15
+ if (o.status === "completed") done.add(o.key);
16
+ }
17
+ for (const p of history.procedures ?? []) done.add(p.key);
18
+ for (const i of history.immunizations ?? []) done.add(i.key);
19
+ return done;
20
+ }
21
+ function addMonths(iso, months) {
22
+ const [y, m, d] = iso.slice(0, 10).split("-").map(Number);
23
+ const total = m - 1 + months;
24
+ const ty = y + Math.floor(total / 12);
25
+ const tm = (total % 12 + 12) % 12;
26
+ const lastDay = new Date(Date.UTC(ty, tm + 1, 0)).getUTCDate();
27
+ return new Date(Date.UTC(ty, tm, Math.min(d, lastDay))).toISOString().slice(0, 10);
28
+ }
29
+ function isApplicable(history, program) {
30
+ if (program.sex && program.sex !== history.sex) return false;
31
+ if (program.ageMin !== void 0 && history.age < program.ageMin)
32
+ return false;
33
+ if (program.ageMax !== void 0 && history.age > program.ageMax)
34
+ return false;
35
+ return true;
36
+ }
37
+ function evaluateProgram(key, program, history, now = /* @__PURE__ */ new Date()) {
38
+ const base = { key, program, pendingKeys: [] };
39
+ if (!isApplicable(history, program)) {
40
+ return { ...base, status: "not-applicable" };
41
+ }
42
+ const satisfying = new Set(flattenOrderKeys(program.orders));
43
+ const completions = [];
44
+ for (const o of history.orders) {
45
+ if (!satisfying.has(o.key)) continue;
46
+ if (o.status === "completed") completions.push(o.date);
47
+ else base.pendingKeys.push(o.key);
48
+ }
49
+ for (const p of history.procedures ?? []) {
50
+ if (satisfying.has(p.key)) completions.push(p.date);
51
+ }
52
+ for (const i of history.immunizations ?? []) {
53
+ if (satisfying.has(i.key)) completions.push(i.date);
54
+ }
55
+ const lastCompleted = completions.sort().at(-1);
56
+ if (!lastCompleted) {
57
+ return base.pendingKeys.length > 0 ? { ...base, status: "pending" } : { ...base, status: "due" };
58
+ }
59
+ if (program.periodicityMonths === void 0) {
60
+ return { ...base, status: "satisfied", lastCompleted };
61
+ }
62
+ const dueDate = addMonths(lastCompleted, program.periodicityMonths);
63
+ if (dueDate > now.toISOString().slice(0, 10)) {
64
+ return { ...base, status: "satisfied", lastCompleted, dueDate };
65
+ }
66
+ return base.pendingKeys.length > 0 ? { ...base, status: "pending", lastCompleted, dueDate } : { ...base, status: "overdue", lastCompleted, dueDate };
67
+ }
68
+ function evaluateDue(history, programs, options) {
69
+ const enrolled = options?.enrolledKeys ? new Set(options.enrolledKeys) : null;
70
+ const now = options?.now ?? /* @__PURE__ */ new Date();
71
+ const items = [];
72
+ for (const [key, program] of Object.entries(programs)) {
73
+ if (enrolled && program.kind !== "quality" && !enrolled.has(key)) continue;
74
+ const item = evaluateProgram(key, program, history, now);
75
+ if (item.status === "not-applicable" && !options?.includeNotApplicable)
76
+ continue;
77
+ items.push(item);
78
+ }
79
+ const rank = {
80
+ overdue: 0,
81
+ due: 1,
82
+ pending: 2,
83
+ satisfied: 3,
84
+ "not-applicable": 4
85
+ };
86
+ return items.sort(
87
+ (a, b) => rank[a.status] - rank[b.status] || (a.dueDate ?? "").localeCompare(b.dueDate ?? "") || a.key.localeCompare(b.key)
88
+ );
89
+ }
90
+ function dueForOrder(orderKey, dueItems) {
91
+ return dueItems.filter(
92
+ (i) => (i.status === "due" || i.status === "overdue") && flattenOrderKeys(i.program.orders).includes(orderKey)
93
+ );
94
+ }
95
+
96
+ // src/components/HealthSurveillance/orderRows.ts
97
+ var KIND_LABEL = {
98
+ surveillance: "surveillance",
99
+ fitness: "fitness for duty",
100
+ credential: "credential",
101
+ quality: "quality measure"
102
+ };
103
+ function labelLookup(history, orderLabels) {
104
+ const m = /* @__PURE__ */ new Map();
105
+ const scan = (list) => {
106
+ for (const e of list ?? []) {
107
+ if (e.key && e.label && !m.has(e.key)) m.set(e.key, e.label);
108
+ }
109
+ };
110
+ scan(history.orders);
111
+ scan(history.observations);
112
+ scan(history.procedures);
113
+ scan(history.immunizations);
114
+ return (key) => orderLabels?.[key] ?? m.get(key) ?? key;
115
+ }
116
+ function reasonIndex(items) {
117
+ const idx = /* @__PURE__ */ new Map();
118
+ for (const item of items) {
119
+ for (const spec of normalizeOrders(item.program.orders)) {
120
+ for (const k of spec.keys) {
121
+ if (!idx.has(k)) idx.set(k, item);
122
+ }
123
+ }
124
+ }
125
+ return idx;
126
+ }
127
+ function buildChartOrderRows(history, programs, options = {}) {
128
+ const {
129
+ enrolledKeys,
130
+ now,
131
+ programLabels,
132
+ orderLabels,
133
+ includeDue = true
134
+ } = options;
135
+ const items = evaluateDue(history, programs, { enrolledKeys, now });
136
+ const byOrderKey = reasonIndex(items);
137
+ const orderLabel = labelLookup(history, orderLabels);
138
+ const programLabel = (key) => programLabels?.[key] ?? key;
139
+ const completed = completedKeys(history);
140
+ const rows = [];
141
+ const reasonFields = (item) => ({
142
+ reason: item ? programLabel(item.key) : "",
143
+ reasonKey: item?.key ?? "",
144
+ kind: item?.program.kind ? KIND_LABEL[item.program.kind] ?? item.program.kind : "",
145
+ dueDate: item?.dueDate?.slice(0, 10) ?? ""
146
+ });
147
+ for (const o of history.orders) {
148
+ rows.push({
149
+ orderKey: o.key,
150
+ order: orderLabel(o.key),
151
+ ...reasonFields(byOrderKey.get(o.key)),
152
+ status: o.status,
153
+ date: o.date.slice(0, 10),
154
+ provider: o.provider ?? "",
155
+ requisitionId: o.requisitionId ?? "",
156
+ encounterId: o.encounterId ?? "",
157
+ blockedBy: ""
158
+ });
159
+ }
160
+ if (includeDue) {
161
+ const placed = new Set(history.orders.map((o) => o.key));
162
+ for (const item of items) {
163
+ if (item.status === "satisfied" || item.status === "not-applicable")
164
+ continue;
165
+ for (const spec of normalizeOrders(item.program.orders)) {
166
+ const unmet = spec.after.filter((k) => !completed.has(k));
167
+ for (const k of spec.keys) {
168
+ if (placed.has(k)) continue;
169
+ rows.push({
170
+ orderKey: k,
171
+ order: orderLabel(k),
172
+ ...reasonFields(item),
173
+ status: unmet.length > 0 ? "blocked" : "available",
174
+ date: "",
175
+ provider: "",
176
+ requisitionId: "",
177
+ encounterId: "",
178
+ blockedBy: unmet.map(orderLabel).join(", ")
179
+ });
180
+ }
181
+ }
182
+ }
183
+ }
184
+ return rows;
185
+ }
186
+ function buildEncounterOrderRows(history, programs, encounterId, options = {}) {
187
+ return buildChartOrderRows(history, programs, options).filter(
188
+ (r) => r.encounterId === encounterId || r.status === "available" || r.status === "blocked"
189
+ );
190
+ }
191
+
192
+ exports.buildChartOrderRows = buildChartOrderRows;
193
+ exports.buildEncounterOrderRows = buildEncounterOrderRows;
194
+ exports.completedKeys = completedKeys;
195
+ exports.dueForOrder = dueForOrder;
196
+ exports.evaluateDue = evaluateDue;
197
+ exports.evaluateProgram = evaluateProgram;
198
+ exports.isApplicable = isApplicable;
199
+ exports.normalizeOrders = normalizeOrders;
200
+ //# sourceMappingURL=chunk-RI56YPED.cjs.map
201
+ //# sourceMappingURL=chunk-RI56YPED.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/HealthSurveillance/evaluate.ts","../src/components/HealthSurveillance/orderRows.ts"],"names":[],"mappings":"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","file":"chunk-RI56YPED.cjs","sourcesContent":["/**\n * Due-evaluation engine — the \"knowledge\" layer of health surveillance.\n * Given a patient's history and the program metadata (programs.json from\n * mieweb/codify, or a deployment's own), decides which programs/measures are\n * due, overdue, pending, or satisfied. Pure functions, no I/O — the metadata\n * is small, so this runs on the main thread.\n */\n\nimport type { PatientHistory } from './history';\n\n/**\n * One entry in a program's order set:\n * - `\"CODETYPE|FULLCODE\"` — a plain required order\n * - `{ alt: [a, b] }` — mutually exclusive alternatives (one-of): a\n * colonoscopy OR a FIT satisfies colorectal screening\n * - `{ key, after: […] }` — depends on completed prerequisites (Gantt edge):\n * the RMO's fitness-for-duty determination needs the panel results first,\n * and a program may carry several determinations (per panel / per SEG)\n */\nexport type ProgramOrder =\n | string\n | {\n key?: string;\n alt?: string[];\n after?: string[];\n };\n\n/** Normalized order entry: alternative keys + prerequisite keys. */\nexport interface OrderSpec {\n /** Alternatives — exactly one should be ordered */\n keys: string[];\n /** Order keys that must be completed before this one can be performed */\n after: string[];\n}\n\nexport function normalizeOrders(orders?: ProgramOrder[]): OrderSpec[] {\n return (orders ?? [])\n .map((o) =>\n typeof o === 'string'\n ? { keys: [o], after: [] }\n : { keys: o.alt ?? (o.key ? [o.key] : []), after: o.after ?? [] }\n )\n .filter((s) => s.keys.length > 0);\n}\n\n/** Every key that can satisfy/appear in the program's order set. */\nexport function flattenOrderKeys(orders?: ProgramOrder[]): string[] {\n return normalizeOrders(orders).flatMap((s) => s.keys);\n}\n\n/** Keys of everything completed in the history (orders, procedures,\n * immunizations) — used to unlock dependent orders. */\nexport function completedKeys(history: PatientHistory): Set<string> {\n const done = new Set<string>();\n for (const o of history.orders) {\n if (o.status === 'completed') done.add(o.key);\n }\n for (const p of history.procedures ?? []) done.add(p.key);\n for (const i of history.immunizations ?? []) done.add(i.key);\n return done;\n}\n\n/** Program metadata — mirrors programs.json (see mieweb/codify). */\nexport interface ProgramMeta {\n kind?: 'surveillance' | 'fitness' | 'credential' | 'quality';\n /** Omitted = one-time / event-driven (satisfied forever once done) */\n periodicityMonths?: number;\n ageMin?: number;\n ageMax?: number;\n sex?: 'M' | 'F';\n /** Satisfying orders — plain keys, one-of alternatives, or dependent\n * entries (see ProgramOrder) */\n orders?: ProgramOrder[];\n}\n\nexport type ProgramsMap = Record<string, ProgramMeta>;\n\nexport type DueStatus =\n | 'due' // applicable, never satisfied (or history silent)\n | 'overdue' // applicable, last satisfied longer ago than the periodicity\n | 'pending' // a satisfying order is in flight\n | 'satisfied' // satisfied within the periodicity window (or one-time done)\n | 'not-applicable'; // age/sex gates exclude the patient\n\nexport interface DueItem {\n /** Program key, CODETYPE|FULLCODE (e.g. \"OSHA|1910.95\", \"eCQM|CMS125\") */\n key: string;\n program: ProgramMeta;\n status: DueStatus;\n /** Most recent completion date of any satisfying order */\n lastCompleted?: string;\n /** When the current/last satisfaction lapses (satisfied/overdue only) */\n dueDate?: string;\n /** Satisfying orders currently pending */\n pendingKeys: string[];\n}\n\n/** Add months to an ISO date, returning an ISO date (YYYY-MM-DD).\n * Computed in UTC (a local-time Date would shift the day in non-UTC zones)\n * with the day-of-month clamped (Jan 31 + 1 month → Feb 28/29, not Mar 2/3). */\nfunction addMonths(iso: string, months: number): string {\n const [y, m, d] = iso.slice(0, 10).split('-').map(Number);\n const total = m - 1 + months;\n const ty = y + Math.floor(total / 12);\n const tm = ((total % 12) + 12) % 12;\n // day 0 of the next month = last day of the target month\n const lastDay = new Date(Date.UTC(ty, tm + 1, 0)).getUTCDate();\n return new Date(Date.UTC(ty, tm, Math.min(d, lastDay)))\n .toISOString()\n .slice(0, 10);\n}\n\n/** Is the patient inside the program's age/sex gates? */\nexport function isApplicable(\n history: Pick<PatientHistory, 'age' | 'sex'>,\n program: ProgramMeta\n): boolean {\n if (program.sex && program.sex !== history.sex) return false;\n if (program.ageMin !== undefined && history.age < program.ageMin)\n return false;\n if (program.ageMax !== undefined && history.age > program.ageMax)\n return false;\n return true;\n}\n\n/**\n * Evaluate one program against the history.\n * `now` defaults to today; injectable for tests.\n */\nexport function evaluateProgram(\n key: string,\n program: ProgramMeta,\n history: PatientHistory,\n now: Date = new Date()\n): DueItem {\n const base = { key, program, pendingKeys: [] as string[] };\n if (!isApplicable(history, program)) {\n return { ...base, status: 'not-applicable' };\n }\n\n const satisfying = new Set(flattenOrderKeys(program.orders));\n // Completions come from finished orders, procedures and immunizations —\n // whatever the source system recorded them as.\n const completions: string[] = [];\n for (const o of history.orders) {\n if (!satisfying.has(o.key)) continue;\n if (o.status === 'completed') completions.push(o.date);\n else base.pendingKeys.push(o.key);\n }\n for (const p of history.procedures ?? []) {\n if (satisfying.has(p.key)) completions.push(p.date);\n }\n for (const i of history.immunizations ?? []) {\n if (satisfying.has(i.key)) completions.push(i.date);\n }\n\n const lastCompleted = completions.sort().at(-1);\n\n if (!lastCompleted) {\n return base.pendingKeys.length > 0\n ? { ...base, status: 'pending' }\n : { ...base, status: 'due' };\n }\n\n // One-time programs (no periodicity) stay satisfied once completed.\n if (program.periodicityMonths === undefined) {\n return { ...base, status: 'satisfied', lastCompleted };\n }\n\n const dueDate = addMonths(lastCompleted, program.periodicityMonths);\n if (dueDate > now.toISOString().slice(0, 10)) {\n return { ...base, status: 'satisfied', lastCompleted, dueDate };\n }\n return base.pendingKeys.length > 0\n ? { ...base, status: 'pending', lastCompleted, dueDate }\n : { ...base, status: 'overdue', lastCompleted, dueDate };\n}\n\n/**\n * Evaluate a set of programs against the history, most actionable first\n * (overdue → due → pending → satisfied; not-applicable omitted unless\n * `includeNotApplicable`).\n *\n * `enrolledKeys` restricts occupational programs to the patient's actual\n * enrollments (a clerk isn't due for cadmium surveillance just because the\n * program exists); quality measures apply to everyone passing their gates.\n */\nexport function evaluateDue(\n history: PatientHistory,\n programs: ProgramsMap,\n options?: {\n enrolledKeys?: string[];\n includeNotApplicable?: boolean;\n now?: Date;\n }\n): DueItem[] {\n const enrolled = options?.enrolledKeys ? new Set(options.enrolledKeys) : null;\n const now = options?.now ?? new Date();\n const items: DueItem[] = [];\n for (const [key, program] of Object.entries(programs)) {\n if (enrolled && program.kind !== 'quality' && !enrolled.has(key)) continue;\n const item = evaluateProgram(key, program, history, now);\n if (item.status === 'not-applicable' && !options?.includeNotApplicable)\n continue;\n items.push(item);\n }\n const rank: Record<DueStatus, number> = {\n overdue: 0,\n due: 1,\n pending: 2,\n satisfied: 3,\n 'not-applicable': 4,\n };\n return items.sort(\n (a, b) =>\n rank[a.status] - rank[b.status] ||\n (a.dueDate ?? '').localeCompare(b.dueDate ?? '') ||\n a.key.localeCompare(b.key)\n );\n}\n\n/**\n * Ordering-time prompt: is this order key part of a due/overdue program?\n * Returns the matching due items so the UI can badge \"due for OSHA 1910.95\"\n * or warn \"already satisfied\" while the clinician is ordering.\n */\nexport function dueForOrder(orderKey: string, dueItems: DueItem[]): DueItem[] {\n return dueItems.filter(\n (i) =>\n (i.status === 'due' || i.status === 'overdue') &&\n flattenOrderKeys(i.program.orders).includes(orderKey)\n );\n}\n","/**\n * Order-row builders — flatten the order history and the due-evaluation\n * output into grid-friendly rows (one row per encounter order) for the\n * NITRO-backed ChartOrdersGrid / EncounterOrdersGrid.\n *\n * Pure functions, no I/O. Every field is a flat string so the DataVis engine\n * can group/filter/aggregate on any of them (reason, provider, requisition,\n * status, kind, date).\n */\n\nimport {\n evaluateDue,\n normalizeOrders,\n completedKeys,\n type DueItem,\n type ProgramsMap,\n} from './evaluate';\nimport type { PatientHistory } from './history';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Per-order status — finer grained than the program-level DueStatus. */\nexport type OrderRowStatus = 'completed' | 'pending' | 'available' | 'blocked';\n\n/** One encounter order as a flat grid row. */\nexport interface OrderRow {\n /** CODETYPE|FULLCODE of the order */\n orderKey: string;\n /** Order display label */\n order: string;\n /** Reason/concern — the surveillance program or quality measure label */\n reason: string;\n /** Program key (CODETYPE|FULLCODE); '' when no program matches */\n reasonKey: string;\n /** Program kind label ('surveillance', 'quality measure', …) */\n kind: string;\n status: OrderRowStatus;\n /** Completion date (completed) or order date (pending); '' otherwise */\n date: string;\n /** Program due date, when known */\n dueDate: string;\n /** Ordering/performing provider; '' when unknown */\n provider: string;\n /** Requisition the order is bundled into; '' = unprocessed */\n requisitionId: string;\n /** Encounter the order was placed in; '' for not-yet-placed rows */\n encounterId: string;\n /** Unmet prerequisite labels, comma-joined ('' when unblocked) */\n blockedBy: string;\n}\n\nexport interface OrderRowsOptions {\n /** Occupational enrollments; quality measures apply to everyone in-gate */\n enrolledKeys?: string[];\n /** Evaluation clock (defaults to today; inject for determinism) */\n now?: Date;\n /** Display labels for program keys (falls back to the key) */\n programLabels?: Record<string, string>;\n /** Display labels for order keys (falls back to history labels, then key) */\n orderLabels?: Record<string, string>;\n /** Include not-yet-placed due-list orders as available/blocked rows\n * (default true) */\n includeDue?: boolean;\n}\n\nconst KIND_LABEL: Record<string, string> = {\n surveillance: 'surveillance',\n fitness: 'fitness for duty',\n credential: 'credential',\n quality: 'quality measure',\n};\n\n// =============================================================================\n// Internals\n// =============================================================================\n\nfunction labelLookup(\n history: PatientHistory,\n orderLabels?: Record<string, string>\n): (key: string) => string {\n const m = new Map<string, string>();\n const scan = (list?: { key?: string; label?: string }[]) => {\n for (const e of list ?? []) {\n if (e.key && e.label && !m.has(e.key)) m.set(e.key, e.label);\n }\n };\n scan(history.orders);\n scan(history.observations);\n scan(history.procedures);\n scan(history.immunizations);\n return (key) => orderLabels?.[key] ?? m.get(key) ?? key;\n}\n\n/** Map every order key to the due item whose program's order set contains it\n * (first program wins when several share an order). */\nfunction reasonIndex(items: DueItem[]): Map<string, DueItem> {\n const idx = new Map<string, DueItem>();\n for (const item of items) {\n for (const spec of normalizeOrders(item.program.orders)) {\n for (const k of spec.keys) {\n if (!idx.has(k)) idx.set(k, item);\n }\n }\n }\n return idx;\n}\n\n// =============================================================================\n// Builders\n// =============================================================================\n\n/**\n * Chart-wide rows: every past + in-flight order in the history, plus (by\n * default) the actionable due-list orders that haven't been placed yet\n * (`available`, or `blocked` while prerequisites are incomplete).\n */\nexport function buildChartOrderRows(\n history: PatientHistory,\n programs: ProgramsMap,\n options: OrderRowsOptions = {}\n): OrderRow[] {\n const {\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n includeDue = true,\n } = options;\n const items = evaluateDue(history, programs, { enrolledKeys, now });\n const byOrderKey = reasonIndex(items);\n const orderLabel = labelLookup(history, orderLabels);\n const programLabel = (key: string) => programLabels?.[key] ?? key;\n const completed = completedKeys(history);\n\n const rows: OrderRow[] = [];\n\n const reasonFields = (item?: DueItem) => ({\n reason: item ? programLabel(item.key) : '',\n reasonKey: item?.key ?? '',\n kind: item?.program.kind\n ? (KIND_LABEL[item.program.kind] ?? item.program.kind)\n : '',\n dueDate: item?.dueDate?.slice(0, 10) ?? '',\n });\n\n // 1) Every order in the history (all encounters)\n for (const o of history.orders) {\n rows.push({\n orderKey: o.key,\n order: orderLabel(o.key),\n ...reasonFields(byOrderKey.get(o.key)),\n status: o.status,\n date: o.date.slice(0, 10),\n provider: o.provider ?? '',\n requisitionId: o.requisitionId ?? '',\n encounterId: o.encounterId ?? '',\n blockedBy: '',\n });\n }\n\n // 2) Actionable due-list orders not yet placed\n if (includeDue) {\n const placed = new Set(history.orders.map((o) => o.key));\n for (const item of items) {\n if (item.status === 'satisfied' || item.status === 'not-applicable')\n continue;\n for (const spec of normalizeOrders(item.program.orders)) {\n const unmet = spec.after.filter((k) => !completed.has(k));\n for (const k of spec.keys) {\n if (placed.has(k)) continue;\n rows.push({\n orderKey: k,\n order: orderLabel(k),\n ...reasonFields(item),\n status: unmet.length > 0 ? 'blocked' : 'available',\n date: '',\n provider: '',\n requisitionId: '',\n encounterId: '',\n blockedBy: unmet.map(orderLabel).join(', '),\n });\n }\n }\n }\n }\n\n return rows;\n}\n\n/**\n * Current-encounter rows: the encounter's own orders (pending unprocessed\n * ones are the mass-operation targets) plus the actionable due-list orders\n * available to place this visit.\n */\nexport function buildEncounterOrderRows(\n history: PatientHistory,\n programs: ProgramsMap,\n encounterId: string,\n options: OrderRowsOptions = {}\n): OrderRow[] {\n return buildChartOrderRows(history, programs, options).filter(\n (r) =>\n r.encounterId === encounterId ||\n r.status === 'available' ||\n r.status === 'blocked'\n );\n}\n"]}
@@ -52,5 +52,5 @@ var Badge = React.forwardRef(
52
52
  Badge.displayName = "Badge";
53
53
 
54
54
  export { Badge, badgeVariants };
55
- //# sourceMappingURL=chunk-DCER2QQB.js.map
56
- //# sourceMappingURL=chunk-DCER2QQB.js.map
55
+ //# sourceMappingURL=chunk-T42BCIUA.js.map
56
+ //# sourceMappingURL=chunk-T42BCIUA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Badge/Badge.tsx"],"names":[],"mappings":";;;;;AAIA,IAAM,aAAA,GAAgB,GAAA;AAAA,EACpB;AAAA,IACE,yCAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EACE,2EAAA;AAAA,QACF,SAAA,EACE,2EAAA;AAAA,QACF,OAAA,EACE,mEAAA;AAAA,QACF,OAAA,EACE,uEAAA;AAAA,QACF,MAAA,EAAQ,2DAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACX;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,qBAAA;AAAA,QACJ,EAAA,EAAI,uBAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ;AAoBA,IAAM,KAAA,GAAc,KAAA,CAAA,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,MAAM,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC/D,IAAA,uBACE,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAW,GAAG,aAAA,CAAc,EAAE,SAAS,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,QACxD,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,UAC9C;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-DCER2QQB.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst badgeVariants = cva(\n [\n 'inline-flex items-center justify-center',\n 'font-medium',\n 'rounded-full',\n 'transition-colors duration-150',\n ],\n {\n variants: {\n variant: {\n default:\n 'bg-primary-100 text-primary-900 dark:bg-primary-900 dark:text-primary-100',\n secondary:\n 'bg-neutral-100 text-neutral-900 dark:bg-neutral-800 dark:text-neutral-100',\n success:\n 'bg-green-100 text-green-900 dark:bg-green-900 dark:text-green-100',\n warning:\n 'bg-yellow-100 text-yellow-900 dark:bg-yellow-900 dark:text-yellow-100',\n danger: 'bg-red-100 text-red-900 dark:bg-red-900 dark:text-red-100',\n outline: 'border border-current bg-transparent',\n },\n size: {\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2.5 py-0.5 text-sm',\n lg: 'px-3 py-1 text-base',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n }\n);\n\nexport interface BadgeProps\n extends\n React.HTMLAttributes<HTMLSpanElement>,\n VariantProps<typeof badgeVariants> {\n /** Optional icon before the text */\n icon?: React.ReactNode;\n}\n\n/**\n * A badge component for displaying status, labels, or counts.\n *\n * @example\n * ```tsx\n * <Badge variant=\"success\">Active</Badge>\n * <Badge variant=\"warning\" size=\"sm\">Pending</Badge>\n * <Badge variant=\"danger\" icon={<AlertIcon />}>Error</Badge>\n * ```\n */\nconst Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n ({ className, variant, size, icon, children, ...props }, ref) => {\n return (\n <span\n ref={ref}\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant, size }), className)}\n {...props}\n >\n {icon && <span className=\"mr-1 shrink-0\">{icon}</span>}\n {children}\n </span>\n );\n }\n);\n\nBadge.displayName = 'Badge';\n\nexport { Badge, badgeVariants };\n"]}
1
+ {"version":3,"sources":["../src/components/Badge/Badge.tsx"],"names":[],"mappings":";;;;;AAIA,IAAM,aAAA,GAAgB,GAAA;AAAA,EACpB;AAAA,IACE,yCAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EACE,2EAAA;AAAA,QACF,SAAA,EACE,2EAAA;AAAA,QACF,OAAA,EACE,mEAAA;AAAA,QACF,OAAA,EACE,uEAAA;AAAA,QACF,MAAA,EAAQ,2DAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACX;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,qBAAA;AAAA,QACJ,EAAA,EAAI,uBAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ;AAoBA,IAAM,KAAA,GAAc,KAAA,CAAA,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,MAAM,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC/D,IAAA,uBACE,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAW,GAAG,aAAA,CAAc,EAAE,SAAS,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,QACxD,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,UAC9C;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-T42BCIUA.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst badgeVariants = cva(\n [\n 'inline-flex items-center justify-center',\n 'font-medium',\n 'rounded-full',\n 'transition-colors duration-150',\n ],\n {\n variants: {\n variant: {\n default:\n 'bg-primary-100 text-primary-900 dark:bg-primary-900 dark:text-primary-100',\n secondary:\n 'bg-neutral-100 text-neutral-900 dark:bg-neutral-800 dark:text-neutral-100',\n success:\n 'bg-green-100 text-green-900 dark:bg-green-900 dark:text-green-100',\n warning:\n 'bg-yellow-100 text-yellow-900 dark:bg-yellow-900 dark:text-yellow-100',\n danger: 'bg-red-100 text-red-900 dark:bg-red-900 dark:text-red-100',\n outline: 'border border-current bg-transparent',\n },\n size: {\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2.5 py-0.5 text-sm',\n lg: 'px-3 py-1 text-base',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n }\n);\n\nexport interface BadgeProps\n extends\n React.HTMLAttributes<HTMLSpanElement>,\n VariantProps<typeof badgeVariants> {\n /** Optional icon before the text */\n icon?: React.ReactNode;\n}\n\n/**\n * A badge component for displaying status, labels, or counts.\n *\n * @example\n * ```tsx\n * <Badge variant=\"success\">Active</Badge>\n * <Badge variant=\"warning\" size=\"sm\">Pending</Badge>\n * <Badge variant=\"danger\" icon={<AlertIcon />}>Error</Badge>\n * ```\n */\nconst Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n ({ className, variant, size, icon, children, ...props }, ref) => {\n return (\n <span\n ref={ref}\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant, size }), className)}\n {...props}\n >\n {icon && <span className=\"mr-1 shrink-0\">{icon}</span>}\n {children}\n </span>\n );\n }\n);\n\nBadge.displayName = 'Badge';\n\nexport { Badge, badgeVariants };\n"]}
@@ -8,10 +8,18 @@ Object.defineProperty(exports, "AlertCircle", {
8
8
  enumerable: true,
9
9
  get: function () { return lucideReact.AlertCircle; }
10
10
  });
11
+ Object.defineProperty(exports, "AlertTriangle", {
12
+ enumerable: true,
13
+ get: function () { return lucideReact.AlertTriangle; }
14
+ });
11
15
  Object.defineProperty(exports, "ArrowLeft", {
12
16
  enumerable: true,
13
17
  get: function () { return lucideReact.ArrowLeft; }
14
18
  });
19
+ Object.defineProperty(exports, "Ban", {
20
+ enumerable: true,
21
+ get: function () { return lucideReact.Ban; }
22
+ });
15
23
  Object.defineProperty(exports, "Bell", {
16
24
  enumerable: true,
17
25
  get: function () { return lucideReact.Bell; }
@@ -20,6 +28,10 @@ Object.defineProperty(exports, "Calendar", {
20
28
  enumerable: true,
21
29
  get: function () { return lucideReact.Calendar; }
22
30
  });
31
+ Object.defineProperty(exports, "CalendarCheck", {
32
+ enumerable: true,
33
+ get: function () { return lucideReact.CalendarCheck; }
34
+ });
23
35
  Object.defineProperty(exports, "Camera", {
24
36
  enumerable: true,
25
37
  get: function () { return lucideReact.Camera; }
@@ -36,6 +48,14 @@ Object.defineProperty(exports, "ChevronDown", {
36
48
  enumerable: true,
37
49
  get: function () { return lucideReact.ChevronDown; }
38
50
  });
51
+ Object.defineProperty(exports, "ChevronRight", {
52
+ enumerable: true,
53
+ get: function () { return lucideReact.ChevronRight; }
54
+ });
55
+ Object.defineProperty(exports, "ChevronUp", {
56
+ enumerable: true,
57
+ get: function () { return lucideReact.ChevronUp; }
58
+ });
39
59
  Object.defineProperty(exports, "ClipboardCheck", {
40
60
  enumerable: true,
41
61
  get: function () { return lucideReact.ClipboardCheck; }
@@ -84,14 +104,38 @@ Object.defineProperty(exports, "Globe", {
84
104
  enumerable: true,
85
105
  get: function () { return lucideReact.Globe; }
86
106
  });
107
+ Object.defineProperty(exports, "GripVertical", {
108
+ enumerable: true,
109
+ get: function () { return lucideReact.GripVertical; }
110
+ });
111
+ Object.defineProperty(exports, "HandMetal", {
112
+ enumerable: true,
113
+ get: function () { return lucideReact.HandMetal; }
114
+ });
87
115
  Object.defineProperty(exports, "HeartPulse", {
88
116
  enumerable: true,
89
117
  get: function () { return lucideReact.HeartPulse; }
90
118
  });
119
+ Object.defineProperty(exports, "HelpCircle", {
120
+ enumerable: true,
121
+ get: function () { return lucideReact.HelpCircle; }
122
+ });
123
+ Object.defineProperty(exports, "History", {
124
+ enumerable: true,
125
+ get: function () { return lucideReact.History; }
126
+ });
91
127
  Object.defineProperty(exports, "Image", {
92
128
  enumerable: true,
93
129
  get: function () { return lucideReact.Image; }
94
130
  });
131
+ Object.defineProperty(exports, "Info", {
132
+ enumerable: true,
133
+ get: function () { return lucideReact.Info; }
134
+ });
135
+ Object.defineProperty(exports, "Link", {
136
+ enumerable: true,
137
+ get: function () { return lucideReact.Link; }
138
+ });
95
139
  Object.defineProperty(exports, "Mail", {
96
140
  enumerable: true,
97
141
  get: function () { return lucideReact.Mail; }
@@ -152,6 +196,22 @@ Object.defineProperty(exports, "Stethoscope", {
152
196
  enumerable: true,
153
197
  get: function () { return lucideReact.Stethoscope; }
154
198
  });
199
+ Object.defineProperty(exports, "StickyNote", {
200
+ enumerable: true,
201
+ get: function () { return lucideReact.StickyNote; }
202
+ });
203
+ Object.defineProperty(exports, "TestTube2", {
204
+ enumerable: true,
205
+ get: function () { return lucideReact.TestTube2; }
206
+ });
207
+ Object.defineProperty(exports, "ThumbsDown", {
208
+ enumerable: true,
209
+ get: function () { return lucideReact.ThumbsDown; }
210
+ });
211
+ Object.defineProperty(exports, "ThumbsUp", {
212
+ enumerable: true,
213
+ get: function () { return lucideReact.ThumbsUp; }
214
+ });
155
215
  Object.defineProperty(exports, "Trash2", {
156
216
  enumerable: true,
157
217
  get: function () { return lucideReact.Trash2; }
@@ -176,5 +236,5 @@ Object.defineProperty(exports, "X", {
176
236
  enumerable: true,
177
237
  get: function () { return lucideReact.X; }
178
238
  });
179
- //# sourceMappingURL=chunk-4ZU53GNR.cjs.map
180
- //# sourceMappingURL=chunk-4ZU53GNR.cjs.map
239
+ //# sourceMappingURL=chunk-UTYUT5YY.cjs.map
240
+ //# sourceMappingURL=chunk-UTYUT5YY.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-UTYUT5YY.cjs","sourcesContent":[]}
@@ -178,5 +178,5 @@ function useScrollSpy({
178
178
  }
179
179
 
180
180
  export { useCommandK, useIsDesktop, useIsLargeDesktop, useIsMobile, useIsMobileOrTablet, useIsSmallTablet, useIsTablet, useKeyboardShortcut, useMediaQuery, useScrollSpy };
181
- //# sourceMappingURL=chunk-Q7NBJFEB.js.map
182
- //# sourceMappingURL=chunk-Q7NBJFEB.js.map
181
+ //# sourceMappingURL=chunk-UVQEHZRF.js.map
182
+ //# sourceMappingURL=chunk-UVQEHZRF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useKeyboardShortcut.ts","../src/hooks/useMediaQuery.ts","../src/hooks/useScrollSpy.ts"],"names":["useEffect","useState","entries"],"mappings":"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","file":"chunk-Q7NBJFEB.js","sourcesContent":["import { useEffect, useCallback } from 'react';\n\n/**\n * Options for keyboard shortcut hook\n */\nexport interface KeyboardShortcutOptions {\n /** Whether the shortcut is currently enabled (default: true) */\n enabled?: boolean;\n /** Modifier keys required (default: none) */\n modifiers?: {\n ctrl?: boolean;\n shift?: boolean;\n alt?: boolean;\n meta?: boolean;\n };\n /** Whether to prevent default browser behavior (default: true) */\n preventDefault?: boolean;\n /** Whether to stop event propagation (default: false) */\n stopPropagation?: boolean;\n /** Element types to ignore when the shortcut is pressed (default: ['INPUT', 'TEXTAREA', 'SELECT']) */\n ignoreInputs?: boolean;\n}\n\n/**\n * Hook that triggers a callback when a specific keyboard shortcut is pressed.\n * Supports modifier keys (Ctrl, Shift, Alt, Meta) and ignores input fields by default.\n *\n * @param key - The key to listen for (e.g., 'k', 'Enter', 'Escape', '/')\n * @param callback - Function to call when the shortcut is pressed\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * // Cmd/Ctrl+K to open search\n * useKeyboardShortcut('k', openSearch, { modifiers: { meta: true, ctrl: true } });\n *\n * // Forward slash to focus search (ignoring when typing)\n * useKeyboardShortcut('/', focusSearch);\n *\n * // Escape to close modal\n * useKeyboardShortcut('Escape', closeModal);\n * ```\n */\nexport function useKeyboardShortcut(\n key: string,\n callback: (event: KeyboardEvent) => void,\n options: KeyboardShortcutOptions = {}\n): void {\n const {\n enabled = true,\n modifiers = {},\n preventDefault = true,\n stopPropagation = false,\n ignoreInputs = true,\n } = options;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n // Check if we should ignore input fields\n if (ignoreInputs) {\n const target = event.target as HTMLElement;\n const tagName = target.tagName.toUpperCase();\n if (\n tagName === 'INPUT' ||\n tagName === 'TEXTAREA' ||\n tagName === 'SELECT' ||\n target.isContentEditable\n ) {\n return;\n }\n }\n\n // Check modifiers\n const { ctrl, shift, alt, meta } = modifiers;\n\n // For Cmd+K style shortcuts, allow either meta (Mac) or ctrl (Windows/Linux)\n const metaOrCtrl = meta || ctrl;\n if (metaOrCtrl) {\n if (!(event.metaKey || event.ctrlKey)) return;\n } else {\n // If no meta/ctrl modifier specified, ensure neither is pressed\n if (event.metaKey || event.ctrlKey) return;\n }\n\n if (shift && !event.shiftKey) return;\n if (alt && !event.altKey) return;\n\n // Check key match (case-insensitive for letters)\n const eventKey =\n event.key.length === 1 ? event.key.toLowerCase() : event.key;\n const targetKey = key.length === 1 ? key.toLowerCase() : key;\n if (eventKey !== targetKey) return;\n\n if (preventDefault) {\n event.preventDefault();\n }\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n callback(event);\n },\n [key, callback, modifiers, preventDefault, stopPropagation, ignoreInputs]\n );\n\n useEffect(() => {\n if (!enabled) return;\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown, enabled]);\n}\n\n/**\n * Hook for the common Cmd/Ctrl+K shortcut pattern (command palette, search, etc.)\n *\n * @param callback - Function to call when Cmd/Ctrl+K is pressed\n * @param enabled - Whether the shortcut is active (default: true)\n *\n * @example\n * ```tsx\n * useCommandK(() => setIsOpen(true));\n * ```\n */\nexport function useCommandK(callback: () => void, enabled = true): void {\n useKeyboardShortcut('k', callback, {\n enabled,\n modifiers: { meta: true, ctrl: true },\n ignoreInputs: false, // Cmd+K should work even in inputs\n });\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Hook that tracks whether a media query matches.\n * Uses the native `matchMedia` API for efficient media query tracking.\n *\n * @param query - CSS media query string (e.g., '(min-width: 768px)')\n * @returns Boolean indicating whether the media query matches\n *\n * @example\n * ```tsx\n * function ResponsiveComponent() {\n * const isMobile = useMediaQuery('(max-width: 767px)');\n * const isTablet = useMediaQuery('(min-width: 768px) and (max-width: 1023px)');\n * const isDesktop = useMediaQuery('(min-width: 1024px)');\n *\n * return (\n * <div>\n * {isMobile && <MobileLayout />}\n * {isTablet && <TabletLayout />}\n * {isDesktop && <DesktopLayout />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useMediaQuery(query: string): boolean {\n // Initialize with null to indicate SSR/initial state\n const [matches, setMatches] = useState<boolean>(() => {\n // Check if we're in a browser environment\n if (typeof window === 'undefined') return false;\n return window.matchMedia(query).matches;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia(query);\n\n // Set initial value\n setMatches(mediaQuery.matches);\n\n // Handler for media query changes\n const handler = (event: MediaQueryListEvent) => {\n setMatches(event.matches);\n };\n\n // Modern browsers use addEventListener\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n }\n\n // Fallback for older browsers\n mediaQuery.addListener(handler);\n return () => mediaQuery.removeListener(handler);\n }, [query]);\n\n return matches;\n}\n\n/**\n * Preset breakpoint hooks following common responsive design patterns\n */\n\n/** Returns true when viewport is smaller than 640px (mobile) */\nexport function useIsMobile(): boolean {\n return useMediaQuery('(max-width: 639px)');\n}\n\n/** Returns true when viewport is 640px-767px (large mobile / small tablet) */\nexport function useIsSmallTablet(): boolean {\n return useMediaQuery('(min-width: 640px) and (max-width: 767px)');\n}\n\n/** Returns true when viewport is 768px-1023px (tablet) */\nexport function useIsTablet(): boolean {\n return useMediaQuery('(min-width: 768px) and (max-width: 1023px)');\n}\n\n/** Returns true when viewport is 1024px or larger (desktop) */\nexport function useIsDesktop(): boolean {\n return useMediaQuery('(min-width: 1024px)');\n}\n\n/** Returns true when viewport is 1280px or larger (large desktop) */\nexport function useIsLargeDesktop(): boolean {\n return useMediaQuery('(min-width: 1280px)');\n}\n\n/** Returns true when viewport is smaller than 1024px (mobile/tablet) */\nexport function useIsMobileOrTablet(): boolean {\n return useMediaQuery('(max-width: 1023px)');\n}\n","import { useEffect, useState, useRef, type RefObject } from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseScrollSpyOptions {\n /** CSS selector for the elements to observe (e.g. 'h2, h3, h4') */\n selectors?: string;\n /** Explicit list of element IDs to observe (alternative to selectors) */\n ids?: string[];\n /** IntersectionObserver root margin (default: '0px 0px -60% 0px') */\n rootMargin?: string;\n /** IntersectionObserver threshold (default: 0) */\n threshold?: number | number[];\n /** Scroll container element ref. Defaults to document viewport. */\n root?: RefObject<HTMLElement | null>;\n /** Whether the hook is active (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseScrollSpyReturn {\n /** The ID of the currently active (in-view) element */\n activeId: string | null;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\n/**\n * Tracks which section is currently in the viewport using IntersectionObserver.\n * Pairs naturally with `TableOfContents` to highlight the active heading.\n *\n * @example\n * ```tsx\n * function DocsPage() {\n * const { activeId } = useScrollSpy({ selectors: 'h2, h3' });\n * return (\n * <aside>\n * <TableOfContents activeId={activeId} />\n * </aside>\n * );\n * }\n * ```\n */\nexport function useScrollSpy({\n selectors,\n ids,\n rootMargin = '0px 0px -60% 0px',\n threshold = 0,\n root,\n enabled = true,\n}: UseScrollSpyOptions = {}): UseScrollSpyReturn {\n const [activeId, setActiveId] = useState<string | null>(null);\n const visibleEntries = useRef<Map<string, IntersectionObserverEntry>>(\n new Map()\n );\n\n // Track root.current so the effect re-runs when the ref attaches\n const rootEl = root?.current ?? null;\n\n useEffect(() => {\n if (!enabled) return;\n\n const container = rootEl ?? document;\n\n // Resolve target elements from the DOM\n function resolveElements(): Element[] {\n let els: Element[] = [];\n if (ids && ids.length > 0) {\n els = ids\n .map((id) => document.getElementById(id))\n .filter((el): el is HTMLElement => el !== null);\n } else if (selectors) {\n els = Array.from(container.querySelectorAll(selectors));\n }\n return els.filter((el) => el.id);\n }\n\n let intersectionObserver: IntersectionObserver | null = null;\n let mutationObserver: MutationObserver | null = null;\n\n function startObserving(): boolean {\n const elements = resolveElements();\n if (elements.length === 0) return false;\n\n intersectionObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n visibleEntries.current.set(entry.target.id, entry);\n } else {\n visibleEntries.current.delete(entry.target.id);\n }\n }\n\n // Pick the topmost visible heading (by DOM order)\n if (visibleEntries.current.size > 0) {\n let topmost: string | null = null;\n let topmostTop = Infinity;\n\n for (const [id, entry] of visibleEntries.current) {\n const top = entry.boundingClientRect.top;\n if (top < topmostTop) {\n topmostTop = top;\n topmost = id;\n }\n }\n\n if (topmost) {\n setActiveId(topmost);\n }\n }\n },\n {\n root: rootEl,\n rootMargin,\n threshold,\n }\n );\n\n for (const el of elements) {\n intersectionObserver.observe(el);\n }\n\n // Elements found — stop watching for new DOM nodes\n mutationObserver?.disconnect();\n mutationObserver = null;\n return true;\n }\n\n // If target elements don't exist yet (e.g. headings mount after ToC),\n // watch for DOM changes and retry until they appear.\n if (!startObserving()) {\n const watchRoot = rootEl ?? document.body;\n mutationObserver = new MutationObserver(() => {\n startObserving();\n });\n mutationObserver.observe(watchRoot, { childList: true, subtree: true });\n }\n\n const entries = visibleEntries.current;\n return () => {\n mutationObserver?.disconnect();\n intersectionObserver?.disconnect();\n entries.clear();\n };\n }, [selectors, ids, rootMargin, threshold, rootEl, enabled]);\n\n return { activeId };\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/useKeyboardShortcut.ts","../src/hooks/useMediaQuery.ts","../src/hooks/useScrollSpy.ts"],"names":["useEffect","useState","entries"],"mappings":"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","file":"chunk-UVQEHZRF.js","sourcesContent":["import { useEffect, useCallback } from 'react';\n\n/**\n * Options for keyboard shortcut hook\n */\nexport interface KeyboardShortcutOptions {\n /** Whether the shortcut is currently enabled (default: true) */\n enabled?: boolean;\n /** Modifier keys required (default: none) */\n modifiers?: {\n ctrl?: boolean;\n shift?: boolean;\n alt?: boolean;\n meta?: boolean;\n };\n /** Whether to prevent default browser behavior (default: true) */\n preventDefault?: boolean;\n /** Whether to stop event propagation (default: false) */\n stopPropagation?: boolean;\n /** Element types to ignore when the shortcut is pressed (default: ['INPUT', 'TEXTAREA', 'SELECT']) */\n ignoreInputs?: boolean;\n}\n\n/**\n * Hook that triggers a callback when a specific keyboard shortcut is pressed.\n * Supports modifier keys (Ctrl, Shift, Alt, Meta) and ignores input fields by default.\n *\n * @param key - The key to listen for (e.g., 'k', 'Enter', 'Escape', '/')\n * @param callback - Function to call when the shortcut is pressed\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * // Cmd/Ctrl+K to open search\n * useKeyboardShortcut('k', openSearch, { modifiers: { meta: true, ctrl: true } });\n *\n * // Forward slash to focus search (ignoring when typing)\n * useKeyboardShortcut('/', focusSearch);\n *\n * // Escape to close modal\n * useKeyboardShortcut('Escape', closeModal);\n * ```\n */\nexport function useKeyboardShortcut(\n key: string,\n callback: (event: KeyboardEvent) => void,\n options: KeyboardShortcutOptions = {}\n): void {\n const {\n enabled = true,\n modifiers = {},\n preventDefault = true,\n stopPropagation = false,\n ignoreInputs = true,\n } = options;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n // Check if we should ignore input fields\n if (ignoreInputs) {\n const target = event.target as HTMLElement;\n const tagName = target.tagName.toUpperCase();\n if (\n tagName === 'INPUT' ||\n tagName === 'TEXTAREA' ||\n tagName === 'SELECT' ||\n target.isContentEditable\n ) {\n return;\n }\n }\n\n // Check modifiers\n const { ctrl, shift, alt, meta } = modifiers;\n\n // For Cmd+K style shortcuts, allow either meta (Mac) or ctrl (Windows/Linux)\n const metaOrCtrl = meta || ctrl;\n if (metaOrCtrl) {\n if (!(event.metaKey || event.ctrlKey)) return;\n } else {\n // If no meta/ctrl modifier specified, ensure neither is pressed\n if (event.metaKey || event.ctrlKey) return;\n }\n\n if (shift && !event.shiftKey) return;\n if (alt && !event.altKey) return;\n\n // Check key match (case-insensitive for letters)\n const eventKey =\n event.key.length === 1 ? event.key.toLowerCase() : event.key;\n const targetKey = key.length === 1 ? key.toLowerCase() : key;\n if (eventKey !== targetKey) return;\n\n if (preventDefault) {\n event.preventDefault();\n }\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n callback(event);\n },\n [key, callback, modifiers, preventDefault, stopPropagation, ignoreInputs]\n );\n\n useEffect(() => {\n if (!enabled) return;\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown, enabled]);\n}\n\n/**\n * Hook for the common Cmd/Ctrl+K shortcut pattern (command palette, search, etc.)\n *\n * @param callback - Function to call when Cmd/Ctrl+K is pressed\n * @param enabled - Whether the shortcut is active (default: true)\n *\n * @example\n * ```tsx\n * useCommandK(() => setIsOpen(true));\n * ```\n */\nexport function useCommandK(callback: () => void, enabled = true): void {\n useKeyboardShortcut('k', callback, {\n enabled,\n modifiers: { meta: true, ctrl: true },\n ignoreInputs: false, // Cmd+K should work even in inputs\n });\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Hook that tracks whether a media query matches.\n * Uses the native `matchMedia` API for efficient media query tracking.\n *\n * @param query - CSS media query string (e.g., '(min-width: 768px)')\n * @returns Boolean indicating whether the media query matches\n *\n * @example\n * ```tsx\n * function ResponsiveComponent() {\n * const isMobile = useMediaQuery('(max-width: 767px)');\n * const isTablet = useMediaQuery('(min-width: 768px) and (max-width: 1023px)');\n * const isDesktop = useMediaQuery('(min-width: 1024px)');\n *\n * return (\n * <div>\n * {isMobile && <MobileLayout />}\n * {isTablet && <TabletLayout />}\n * {isDesktop && <DesktopLayout />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useMediaQuery(query: string): boolean {\n // Initialize with null to indicate SSR/initial state\n const [matches, setMatches] = useState<boolean>(() => {\n // Check if we're in a browser environment\n if (typeof window === 'undefined') return false;\n return window.matchMedia(query).matches;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia(query);\n\n // Set initial value\n setMatches(mediaQuery.matches);\n\n // Handler for media query changes\n const handler = (event: MediaQueryListEvent) => {\n setMatches(event.matches);\n };\n\n // Modern browsers use addEventListener\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n }\n\n // Fallback for older browsers\n mediaQuery.addListener(handler);\n return () => mediaQuery.removeListener(handler);\n }, [query]);\n\n return matches;\n}\n\n/**\n * Preset breakpoint hooks following common responsive design patterns\n */\n\n/** Returns true when viewport is smaller than 640px (mobile) */\nexport function useIsMobile(): boolean {\n return useMediaQuery('(max-width: 639px)');\n}\n\n/** Returns true when viewport is 640px-767px (large mobile / small tablet) */\nexport function useIsSmallTablet(): boolean {\n return useMediaQuery('(min-width: 640px) and (max-width: 767px)');\n}\n\n/** Returns true when viewport is 768px-1023px (tablet) */\nexport function useIsTablet(): boolean {\n return useMediaQuery('(min-width: 768px) and (max-width: 1023px)');\n}\n\n/** Returns true when viewport is 1024px or larger (desktop) */\nexport function useIsDesktop(): boolean {\n return useMediaQuery('(min-width: 1024px)');\n}\n\n/** Returns true when viewport is 1280px or larger (large desktop) */\nexport function useIsLargeDesktop(): boolean {\n return useMediaQuery('(min-width: 1280px)');\n}\n\n/** Returns true when viewport is smaller than 1024px (mobile/tablet) */\nexport function useIsMobileOrTablet(): boolean {\n return useMediaQuery('(max-width: 1023px)');\n}\n","import { useEffect, useState, useRef, type RefObject } from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseScrollSpyOptions {\n /** CSS selector for the elements to observe (e.g. 'h2, h3, h4') */\n selectors?: string;\n /** Explicit list of element IDs to observe (alternative to selectors) */\n ids?: string[];\n /** IntersectionObserver root margin (default: '0px 0px -60% 0px') */\n rootMargin?: string;\n /** IntersectionObserver threshold (default: 0) */\n threshold?: number | number[];\n /** Scroll container element ref. Defaults to document viewport. */\n root?: RefObject<HTMLElement | null>;\n /** Whether the hook is active (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseScrollSpyReturn {\n /** The ID of the currently active (in-view) element */\n activeId: string | null;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\n/**\n * Tracks which section is currently in the viewport using IntersectionObserver.\n * Pairs naturally with `TableOfContents` to highlight the active heading.\n *\n * @example\n * ```tsx\n * function DocsPage() {\n * const { activeId } = useScrollSpy({ selectors: 'h2, h3' });\n * return (\n * <aside>\n * <TableOfContents activeId={activeId} />\n * </aside>\n * );\n * }\n * ```\n */\nexport function useScrollSpy({\n selectors,\n ids,\n rootMargin = '0px 0px -60% 0px',\n threshold = 0,\n root,\n enabled = true,\n}: UseScrollSpyOptions = {}): UseScrollSpyReturn {\n const [activeId, setActiveId] = useState<string | null>(null);\n const visibleEntries = useRef<Map<string, IntersectionObserverEntry>>(\n new Map()\n );\n\n // Track root.current so the effect re-runs when the ref attaches\n const rootEl = root?.current ?? null;\n\n useEffect(() => {\n if (!enabled) return;\n\n const container = rootEl ?? document;\n\n // Resolve target elements from the DOM\n function resolveElements(): Element[] {\n let els: Element[] = [];\n if (ids && ids.length > 0) {\n els = ids\n .map((id) => document.getElementById(id))\n .filter((el): el is HTMLElement => el !== null);\n } else if (selectors) {\n els = Array.from(container.querySelectorAll(selectors));\n }\n return els.filter((el) => el.id);\n }\n\n let intersectionObserver: IntersectionObserver | null = null;\n let mutationObserver: MutationObserver | null = null;\n\n function startObserving(): boolean {\n const elements = resolveElements();\n if (elements.length === 0) return false;\n\n intersectionObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n visibleEntries.current.set(entry.target.id, entry);\n } else {\n visibleEntries.current.delete(entry.target.id);\n }\n }\n\n // Pick the topmost visible heading (by DOM order)\n if (visibleEntries.current.size > 0) {\n let topmost: string | null = null;\n let topmostTop = Infinity;\n\n for (const [id, entry] of visibleEntries.current) {\n const top = entry.boundingClientRect.top;\n if (top < topmostTop) {\n topmostTop = top;\n topmost = id;\n }\n }\n\n if (topmost) {\n setActiveId(topmost);\n }\n }\n },\n {\n root: rootEl,\n rootMargin,\n threshold,\n }\n );\n\n for (const el of elements) {\n intersectionObserver.observe(el);\n }\n\n // Elements found — stop watching for new DOM nodes\n mutationObserver?.disconnect();\n mutationObserver = null;\n return true;\n }\n\n // If target elements don't exist yet (e.g. headings mount after ToC),\n // watch for DOM changes and retry until they appear.\n if (!startObserving()) {\n const watchRoot = rootEl ?? document.body;\n mutationObserver = new MutationObserver(() => {\n startObserving();\n });\n mutationObserver.observe(watchRoot, { childList: true, subtree: true });\n }\n\n const entries = visibleEntries.current;\n return () => {\n mutationObserver?.disconnect();\n intersectionObserver?.disconnect();\n entries.clear();\n };\n }, [selectors, ids, rootMargin, threshold, rootEl, enabled]);\n\n return { activeId };\n}\n"]}
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=chunk-VBWRH4UW.cjs.map
4
+ //# sourceMappingURL=chunk-VBWRH4UW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-VBWRH4UW.cjs"}
@@ -341,7 +341,7 @@ function DataVisNitroGraphInner({
341
341
  () => buildResolvedColumns2(columns, fallbackFields, normalizedTypeInfo),
342
342
  [columns, fallbackFields, normalizedTypeInfo]
343
343
  );
344
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: height ? { height } : void 0, children: /* @__PURE__ */ jsxRuntime.jsx(
344
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "wcdv-graph", style: height ? { height } : void 0, children: /* @__PURE__ */ jsxRuntime.jsx(
345
345
  datavis.GraphView,
346
346
  {
347
347
  viewData: viewState.data,
@@ -366,5 +366,5 @@ exports.DataVisNitroContext = DataVisNitroContext;
366
366
  exports.DataVisNitroGraph = DataVisNitroGraph;
367
367
  exports.DataVisNitroGrid = DataVisNitroGrid;
368
368
  exports.DataVisNitroSource = DataVisNitroSource;
369
- //# sourceMappingURL=chunk-WJIANZPI.cjs.map
370
- //# sourceMappingURL=chunk-WJIANZPI.cjs.map
369
+ //# sourceMappingURL=chunk-VJOVJTFP.cjs.map
370
+ //# sourceMappingURL=chunk-VJOVJTFP.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/DataVisNITRO/DataVisNITRO.tsx","../src/components/DataVisNITRO/DataVisNitroGraph.tsx"],"names":["createContext","determineColumns","useRef","Source","ComputedView","useView","useMemo","buildAggregateFunctions","getBuiltinGroupFunctions","jsx","DataGrid","TableRenderer","useContext","isObject","normalizeTypeInfo","normalizeFieldType","buildColumnFromField","buildResolvedColumns","buildFallbackFieldOrder","useState","useCallback","GraphView"],"mappings":"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","file":"chunk-VJOVJTFP.cjs","sourcesContent":["import React, { createContext, useContext, useMemo, useRef } from 'react';\nimport { ComputedView, Source } from 'datavis-ace';\n\nimport {\n DataGrid,\n determineColumns,\n getBuiltinGroupFunctions,\n buildAggregateFunctions,\n useView,\n TableRenderer,\n type DataGridProps,\n type GridTableDef,\n type ViewInstance,\n type TableRendererProps,\n type TableColumn,\n type TableFeatures,\n type ColumnFilterConfig,\n type AggregateFunction,\n type GroupFunctionDef,\n} from '@mieweb/datavis';\n\ntype TranslateFn = (key: string, ...args: unknown[]) => string;\n\ntype DataVisNitroSourceType = 'http' | 'local' | 'file';\n\ninterface HttpDataVisNitroSourceProps {\n type: 'http';\n url: string;\n children?: React.ReactNode;\n}\n\ninterface LocalDataVisNitroSourceProps {\n type: 'local';\n varName?: string;\n children?: React.ReactNode;\n}\n\ninterface FileDataVisNitroSourceProps {\n type: 'file';\n children?: React.ReactNode;\n}\n\nexport type DataVisNitroSourceProps =\n | HttpDataVisNitroSourceProps\n | LocalDataVisNitroSourceProps\n | FileDataVisNitroSourceProps;\n\ntype TrackedViewInstance = ViewInstance & {\n _dvType: DataVisNitroSourceType;\n _dvUrl: string | undefined;\n};\n\ntype DataVisTypeInfoEntry = {\n type?: string;\n displayText?: string;\n format?: string | Record<string, unknown>;\n internalType?: string;\n};\n\ntype DataVisTypeInfoMap = Record<string, DataVisTypeInfoEntry>;\n\ntype DataVisTypeInfoOrdMap = {\n keys?: () => string[];\n get?: (key: string) => DataVisTypeInfoEntry | undefined;\n};\n\nexport type DataVisNitroColumn = string | TableColumn;\n\nexport interface DataVisNitroGridProps\n extends\n Omit<DataGridProps, 'view' | 'children' | 'allColumns'>,\n Pick<\n TableRendererProps,\n | 'formatCell'\n | 'onColumnReorder'\n | 'onColumnResize'\n | 'onHeaderContextMenu'\n | 'onRowClick'\n | 'onRowDoubleClick'\n | 'onSelectionChange'\n > {\n columns?: DataVisNitroColumn[];\n allColumns?: TableColumn[];\n features?: TableFeatures;\n filterColumns?: ColumnFilterConfig[];\n aggregateFunctions?: AggregateFunction[];\n groupFunctionDefs?: GroupFunctionDef[];\n style?: React.CSSProperties;\n trans?: TranslateFn;\n}\n\nexport const DataVisNitroContext = createContext<ViewInstance | null>(null);\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction normalizeTypeInfo(typeInfo: unknown): DataVisTypeInfoMap {\n if (Array.isArray(typeInfo)) {\n return Object.fromEntries(\n typeInfo.filter(isObject).map((entry) => [entry.field, entry])\n ) as DataVisTypeInfoMap;\n }\n\n if (!isObject(typeInfo)) {\n return {};\n }\n\n const maybeOrdMap = typeInfo as DataVisTypeInfoOrdMap;\n if (\n typeof maybeOrdMap.keys === 'function' &&\n typeof maybeOrdMap.get === 'function'\n ) {\n return Object.fromEntries(\n maybeOrdMap.keys().map((field) => [field, maybeOrdMap.get?.(field) ?? {}])\n );\n }\n\n return Object.fromEntries(\n Object.entries(typeInfo).filter(([, value]) => isObject(value))\n ) as DataVisTypeInfoMap;\n}\n\nfunction normalizeFieldType(type: string | undefined): string | undefined {\n if (!type) return undefined;\n if (type === 'integer') return 'number';\n if (type === 'boolean') return 'string';\n return type;\n}\n\nfunction buildColumnFromField(\n field: string,\n typeInfo: DataVisTypeInfoMap\n): TableColumn {\n const info = typeInfo[field];\n const normalizedType = normalizeFieldType(info?.type);\n\n return {\n field,\n header: info?.displayText ?? field,\n sortable: true,\n filterable: true,\n resizable: true,\n reorderable: true,\n ...(normalizedType\n ? {\n typeInfo: {\n type: normalizedType,\n ...(info?.format !== undefined ? { format: info.format } : {}),\n ...(info?.internalType !== undefined\n ? { internalType: info.internalType }\n : {}),\n },\n }\n : {}),\n };\n}\n\nfunction mergeColumnWithTypeInfo(\n column: TableColumn,\n typeInfo: DataVisTypeInfoMap\n): TableColumn {\n const fallbackColumn = buildColumnFromField(column.field, typeInfo);\n return {\n ...fallbackColumn,\n ...column,\n header: column.header ?? fallbackColumn.header,\n typeInfo: column.typeInfo ?? fallbackColumn.typeInfo,\n };\n}\n\nfunction buildResolvedColumns(\n columns: DataVisNitroColumn[] | undefined,\n fallbackFields: string[],\n typeInfo: DataVisTypeInfoMap\n): TableColumn[] {\n if (columns && columns.length > 0) {\n return columns.map((column) => {\n if (typeof column === 'string') {\n return buildColumnFromField(column, typeInfo);\n }\n\n return mergeColumnWithTypeInfo(column, typeInfo);\n });\n }\n\n return fallbackFields.map((field) => buildColumnFromField(field, typeInfo));\n}\n\nfunction buildFallbackFieldOrder(\n typeInfo: DataVisTypeInfoMap,\n data: unknown[] | null\n): string[] {\n const rows = Array.isArray(data)\n ? data.filter((row): row is Record<string, unknown> => isObject(row))\n : null;\n\n const normalizedEntries = Object.fromEntries(\n Object.entries(typeInfo).map(([field, info]) => [\n field,\n {\n type: normalizeFieldType(info.type) ?? 'string',\n ...(info.displayText !== undefined\n ? { displayText: info.displayText }\n : {}),\n },\n ])\n );\n\n return determineColumns(null, normalizedEntries, rows);\n}\n\nfunction buildControlFields(\n columns: TableColumn[]\n): NonNullable<DataGridProps['controlFields']> {\n return columns.map((column) => ({\n field: column.field,\n displayName: column.header,\n type: column.typeInfo?.type,\n }));\n}\n\nfunction buildAggregateFields(\n columns: TableColumn[]\n): NonNullable<DataGridProps['aggregateFields']> {\n return columns.map((column) => ({\n field: column.field,\n displayName: column.header,\n }));\n}\n\nfunction mergeTableDef(\n tableDef: GridTableDef | undefined,\n features: TableFeatures | undefined\n): GridTableDef | undefined {\n if (!tableDef && !features) {\n return undefined;\n }\n\n const { rowMode, ...featureFlags } = features ?? {};\n const mergedFeatures =\n Object.keys(featureFlags).length > 0\n ? ({\n ...(tableDef?.features ?? {}),\n ...featureFlags,\n } as GridTableDef['features'])\n : undefined;\n\n return {\n ...tableDef,\n ...(rowMode !== undefined ? { rowMode } : {}),\n ...(mergedFeatures ? { features: mergedFeatures } : {}),\n };\n}\n\nfunction DataVisNitroSource(props: DataVisNitroSourceProps) {\n const { type, children } = props;\n const url = props.type === 'http' ? props.url : undefined;\n const varName = props.type === 'local' ? props.varName : undefined;\n const viewRef = useRef<TrackedViewInstance | null>(null);\n\n if (\n viewRef.current === null ||\n viewRef.current._dvType !== type ||\n viewRef.current._dvUrl !== url ||\n (viewRef.current as TrackedViewInstance & { _dvVarName?: string })\n ._dvVarName !== varName\n ) {\n const source =\n props.type === 'http'\n ? new Source({ type, url: props.url })\n : new Source(\n props.type === 'local' && props.varName\n ? { type, varName: props.varName }\n : { type }\n );\n\n viewRef.current = Object.assign(\n new ComputedView(source) as unknown as ViewInstance,\n { _dvType: type, _dvUrl: url, _dvVarName: varName }\n );\n }\n\n return (\n <DataVisNitroContext.Provider value={viewRef.current}>\n {children}\n </DataVisNitroContext.Provider>\n );\n}\n\nfunction DataVisNitroGridInner({\n computedView,\n columns,\n allColumns,\n features,\n filterColumns,\n controlFields,\n aggregateFields,\n aggregateFunctions,\n groupFunctionDefs,\n tableDef,\n formatCell,\n onColumnReorder,\n onColumnResize,\n onHeaderContextMenu,\n onRowClick,\n onRowDoubleClick,\n onSelectionChange,\n style,\n trans,\n ...dataGridProps\n}: DataVisNitroGridProps & { computedView: ViewInstance }) {\n const viewState = useView(computedView, false);\n\n const normalizedTypeInfo = useMemo(\n () =>\n normalizeTypeInfo(viewState.typeInfo ?? computedView?.typeInfo ?? null),\n [computedView, viewState.typeInfo]\n );\n\n const fallbackFields = useMemo(\n () =>\n buildFallbackFieldOrder(normalizedTypeInfo, viewState.data?.data ?? null),\n [normalizedTypeInfo, viewState.data?.data]\n );\n\n const resolvedAllColumns = useMemo(() => {\n if (allColumns && allColumns.length > 0) {\n return allColumns.map((column) =>\n mergeColumnWithTypeInfo(column, normalizedTypeInfo)\n );\n }\n\n return buildResolvedColumns(columns, fallbackFields, normalizedTypeInfo);\n }, [allColumns, columns, fallbackFields, normalizedTypeInfo]);\n\n const resolvedColumns = useMemo(() => {\n if (columns && columns.length > 0) {\n return buildResolvedColumns(\n columns,\n fallbackFields,\n normalizedTypeInfo\n ).filter((column) => column.visible !== false);\n }\n\n return resolvedAllColumns.filter((column) => column.visible !== false);\n }, [columns, fallbackFields, normalizedTypeInfo, resolvedAllColumns]);\n\n const effectiveAggregateFunctions = useMemo(\n () => aggregateFunctions ?? buildAggregateFunctions(),\n [aggregateFunctions]\n );\n\n const effectiveGroupFunctionDefs = useMemo(\n () =>\n groupFunctionDefs ??\n getBuiltinGroupFunctions(trans as TranslateFn | undefined),\n [groupFunctionDefs, trans]\n );\n\n const effectiveTableDef = useMemo(\n () => mergeTableDef(tableDef, features),\n [tableDef, features]\n );\n\n const aggFnLabels = useMemo(\n () =>\n Object.fromEntries(\n effectiveAggregateFunctions.map((fn) => [fn.name, fn.label])\n ),\n [effectiveAggregateFunctions]\n );\n\n return (\n <div style={style}>\n <DataGrid\n {...dataGridProps}\n view={computedView}\n tableDef={effectiveTableDef}\n allColumns={resolvedAllColumns}\n filterColumns={filterColumns ?? []}\n controlFields={controlFields ?? buildControlFields(resolvedAllColumns)}\n aggregateFields={\n aggregateFields ?? buildAggregateFields(resolvedAllColumns)\n }\n aggregateFunctions={effectiveAggregateFunctions}\n groupFunctionDefs={effectiveGroupFunctionDefs}\n >\n <TableRenderer\n viewData={viewState.data}\n columns={resolvedColumns}\n features={\n (effectiveTableDef?.features as TableFeatures | undefined) ??\n features\n }\n totalRows={viewState.totalRowCount ?? viewState.rowCount}\n loading={viewState.loading || !viewState.ready}\n formatCell={formatCell}\n aggFnLabels={aggFnLabels}\n onColumnReorder={onColumnReorder}\n onColumnResize={onColumnResize}\n onHeaderContextMenu={onHeaderContextMenu}\n onRowClick={onRowClick}\n onRowDoubleClick={onRowDoubleClick}\n onSelectionChange={onSelectionChange}\n />\n </DataGrid>\n </div>\n );\n}\n\nfunction DataVisNitroGrid(props: DataVisNitroGridProps) {\n const computedView = useContext(DataVisNitroContext);\n\n if (computedView === null) {\n return null;\n }\n\n return <DataVisNitroGridInner {...props} computedView={computedView} />;\n}\n\nDataVisNitroSource.displayName = 'DataVisNitroSource';\nDataVisNitroGrid.displayName = 'DataVisNitroGrid';\n\nexport { DataVisNitroGrid, DataVisNitroSource };\n","import React, { useCallback, useContext, useMemo, useState } from 'react';\n\nimport {\n GraphView,\n determineColumns,\n useView,\n type GraphConfig,\n type TableColumn,\n type ViewInstance,\n} from '@mieweb/datavis';\n\nimport { DataVisNitroContext } from './DataVisNITRO';\nimport type { DataVisNitroColumn } from './DataVisNITRO';\n\ntype DataVisTypeInfoEntry = {\n type?: string;\n displayText?: string;\n format?: string | Record<string, unknown>;\n internalType?: string;\n};\n\ntype DataVisTypeInfoMap = Record<string, DataVisTypeInfoEntry>;\n\ntype DataVisTypeInfoOrdMap = {\n keys?: () => string[];\n get?: (key: string) => DataVisTypeInfoEntry | undefined;\n};\n\nexport interface DataVisNitroGraphProps {\n /** Column definitions or field names to include in the graph. */\n columns?: DataVisNitroColumn[];\n /** Initial graph configuration (chart type, axes, etc.). */\n config?: Partial<GraphConfig>;\n /** Locale for formatting. */\n locale?: string;\n /** Additional CSS class name. */\n className?: string;\n /** CSS height for the container. */\n height?: string;\n /** Callback when the user changes graph configuration. */\n onConfigChange?: (config: GraphConfig) => void;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction normalizeTypeInfo(typeInfo: unknown): DataVisTypeInfoMap {\n if (Array.isArray(typeInfo)) {\n return Object.fromEntries(\n typeInfo.filter(isObject).map((entry) => [entry.field, entry])\n ) as DataVisTypeInfoMap;\n }\n\n if (!isObject(typeInfo)) {\n return {};\n }\n\n const maybeOrdMap = typeInfo as DataVisTypeInfoOrdMap;\n if (\n typeof maybeOrdMap.keys === 'function' &&\n typeof maybeOrdMap.get === 'function'\n ) {\n return Object.fromEntries(\n maybeOrdMap.keys().map((field) => [field, maybeOrdMap.get?.(field) ?? {}])\n );\n }\n\n return Object.fromEntries(\n Object.entries(typeInfo).filter(([, value]) => isObject(value))\n ) as DataVisTypeInfoMap;\n}\n\nfunction normalizeFieldType(type: string | undefined): string | undefined {\n if (!type) return undefined;\n if (type === 'integer') return 'number';\n if (type === 'boolean') return 'string';\n return type;\n}\n\nfunction buildColumnFromField(\n field: string,\n typeInfo: DataVisTypeInfoMap\n): TableColumn {\n const info = typeInfo[field];\n const normalizedType = normalizeFieldType(info?.type);\n\n return {\n field,\n header: info?.displayText ?? field,\n sortable: true,\n filterable: true,\n resizable: true,\n reorderable: true,\n ...(normalizedType\n ? {\n typeInfo: {\n type: normalizedType,\n ...(info?.format !== undefined ? { format: info.format } : {}),\n ...(info?.internalType !== undefined\n ? { internalType: info.internalType }\n : {}),\n },\n }\n : {}),\n };\n}\n\nfunction buildResolvedColumns(\n columns: DataVisNitroColumn[] | undefined,\n fallbackFields: string[],\n typeInfo: DataVisTypeInfoMap\n): TableColumn[] {\n if (columns && columns.length > 0) {\n return columns.map((column) => {\n if (typeof column === 'string') {\n return buildColumnFromField(column, typeInfo);\n }\n return column;\n });\n }\n\n return fallbackFields.map((field) => buildColumnFromField(field, typeInfo));\n}\n\nfunction buildFallbackFieldOrder(\n typeInfo: DataVisTypeInfoMap,\n data: unknown[] | null\n): string[] {\n const rows = Array.isArray(data)\n ? data.filter((row): row is Record<string, unknown> => isObject(row))\n : null;\n\n const normalizedEntries = Object.fromEntries(\n Object.entries(typeInfo).map(([field, info]) => [\n field,\n {\n type: normalizeFieldType(info.type) ?? 'string',\n ...(info.displayText !== undefined\n ? { displayText: info.displayText }\n : {}),\n },\n ])\n );\n\n return determineColumns(null, normalizedEntries, rows);\n}\n\nfunction DataVisNitroGraphInner({\n computedView,\n columns,\n config: initialConfig,\n locale,\n className,\n height,\n onConfigChange,\n}: DataVisNitroGraphProps & { computedView: ViewInstance }) {\n const viewState = useView(computedView);\n const [liveConfig, setLiveConfig] = useState<\n Partial<GraphConfig> | undefined\n >(initialConfig);\n\n const handleConfigChange = useCallback(\n (newConfig: GraphConfig) => {\n setLiveConfig(newConfig);\n onConfigChange?.(newConfig);\n },\n [onConfigChange]\n );\n\n const normalizedTypeInfo = useMemo(\n () =>\n normalizeTypeInfo(viewState.typeInfo ?? computedView?.typeInfo ?? null),\n [computedView, viewState.typeInfo]\n );\n\n const fallbackFields = useMemo(\n () =>\n buildFallbackFieldOrder(normalizedTypeInfo, viewState.data?.data ?? null),\n [normalizedTypeInfo, viewState.data?.data]\n );\n\n const resolvedColumns = useMemo(\n () => buildResolvedColumns(columns, fallbackFields, normalizedTypeInfo),\n [columns, fallbackFields, normalizedTypeInfo]\n );\n\n return (\n <div className=\"wcdv-graph\" style={height ? { height } : undefined}>\n <GraphView\n viewData={viewState.data}\n columns={resolvedColumns}\n config={liveConfig}\n locale={locale}\n className={className}\n onConfigChange={handleConfigChange}\n />\n </div>\n );\n}\n\nfunction DataVisNitroGraph(props: DataVisNitroGraphProps) {\n const computedView = useContext(DataVisNitroContext);\n\n if (computedView === null) {\n return null;\n }\n\n return <DataVisNitroGraphInner {...props} computedView={computedView} />;\n}\n\nDataVisNitroGraph.displayName = 'DataVisNitroGraph';\n\nexport { DataVisNitroGraph };\n"]}
@@ -1,5 +1,5 @@
1
- import { useEscapeKey } from './chunk-T4ME7QCT.js';
2
1
  import { useClickOutside } from './chunk-OKBR6PX4.js';
2
+ import { useEscapeKey } from './chunk-T4ME7QCT.js';
3
3
  import { cn } from './chunk-F3SOEIN2.js';
4
4
  import * as React from 'react';
5
5
  import * as libphonenumber from 'google-libphonenumber';
@@ -324,5 +324,5 @@ function CountryCodeDropdown({
324
324
  CountryCodeDropdown.displayName = "CountryCodeDropdown";
325
325
 
326
326
  export { CountryCodeDropdown, formatE164, validatePhoneNumber };
327
- //# sourceMappingURL=chunk-OVQKCUTZ.js.map
328
- //# sourceMappingURL=chunk-OVQKCUTZ.js.map
327
+ //# sourceMappingURL=chunk-WFS6R2F5.js.map
328
+ //# sourceMappingURL=chunk-WFS6R2F5.js.map