@handled-ai/design-system 0.18.23 → 0.18.25

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 (55) hide show
  1. package/dist/components/case-panel-detail.d.ts +3 -1
  2. package/dist/components/case-panel-detail.js +29 -15
  3. package/dist/components/case-panel-detail.js.map +1 -1
  4. package/dist/components/case-panel-email-composer.d.ts +2 -1
  5. package/dist/components/case-panel-email-composer.js +4 -2
  6. package/dist/components/case-panel-email-composer.js.map +1 -1
  7. package/dist/components/data-table.js +1 -0
  8. package/dist/components/data-table.js.map +1 -1
  9. package/dist/components/score-analysis-modal.d.ts +8 -2
  10. package/dist/components/score-analysis-modal.js +19 -6
  11. package/dist/components/score-analysis-modal.js.map +1 -1
  12. package/dist/components/score-breakdown.d.ts +3 -1
  13. package/dist/components/score-breakdown.js +5 -6
  14. package/dist/components/score-breakdown.js.map +1 -1
  15. package/dist/components/score-ring.d.ts +6 -3
  16. package/dist/components/score-ring.js +11 -14
  17. package/dist/components/score-ring.js.map +1 -1
  18. package/dist/components/score-semantics.d.ts +27 -0
  19. package/dist/components/score-semantics.js +173 -0
  20. package/dist/components/score-semantics.js.map +1 -0
  21. package/dist/components/score-why-chips.d.ts +3 -2
  22. package/dist/components/score-why-chips.js +10 -21
  23. package/dist/components/score-why-chips.js.map +1 -1
  24. package/dist/components/signal-priority-popover.d.ts +1 -0
  25. package/dist/components/signal-priority-popover.js +20 -20
  26. package/dist/components/signal-priority-popover.js.map +1 -1
  27. package/dist/index.d.ts +3 -2
  28. package/dist/index.js +1 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/prototype/index.d.ts +1 -0
  31. package/dist/prototype/prototype-accounts-view.d.ts +1 -0
  32. package/dist/prototype/prototype-admin-view.d.ts +1 -0
  33. package/dist/prototype/prototype-config.d.ts +1 -0
  34. package/dist/prototype/prototype-inbox-view.d.ts +1 -0
  35. package/dist/prototype/prototype-insights-view.d.ts +1 -0
  36. package/dist/prototype/prototype-shell.d.ts +1 -0
  37. package/package.json +1 -1
  38. package/src/components/__tests__/case-panel-detail.test.tsx +17 -1
  39. package/src/components/__tests__/case-panel-email-composer.test.tsx +7 -0
  40. package/src/components/__tests__/contextual-quick-action-launcher.test.tsx +4 -1
  41. package/src/components/__tests__/score-analysis-modal.test.tsx +55 -0
  42. package/src/components/__tests__/score-breakdown-intent.test.tsx +47 -0
  43. package/src/components/__tests__/score-ring.test.tsx +43 -0
  44. package/src/components/__tests__/score-semantics.test.ts +107 -0
  45. package/src/components/__tests__/signal-priority-popover.test.tsx +7 -5
  46. package/src/components/case-panel-detail.tsx +31 -13
  47. package/src/components/case-panel-email-composer.tsx +25 -21
  48. package/src/components/data-table.tsx +1 -0
  49. package/src/components/score-analysis-modal.tsx +22 -5
  50. package/src/components/score-breakdown.tsx +7 -6
  51. package/src/components/score-ring.tsx +11 -13
  52. package/src/components/score-semantics.ts +187 -0
  53. package/src/components/score-why-chips.tsx +12 -23
  54. package/src/components/signal-priority-popover.tsx +21 -21
  55. package/src/index.ts +1 -0
@@ -0,0 +1,187 @@
1
+ export type ScoreIntent = "urgency" | "risk" | "positive"
2
+
3
+ export type UrgencyLevel = "Low" | "Medium" | "High" | "Urgent"
4
+ export type RiskLevel = "Low Risk" | "Medium Risk" | "High Risk"
5
+ export type PositiveLevel = "Low" | "Medium" | "High"
6
+
7
+ export type ScoreSemanticClasses = {
8
+ solid: string
9
+ outline: string
10
+ dot: string
11
+ trigger: string
12
+ hover: string
13
+ open: string
14
+ text: string
15
+ track: string
16
+ bar: string
17
+ }
18
+
19
+ export const URGENCY_SCORE_CLASSES: Record<UrgencyLevel, ScoreSemanticClasses> = {
20
+ Urgent: {
21
+ solid: "bg-red-600 text-white",
22
+ outline: "border-red-300 bg-red-50 text-red-800",
23
+ dot: "bg-red-600",
24
+ trigger: "border-red-300 bg-red-50 text-red-800",
25
+ hover: "hover:bg-red-100",
26
+ open: "bg-red-100",
27
+ text: "text-red-600",
28
+ track: "text-red-600/15",
29
+ bar: "bg-red-600",
30
+ },
31
+ High: {
32
+ solid: "bg-orange-500 text-white",
33
+ outline: "border-orange-300 bg-orange-50 text-orange-800",
34
+ dot: "bg-orange-500",
35
+ trigger: "border-orange-300 bg-orange-50 text-orange-800",
36
+ hover: "hover:bg-orange-100",
37
+ open: "bg-orange-100",
38
+ text: "text-orange-500",
39
+ track: "text-orange-500/15",
40
+ bar: "bg-orange-500",
41
+ },
42
+ Medium: {
43
+ solid: "bg-amber-500 text-white",
44
+ outline: "border-amber-300 bg-amber-50 text-amber-800",
45
+ dot: "bg-amber-500",
46
+ trigger: "border-amber-300 bg-amber-50 text-amber-800",
47
+ hover: "hover:bg-amber-100",
48
+ open: "bg-amber-100",
49
+ text: "text-amber-500",
50
+ track: "text-amber-500/15",
51
+ bar: "bg-amber-500",
52
+ },
53
+ Low: {
54
+ solid: "bg-neutral-300 text-neutral-900",
55
+ outline: "border-neutral-200 bg-neutral-50 text-neutral-700",
56
+ dot: "bg-neutral-400",
57
+ trigger: "border-neutral-200 bg-neutral-50 text-neutral-700",
58
+ hover: "hover:bg-neutral-100",
59
+ open: "bg-neutral-100",
60
+ text: "text-neutral-400",
61
+ track: "text-neutral-400/15",
62
+ bar: "bg-neutral-400",
63
+ },
64
+ }
65
+
66
+ export const RISK_SCORE_CLASSES: Record<RiskLevel, ScoreSemanticClasses> = {
67
+ "High Risk": {
68
+ solid: "bg-red-600 text-white",
69
+ outline: "border-red-300 bg-red-50 text-red-800",
70
+ dot: "bg-red-600",
71
+ trigger: "border-red-300 bg-red-50 text-red-800",
72
+ hover: "hover:bg-red-100",
73
+ open: "bg-red-100",
74
+ text: "text-red-600",
75
+ track: "text-red-600/15",
76
+ bar: "bg-red-600",
77
+ },
78
+ "Medium Risk": {
79
+ solid: "bg-amber-500 text-white",
80
+ outline: "border-amber-300 bg-amber-50 text-amber-800",
81
+ dot: "bg-amber-500",
82
+ trigger: "border-amber-300 bg-amber-50 text-amber-800",
83
+ hover: "hover:bg-amber-100",
84
+ open: "bg-amber-100",
85
+ text: "text-amber-500",
86
+ track: "text-amber-500/15",
87
+ bar: "bg-amber-500",
88
+ },
89
+ "Low Risk": {
90
+ solid: "bg-neutral-300 text-neutral-900",
91
+ outline: "border-neutral-200 bg-neutral-50 text-neutral-700",
92
+ dot: "bg-neutral-400",
93
+ trigger: "border-neutral-200 bg-neutral-50 text-neutral-700",
94
+ hover: "hover:bg-neutral-100",
95
+ open: "bg-neutral-100",
96
+ text: "text-neutral-400",
97
+ track: "text-neutral-400/15",
98
+ bar: "bg-neutral-400",
99
+ },
100
+ }
101
+
102
+ export const POSITIVE_SCORE_CLASSES: Record<PositiveLevel, ScoreSemanticClasses> = {
103
+ High: {
104
+ solid: "bg-emerald-500 text-white",
105
+ outline: "border-emerald-300 bg-emerald-50 text-emerald-800",
106
+ dot: "bg-emerald-500",
107
+ trigger: "border-emerald-300 bg-emerald-50 text-emerald-800",
108
+ hover: "hover:bg-emerald-100",
109
+ open: "bg-emerald-100",
110
+ text: "text-emerald-500",
111
+ track: "text-emerald-500/15",
112
+ bar: "bg-emerald-500",
113
+ },
114
+ Medium: {
115
+ solid: "bg-amber-500 text-white",
116
+ outline: "border-amber-300 bg-amber-50 text-amber-800",
117
+ dot: "bg-amber-500",
118
+ trigger: "border-amber-300 bg-amber-50 text-amber-800",
119
+ hover: "hover:bg-amber-100",
120
+ open: "bg-amber-100",
121
+ text: "text-amber-500",
122
+ track: "text-amber-500/15",
123
+ bar: "bg-amber-500",
124
+ },
125
+ Low: {
126
+ solid: "bg-red-500 text-white",
127
+ outline: "border-red-300 bg-red-50 text-red-800",
128
+ dot: "bg-red-500",
129
+ trigger: "border-red-300 bg-red-50 text-red-800",
130
+ hover: "hover:bg-red-100",
131
+ open: "bg-red-100",
132
+ text: "text-red-500",
133
+ track: "text-red-500/15",
134
+ bar: "bg-red-500",
135
+ },
136
+ }
137
+
138
+ export const SCORE_TONE_CLASSES: Record<string, string> = {
139
+ alert: "bg-red-50 text-red-600",
140
+ warn: "bg-amber-50 text-amber-600",
141
+ info: "bg-blue-50 text-blue-600",
142
+ }
143
+
144
+ export const DEFAULT_SCORE_TONE_CLASS = "bg-muted text-muted-foreground"
145
+
146
+ export function getUrgencyLevel(score: number): UrgencyLevel {
147
+ if (score >= 80) return "Urgent"
148
+ if (score >= 60) return "High"
149
+ if (score >= 35) return "Medium"
150
+ return "Low"
151
+ }
152
+
153
+ export function getUrgencyRange(label: UrgencyLevel): string {
154
+ switch (label) {
155
+ case "Urgent":
156
+ return "80-100"
157
+ case "High":
158
+ return "60-79"
159
+ case "Medium":
160
+ return "35-59"
161
+ case "Low":
162
+ return "0-34"
163
+ }
164
+ }
165
+
166
+ export function getRiskLevel(score: number): RiskLevel {
167
+ if (score >= 70) return "High Risk"
168
+ if (score >= 40) return "Medium Risk"
169
+ return "Low Risk"
170
+ }
171
+
172
+ export function getPositiveLevel(score: number): PositiveLevel {
173
+ if (score >= 70) return "High"
174
+ if (score >= 40) return "Medium"
175
+ return "Low"
176
+ }
177
+
178
+ export function getScoreToneClasses(score: number, intent: ScoreIntent): ScoreSemanticClasses {
179
+ switch (intent) {
180
+ case "urgency":
181
+ return URGENCY_SCORE_CLASSES[getUrgencyLevel(score)]
182
+ case "risk":
183
+ return RISK_SCORE_CLASSES[getRiskLevel(score)]
184
+ case "positive":
185
+ return POSITIVE_SCORE_CLASSES[getPositiveLevel(score)]
186
+ }
187
+ }
@@ -17,6 +17,12 @@ import type { LucideIcon } from "lucide-react"
17
17
  import { FeedbackFooter } from "./feedback-primitives"
18
18
  import type { FeedbackChipTree, FeedbackSubmitData, PersistedFeedbackData } from "./feedback-primitives"
19
19
  import { cn } from "../lib/utils"
20
+ import {
21
+ DEFAULT_SCORE_TONE_CLASS,
22
+ SCORE_TONE_CLASSES,
23
+ getUrgencyLevel,
24
+ getUrgencyRange,
25
+ } from "./score-semantics"
20
26
  import type {
21
27
  QueueItem,
22
28
  SignalScoreData,
@@ -33,24 +39,11 @@ export function getSignalScoreUrgencyLabel(
33
39
  score: number,
34
40
  providedLabel?: SignalScoreUrgencyLabel,
35
41
  ): SignalScoreUrgencyLabel {
36
- if (providedLabel) return providedLabel
37
- if (score >= 80) return "Urgent"
38
- if (score >= 60) return "High"
39
- if (score >= 35) return "Medium"
40
- return "Low"
42
+ return providedLabel ?? getUrgencyLevel(score)
41
43
  }
42
44
 
43
45
  export function scoreRangeForUrgency(label: SignalScoreUrgencyLabel): string {
44
- switch (label) {
45
- case "Urgent":
46
- return "80-100"
47
- case "High":
48
- return "60-79"
49
- case "Medium":
50
- return "35-59"
51
- case "Low":
52
- return "0-34"
53
- }
46
+ return getUrgencyRange(label)
54
47
  }
55
48
 
56
49
  function makeDomId(...parts: Array<string | undefined>): string {
@@ -107,15 +100,11 @@ function resolveIcon(iconName?: string): LucideIcon {
107
100
  // Static tone class maps (REQUIRED for Tailwind v4 source scanning)
108
101
  // ---------------------------------------------------------------------------
109
102
 
110
- /** Shared tone-to-class map. Re-exported for signal-priority-popover. */
111
- export const SIGNAL_TONE_CLASSES: Record<string, string> = {
112
- alert: "bg-red-50 text-red-600",
113
- warn: "bg-amber-50 text-amber-600",
114
- info: "bg-blue-50 text-blue-600",
115
- }
103
+ /** Shared tone-to-class map. Re-exported for backward compatibility. */
104
+ export const SIGNAL_TONE_CLASSES: Record<string, string> = SCORE_TONE_CLASSES
116
105
 
117
- /** Default tone for missing/unknown tone values */
118
- export const DEFAULT_TONE_CLASS = "bg-muted text-muted-foreground"
106
+ /** Default tone for missing/unknown tone values. Re-exported for backward compatibility. */
107
+ export const DEFAULT_TONE_CLASS = DEFAULT_SCORE_TONE_CLASS
119
108
 
120
109
  // ---------------------------------------------------------------------------
121
110
  // Em-dash fallback for missing slot data
@@ -22,7 +22,7 @@ import { cn } from "../lib/utils"
22
22
  import { FeedbackFooter, InlineFeedbackControl } from "./feedback-primitives"
23
23
  import type { FeedbackChipTree, FeedbackSubmitData, PersistedFeedbackData } from "./feedback-primitives"
24
24
  import type { SignalScoreUrgencyLabel } from "../prototype/prototype-config"
25
- import { getSignalScoreUrgencyLabel, scoreRangeForUrgency, SIGNAL_TONE_CLASSES } from "./score-why-chips"
25
+ import { SCORE_TONE_CLASSES, URGENCY_SCORE_CLASSES, getUrgencyLevel, getUrgencyRange } from "./score-semantics"
26
26
 
27
27
  // ---------------------------------------------------------------------------
28
28
  // Types
@@ -75,28 +75,28 @@ export interface SignalPriorityPopoverProps {
75
75
  // ---------------------------------------------------------------------------
76
76
 
77
77
  const URGENCY_TRIGGER_DEFAULT: Record<SignalScoreUrgencyLabel, string> = {
78
- Urgent: "border-red-200 bg-red-50 text-red-700",
79
- High: "border-orange-200 bg-orange-50 text-orange-700",
80
- Medium: "border-amber-200 bg-amber-50 text-amber-700",
81
- Low: "border-blue-200 bg-blue-50 text-blue-700",
78
+ Urgent: URGENCY_SCORE_CLASSES.Urgent.trigger,
79
+ High: URGENCY_SCORE_CLASSES.High.trigger,
80
+ Medium: URGENCY_SCORE_CLASSES.Medium.trigger,
81
+ Low: URGENCY_SCORE_CLASSES.Low.trigger,
82
82
  }
83
83
 
84
84
  const URGENCY_TRIGGER_HOVER: Record<SignalScoreUrgencyLabel, string> = {
85
- Urgent: "hover:bg-red-100",
86
- High: "hover:bg-orange-100",
87
- Medium: "hover:bg-amber-100",
88
- Low: "hover:bg-blue-100",
85
+ Urgent: URGENCY_SCORE_CLASSES.Urgent.hover,
86
+ High: URGENCY_SCORE_CLASSES.High.hover,
87
+ Medium: URGENCY_SCORE_CLASSES.Medium.hover,
88
+ Low: URGENCY_SCORE_CLASSES.Low.hover,
89
89
  }
90
90
 
91
91
  const URGENCY_TRIGGER_OPEN: Record<SignalScoreUrgencyLabel, string> = {
92
- Urgent: "bg-red-100",
93
- High: "bg-orange-100",
94
- Medium: "bg-amber-100",
95
- Low: "bg-blue-100",
92
+ Urgent: URGENCY_SCORE_CLASSES.Urgent.open,
93
+ High: URGENCY_SCORE_CLASSES.High.open,
94
+ Medium: URGENCY_SCORE_CLASSES.Medium.open,
95
+ Low: URGENCY_SCORE_CLASSES.Low.open,
96
96
  }
97
97
 
98
- /** Re-use shared tone classes from score-why-chips. */
99
- const TONE_ICON_CLASSES: Record<PriorityFactor["tone"], string> = SIGNAL_TONE_CLASSES as Record<PriorityFactor["tone"], string>
98
+ /** Re-use shared tone classes from score-semantics. */
99
+ const TONE_ICON_CLASSES: Record<PriorityFactor["tone"], string> = SCORE_TONE_CLASSES as Record<PriorityFactor["tone"], string>
100
100
 
101
101
  const DIRECTION_CLASSES: Record<PriorityFactor["direction"], string> = {
102
102
  raises: "text-red-600",
@@ -124,10 +124,10 @@ const FACTOR_ICONS: Record<string, LucideIcon> = {
124
124
  // ---------------------------------------------------------------------------
125
125
 
126
126
  const URGENCY_DOT_CLASSES: Record<SignalScoreUrgencyLabel, string> = {
127
- Urgent: "bg-red-500",
128
- High: "bg-orange-500",
129
- Medium: "bg-amber-500",
130
- Low: "bg-blue-500",
127
+ Urgent: URGENCY_SCORE_CLASSES.Urgent.dot,
128
+ High: URGENCY_SCORE_CLASSES.High.dot,
129
+ Medium: URGENCY_SCORE_CLASSES.Medium.dot,
130
+ Low: URGENCY_SCORE_CLASSES.Low.dot,
131
131
  }
132
132
 
133
133
  // ---------------------------------------------------------------------------
@@ -283,8 +283,8 @@ export function SignalPriorityPopover({
283
283
  onFactorFeedback,
284
284
  initialPriorityFeedback,
285
285
  }: SignalPriorityPopoverProps) {
286
- const urgencyLabel = getSignalScoreUrgencyLabel(score, providedLabel)
287
- const scoreRange = scoreRangeForUrgency(urgencyLabel)
286
+ const urgencyLabel = providedLabel ?? getUrgencyLevel(score)
287
+ const scoreRange = getUrgencyRange(urgencyLabel)
288
288
 
289
289
  const [open, setOpen] = React.useState(false)
290
290
  const [feedback, setFeedback] = React.useState<"positive" | "negative" | null>(null)
package/src/index.ts CHANGED
@@ -81,6 +81,7 @@ export * from "./components/rich-text-toolbar"
81
81
  export * from "./components/score-analysis-modal"
82
82
  export * from "./components/score-breakdown"
83
83
  export * from "./components/score-feedback"
84
+ export * from "./components/score-semantics"
84
85
  export * from "./components/score-why-chips"
85
86
  export * from "./components/score-ring"
86
87
  export * from "./components/scroll-area"