@oods/component-contracts 0.3.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oods/component-contracts",
3
- "version": "0.3.3",
3
+ "version": "0.4.0",
4
4
  "description": "Component contracts for OODS Foundry: each component's identity, props, events, states, token roles and accessibility obligations, with shared formatting helpers.",
5
5
  "homepage": "https://oods-foundry.com/",
6
6
  "bugs": {
@@ -3,6 +3,150 @@
3
3
  "kind": "component-capability-additions",
4
4
  "decisionId": 2054,
5
5
  "rows": [
6
+ {
7
+ "id": "Dialog",
8
+ "proposedClassification": "native",
9
+ "reconciliationState": "proposed-awaiting-approval",
10
+ "surfaces": {
11
+ "contract": {
12
+ "state": "versioned-v1",
13
+ "evidence": [
14
+ "packages/component-contracts/src/contracts.ts#Dialog"
15
+ ]
16
+ },
17
+ "metadata": {
18
+ "state": "available",
19
+ "evidence": [
20
+ "packages/component-contracts/registry/component-intake.v1.json#Dialog"
21
+ ]
22
+ },
23
+ "html": {
24
+ "state": "mapped",
25
+ "evidence": [
26
+ "packages/mcp-server/src/render/component-map.ts#renderDialog"
27
+ ]
28
+ },
29
+ "react": {
30
+ "state": "implemented-evidence-complete",
31
+ "evidence": [
32
+ "packages/components-react/evidence/react-readiness.v1.json#Dialog"
33
+ ]
34
+ },
35
+ "vue": {
36
+ "state": "implemented-evidence-complete",
37
+ "evidence": [
38
+ "packages/components-vue/evidence/vue-readiness.v1.json#Dialog"
39
+ ]
40
+ },
41
+ "generatedConsumer": {
42
+ "state": "unavailable",
43
+ "evidence": [
44
+ "artifacts/product-reality/sprint-193/m07/runtime/runtime-cells.v1.json"
45
+ ],
46
+ "reason": "No current runtime cell places this component; historical receipts do not establish current coverage."
47
+ },
48
+ "accessibility": {
49
+ "state": "verified",
50
+ "evidence": [
51
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/react-measured.json#Dialog",
52
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/vue-measured.json#Dialog",
53
+ "packages/components-react/evidence/react-readiness.v1.json#Dialog",
54
+ "packages/components-vue/evidence/vue-readiness.v1.json#Dialog"
55
+ ]
56
+ },
57
+ "theme": {
58
+ "state": "verified",
59
+ "evidence": [
60
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/react-theme/report.json#Dialog",
61
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/vue-theme/report.json#Dialog",
62
+ "packages/components-react/evidence/react-readiness.v1.json#Dialog",
63
+ "packages/components-vue/evidence/vue-readiness.v1.json#Dialog"
64
+ ]
65
+ },
66
+ "interaction": {
67
+ "state": "verified",
68
+ "evidence": [
69
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/react-measured.json#Dialog",
70
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/vue-measured.json#Dialog",
71
+ "packages/components-react/evidence/react-readiness.v1.json#Dialog",
72
+ "packages/components-vue/evidence/vue-readiness.v1.json#Dialog"
73
+ ]
74
+ }
75
+ },
76
+ "decisionId": 2502
77
+ },
78
+ {
79
+ "id": "Switch",
80
+ "proposedClassification": "native",
81
+ "reconciliationState": "proposed-awaiting-approval",
82
+ "surfaces": {
83
+ "contract": {
84
+ "state": "versioned-v1",
85
+ "evidence": [
86
+ "packages/component-contracts/src/contracts.ts#Switch"
87
+ ]
88
+ },
89
+ "metadata": {
90
+ "state": "available",
91
+ "evidence": [
92
+ "packages/component-contracts/registry/component-intake.v1.json#Switch"
93
+ ]
94
+ },
95
+ "html": {
96
+ "state": "mapped",
97
+ "evidence": [
98
+ "packages/mcp-server/src/render/component-map.ts#renderSwitch"
99
+ ]
100
+ },
101
+ "react": {
102
+ "state": "implemented-evidence-complete",
103
+ "evidence": [
104
+ "packages/components-react/evidence/react-readiness.v1.json#Switch"
105
+ ]
106
+ },
107
+ "vue": {
108
+ "state": "implemented-evidence-complete",
109
+ "evidence": [
110
+ "packages/components-vue/evidence/vue-readiness.v1.json#Switch"
111
+ ]
112
+ },
113
+ "generatedConsumer": {
114
+ "state": "unavailable",
115
+ "evidence": [
116
+ "artifacts/product-reality/sprint-193/m07/runtime/runtime-cells.v1.json"
117
+ ],
118
+ "reason": "No current runtime cell places this component; historical receipts do not establish current coverage."
119
+ },
120
+ "accessibility": {
121
+ "state": "verified",
122
+ "evidence": [
123
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/react-measured.json#Switch",
124
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/vue-measured.json#Switch",
125
+ "packages/components-react/evidence/react-readiness.v1.json#Switch",
126
+ "packages/components-vue/evidence/vue-readiness.v1.json#Switch"
127
+ ]
128
+ },
129
+ "theme": {
130
+ "state": "verified",
131
+ "evidence": [
132
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/react-theme/report.json#Switch",
133
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/vue-theme/report.json#Switch",
134
+ "packages/components-react/evidence/react-readiness.v1.json#Switch",
135
+ "packages/components-vue/evidence/vue-readiness.v1.json#Switch"
136
+ ]
137
+ },
138
+ "interaction": {
139
+ "state": "verified",
140
+ "evidence": [
141
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/react-measured.json#Switch",
142
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/vue-measured.json#Switch",
143
+ "packages/components-react/evidence/react-readiness.v1.json#Switch",
144
+ "packages/components-vue/evidence/vue-readiness.v1.json#Switch"
145
+ ]
146
+ }
147
+ },
148
+ "decisionId": 2502
149
+ },
6
150
  {
7
151
  "id": "VizGraphPreview",
8
152
  "proposedClassification": "recipe",
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": "1.0.0",
3
3
  "kind": "component-capability-ledger",
4
4
  "generatedAt": "2026-09-11T05:30:00Z",
5
- "controllingObligationDenominator": 110,
5
+ "controllingObligationDenominator": 112,
6
6
  "approvedRuntimeCensus": null,
7
7
  "source": "refresh_structured_data.py#project_measured_surfaces",
8
8
  "rows": [
@@ -3070,6 +3070,77 @@
3070
3070
  }
3071
3071
  }
3072
3072
  },
3073
+ {
3074
+ "id": "Dialog",
3075
+ "proposedClassification": "native",
3076
+ "reconciliationState": "proposed-awaiting-approval",
3077
+ "surfaces": {
3078
+ "contract": {
3079
+ "state": "versioned-v1",
3080
+ "evidence": [
3081
+ "packages/component-contracts/src/contracts.ts#Dialog"
3082
+ ]
3083
+ },
3084
+ "metadata": {
3085
+ "state": "available",
3086
+ "evidence": [
3087
+ "packages/component-contracts/registry/component-intake.v1.json#Dialog"
3088
+ ]
3089
+ },
3090
+ "html": {
3091
+ "state": "mapped",
3092
+ "evidence": [
3093
+ "packages/mcp-server/src/render/component-map.ts#renderDialog"
3094
+ ]
3095
+ },
3096
+ "react": {
3097
+ "state": "implemented-evidence-complete",
3098
+ "evidence": [
3099
+ "packages/components-react/evidence/react-readiness.v1.json#Dialog"
3100
+ ]
3101
+ },
3102
+ "vue": {
3103
+ "state": "implemented-evidence-complete",
3104
+ "evidence": [
3105
+ "packages/components-vue/evidence/vue-readiness.v1.json#Dialog"
3106
+ ]
3107
+ },
3108
+ "generatedConsumer": {
3109
+ "state": "unavailable",
3110
+ "evidence": [
3111
+ "artifacts/product-reality/sprint-193/m07/runtime/runtime-cells.v1.json"
3112
+ ],
3113
+ "reason": "No current runtime cell places this component; historical receipts do not establish current coverage."
3114
+ },
3115
+ "accessibility": {
3116
+ "state": "verified",
3117
+ "evidence": [
3118
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/react-measured.json#Dialog",
3119
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/vue-measured.json#Dialog",
3120
+ "packages/components-react/evidence/react-readiness.v1.json#Dialog",
3121
+ "packages/components-vue/evidence/vue-readiness.v1.json#Dialog"
3122
+ ]
3123
+ },
3124
+ "theme": {
3125
+ "state": "verified",
3126
+ "evidence": [
3127
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/react-theme/report.json#Dialog",
3128
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/vue-theme/report.json#Dialog",
3129
+ "packages/components-react/evidence/react-readiness.v1.json#Dialog",
3130
+ "packages/components-vue/evidence/vue-readiness.v1.json#Dialog"
3131
+ ]
3132
+ },
3133
+ "interaction": {
3134
+ "state": "verified",
3135
+ "evidence": [
3136
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/react-measured.json#Dialog",
3137
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/vue-measured.json#Dialog",
3138
+ "packages/components-react/evidence/react-readiness.v1.json#Dialog",
3139
+ "packages/components-vue/evidence/vue-readiness.v1.json#Dialog"
3140
+ ]
3141
+ }
3142
+ }
3143
+ },
3073
3144
  {
3074
3145
  "id": "FilterPanel",
3075
3146
  "proposedClassification": "recipe",
@@ -6658,6 +6729,77 @@
6658
6729
  }
6659
6730
  }
6660
6731
  },
6732
+ {
6733
+ "id": "Switch",
6734
+ "proposedClassification": "native",
6735
+ "reconciliationState": "proposed-awaiting-approval",
6736
+ "surfaces": {
6737
+ "contract": {
6738
+ "state": "versioned-v1",
6739
+ "evidence": [
6740
+ "packages/component-contracts/src/contracts.ts#Switch"
6741
+ ]
6742
+ },
6743
+ "metadata": {
6744
+ "state": "available",
6745
+ "evidence": [
6746
+ "packages/component-contracts/registry/component-intake.v1.json#Switch"
6747
+ ]
6748
+ },
6749
+ "html": {
6750
+ "state": "mapped",
6751
+ "evidence": [
6752
+ "packages/mcp-server/src/render/component-map.ts#renderSwitch"
6753
+ ]
6754
+ },
6755
+ "react": {
6756
+ "state": "implemented-evidence-complete",
6757
+ "evidence": [
6758
+ "packages/components-react/evidence/react-readiness.v1.json#Switch"
6759
+ ]
6760
+ },
6761
+ "vue": {
6762
+ "state": "implemented-evidence-complete",
6763
+ "evidence": [
6764
+ "packages/components-vue/evidence/vue-readiness.v1.json#Switch"
6765
+ ]
6766
+ },
6767
+ "generatedConsumer": {
6768
+ "state": "unavailable",
6769
+ "evidence": [
6770
+ "artifacts/product-reality/sprint-193/m07/runtime/runtime-cells.v1.json"
6771
+ ],
6772
+ "reason": "No current runtime cell places this component; historical receipts do not establish current coverage."
6773
+ },
6774
+ "accessibility": {
6775
+ "state": "verified",
6776
+ "evidence": [
6777
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/react-measured.json#Switch",
6778
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/vue-measured.json#Switch",
6779
+ "packages/components-react/evidence/react-readiness.v1.json#Switch",
6780
+ "packages/components-vue/evidence/vue-readiness.v1.json#Switch"
6781
+ ]
6782
+ },
6783
+ "theme": {
6784
+ "state": "verified",
6785
+ "evidence": [
6786
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/react-theme/report.json#Switch",
6787
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/vue-theme/report.json#Switch",
6788
+ "packages/components-react/evidence/react-readiness.v1.json#Switch",
6789
+ "packages/components-vue/evidence/vue-readiness.v1.json#Switch"
6790
+ ]
6791
+ },
6792
+ "interaction": {
6793
+ "state": "verified",
6794
+ "evidence": [
6795
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/react-measured.json#Switch",
6796
+ "artifacts/product-reality/sprint-222/m02/switch-dialog/vue-measured.json#Switch",
6797
+ "packages/components-react/evidence/react-readiness.v1.json#Switch",
6798
+ "packages/components-vue/evidence/vue-readiness.v1.json#Switch"
6799
+ ]
6800
+ }
6801
+ }
6802
+ },
6661
6803
  {
6662
6804
  "id": "Table",
6663
6805
  "proposedClassification": "native",
@@ -3,7 +3,7 @@
3
3
  "kind": "component-intake",
4
4
  "baselineCommit": "ae560bc22969c1fd81336730be4330c9115fc316",
5
5
  "planningCommit": "8ce349076e7e3ba3f0b2f3f667d4fbb5c6a4b63b",
6
- "controllingObligationDenominator": 110,
6
+ "controllingObligationDenominator": 112,
7
7
  "countRule": "Derived from the unique, deterministically sorted rows array; never from an independent counter.",
8
8
  "rows": [
9
9
  {
@@ -1049,6 +1049,28 @@
1049
1049
  "traits/content/Labelled.trait.yaml"
1050
1050
  ]
1051
1051
  },
1052
+ {
1053
+ "id": "Dialog",
1054
+ "displayName": "Dialog",
1055
+ "baselineMetadata": {
1056
+ "categories": [
1057
+ "primitive"
1058
+ ],
1059
+ "tags": [
1060
+ "dialog",
1061
+ "modal",
1062
+ "overlay",
1063
+ "primitive"
1064
+ ],
1065
+ "contexts": [],
1066
+ "regions": []
1067
+ },
1068
+ "intakeEvidence": [
1069
+ "packages/component-contracts/src/contracts.ts#Dialog",
1070
+ "packages/mcp-server/src/render/component-map.ts#renderDialog"
1071
+ ],
1072
+ "addedBy": "s222-m02; decision #2502 ruling 11"
1073
+ },
1052
1074
  {
1053
1075
  "id": "FilterPanel",
1054
1076
  "displayName": "FilterPanel",
@@ -2154,6 +2176,36 @@
2154
2176
  "traits/lifecycle/Stateful.trait.yaml"
2155
2177
  ]
2156
2178
  },
2179
+ {
2180
+ "id": "Switch",
2181
+ "displayName": "Switch",
2182
+ "baselineMetadata": {
2183
+ "categories": [
2184
+ "primitive"
2185
+ ],
2186
+ "tags": [
2187
+ "boolean",
2188
+ "field",
2189
+ "form",
2190
+ "input",
2191
+ "interactive",
2192
+ "primitive",
2193
+ "switch"
2194
+ ],
2195
+ "contexts": [
2196
+ "form"
2197
+ ],
2198
+ "regions": [
2199
+ "form",
2200
+ "main"
2201
+ ]
2202
+ },
2203
+ "intakeEvidence": [
2204
+ "packages/component-contracts/src/contracts.ts#Switch",
2205
+ "packages/mcp-server/src/render/component-map.ts#renderSwitch"
2206
+ ],
2207
+ "addedBy": "s222-m02; decision #2502 ruling 11"
2208
+ },
2157
2209
  {
2158
2210
  "id": "Table",
2159
2211
  "displayName": "Table",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "decisionId": 2054,
3
+ "decisionId": 2502,
4
4
  "disposition": "retain-all-obligations",
5
- "controllingObligationDenominator": 110,
5
+ "controllingObligationDenominator": 112,
6
6
  "approvedRuntimeCensus": null,
7
7
  "classificationStatus": "proposed-awaiting-approval"
8
8
  }
@@ -4,9 +4,9 @@
4
4
  "baselineCommit": "a5638cf819bdadb86e2336c4aabe9b2184699c13",
5
5
  "planningCommit": "8ce349076e7e3ba3f0b2f3f667d4fbb5c6a4b63b",
6
6
  "status": "proposed-awaiting-approval",
7
- "controllingObligationDenominator": 110,
7
+ "controllingObligationDenominator": 112,
8
8
  "approvedRuntimeCensus": null,
9
- "proposedRuntimeCensus": 110,
9
+ "proposedRuntimeCensus": 112,
10
10
  "rows": [
11
11
  {
12
12
  "id": "AddressCollectionPanel",
@@ -726,6 +726,25 @@
726
726
  "implementationStatus": "implemented-evidence-complete",
727
727
  "compatibilityNote": "Retain the named public ID and existing HTML discovery contract. Governed framework implementation and measurements are linked; classification remains a proposal."
728
728
  },
729
+ {
730
+ "id": "Dialog",
731
+ "proposedClassification": "native",
732
+ "approvalState": "pending-approval",
733
+ "evidence": [
734
+ "packages/mcp-server/src/render/component-map.ts#renderDialog",
735
+ "packages/components-react/evidence/react-readiness.v1.json#Dialog",
736
+ "packages/components-vue/evidence/vue-readiness.v1.json#Dialog",
737
+ "packages/component-contracts/src/contracts.ts#Dialog"
738
+ ],
739
+ "implementationStatus": "implemented-evidence-complete",
740
+ "proposedResolution": {
741
+ "surface": "react+vue+html",
742
+ "implementation": "Dialog",
743
+ "source": "packages/component-contracts/src/contracts.ts",
744
+ "publicIdRetained": true
745
+ },
746
+ "compatibilityNote": "New public identity added by decision #2502 (ruling 11). Governed framework implementation and measurements are linked; classification remains a proposal."
747
+ },
729
748
  {
730
749
  "id": "FilterPanel",
731
750
  "proposedClassification": "recipe",
@@ -1501,6 +1520,25 @@
1501
1520
  "implementationStatus": "implemented-evidence-complete",
1502
1521
  "compatibilityNote": "Retain the named public ID and existing HTML discovery contract. Governed framework implementation and measurements are linked; classification remains a proposal."
1503
1522
  },
1523
+ {
1524
+ "id": "Switch",
1525
+ "proposedClassification": "native",
1526
+ "approvalState": "pending-approval",
1527
+ "evidence": [
1528
+ "packages/mcp-server/src/render/component-map.ts#renderSwitch",
1529
+ "packages/components-react/evidence/react-readiness.v1.json#Switch",
1530
+ "packages/components-vue/evidence/vue-readiness.v1.json#Switch",
1531
+ "packages/component-contracts/src/contracts.ts#Switch"
1532
+ ],
1533
+ "implementationStatus": "implemented-evidence-complete",
1534
+ "proposedResolution": {
1535
+ "surface": "react+vue+html",
1536
+ "implementation": "Switch",
1537
+ "source": "packages/component-contracts/src/contracts.ts",
1538
+ "publicIdRetained": true
1539
+ },
1540
+ "compatibilityNote": "New public identity added by decision #2502 (ruling 11). Governed framework implementation and measurements are linked; classification remains a proposal."
1541
+ },
1504
1542
  {
1505
1543
  "id": "Table",
1506
1544
  "proposedClassification": "native",
@@ -0,0 +1,55 @@
1
+ {
2
+ "$comment": "s222-m03 (#2502 ruling 13): the lifecycle status-to-tone table the StatusBadge contract names. A status badge whose own table (subscription, invoice) does not know a status, or whose field names no table, reads its tone, mark and description here. Icons are status icon names (icon.status.<alias>, packages/component-contracts/src/status-icons.ts).",
3
+ "version": "1.0.0",
4
+ "states": {
5
+ "active": { "tone": "success", "icon": "icon.status.success", "description": "Active and in use." },
6
+ "available": { "tone": "success", "icon": "icon.status.success", "description": "Available to use." },
7
+ "published": { "tone": "success", "icon": "icon.status.success", "description": "Published and visible." },
8
+ "settled": { "tone": "success", "icon": "icon.status.success", "description": "Settled in full." },
9
+ "succeeded": { "tone": "success", "icon": "icon.status.success", "description": "Completed successfully." },
10
+ "paid": { "tone": "success", "icon": "icon.status.paid", "description": "Paid in full." },
11
+ "completed": { "tone": "success", "icon": "icon.status.success", "description": "Completed." },
12
+ "good_standing": { "tone": "success", "icon": "icon.status.success", "description": "In good standing." },
13
+ "in_stock": { "tone": "success", "icon": "icon.status.success", "description": "In stock." },
14
+ "ok": { "tone": "success", "icon": "icon.status.success", "description": "Working as expected." },
15
+ "invited": { "tone": "info", "icon": "icon.status.pending", "description": "Invited and not yet joined." },
16
+ "onboarding": { "tone": "info", "icon": "icon.status.processing", "description": "Being set up." },
17
+ "pending": { "tone": "info", "icon": "icon.status.pending", "description": "Waiting to be processed." },
18
+ "authorized": { "tone": "info", "icon": "icon.status.pending", "description": "Authorized and not yet settled." },
19
+ "processing": { "tone": "info", "icon": "icon.status.processing", "description": "Being processed." },
20
+ "in_review": { "tone": "info", "icon": "icon.status.pending", "description": "In review." },
21
+ "scheduled": { "tone": "info", "icon": "icon.status.scheduled", "description": "Scheduled for later." },
22
+ "ingested": { "tone": "info", "icon": "icon.status.pending", "description": "Received and not yet processed." },
23
+ "proposed": { "tone": "info", "icon": "icon.status.pending", "description": "Proposed and not yet agreed." },
24
+ "posted": { "tone": "info", "icon": "icon.status.pending", "description": "Finalized and posted." },
25
+ "open": { "tone": "info", "icon": "icon.status.pending", "description": "Open and awaiting action." },
26
+ "future": { "tone": "info", "icon": "icon.status.future", "description": "Starts later." },
27
+ "trialing": { "tone": "accent", "icon": "icon.status.trial", "description": "In a trial period." },
28
+ "private_beta": { "tone": "accent", "icon": "icon.status.trial", "description": "Available to a limited group." },
29
+ "retrying": { "tone": "warning", "icon": "icon.status.processing", "description": "Failed once and retrying." },
30
+ "delayed": { "tone": "warning", "icon": "icon.status.warning", "description": "Behind schedule." },
31
+ "investigating": { "tone": "warning", "icon": "icon.status.warning", "description": "Being investigated." },
32
+ "low_stock": { "tone": "warning", "icon": "icon.status.warning", "description": "Running low." },
33
+ "backorder": { "tone": "warning", "icon": "icon.status.warning", "description": "Out of stock and on order." },
34
+ "suspended": { "tone": "warning", "icon": "icon.status.paused", "description": "Suspended for now." },
35
+ "deprecated": { "tone": "warning", "icon": "icon.status.warning", "description": "Being phased out." },
36
+ "past_due": { "tone": "critical", "icon": "icon.status.warning", "description": "Past its due date." },
37
+ "failed": { "tone": "critical", "icon": "icon.status.critical", "description": "Failed." },
38
+ "unpaid": { "tone": "critical", "icon": "icon.status.critical", "description": "Unpaid." },
39
+ "uncollectible": { "tone": "critical", "icon": "icon.status.critical", "description": "Could not be collected." },
40
+ "draft": { "tone": "neutral", "icon": "icon.status.draft", "description": "A draft, not yet final." },
41
+ "prospect": { "tone": "neutral", "icon": "icon.status.default", "description": "Not yet a customer." },
42
+ "paused": { "tone": "neutral", "icon": "icon.status.paused", "description": "Paused." },
43
+ "archived": { "tone": "neutral", "icon": "icon.status.default", "description": "Archived." },
44
+ "legacy": { "tone": "neutral", "icon": "icon.status.default", "description": "Kept for existing users and no longer offered." },
45
+ "refunded": { "tone": "neutral", "icon": "icon.status.refunded", "description": "Refunded." },
46
+ "cancelled": { "tone": "neutral", "icon": "icon.status.cancelled", "description": "Cancelled." },
47
+ "canceled": { "tone": "neutral", "icon": "icon.status.canceled", "description": "Cancelled." },
48
+ "void": { "tone": "neutral", "icon": "icon.status.void", "description": "Voided." },
49
+ "retired": { "tone": "neutral", "icon": "icon.status.canceled", "description": "Retired and no longer offered." },
50
+ "discontinued": { "tone": "neutral", "icon": "icon.status.canceled", "description": "Discontinued." },
51
+ "deactivated": { "tone": "neutral", "icon": "icon.status.canceled", "description": "Deactivated." },
52
+ "terminated": { "tone": "neutral", "icon": "icon.status.canceled", "description": "Ended." },
53
+ "churned": { "tone": "neutral", "icon": "icon.status.canceled", "description": "No longer a customer." }
54
+ }
55
+ }