@oods/component-contracts 0.3.3 → 0.4.1

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.
@@ -3,7 +3,7 @@
3
3
  "kind": "component-intake",
4
4
  "baselineCommit": "ae560bc22969c1fd81336730be4330c9115fc316",
5
5
  "planningCommit": "8ce349076e7e3ba3f0b2f3f667d4fbb5c6a4b63b",
6
- "controllingObligationDenominator": 110,
6
+ "controllingObligationDenominator": 114,
7
7
  "countRule": "Derived from the unique, deterministically sorted rows array; never from an independent counter.",
8
8
  "rows": [
9
9
  {
@@ -934,6 +934,38 @@
934
934
  "traits/visual/Colorized.trait.yaml"
935
935
  ]
936
936
  },
937
+ {
938
+ "id": "Combobox",
939
+ "displayName": "Combobox",
940
+ "baselineMetadata": {
941
+ "categories": [
942
+ "primitive"
943
+ ],
944
+ "tags": [
945
+ "autocomplete",
946
+ "combobox",
947
+ "field",
948
+ "filter",
949
+ "form",
950
+ "input",
951
+ "interactive",
952
+ "primitive",
953
+ "select"
954
+ ],
955
+ "contexts": [
956
+ "form"
957
+ ],
958
+ "regions": [
959
+ "form",
960
+ "main"
961
+ ]
962
+ },
963
+ "intakeEvidence": [
964
+ "packages/component-contracts/src/contracts.ts#Combobox",
965
+ "packages/mcp-server/src/render/component-map.ts#renderCombobox"
966
+ ],
967
+ "addedBy": "s223-m02; decision #2527 ruling 11"
968
+ },
937
969
  {
938
970
  "id": "CommunicationDetailPanel",
939
971
  "displayName": "CommunicationDetailPanel",
@@ -1049,6 +1081,28 @@
1049
1081
  "traits/content/Labelled.trait.yaml"
1050
1082
  ]
1051
1083
  },
1084
+ {
1085
+ "id": "Dialog",
1086
+ "displayName": "Dialog",
1087
+ "baselineMetadata": {
1088
+ "categories": [
1089
+ "primitive"
1090
+ ],
1091
+ "tags": [
1092
+ "dialog",
1093
+ "modal",
1094
+ "overlay",
1095
+ "primitive"
1096
+ ],
1097
+ "contexts": [],
1098
+ "regions": []
1099
+ },
1100
+ "intakeEvidence": [
1101
+ "packages/component-contracts/src/contracts.ts#Dialog",
1102
+ "packages/mcp-server/src/render/component-map.ts#renderDialog"
1103
+ ],
1104
+ "addedBy": "s222-m02; decision #2502 ruling 11"
1105
+ },
1052
1106
  {
1053
1107
  "id": "FilterPanel",
1054
1108
  "displayName": "FilterPanel",
@@ -1897,6 +1951,37 @@
1897
1951
  "traits/behavioral/Searchable.trait.yaml"
1898
1952
  ]
1899
1953
  },
1954
+ {
1955
+ "id": "SegmentedControl",
1956
+ "displayName": "SegmentedControl",
1957
+ "baselineMetadata": {
1958
+ "categories": [
1959
+ "primitive"
1960
+ ],
1961
+ "tags": [
1962
+ "choice",
1963
+ "field",
1964
+ "form",
1965
+ "input",
1966
+ "interactive",
1967
+ "primitive",
1968
+ "radio",
1969
+ "segmented-control"
1970
+ ],
1971
+ "contexts": [
1972
+ "form"
1973
+ ],
1974
+ "regions": [
1975
+ "form",
1976
+ "main"
1977
+ ]
1978
+ },
1979
+ "intakeEvidence": [
1980
+ "packages/component-contracts/src/contracts.ts#SegmentedControl",
1981
+ "packages/mcp-server/src/render/component-map.ts#renderSegmentedControl"
1982
+ ],
1983
+ "addedBy": "s223-m02; decision #2527 ruling 10"
1984
+ },
1900
1985
  {
1901
1986
  "id": "Select",
1902
1987
  "displayName": "Select",
@@ -2154,6 +2239,36 @@
2154
2239
  "traits/lifecycle/Stateful.trait.yaml"
2155
2240
  ]
2156
2241
  },
2242
+ {
2243
+ "id": "Switch",
2244
+ "displayName": "Switch",
2245
+ "baselineMetadata": {
2246
+ "categories": [
2247
+ "primitive"
2248
+ ],
2249
+ "tags": [
2250
+ "boolean",
2251
+ "field",
2252
+ "form",
2253
+ "input",
2254
+ "interactive",
2255
+ "primitive",
2256
+ "switch"
2257
+ ],
2258
+ "contexts": [
2259
+ "form"
2260
+ ],
2261
+ "regions": [
2262
+ "form",
2263
+ "main"
2264
+ ]
2265
+ },
2266
+ "intakeEvidence": [
2267
+ "packages/component-contracts/src/contracts.ts#Switch",
2268
+ "packages/mcp-server/src/render/component-map.ts#renderSwitch"
2269
+ ],
2270
+ "addedBy": "s222-m02; decision #2502 ruling 11"
2271
+ },
2157
2272
  {
2158
2273
  "id": "Table",
2159
2274
  "displayName": "Table",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "decisionId": 2054,
3
+ "decisionId": 2527,
4
4
  "disposition": "retain-all-obligations",
5
- "controllingObligationDenominator": 110,
5
+ "controllingObligationDenominator": 114,
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": 114,
8
8
  "approvedRuntimeCensus": null,
9
- "proposedRuntimeCensus": 110,
9
+ "proposedRuntimeCensus": 114,
10
10
  "rows": [
11
11
  {
12
12
  "id": "AddressCollectionPanel",
@@ -646,6 +646,25 @@
646
646
  "implementationStatus": "implemented-evidence-complete",
647
647
  "compatibilityNote": "Retain the named public ID and existing HTML discovery contract. Governed framework implementation and measurements are linked; classification remains a proposal."
648
648
  },
649
+ {
650
+ "id": "Combobox",
651
+ "proposedClassification": "native",
652
+ "approvalState": "pending-approval",
653
+ "evidence": [
654
+ "packages/mcp-server/src/render/component-map.ts#renderCombobox",
655
+ "packages/components-react/evidence/react-readiness.v1.json#Combobox",
656
+ "packages/components-vue/evidence/vue-readiness.v1.json#Combobox",
657
+ "packages/component-contracts/src/contracts.ts#Combobox"
658
+ ],
659
+ "implementationStatus": "implemented-evidence-complete",
660
+ "proposedResolution": {
661
+ "surface": "react+vue+html",
662
+ "implementation": "Combobox",
663
+ "source": "packages/component-contracts/src/contracts.ts",
664
+ "publicIdRetained": true
665
+ },
666
+ "compatibilityNote": "New public identity added by decision #2527 (ruling 11). Governed framework implementation and measurements are linked; classification remains a proposal."
667
+ },
649
668
  {
650
669
  "id": "CommunicationDetailPanel",
651
670
  "proposedClassification": "recipe",
@@ -726,6 +745,25 @@
726
745
  "implementationStatus": "implemented-evidence-complete",
727
746
  "compatibilityNote": "Retain the named public ID and existing HTML discovery contract. Governed framework implementation and measurements are linked; classification remains a proposal."
728
747
  },
748
+ {
749
+ "id": "Dialog",
750
+ "proposedClassification": "native",
751
+ "approvalState": "pending-approval",
752
+ "evidence": [
753
+ "packages/mcp-server/src/render/component-map.ts#renderDialog",
754
+ "packages/components-react/evidence/react-readiness.v1.json#Dialog",
755
+ "packages/components-vue/evidence/vue-readiness.v1.json#Dialog",
756
+ "packages/component-contracts/src/contracts.ts#Dialog"
757
+ ],
758
+ "implementationStatus": "implemented-evidence-complete",
759
+ "proposedResolution": {
760
+ "surface": "react+vue+html",
761
+ "implementation": "Dialog",
762
+ "source": "packages/component-contracts/src/contracts.ts",
763
+ "publicIdRetained": true
764
+ },
765
+ "compatibilityNote": "New public identity added by decision #2502 (ruling 11). Governed framework implementation and measurements are linked; classification remains a proposal."
766
+ },
729
767
  {
730
768
  "id": "FilterPanel",
731
769
  "proposedClassification": "recipe",
@@ -1340,6 +1378,25 @@
1340
1378
  "implementationStatus": "implemented-evidence-complete",
1341
1379
  "compatibilityNote": "Retain the named public ID and existing HTML discovery contract. Governed framework implementation and measurements are linked; classification remains a proposal."
1342
1380
  },
1381
+ {
1382
+ "id": "SegmentedControl",
1383
+ "proposedClassification": "native",
1384
+ "approvalState": "pending-approval",
1385
+ "evidence": [
1386
+ "packages/mcp-server/src/render/component-map.ts#renderSegmentedControl",
1387
+ "packages/components-react/evidence/react-readiness.v1.json#SegmentedControl",
1388
+ "packages/components-vue/evidence/vue-readiness.v1.json#SegmentedControl",
1389
+ "packages/component-contracts/src/contracts.ts#SegmentedControl"
1390
+ ],
1391
+ "implementationStatus": "implemented-evidence-complete",
1392
+ "proposedResolution": {
1393
+ "surface": "react+vue+html",
1394
+ "implementation": "SegmentedControl",
1395
+ "source": "packages/component-contracts/src/contracts.ts",
1396
+ "publicIdRetained": true
1397
+ },
1398
+ "compatibilityNote": "New public identity added by decision #2527 (ruling 10). Governed framework implementation and measurements are linked; classification remains a proposal."
1399
+ },
1343
1400
  {
1344
1401
  "id": "Select",
1345
1402
  "proposedClassification": "native",
@@ -1501,6 +1558,25 @@
1501
1558
  "implementationStatus": "implemented-evidence-complete",
1502
1559
  "compatibilityNote": "Retain the named public ID and existing HTML discovery contract. Governed framework implementation and measurements are linked; classification remains a proposal."
1503
1560
  },
1561
+ {
1562
+ "id": "Switch",
1563
+ "proposedClassification": "native",
1564
+ "approvalState": "pending-approval",
1565
+ "evidence": [
1566
+ "packages/mcp-server/src/render/component-map.ts#renderSwitch",
1567
+ "packages/components-react/evidence/react-readiness.v1.json#Switch",
1568
+ "packages/components-vue/evidence/vue-readiness.v1.json#Switch",
1569
+ "packages/component-contracts/src/contracts.ts#Switch"
1570
+ ],
1571
+ "implementationStatus": "implemented-evidence-complete",
1572
+ "proposedResolution": {
1573
+ "surface": "react+vue+html",
1574
+ "implementation": "Switch",
1575
+ "source": "packages/component-contracts/src/contracts.ts",
1576
+ "publicIdRetained": true
1577
+ },
1578
+ "compatibilityNote": "New public identity added by decision #2502 (ruling 11). Governed framework implementation and measurements are linked; classification remains a proposal."
1579
+ },
1504
1580
  {
1505
1581
  "id": "Table",
1506
1582
  "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
+ }
@@ -0,0 +1,205 @@
1
+ {
2
+ "version": "1.1.0",
3
+ "generated_at": "2025-10-27T00:00:00Z",
4
+ "domains": {
5
+ "subscription": {
6
+ "future": {
7
+ "description": "Subscription is scheduled but not yet active.",
8
+ "chip": {
9
+ "foreground": "color.text.info",
10
+ "background": "color.background.info.subtle",
11
+ "border": "color.border.info",
12
+ "icon": "icon.status.scheduled"
13
+ },
14
+ "banner": {
15
+ "foreground": "color.text.info",
16
+ "background": "color.background.surface.default",
17
+ "border": "color.border.info",
18
+ "icon": "icon.status.scheduled"
19
+ }
20
+ },
21
+ "trialing": {
22
+ "description": "Subscription is in a trial period before billing begins.",
23
+ "chip": {
24
+ "foreground": "color.text.accent",
25
+ "background": "color.background.accent.subtle",
26
+ "border": "color.border.accent",
27
+ "icon": "icon.status.trial"
28
+ },
29
+ "banner": {
30
+ "foreground": "color.text.accent",
31
+ "background": "color.background.surface.default",
32
+ "border": "color.border.accent",
33
+ "icon": "icon.status.trial"
34
+ }
35
+ },
36
+ "active": {
37
+ "description": "Subscription is paid and service is provisioned.",
38
+ "chip": {
39
+ "foreground": "color.text.positive",
40
+ "background": "color.background.positive.subtle",
41
+ "border": "color.border.positive",
42
+ "icon": "icon.status.success"
43
+ },
44
+ "banner": {
45
+ "foreground": "color.text.positive",
46
+ "background": "color.background.surface.default",
47
+ "border": "color.border.positive",
48
+ "icon": "icon.status.success"
49
+ }
50
+ },
51
+ "paused": {
52
+ "description": "Billing paused temporarily by finance or customer request.",
53
+ "chip": {
54
+ "foreground": "color.text.neutral",
55
+ "background": "color.background.neutral.subtle",
56
+ "border": "color.border.neutral",
57
+ "icon": "icon.status.paused"
58
+ },
59
+ "banner": {
60
+ "foreground": "color.text.neutral",
61
+ "background": "color.background.surface.muted",
62
+ "border": "color.border.neutral",
63
+ "icon": "icon.status.paused"
64
+ }
65
+ },
66
+ "pending_cancellation": {
67
+ "description": "Subscription will cancel at period end but remains active now.",
68
+ "chip": {
69
+ "foreground": "color.text.info",
70
+ "background": "color.background.info.subtle",
71
+ "border": "color.border.info",
72
+ "icon": "icon.status.pending"
73
+ },
74
+ "banner": {
75
+ "foreground": "color.text.info",
76
+ "background": "color.background.surface.default",
77
+ "border": "color.border.info",
78
+ "icon": "icon.status.pending"
79
+ }
80
+ },
81
+ "past_due": {
82
+ "description": "Renewal payment failed; smart retries ongoing and access retained during the grace window.",
83
+ "chip": {
84
+ "foreground": "color.text.danger",
85
+ "background": "color.background.danger.subtle",
86
+ "border": "color.border.danger",
87
+ "icon": "icon.status.warning"
88
+ },
89
+ "banner": {
90
+ "foreground": "color.text.onbold",
91
+ "background": "color.background.danger.bold",
92
+ "border": "color.border.danger",
93
+ "icon": "icon.status.warning"
94
+ }
95
+ },
96
+ "unpaid": {
97
+ "description": "Payment retries exhausted; service access revoked.",
98
+ "chip": {
99
+ "foreground": "color.text.danger",
100
+ "background": "color.background.danger.subtle",
101
+ "border": "color.border.danger",
102
+ "icon": "icon.status.error"
103
+ },
104
+ "banner": {
105
+ "foreground": "color.text.onbold",
106
+ "background": "color.background.danger.bold",
107
+ "border": "color.border.danger",
108
+ "icon": "icon.status.error"
109
+ }
110
+ },
111
+ "terminated": {
112
+ "description": "Subscription ended; service access revoked and billing stopped.",
113
+ "chip": {
114
+ "foreground": "color.text.disabled",
115
+ "background": "color.background.disabled",
116
+ "border": "color.border.disabled",
117
+ "icon": "icon.status.canceled"
118
+ },
119
+ "banner": {
120
+ "foreground": "color.text.neutral",
121
+ "background": "color.background.neutral.subtle",
122
+ "border": "color.border.neutral",
123
+ "icon": "icon.status.canceled"
124
+ }
125
+ }
126
+ },
127
+ "invoice": {
128
+ "draft": {
129
+ "description": "Invoice is editable and not yet finalized.",
130
+ "chip": {
131
+ "foreground": "color.text.neutral",
132
+ "background": "color.background.neutral.subtle",
133
+ "border": "color.border.neutral",
134
+ "icon": "icon.status.draft"
135
+ },
136
+ "banner": {
137
+ "foreground": "color.text.neutral",
138
+ "background": "color.background.surface.muted",
139
+ "border": "color.border.neutral",
140
+ "icon": "icon.status.draft"
141
+ }
142
+ },
143
+ "posted": {
144
+ "description": "Invoice finalized with terms before collection.",
145
+ "chip": {
146
+ "foreground": "color.text.info",
147
+ "background": "color.background.info.subtle",
148
+ "border": "color.border.info",
149
+ "icon": "icon.status.pending"
150
+ },
151
+ "banner": {
152
+ "foreground": "color.text.info",
153
+ "background": "color.background.surface.default",
154
+ "border": "color.border.info",
155
+ "icon": "icon.status.pending"
156
+ }
157
+ },
158
+ "paid": {
159
+ "description": "Invoice collected successfully in full.",
160
+ "chip": {
161
+ "foreground": "color.text.positive",
162
+ "background": "color.background.positive.subtle",
163
+ "border": "color.border.positive",
164
+ "icon": "icon.status.success"
165
+ },
166
+ "banner": {
167
+ "foreground": "color.text.positive",
168
+ "background": "color.background.surface.default",
169
+ "border": "color.border.positive",
170
+ "icon": "icon.status.success"
171
+ }
172
+ },
173
+ "past_due": {
174
+ "description": "Invoice is unpaid past its due date.",
175
+ "chip": {
176
+ "foreground": "color.text.danger",
177
+ "background": "color.background.danger.subtle",
178
+ "border": "color.border.danger",
179
+ "icon": "icon.status.error"
180
+ },
181
+ "banner": {
182
+ "foreground": "color.text.onbold",
183
+ "background": "color.background.danger.bold",
184
+ "border": "color.border.danger",
185
+ "icon": "icon.status.error"
186
+ }
187
+ },
188
+ "void": {
189
+ "description": "Invoice canceled and no longer payable.",
190
+ "chip": {
191
+ "foreground": "color.text.disabled",
192
+ "background": "color.background.disabled",
193
+ "border": "color.border.disabled",
194
+ "icon": "icon.status.void"
195
+ },
196
+ "banner": {
197
+ "foreground": "color.text.neutral",
198
+ "background": "color.background.neutral.subtle",
199
+ "border": "color.border.neutral",
200
+ "icon": "icon.status.void"
201
+ }
202
+ }
203
+ }
204
+ }
205
+ }