@amedia/brick-mcp 0.1.6 → 0.1.8

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.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: brick-countdown
3
- version: 3.0.0
4
- selector: brick-countdown-v2
3
+ version: 3.0.1
4
+ selector: brick-countdown-v3
5
5
  category: Feedback
6
6
  tags: [countdown, timer, animation, teaser, time-based]
7
7
  use_cases:
@@ -36,32 +36,32 @@ An animated countdown component that displays time remaining until a specified d
36
36
  ### Basic Countdown
37
37
 
38
38
  ```html
39
- <brick-countdown-v2 data-date="1713515269513"></brick-countdown-v2>
39
+ <brick-countdown-v3 data-date="1713515269513"></brick-countdown-v3>
40
40
  ```
41
41
 
42
42
  ### With Custom Text
43
43
 
44
44
  ```html
45
- <brick-countdown-v2
45
+ <brick-countdown-v3
46
46
  data-date="1713515269513"
47
47
  data-text="Starts in"
48
- ></brick-countdown-v2>
48
+ ></brick-countdown-v3>
49
49
  ```
50
50
 
51
51
  ### With Locale
52
52
 
53
53
  ```html
54
- <brick-countdown-v2
54
+ <brick-countdown-v3
55
55
  data-date="1713515269513"
56
56
  data-text="Tid igjen"
57
57
  data-locale="nn-NO"
58
- ></brick-countdown-v2>
58
+ ></brick-countdown-v3>
59
59
  ```
60
60
 
61
61
  ### JavaScript Creation
62
62
 
63
63
  ```javascript
64
- const el = document.createElement('brick-countdown-v2');
64
+ const el = document.createElement('brick-countdown-v3');
65
65
  el.dataset.date = '1713515269513';
66
66
  el.dataset.text = 'Event starts in';
67
67
  el.dataset.locale = 'nb-NO';
@@ -138,11 +138,11 @@ The component follows the IETF BCP 47 language tag standard for locale values.
138
138
 
139
139
  ```html
140
140
  <brick-teaser-v9>
141
- <brick-countdown-v2
141
+ <brick-countdown-v3
142
142
  data-date="1713515269513"
143
143
  data-text="Direktesending starter om"
144
144
  data-locale="nb-NO"
145
- ></brick-countdown-v2>
145
+ ></brick-countdown-v3>
146
146
  <!-- Other teaser content -->
147
147
  </brick-teaser-v9>
148
148
  ```
@@ -151,7 +151,7 @@ The component follows the IETF BCP 47 language tag standard for locale values.
151
151
 
152
152
  ```javascript
153
153
  function createCountdown(targetDate, text) {
154
- const countdown = document.createElement('brick-countdown-v2');
154
+ const countdown = document.createElement('brick-countdown-v3');
155
155
  countdown.dataset.date = targetDate.getTime().toString();
156
156
  countdown.dataset.text = text;
157
157
  return countdown;
@@ -163,7 +163,7 @@ const countdownEl = createCountdown(eventDate, 'New Year in');
163
163
 
164
164
  ## Technical Details
165
165
 
166
- - **Custom Element**: `brick-countdown-v2`
166
+ - **Custom Element**: `brick-countdown-v3`
167
167
  - **Base Class**: BrickElement
168
168
  - **Dependencies**: `@amedia/brick-template`, `@amedia/brick-tokens`
169
169
  - **Renders as**: Custom element with `<time>` element inside
@@ -180,7 +180,7 @@ const countdownEl = createCountdown(eventDate, 'New Year in');
180
180
 
181
181
  ## Version
182
182
 
183
- Current version: 3.0.0 (pending release)
183
+ Current version: 3.0.1
184
184
 
185
185
  ## Breaking Changes in v3.0.0
186
186
 
@@ -1,7 +1,7 @@
1
1
  [
2
2
  {
3
3
  "name": "brick-alt-teaser",
4
- "version": "8.1.13",
4
+ "version": "8.1.17",
5
5
  "selector": "brick-alt-teaser-v8",
6
6
  "category": "Display",
7
7
  "tags": [
@@ -10,7 +10,7 @@
10
10
  },
11
11
  {
12
12
  "name": "brick-avatar",
13
- "version": "0.2.54",
13
+ "version": "0.2.55",
14
14
  "selector": "brick-avatar-v0",
15
15
  "description": "brick-avatar component",
16
16
  "category": "Display",
@@ -20,7 +20,7 @@
20
20
  },
21
21
  {
22
22
  "name": "brick-button",
23
- "version": "9.4.12",
23
+ "version": "9.4.13",
24
24
  "selector": "brick-button-v9",
25
25
  "category": "Forms",
26
26
  "tags": [
@@ -30,13 +30,13 @@
30
30
  },
31
31
  {
32
32
  "name": "brick-byline",
33
- "version": "1.0.16",
33
+ "version": "1.0.17",
34
34
  "selector": "brick-byline-v1",
35
35
  "description": "brick-byline component"
36
36
  },
37
37
  {
38
38
  "name": "brick-card",
39
- "version": "7.3.26",
39
+ "version": "7.3.27",
40
40
  "selector": "brick-card-v7",
41
41
  "category": "Layout",
42
42
  "tags": [
@@ -45,7 +45,7 @@
45
45
  },
46
46
  {
47
47
  "name": "brick-carousel",
48
- "version": "2.2.15",
48
+ "version": "2.3.0",
49
49
  "selector": "brick-carousel-v2",
50
50
  "description": "Simple carousel for any content passed to it.",
51
51
  "category": "Display",
@@ -65,13 +65,13 @@
65
65
  },
66
66
  {
67
67
  "name": "brick-countdown",
68
- "version": "3.0.0",
68
+ "version": "3.0.2",
69
69
  "selector": "brick-countdown-v3",
70
70
  "description": "brick-countdown component"
71
71
  },
72
72
  {
73
73
  "name": "brick-dialog",
74
- "version": "2.1.9",
74
+ "version": "2.1.10",
75
75
  "selector": "brick-dialog-v2",
76
76
  "description": "brick-dialog component",
77
77
  "category": "Feedback",
@@ -81,7 +81,7 @@
81
81
  },
82
82
  {
83
83
  "name": "brick-expand",
84
- "version": "0.0.20",
84
+ "version": "0.0.22",
85
85
  "selector": "brick-expand-v0",
86
86
  "description": "brick-expand component"
87
87
  },
@@ -97,13 +97,13 @@
97
97
  },
98
98
  {
99
99
  "name": "brick-helloworld",
100
- "version": "2.0.19",
100
+ "version": "2.0.20",
101
101
  "selector": "brick-helloworld-v2",
102
102
  "description": "Brick Hello World component"
103
103
  },
104
104
  {
105
105
  "name": "brick-icon",
106
- "version": "2.3.18",
106
+ "version": "2.3.19",
107
107
  "selector": "brick-icon-v2",
108
108
  "category": "Display",
109
109
  "tags": [
@@ -118,7 +118,7 @@
118
118
  },
119
119
  {
120
120
  "name": "brick-image",
121
- "version": "6.0.21",
121
+ "version": "6.0.22",
122
122
  "selector": "brick-image-v6",
123
123
  "category": "Display",
124
124
  "tags": [
@@ -127,7 +127,7 @@
127
127
  },
128
128
  {
129
129
  "name": "brick-input",
130
- "version": "4.0.0",
130
+ "version": "4.0.1",
131
131
  "selector": "brick-input-v4",
132
132
  "description": "brick-input component",
133
133
  "category": "Forms",
@@ -138,42 +138,42 @@
138
138
  },
139
139
  {
140
140
  "name": "brick-pill",
141
- "version": "10.0.0",
141
+ "version": "10.1.1",
142
142
  "selector": "brick-pill-v10"
143
143
  },
144
144
  {
145
145
  "name": "brick-player",
146
- "version": "2.3.0",
146
+ "version": "2.3.2",
147
147
  "selector": "brick-player-v2",
148
148
  "description": "Component for playing video and audio files"
149
149
  },
150
150
  {
151
151
  "name": "brick-published",
152
- "version": "4.0.17",
152
+ "version": "4.0.18",
153
153
  "selector": "brick-published-v4",
154
154
  "description": "brick-published"
155
155
  },
156
156
  {
157
157
  "name": "brick-share",
158
- "version": "0.3.22",
158
+ "version": "0.3.23",
159
159
  "selector": "brick-share-v0",
160
160
  "description": "brick-share component"
161
161
  },
162
162
  {
163
163
  "name": "brick-stepper",
164
- "version": "1.1.3",
164
+ "version": "1.1.4",
165
165
  "selector": "brick-stepper-v1",
166
166
  "description": "brick-stepper component"
167
167
  },
168
168
  {
169
169
  "name": "brick-tab",
170
- "version": "0.1.24",
170
+ "version": "0.1.25",
171
171
  "selector": "brick-tab-v0",
172
172
  "description": "brick-tab component"
173
173
  },
174
174
  {
175
175
  "name": "brick-tabs",
176
- "version": "0.1.25",
176
+ "version": "0.1.26",
177
177
  "selector": "brick-tabs-v0",
178
178
  "description": "brick-tabs component handling tablist, tabs and tabpanel",
179
179
  "category": "Navigation",
@@ -183,13 +183,13 @@
183
183
  },
184
184
  {
185
185
  "name": "brick-tag",
186
- "version": "0.0.24",
186
+ "version": "0.0.25",
187
187
  "selector": "brick-tag-v0",
188
188
  "description": "brick-tag component"
189
189
  },
190
190
  {
191
191
  "name": "brick-teaser",
192
- "version": "22.0.5",
192
+ "version": "22.0.9",
193
193
  "selector": "brick-teaser-v22",
194
194
  "description": "Teaser component.",
195
195
  "category": "Display",
@@ -199,7 +199,7 @@
199
199
  },
200
200
  {
201
201
  "name": "brick-teaser-player",
202
- "version": "1.1.12",
202
+ "version": "1.1.14",
203
203
  "selector": "brick-teaser-player-v1",
204
204
  "description": "brick-video-teaser component",
205
205
  "category": "Display",
@@ -209,7 +209,7 @@
209
209
  },
210
210
  {
211
211
  "name": "brick-teaser-reels",
212
- "version": "0.4.15",
212
+ "version": "0.4.16",
213
213
  "selector": "brick-teaser-reels-v0",
214
214
  "description": "brick-teaser-reels component",
215
215
  "category": "Display",
@@ -219,7 +219,7 @@
219
219
  },
220
220
  {
221
221
  "name": "brick-textarea",
222
- "version": "2.0.20",
222
+ "version": "2.0.21",
223
223
  "selector": "brick-textarea-v2",
224
224
  "description": "brick-textarea component"
225
225
  },
@@ -231,7 +231,7 @@
231
231
  },
232
232
  {
233
233
  "name": "brick-toast",
234
- "version": "0.1.38",
234
+ "version": "0.1.39",
235
235
  "selector": "brick-toast-v0",
236
236
  "description": "brick-toast component",
237
237
  "category": "Feedback",
@@ -241,13 +241,13 @@
241
241
  },
242
242
  {
243
243
  "name": "brick-toggle",
244
- "version": "3.1.24",
244
+ "version": "3.1.25",
245
245
  "selector": "brick-toggle-v3",
246
246
  "description": "brick-toggle component"
247
247
  },
248
248
  {
249
249
  "name": "brick-tokens",
250
- "version": "6.0.10",
250
+ "version": "6.0.11",
251
251
  "selector": "brick-tokens-v6",
252
252
  "description": "Tokens package",
253
253
  "category": "Utilities",
@@ -257,7 +257,7 @@
257
257
  },
258
258
  {
259
259
  "name": "brick-tooltip",
260
- "version": "1.0.27",
260
+ "version": "1.0.28",
261
261
  "selector": "brick-tooltip-v1",
262
262
  "description": "brick-tooltip component"
263
263
  }
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: brick-countdown
3
- version: 3.0.0
4
- selector: brick-countdown-v2
3
+ version: 3.0.1
4
+ selector: brick-countdown-v3
5
5
  category: Feedback
6
6
  tags: [countdown, timer, animation, teaser, time-based]
7
7
  use_cases:
@@ -36,32 +36,32 @@ An animated countdown component that displays time remaining until a specified d
36
36
  ### Basic Countdown
37
37
 
38
38
  ```html
39
- <brick-countdown-v2 data-date="1713515269513"></brick-countdown-v2>
39
+ <brick-countdown-v3 data-date="1713515269513"></brick-countdown-v3>
40
40
  ```
41
41
 
42
42
  ### With Custom Text
43
43
 
44
44
  ```html
45
- <brick-countdown-v2
45
+ <brick-countdown-v3
46
46
  data-date="1713515269513"
47
47
  data-text="Starts in"
48
- ></brick-countdown-v2>
48
+ ></brick-countdown-v3>
49
49
  ```
50
50
 
51
51
  ### With Locale
52
52
 
53
53
  ```html
54
- <brick-countdown-v2
54
+ <brick-countdown-v3
55
55
  data-date="1713515269513"
56
56
  data-text="Tid igjen"
57
57
  data-locale="nn-NO"
58
- ></brick-countdown-v2>
58
+ ></brick-countdown-v3>
59
59
  ```
60
60
 
61
61
  ### JavaScript Creation
62
62
 
63
63
  ```javascript
64
- const el = document.createElement('brick-countdown-v2');
64
+ const el = document.createElement('brick-countdown-v3');
65
65
  el.dataset.date = '1713515269513';
66
66
  el.dataset.text = 'Event starts in';
67
67
  el.dataset.locale = 'nb-NO';
@@ -138,11 +138,11 @@ The component follows the IETF BCP 47 language tag standard for locale values.
138
138
 
139
139
  ```html
140
140
  <brick-teaser-v9>
141
- <brick-countdown-v2
141
+ <brick-countdown-v3
142
142
  data-date="1713515269513"
143
143
  data-text="Direktesending starter om"
144
144
  data-locale="nb-NO"
145
- ></brick-countdown-v2>
145
+ ></brick-countdown-v3>
146
146
  <!-- Other teaser content -->
147
147
  </brick-teaser-v9>
148
148
  ```
@@ -151,7 +151,7 @@ The component follows the IETF BCP 47 language tag standard for locale values.
151
151
 
152
152
  ```javascript
153
153
  function createCountdown(targetDate, text) {
154
- const countdown = document.createElement('brick-countdown-v2');
154
+ const countdown = document.createElement('brick-countdown-v3');
155
155
  countdown.dataset.date = targetDate.getTime().toString();
156
156
  countdown.dataset.text = text;
157
157
  return countdown;
@@ -163,7 +163,7 @@ const countdownEl = createCountdown(eventDate, 'New Year in');
163
163
 
164
164
  ## Technical Details
165
165
 
166
- - **Custom Element**: `brick-countdown-v2`
166
+ - **Custom Element**: `brick-countdown-v3`
167
167
  - **Base Class**: BrickElement
168
168
  - **Dependencies**: `@amedia/brick-template`, `@amedia/brick-tokens`
169
169
  - **Renders as**: Custom element with `<time>` element inside
@@ -180,7 +180,7 @@ const countdownEl = createCountdown(eventDate, 'New Year in');
180
180
 
181
181
  ## Version
182
182
 
183
- Current version: 3.0.0 (pending release)
183
+ Current version: 3.0.1
184
184
 
185
185
  ## Breaking Changes in v3.0.0
186
186
 
@@ -1,7 +1,7 @@
1
1
  [
2
2
  {
3
3
  "name": "brick-alt-teaser",
4
- "version": "8.1.13",
4
+ "version": "8.1.17",
5
5
  "selector": "brick-alt-teaser-v8",
6
6
  "category": "Display",
7
7
  "tags": [
@@ -10,7 +10,7 @@
10
10
  },
11
11
  {
12
12
  "name": "brick-avatar",
13
- "version": "0.2.54",
13
+ "version": "0.2.55",
14
14
  "selector": "brick-avatar-v0",
15
15
  "description": "brick-avatar component",
16
16
  "category": "Display",
@@ -20,7 +20,7 @@
20
20
  },
21
21
  {
22
22
  "name": "brick-button",
23
- "version": "9.4.12",
23
+ "version": "9.4.13",
24
24
  "selector": "brick-button-v9",
25
25
  "category": "Forms",
26
26
  "tags": [
@@ -30,13 +30,13 @@
30
30
  },
31
31
  {
32
32
  "name": "brick-byline",
33
- "version": "1.0.16",
33
+ "version": "1.0.17",
34
34
  "selector": "brick-byline-v1",
35
35
  "description": "brick-byline component"
36
36
  },
37
37
  {
38
38
  "name": "brick-card",
39
- "version": "7.3.26",
39
+ "version": "7.3.27",
40
40
  "selector": "brick-card-v7",
41
41
  "category": "Layout",
42
42
  "tags": [
@@ -45,7 +45,7 @@
45
45
  },
46
46
  {
47
47
  "name": "brick-carousel",
48
- "version": "2.2.15",
48
+ "version": "2.3.0",
49
49
  "selector": "brick-carousel-v2",
50
50
  "description": "Simple carousel for any content passed to it.",
51
51
  "category": "Display",
@@ -65,13 +65,13 @@
65
65
  },
66
66
  {
67
67
  "name": "brick-countdown",
68
- "version": "3.0.0",
68
+ "version": "3.0.2",
69
69
  "selector": "brick-countdown-v3",
70
70
  "description": "brick-countdown component"
71
71
  },
72
72
  {
73
73
  "name": "brick-dialog",
74
- "version": "2.1.9",
74
+ "version": "2.1.10",
75
75
  "selector": "brick-dialog-v2",
76
76
  "description": "brick-dialog component",
77
77
  "category": "Feedback",
@@ -81,7 +81,7 @@
81
81
  },
82
82
  {
83
83
  "name": "brick-expand",
84
- "version": "0.0.20",
84
+ "version": "0.0.22",
85
85
  "selector": "brick-expand-v0",
86
86
  "description": "brick-expand component"
87
87
  },
@@ -97,13 +97,13 @@
97
97
  },
98
98
  {
99
99
  "name": "brick-helloworld",
100
- "version": "2.0.19",
100
+ "version": "2.0.20",
101
101
  "selector": "brick-helloworld-v2",
102
102
  "description": "Brick Hello World component"
103
103
  },
104
104
  {
105
105
  "name": "brick-icon",
106
- "version": "2.3.18",
106
+ "version": "2.3.19",
107
107
  "selector": "brick-icon-v2",
108
108
  "category": "Display",
109
109
  "tags": [
@@ -118,7 +118,7 @@
118
118
  },
119
119
  {
120
120
  "name": "brick-image",
121
- "version": "6.0.21",
121
+ "version": "6.0.22",
122
122
  "selector": "brick-image-v6",
123
123
  "category": "Display",
124
124
  "tags": [
@@ -127,7 +127,7 @@
127
127
  },
128
128
  {
129
129
  "name": "brick-input",
130
- "version": "4.0.0",
130
+ "version": "4.0.1",
131
131
  "selector": "brick-input-v4",
132
132
  "description": "brick-input component",
133
133
  "category": "Forms",
@@ -138,42 +138,42 @@
138
138
  },
139
139
  {
140
140
  "name": "brick-pill",
141
- "version": "10.0.0",
141
+ "version": "10.1.1",
142
142
  "selector": "brick-pill-v10"
143
143
  },
144
144
  {
145
145
  "name": "brick-player",
146
- "version": "2.3.0",
146
+ "version": "2.3.2",
147
147
  "selector": "brick-player-v2",
148
148
  "description": "Component for playing video and audio files"
149
149
  },
150
150
  {
151
151
  "name": "brick-published",
152
- "version": "4.0.17",
152
+ "version": "4.0.18",
153
153
  "selector": "brick-published-v4",
154
154
  "description": "brick-published"
155
155
  },
156
156
  {
157
157
  "name": "brick-share",
158
- "version": "0.3.22",
158
+ "version": "0.3.23",
159
159
  "selector": "brick-share-v0",
160
160
  "description": "brick-share component"
161
161
  },
162
162
  {
163
163
  "name": "brick-stepper",
164
- "version": "1.1.3",
164
+ "version": "1.1.4",
165
165
  "selector": "brick-stepper-v1",
166
166
  "description": "brick-stepper component"
167
167
  },
168
168
  {
169
169
  "name": "brick-tab",
170
- "version": "0.1.24",
170
+ "version": "0.1.25",
171
171
  "selector": "brick-tab-v0",
172
172
  "description": "brick-tab component"
173
173
  },
174
174
  {
175
175
  "name": "brick-tabs",
176
- "version": "0.1.25",
176
+ "version": "0.1.26",
177
177
  "selector": "brick-tabs-v0",
178
178
  "description": "brick-tabs component handling tablist, tabs and tabpanel",
179
179
  "category": "Navigation",
@@ -183,13 +183,13 @@
183
183
  },
184
184
  {
185
185
  "name": "brick-tag",
186
- "version": "0.0.24",
186
+ "version": "0.0.25",
187
187
  "selector": "brick-tag-v0",
188
188
  "description": "brick-tag component"
189
189
  },
190
190
  {
191
191
  "name": "brick-teaser",
192
- "version": "22.0.5",
192
+ "version": "22.0.9",
193
193
  "selector": "brick-teaser-v22",
194
194
  "description": "Teaser component.",
195
195
  "category": "Display",
@@ -199,7 +199,7 @@
199
199
  },
200
200
  {
201
201
  "name": "brick-teaser-player",
202
- "version": "1.1.12",
202
+ "version": "1.1.14",
203
203
  "selector": "brick-teaser-player-v1",
204
204
  "description": "brick-video-teaser component",
205
205
  "category": "Display",
@@ -209,7 +209,7 @@
209
209
  },
210
210
  {
211
211
  "name": "brick-teaser-reels",
212
- "version": "0.4.15",
212
+ "version": "0.4.16",
213
213
  "selector": "brick-teaser-reels-v0",
214
214
  "description": "brick-teaser-reels component",
215
215
  "category": "Display",
@@ -219,7 +219,7 @@
219
219
  },
220
220
  {
221
221
  "name": "brick-textarea",
222
- "version": "2.0.20",
222
+ "version": "2.0.21",
223
223
  "selector": "brick-textarea-v2",
224
224
  "description": "brick-textarea component"
225
225
  },
@@ -231,7 +231,7 @@
231
231
  },
232
232
  {
233
233
  "name": "brick-toast",
234
- "version": "0.1.38",
234
+ "version": "0.1.39",
235
235
  "selector": "brick-toast-v0",
236
236
  "description": "brick-toast component",
237
237
  "category": "Feedback",
@@ -241,13 +241,13 @@
241
241
  },
242
242
  {
243
243
  "name": "brick-toggle",
244
- "version": "3.1.24",
244
+ "version": "3.1.25",
245
245
  "selector": "brick-toggle-v3",
246
246
  "description": "brick-toggle component"
247
247
  },
248
248
  {
249
249
  "name": "brick-tokens",
250
- "version": "6.0.10",
250
+ "version": "6.0.11",
251
251
  "selector": "brick-tokens-v6",
252
252
  "description": "Tokens package",
253
253
  "category": "Utilities",
@@ -257,7 +257,7 @@
257
257
  },
258
258
  {
259
259
  "name": "brick-tooltip",
260
- "version": "1.0.27",
260
+ "version": "1.0.28",
261
261
  "selector": "brick-tooltip-v1",
262
262
  "description": "brick-tooltip component"
263
263
  }
package/dist/http.js CHANGED
@@ -119,12 +119,16 @@ async function getComponentDocs(input) {
119
119
  // src/tools/getDesignTokens.ts
120
120
  import { readFile as readFile3 } from "node:fs/promises";
121
121
  import { join as join4 } from "node:path";
122
+ var CATEGORY_PREFIXES = {
123
+ colors: ["color."],
124
+ spacing: ["spacing."],
125
+ typography: ["typography."],
126
+ shadows: ["box-shadow."],
127
+ borders: ["border-width.", "border-radius.", "border."]
128
+ };
122
129
  function getTokensDataPath() {
123
130
  return join4(getDataPath(), "tokens.json");
124
131
  }
125
- function getDocumentationDataPath() {
126
- return join4(getDataPath(), "tokens-documentation.json");
127
- }
128
132
  async function loadAllTokens() {
129
133
  try {
130
134
  const dataPath = getTokensDataPath();
@@ -135,44 +139,42 @@ async function loadAllTokens() {
135
139
  return [];
136
140
  }
137
141
  }
138
- async function loadDocumentation() {
139
- try {
140
- const dataPath = getDocumentationDataPath();
141
- const content = await readFile3(dataPath, "utf-8");
142
- return JSON.parse(content);
143
- } catch (error) {
144
- console.error("Error loading documentation data:", error);
145
- return {};
142
+ function tokenMatchesCategory(token, category) {
143
+ const prefixes = CATEGORY_PREFIXES[category];
144
+ if (!prefixes)
145
+ return false;
146
+ const path = token.path.toLowerCase();
147
+ return prefixes.some((prefix) => path.startsWith(prefix));
148
+ }
149
+ function formatTokensCompact(tokens) {
150
+ return tokens.map((t) => {
151
+ const base = `${t.cssVariable}: ${t.value}`;
152
+ return t.description ? `${base} \u2014 ${t.description}` : base;
153
+ }).join("\n");
154
+ }
155
+ function buildCategorySummary(allTokens) {
156
+ const lines = ["Available token categories:"];
157
+ for (const category of Object.keys(CATEGORY_PREFIXES)) {
158
+ const matching = allTokens.filter((t) => tokenMatchesCategory(t, category));
159
+ const count = matching.length;
160
+ const examples = matching.slice(0, 3).map((t) => t.path).join(", ");
161
+ const suffix = examples ? ` (${examples}, ...)` : "";
162
+ lines.push(`- ${category}: ${count} tokens${suffix}`);
146
163
  }
164
+ lines.push("", "Call with a specific category to see tokens.");
165
+ return lines.join("\n");
147
166
  }
148
167
  async function getDesignTokens(input) {
149
168
  const allTokens = await loadAllTokens();
150
- const documentation = await loadDocumentation();
151
- let filteredTokens = allTokens;
152
- if (input.category) {
153
- filteredTokens = filteredTokens.filter((token) => {
154
- const path = token.path.toLowerCase();
155
- switch (input.category) {
156
- case "colors":
157
- return path.startsWith("color.");
158
- case "spacing":
159
- return path.startsWith("spacing.");
160
- case "typography":
161
- return path.startsWith("typography.");
162
- case "shadows":
163
- return path.startsWith("box-shadow.");
164
- case "borders":
165
- return path.startsWith("border-width.") || path.startsWith("border-radius.") || path.startsWith("border.");
166
- default:
167
- return false;
168
- }
169
- });
169
+ if (!input.category) {
170
+ return buildCategorySummary(allTokens);
170
171
  }
171
- return {
172
- tokens: filteredTokens,
173
- documentation,
174
- note: 'The "value" field shows example values from one theme. Actual values vary across different themes (alfa, bravo, charlie, nettavisen, alt). Use the "cssVariable" field for theme-aware styling.'
175
- };
172
+ const filteredTokens = allTokens.filter(
173
+ (t) => tokenMatchesCategory(t, input.category)
174
+ );
175
+ const header = `${input.category} tokens (${filteredTokens.length} tokens). Values shown are examples from one theme. Actual values vary across themes (alfa, bravo, charlie, nettavisen, alt). Use the CSS variable for theme-aware styling.
176
+ `;
177
+ return header + formatTokensCompact(filteredTokens);
176
178
  }
177
179
 
178
180
  // src/tools/listComponents.ts
@@ -251,7 +253,7 @@ function createServer() {
251
253
  content: [
252
254
  {
253
255
  type: "text",
254
- text: JSON.stringify(result, null, 2)
256
+ text: result
255
257
  }
256
258
  ]
257
259
  };
package/dist/http.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/http.ts", "../src/server.ts", "../src/tools/getComponentDocs.ts", "../src/utils/dataPath.ts", "../src/extractors/packageScanner.ts", "../src/tools/getDesignTokens.ts", "../src/tools/listComponents.ts"],
4
- "sourcesContent": ["/**\n * HTTP server entry point for local development only\n * Uses Fastify and SSE transport for MCP communication\n */\n\nimport cors from '@fastify/cors';\nimport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';\nimport Fastify from 'fastify';\n\nimport { createServer } from './server.ts';\n\nconst PORT = 3000;\nconst HOST = 'localhost';\n\nconst fastify = Fastify({\n logger: {\n level: 'info',\n },\n});\n\n// Store active transports and servers by sessionId\nconst activeTransports = new Map<string, SSEServerTransport>();\nconst activeMcpServers = new Map<string, ReturnType<typeof createServer>>();\n\n// Enable CORS for local development\nawait fastify.register(cors, {\n origin: true,\n credentials: true,\n});\n\n// Health check endpoint\nfastify.get('/health', async () => {\n return { status: 'ok' };\n});\n\n// SSE endpoint for MCP communication\nfastify.get('/sse', async (_request, reply) => {\n // Prevent Fastify from automatically sending a response\n reply.hijack();\n\n // Create a new MCP server instance for this connection\n const mcpServer = createServer();\n\n // Create SSE transport (this will handle headers internally)\n const transport = new SSEServerTransport('/message', reply.raw);\n\n // Handle the SSE connection (this calls transport.start() which writes headers)\n await mcpServer.connect(transport);\n\n // Store the transport and server by sessionId for POST message handling\n // The sessionId is available after the transport starts via the public getter\n const sessionId = transport.sessionId;\n activeTransports.set(sessionId, transport);\n activeMcpServers.set(sessionId, mcpServer);\n\n // Clean up when the connection closes\n reply.raw.on('close', async () => {\n activeTransports.delete(sessionId);\n const server = activeMcpServers.get(sessionId);\n if (server) {\n await server.close();\n activeMcpServers.delete(sessionId);\n }\n });\n});\n\n// POST endpoint for messages\nfastify.post<{\n Querystring: { sessionId: string };\n}>('/message', async (request, reply) => {\n // Prevent Fastify from automatically sending a response\n reply.hijack();\n\n // Extract sessionId from query parameters (now properly typed)\n const { sessionId } = request.query;\n\n // Find the transport for this session\n const transport = activeTransports.get(sessionId);\n\n if (!transport) {\n reply.raw.writeHead(404, { 'Content-Type': 'application/json' });\n reply.raw.end(JSON.stringify({ error: 'Session not found' }));\n return;\n }\n\n // Let the transport handle the POST message\n await transport.handlePostMessage(request.raw, reply.raw, request.body);\n});\n\n// Start the server\ntry {\n await fastify.listen({ port: PORT, host: HOST });\n console.log(`Brick MCP HTTP server listening on http://${HOST}:${PORT}`);\n console.log(`SSE endpoint: http://${HOST}:${PORT}/sse`);\n} catch (err) {\n fastify.log.error(err);\n process.exit(1);\n}\n", "/**\n * MCP server setup and registration\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport { getComponentDocs } from './tools/getComponentDocs.ts';\nimport { getDesignTokens } from './tools/getDesignTokens.ts';\nimport { listComponents } from './tools/listComponents.ts';\n\n/**\n * Create and configure the MCP server\n */\nexport function createServer(): McpServer {\n // Create an MCP server\n const server = new McpServer({\n name: 'brick-design-system',\n version: '1.0.0',\n });\n\n // Register list-components tool\n server.registerTool(\n 'list-components',\n {\n title: 'List Brick Components',\n description:\n 'List all available Brick components with metadata. Optionally filter by category, tag, or name.',\n inputSchema: z.object({\n filter: z\n .string()\n .optional()\n .describe('Optional filter by category, tag, or name'),\n }),\n } as const,\n async ({ filter }: { filter?: string }) => {\n const result = await listComponents({ filter });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register get-component-docs tool\n server.registerTool(\n 'get-component-docs',\n {\n title: 'Get Component Documentation',\n description:\n 'Retrieve detailed documentation for specific Brick component(s) including props, events, examples, and accessibility information.',\n inputSchema: z.object({\n components: z\n .array(z.string())\n .describe(\n 'Array of component names (e.g., [\"brick-button\", \"brick-modal\"])'\n ),\n }),\n } as const,\n async ({ components }: { components: string[] }) => {\n const result = await getComponentDocs({ components });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register get-design-tokens tool\n server.registerTool(\n 'get-design-tokens',\n {\n title: 'Get Design Tokens',\n description:\n 'Access design tokens from brick-tokens. Optionally filter by category (colors, spacing, typography, shadows, borders).',\n inputSchema: z.object({\n category: z\n .enum(['colors', 'spacing', 'typography', 'shadows', 'borders'])\n .optional()\n .describe('Filter tokens by category'),\n }),\n } as const,\n async ({\n category,\n }: {\n category?: 'colors' | 'spacing' | 'typography' | 'shadows' | 'borders';\n }) => {\n const result = await getDesignTokens({ category });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n return server;\n}\n", "/**\n * Get Component Docs tool implementation\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getDataPath } from '../utils/dataPath.ts';\nimport { loadComponentData } from '../extractors/packageScanner.ts';\n\nexport interface GetComponentDocsInput {\n components: string[]; // e.g., [\"brick-button\", \"brick-modal\"]\n}\n\nexport interface GetComponentDocsOutput {\n docs: string[];\n}\n\n/**\n * Load markdown documentation for a component\n */\nasync function loadComponentMarkdown(\n componentName: string\n): Promise<string | undefined> {\n try {\n const markdownPath = join(\n getDataPath(),\n 'components',\n `${componentName}.md`\n );\n const content = await readFile(markdownPath, 'utf-8');\n return content;\n } catch (error) {\n console.error(`Error loading markdown for ${componentName}:`, error);\n return undefined;\n }\n}\n\n/**\n * Get detailed documentation for specific component(s)\n */\nexport async function getComponentDocs(\n input: GetComponentDocsInput\n): Promise<GetComponentDocsOutput> {\n // Load markdown documentation for each requested component\n const docsPromises = input.components.map(async (componentName) => {\n const md = await loadComponentMarkdown(componentName);\n if (!md) {\n const json = await loadComponentData(componentName);\n return json ? JSON.stringify(json) : undefined;\n }\n return md;\n });\n\n const docsResults = await Promise.all(docsPromises);\n\n // Filter out any components that failed to load\n const docs = docsResults.filter((doc): doc is string => doc !== undefined);\n\n return { docs };\n}\n", "/**\n * Utility for finding the data directory path\n * Works both in development (from src/) and production (from dist/)\n */\n\nimport { accessSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Get the path to the data directory\n * When running from dist/, looks for dist/data\n * When running from src/, looks for package root data\n */\nexport function getDataPath(): string {\n const currentFilePath = fileURLToPath(import.meta.url);\n let dir = dirname(currentFilePath);\n\n // First check if there's a data directory in the same parent as the current file\n // This handles the dist/data case when running from dist/\n const localDataPath = join(dir, 'data');\n try {\n accessSync(localDataPath);\n return localDataPath;\n } catch {\n // Continue to package root search\n }\n\n // Walk up the directory tree to find package root (where package.json exists)\n for (let i = 0; i < 5; i++) {\n try {\n const testPath = join(dir, 'package.json');\n accessSync(testPath);\n return join(dir, 'data');\n } catch {\n // Go up one level\n const parent = dirname(dir);\n if (parent === dir) break; // Reached filesystem root\n dir = parent;\n }\n }\n\n return join(dirname(currentFilePath), '..', '..', 'data');\n}\n", "/**\n * Package scanner for discovering Brick components\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { type BrickComponent, type BrickComponentMetadata } from '../types.ts';\nimport { getDataPath } from '../utils/dataPath.ts';\n\n/**\n * Load all component metadata (lightweight, for listing)\n */\nexport async function scanAllPackages(): Promise<BrickComponentMetadata[]> {\n try {\n const metadataPath = join(getDataPath(), 'components-metadata.json');\n const content = await readFile(metadataPath, 'utf-8');\n const metadata: BrickComponentMetadata[] = JSON.parse(content);\n return metadata;\n } catch (error) {\n console.error('Error loading component metadata:', error);\n return [];\n }\n}\n\n/**\n * Load full component data for a specific component\n */\nexport async function loadComponentData(\n componentName: string\n): Promise<BrickComponent | undefined> {\n try {\n const componentPath = join(\n getDataPath(),\n 'components',\n `${componentName}.json`\n );\n const content = await readFile(componentPath, 'utf-8');\n const component: BrickComponent = JSON.parse(content);\n return component;\n } catch (error) {\n console.error(`Error loading component data for ${componentName}:`, error);\n return undefined;\n }\n}\n\n/**\n * Filter components by category or tag\n */\nexport function filterComponents(\n components: BrickComponentMetadata[],\n filter?: string\n): BrickComponentMetadata[] {\n if (!filter) {\n return components;\n }\n\n const filterLower = filter.toLowerCase();\n\n return components.filter((component) => {\n // Match against name\n if (component.name.toLowerCase().includes(filterLower)) {\n return true;\n }\n\n // Match against category\n if (component.category?.toLowerCase().includes(filterLower)) {\n return true;\n }\n\n // Match against tags\n if (\n component.tags?.some((tag) => tag.toLowerCase().includes(filterLower))\n ) {\n return true;\n }\n\n return false;\n });\n}\n", "/**\n * Get Design Tokens tool implementation\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getDataPath } from '../utils/dataPath.ts';\n\nexport interface DesignToken {\n path: string;\n name: string;\n type: string;\n value: string;\n description?: string;\n cssVariable: string;\n}\n\nexport interface GetDesignTokensInput {\n category?: 'colors' | 'spacing' | 'typography' | 'shadows' | 'borders';\n}\n\nexport interface TokensDocumentation {\n anOverview?: string;\n formats?: string;\n naming?: string;\n usage?: string;\n}\n\nexport interface GetDesignTokensOutput {\n tokens: DesignToken[];\n documentation: TokensDocumentation;\n note?: string;\n}\n\n/**\n * Get the path to the bundled tokens data\n */\nfunction getTokensDataPath(): string {\n return join(getDataPath(), 'tokens.json');\n}\n\n/**\n * Get the path to the bundled documentation data\n */\nfunction getDocumentationDataPath(): string {\n return join(getDataPath(), 'tokens-documentation.json');\n}\n\n/**\n * Load all tokens from bundled JSON data\n */\nasync function loadAllTokens(): Promise<DesignToken[]> {\n try {\n const dataPath = getTokensDataPath();\n const content = await readFile(dataPath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n console.error('Error loading tokens data:', error);\n return [];\n }\n}\n\n/**\n * Load documentation from bundled JSON data\n */\nasync function loadDocumentation(): Promise<TokensDocumentation> {\n try {\n const dataPath = getDocumentationDataPath();\n const content = await readFile(dataPath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n console.error('Error loading documentation data:', error);\n return {};\n }\n}\n\n/**\n * Get design tokens with optional filtering\n */\nexport async function getDesignTokens(\n input: GetDesignTokensInput\n): Promise<GetDesignTokensOutput> {\n const allTokens = await loadAllTokens();\n const documentation = await loadDocumentation();\n\n let filteredTokens = allTokens;\n\n // Filter by category if specified\n if (input.category) {\n filteredTokens = filteredTokens.filter((token) => {\n // Filter based on the path field which contains category information\n const path = token.path.toLowerCase();\n\n switch (input.category) {\n case 'colors':\n return path.startsWith('color.');\n case 'spacing':\n return path.startsWith('spacing.');\n case 'typography':\n return path.startsWith('typography.');\n case 'shadows':\n return path.startsWith('box-shadow.');\n case 'borders':\n return (\n path.startsWith('border-width.') ||\n path.startsWith('border-radius.') ||\n path.startsWith('border.')\n );\n default:\n return false;\n }\n });\n }\n\n return {\n tokens: filteredTokens,\n documentation,\n note: 'The \"value\" field shows example values from one theme. Actual values vary across different themes (alfa, bravo, charlie, nettavisen, alt). Use the \"cssVariable\" field for theme-aware styling.',\n };\n}\n", "/**\n * List Components tool implementation\n */\n\nimport {\n filterComponents,\n scanAllPackages,\n} from '../extractors/packageScanner.ts';\nimport type { BrickComponentMetadata } from '../types.ts';\n\nexport interface ListComponentsInput {\n filter?: string;\n}\n\nexport interface ListComponentsOutput {\n components: BrickComponentMetadata[];\n}\n\n/**\n * List all available Brick components with optional filtering\n */\nexport async function listComponents(\n input: ListComponentsInput\n): Promise<ListComponentsOutput> {\n // Scan all packages in the monorepo (returns lightweight metadata)\n const allComponents = await scanAllPackages();\n\n // Apply filter if provided\n const components = filterComponents(allComponents, input.filter);\n\n return {\n components,\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * HTTP server entry point for local development only\n * Uses Fastify and SSE transport for MCP communication\n */\n\nimport cors from '@fastify/cors';\nimport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';\nimport Fastify from 'fastify';\n\nimport { createServer } from './server.ts';\n\nconst PORT = 3000;\nconst HOST = 'localhost';\n\nconst fastify = Fastify({\n logger: {\n level: 'info',\n },\n});\n\n// Store active transports and servers by sessionId\nconst activeTransports = new Map<string, SSEServerTransport>();\nconst activeMcpServers = new Map<string, ReturnType<typeof createServer>>();\n\n// Enable CORS for local development\nawait fastify.register(cors, {\n origin: true,\n credentials: true,\n});\n\n// Health check endpoint\nfastify.get('/health', async () => {\n return { status: 'ok' };\n});\n\n// SSE endpoint for MCP communication\nfastify.get('/sse', async (_request, reply) => {\n // Prevent Fastify from automatically sending a response\n reply.hijack();\n\n // Create a new MCP server instance for this connection\n const mcpServer = createServer();\n\n // Create SSE transport (this will handle headers internally)\n const transport = new SSEServerTransport('/message', reply.raw);\n\n // Handle the SSE connection (this calls transport.start() which writes headers)\n await mcpServer.connect(transport);\n\n // Store the transport and server by sessionId for POST message handling\n // The sessionId is available after the transport starts via the public getter\n const sessionId = transport.sessionId;\n activeTransports.set(sessionId, transport);\n activeMcpServers.set(sessionId, mcpServer);\n\n // Clean up when the connection closes\n reply.raw.on('close', async () => {\n activeTransports.delete(sessionId);\n const server = activeMcpServers.get(sessionId);\n if (server) {\n await server.close();\n activeMcpServers.delete(sessionId);\n }\n });\n});\n\n// POST endpoint for messages\nfastify.post<{\n Querystring: { sessionId: string };\n}>('/message', async (request, reply) => {\n // Prevent Fastify from automatically sending a response\n reply.hijack();\n\n // Extract sessionId from query parameters (now properly typed)\n const { sessionId } = request.query;\n\n // Find the transport for this session\n const transport = activeTransports.get(sessionId);\n\n if (!transport) {\n reply.raw.writeHead(404, { 'Content-Type': 'application/json' });\n reply.raw.end(JSON.stringify({ error: 'Session not found' }));\n return;\n }\n\n // Let the transport handle the POST message\n await transport.handlePostMessage(request.raw, reply.raw, request.body);\n});\n\n// Start the server\ntry {\n await fastify.listen({ port: PORT, host: HOST });\n console.log(`Brick MCP HTTP server listening on http://${HOST}:${PORT}`);\n console.log(`SSE endpoint: http://${HOST}:${PORT}/sse`);\n} catch (err) {\n fastify.log.error(err);\n process.exit(1);\n}\n", "/**\n * MCP server setup and registration\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport { getComponentDocs } from './tools/getComponentDocs.ts';\nimport { getDesignTokens } from './tools/getDesignTokens.ts';\nimport { listComponents } from './tools/listComponents.ts';\n\n/**\n * Create and configure the MCP server\n */\nexport function createServer(): McpServer {\n // Create an MCP server\n const server = new McpServer({\n name: 'brick-design-system',\n version: '1.0.0',\n });\n\n // Register list-components tool\n server.registerTool(\n 'list-components',\n {\n title: 'List Brick Components',\n description:\n 'List all available Brick components with metadata. Optionally filter by category, tag, or name.',\n inputSchema: z.object({\n filter: z\n .string()\n .optional()\n .describe('Optional filter by category, tag, or name'),\n }),\n } as const,\n async ({ filter }: { filter?: string }) => {\n const result = await listComponents({ filter });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register get-component-docs tool\n server.registerTool(\n 'get-component-docs',\n {\n title: 'Get Component Documentation',\n description:\n 'Retrieve detailed documentation for specific Brick component(s) including props, events, examples, and accessibility information.',\n inputSchema: z.object({\n components: z\n .array(z.string())\n .describe(\n 'Array of component names (e.g., [\"brick-button\", \"brick-modal\"])'\n ),\n }),\n } as const,\n async ({ components }: { components: string[] }) => {\n const result = await getComponentDocs({ components });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register get-design-tokens tool\n server.registerTool(\n 'get-design-tokens',\n {\n title: 'Get Design Tokens',\n description:\n 'Access design tokens from brick-tokens. Optionally filter by category (colors, spacing, typography, shadows, borders).',\n inputSchema: z.object({\n category: z\n .enum(['colors', 'spacing', 'typography', 'shadows', 'borders'])\n .optional()\n .describe('Filter tokens by category'),\n }),\n } as const,\n async ({\n category,\n }: {\n category?: 'colors' | 'spacing' | 'typography' | 'shadows' | 'borders';\n }) => {\n const result = await getDesignTokens({ category });\n\n return {\n content: [\n {\n type: 'text',\n text: result,\n },\n ],\n };\n }\n );\n\n return server;\n}\n", "/**\n * Get Component Docs tool implementation\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getDataPath } from '../utils/dataPath.ts';\nimport { loadComponentData } from '../extractors/packageScanner.ts';\n\nexport interface GetComponentDocsInput {\n components: string[]; // e.g., [\"brick-button\", \"brick-modal\"]\n}\n\nexport interface GetComponentDocsOutput {\n docs: string[];\n}\n\n/**\n * Load markdown documentation for a component\n */\nasync function loadComponentMarkdown(\n componentName: string\n): Promise<string | undefined> {\n try {\n const markdownPath = join(\n getDataPath(),\n 'components',\n `${componentName}.md`\n );\n const content = await readFile(markdownPath, 'utf-8');\n return content;\n } catch (error) {\n console.error(`Error loading markdown for ${componentName}:`, error);\n return undefined;\n }\n}\n\n/**\n * Get detailed documentation for specific component(s)\n */\nexport async function getComponentDocs(\n input: GetComponentDocsInput\n): Promise<GetComponentDocsOutput> {\n // Load markdown documentation for each requested component\n const docsPromises = input.components.map(async (componentName) => {\n const md = await loadComponentMarkdown(componentName);\n if (!md) {\n const json = await loadComponentData(componentName);\n return json ? JSON.stringify(json) : undefined;\n }\n return md;\n });\n\n const docsResults = await Promise.all(docsPromises);\n\n // Filter out any components that failed to load\n const docs = docsResults.filter((doc): doc is string => doc !== undefined);\n\n return { docs };\n}\n", "/**\n * Utility for finding the data directory path\n * Works both in development (from src/) and production (from dist/)\n */\n\nimport { accessSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Get the path to the data directory\n * When running from dist/, looks for dist/data\n * When running from src/, looks for package root data\n */\nexport function getDataPath(): string {\n const currentFilePath = fileURLToPath(import.meta.url);\n let dir = dirname(currentFilePath);\n\n // First check if there's a data directory in the same parent as the current file\n // This handles the dist/data case when running from dist/\n const localDataPath = join(dir, 'data');\n try {\n accessSync(localDataPath);\n return localDataPath;\n } catch {\n // Continue to package root search\n }\n\n // Walk up the directory tree to find package root (where package.json exists)\n for (let i = 0; i < 5; i++) {\n try {\n const testPath = join(dir, 'package.json');\n accessSync(testPath);\n return join(dir, 'data');\n } catch {\n // Go up one level\n const parent = dirname(dir);\n if (parent === dir) break; // Reached filesystem root\n dir = parent;\n }\n }\n\n return join(dirname(currentFilePath), '..', '..', 'data');\n}\n", "/**\n * Package scanner for discovering Brick components\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { type BrickComponent, type BrickComponentMetadata } from '../types.ts';\nimport { getDataPath } from '../utils/dataPath.ts';\n\n/**\n * Load all component metadata (lightweight, for listing)\n */\nexport async function scanAllPackages(): Promise<BrickComponentMetadata[]> {\n try {\n const metadataPath = join(getDataPath(), 'components-metadata.json');\n const content = await readFile(metadataPath, 'utf-8');\n const metadata: BrickComponentMetadata[] = JSON.parse(content);\n return metadata;\n } catch (error) {\n console.error('Error loading component metadata:', error);\n return [];\n }\n}\n\n/**\n * Load full component data for a specific component\n */\nexport async function loadComponentData(\n componentName: string\n): Promise<BrickComponent | undefined> {\n try {\n const componentPath = join(\n getDataPath(),\n 'components',\n `${componentName}.json`\n );\n const content = await readFile(componentPath, 'utf-8');\n const component: BrickComponent = JSON.parse(content);\n return component;\n } catch (error) {\n console.error(`Error loading component data for ${componentName}:`, error);\n return undefined;\n }\n}\n\n/**\n * Filter components by category or tag\n */\nexport function filterComponents(\n components: BrickComponentMetadata[],\n filter?: string\n): BrickComponentMetadata[] {\n if (!filter) {\n return components;\n }\n\n const filterLower = filter.toLowerCase();\n\n return components.filter((component) => {\n // Match against name\n if (component.name.toLowerCase().includes(filterLower)) {\n return true;\n }\n\n // Match against category\n if (component.category?.toLowerCase().includes(filterLower)) {\n return true;\n }\n\n // Match against tags\n if (\n component.tags?.some((tag) => tag.toLowerCase().includes(filterLower))\n ) {\n return true;\n }\n\n return false;\n });\n}\n", "/**\n * Get Design Tokens tool implementation\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getDataPath } from '../utils/dataPath.ts';\n\nexport interface DesignToken {\n path: string;\n name: string;\n type: string;\n value: string;\n description?: string;\n cssVariable: string;\n}\n\nexport interface GetDesignTokensInput {\n category?: 'colors' | 'spacing' | 'typography' | 'shadows' | 'borders';\n}\n\n/**\n * Category filter definitions mapping category names to path prefixes\n */\nconst CATEGORY_PREFIXES: Record<string, string[]> = {\n colors: ['color.'],\n spacing: ['spacing.'],\n typography: ['typography.'],\n shadows: ['box-shadow.'],\n borders: ['border-width.', 'border-radius.', 'border.'],\n};\n\n/**\n * Get the path to the bundled tokens data\n */\nfunction getTokensDataPath(): string {\n return join(getDataPath(), 'tokens.json');\n}\n\n/**\n * Load all tokens from bundled JSON data\n */\nasync function loadAllTokens(): Promise<DesignToken[]> {\n try {\n const dataPath = getTokensDataPath();\n const content = await readFile(dataPath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n console.error('Error loading tokens data:', error);\n return [];\n }\n}\n\n/**\n * Check if a token belongs to a given category\n */\nfunction tokenMatchesCategory(token: DesignToken, category: string): boolean {\n const prefixes = CATEGORY_PREFIXES[category];\n if (!prefixes) return false;\n const path = token.path.toLowerCase();\n return prefixes.some((prefix) => path.startsWith(prefix));\n}\n\n/**\n * Format tokens as a compact text listing\n */\nfunction formatTokensCompact(tokens: DesignToken[]): string {\n return tokens\n .map((t) => {\n const base = `${t.cssVariable}: ${t.value}`;\n return t.description ? `${base} \u2014 ${t.description}` : base;\n })\n .join('\\n');\n}\n\n/**\n * Build a category summary with counts and example token paths\n */\nfunction buildCategorySummary(allTokens: DesignToken[]): string {\n const lines: string[] = ['Available token categories:'];\n\n for (const category of Object.keys(CATEGORY_PREFIXES)) {\n const matching = allTokens.filter((t) => tokenMatchesCategory(t, category));\n const count = matching.length;\n const examples = matching\n .slice(0, 3)\n .map((t) => t.path)\n .join(', ');\n const suffix = examples ? ` (${examples}, ...)` : '';\n lines.push(`- ${category}: ${count} tokens${suffix}`);\n }\n\n lines.push('', 'Call with a specific category to see tokens.');\n return lines.join('\\n');\n}\n\n/**\n * Get design tokens with optional filtering.\n * Returns a compact text string to minimize context window usage.\n */\nexport async function getDesignTokens(\n input: GetDesignTokensInput\n): Promise<string> {\n const allTokens = await loadAllTokens();\n\n // No category: return summary instead of dumping all tokens\n if (!input.category) {\n return buildCategorySummary(allTokens);\n }\n\n const filteredTokens = allTokens.filter((t) =>\n tokenMatchesCategory(t, input.category!)\n );\n\n const header = `${input.category} tokens (${filteredTokens.length} tokens). Values shown are examples from one theme. Actual values vary across themes (alfa, bravo, charlie, nettavisen, alt). Use the CSS variable for theme-aware styling.\\n`;\n return header + formatTokensCompact(filteredTokens);\n}\n", "/**\n * List Components tool implementation\n */\n\nimport {\n filterComponents,\n scanAllPackages,\n} from '../extractors/packageScanner.ts';\nimport type { BrickComponentMetadata } from '../types.ts';\n\nexport interface ListComponentsInput {\n filter?: string;\n}\n\nexport interface ListComponentsOutput {\n components: BrickComponentMetadata[];\n}\n\n/**\n * List all available Brick components with optional filtering\n */\nexport async function listComponents(\n input: ListComponentsInput\n): Promise<ListComponentsOutput> {\n // Scan all packages in the monorepo (returns lightweight metadata)\n const allComponents = await scanAllPackages();\n\n // Apply filter if provided\n const components = filterComponents(allComponents, input.filter);\n\n return {\n components,\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["readFile", "join", "join", "join", "join", "readFile", "readFile", "join", "join", "readFile"]
7
7
  }
package/dist/index.js CHANGED
@@ -118,12 +118,16 @@ async function getComponentDocs(input) {
118
118
  // src/tools/getDesignTokens.ts
119
119
  import { readFile as readFile3 } from "node:fs/promises";
120
120
  import { join as join4 } from "node:path";
121
+ var CATEGORY_PREFIXES = {
122
+ colors: ["color."],
123
+ spacing: ["spacing."],
124
+ typography: ["typography."],
125
+ shadows: ["box-shadow."],
126
+ borders: ["border-width.", "border-radius.", "border."]
127
+ };
121
128
  function getTokensDataPath() {
122
129
  return join4(getDataPath(), "tokens.json");
123
130
  }
124
- function getDocumentationDataPath() {
125
- return join4(getDataPath(), "tokens-documentation.json");
126
- }
127
131
  async function loadAllTokens() {
128
132
  try {
129
133
  const dataPath = getTokensDataPath();
@@ -134,44 +138,42 @@ async function loadAllTokens() {
134
138
  return [];
135
139
  }
136
140
  }
137
- async function loadDocumentation() {
138
- try {
139
- const dataPath = getDocumentationDataPath();
140
- const content = await readFile3(dataPath, "utf-8");
141
- return JSON.parse(content);
142
- } catch (error) {
143
- console.error("Error loading documentation data:", error);
144
- return {};
141
+ function tokenMatchesCategory(token, category) {
142
+ const prefixes = CATEGORY_PREFIXES[category];
143
+ if (!prefixes)
144
+ return false;
145
+ const path = token.path.toLowerCase();
146
+ return prefixes.some((prefix) => path.startsWith(prefix));
147
+ }
148
+ function formatTokensCompact(tokens) {
149
+ return tokens.map((t) => {
150
+ const base = `${t.cssVariable}: ${t.value}`;
151
+ return t.description ? `${base} \u2014 ${t.description}` : base;
152
+ }).join("\n");
153
+ }
154
+ function buildCategorySummary(allTokens) {
155
+ const lines = ["Available token categories:"];
156
+ for (const category of Object.keys(CATEGORY_PREFIXES)) {
157
+ const matching = allTokens.filter((t) => tokenMatchesCategory(t, category));
158
+ const count = matching.length;
159
+ const examples = matching.slice(0, 3).map((t) => t.path).join(", ");
160
+ const suffix = examples ? ` (${examples}, ...)` : "";
161
+ lines.push(`- ${category}: ${count} tokens${suffix}`);
145
162
  }
163
+ lines.push("", "Call with a specific category to see tokens.");
164
+ return lines.join("\n");
146
165
  }
147
166
  async function getDesignTokens(input) {
148
167
  const allTokens = await loadAllTokens();
149
- const documentation = await loadDocumentation();
150
- let filteredTokens = allTokens;
151
- if (input.category) {
152
- filteredTokens = filteredTokens.filter((token) => {
153
- const path = token.path.toLowerCase();
154
- switch (input.category) {
155
- case "colors":
156
- return path.startsWith("color.");
157
- case "spacing":
158
- return path.startsWith("spacing.");
159
- case "typography":
160
- return path.startsWith("typography.");
161
- case "shadows":
162
- return path.startsWith("box-shadow.");
163
- case "borders":
164
- return path.startsWith("border-width.") || path.startsWith("border-radius.") || path.startsWith("border.");
165
- default:
166
- return false;
167
- }
168
- });
168
+ if (!input.category) {
169
+ return buildCategorySummary(allTokens);
169
170
  }
170
- return {
171
- tokens: filteredTokens,
172
- documentation,
173
- note: 'The "value" field shows example values from one theme. Actual values vary across different themes (alfa, bravo, charlie, nettavisen, alt). Use the "cssVariable" field for theme-aware styling.'
174
- };
171
+ const filteredTokens = allTokens.filter(
172
+ (t) => tokenMatchesCategory(t, input.category)
173
+ );
174
+ const header = `${input.category} tokens (${filteredTokens.length} tokens). Values shown are examples from one theme. Actual values vary across themes (alfa, bravo, charlie, nettavisen, alt). Use the CSS variable for theme-aware styling.
175
+ `;
176
+ return header + formatTokensCompact(filteredTokens);
175
177
  }
176
178
 
177
179
  // src/tools/listComponents.ts
@@ -250,7 +252,7 @@ function createServer() {
250
252
  content: [
251
253
  {
252
254
  type: "text",
253
- text: JSON.stringify(result, null, 2)
255
+ text: result
254
256
  }
255
257
  ]
256
258
  };
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/server.ts", "../src/tools/getComponentDocs.ts", "../src/utils/dataPath.ts", "../src/extractors/packageScanner.ts", "../src/tools/getDesignTokens.ts", "../src/tools/listComponents.ts"],
4
- "sourcesContent": ["/**\n * Main MCP server entry point\n */\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { createServer } from './server.ts';\n\n// Create and start the server\nconst server = createServer();\n\n// Start receiving messages on stdin and sending messages on stdout\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n", "/**\n * MCP server setup and registration\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport { getComponentDocs } from './tools/getComponentDocs.ts';\nimport { getDesignTokens } from './tools/getDesignTokens.ts';\nimport { listComponents } from './tools/listComponents.ts';\n\n/**\n * Create and configure the MCP server\n */\nexport function createServer(): McpServer {\n // Create an MCP server\n const server = new McpServer({\n name: 'brick-design-system',\n version: '1.0.0',\n });\n\n // Register list-components tool\n server.registerTool(\n 'list-components',\n {\n title: 'List Brick Components',\n description:\n 'List all available Brick components with metadata. Optionally filter by category, tag, or name.',\n inputSchema: z.object({\n filter: z\n .string()\n .optional()\n .describe('Optional filter by category, tag, or name'),\n }),\n } as const,\n async ({ filter }: { filter?: string }) => {\n const result = await listComponents({ filter });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register get-component-docs tool\n server.registerTool(\n 'get-component-docs',\n {\n title: 'Get Component Documentation',\n description:\n 'Retrieve detailed documentation for specific Brick component(s) including props, events, examples, and accessibility information.',\n inputSchema: z.object({\n components: z\n .array(z.string())\n .describe(\n 'Array of component names (e.g., [\"brick-button\", \"brick-modal\"])'\n ),\n }),\n } as const,\n async ({ components }: { components: string[] }) => {\n const result = await getComponentDocs({ components });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register get-design-tokens tool\n server.registerTool(\n 'get-design-tokens',\n {\n title: 'Get Design Tokens',\n description:\n 'Access design tokens from brick-tokens. Optionally filter by category (colors, spacing, typography, shadows, borders).',\n inputSchema: z.object({\n category: z\n .enum(['colors', 'spacing', 'typography', 'shadows', 'borders'])\n .optional()\n .describe('Filter tokens by category'),\n }),\n } as const,\n async ({\n category,\n }: {\n category?: 'colors' | 'spacing' | 'typography' | 'shadows' | 'borders';\n }) => {\n const result = await getDesignTokens({ category });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n return server;\n}\n", "/**\n * Get Component Docs tool implementation\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getDataPath } from '../utils/dataPath.ts';\nimport { loadComponentData } from '../extractors/packageScanner.ts';\n\nexport interface GetComponentDocsInput {\n components: string[]; // e.g., [\"brick-button\", \"brick-modal\"]\n}\n\nexport interface GetComponentDocsOutput {\n docs: string[];\n}\n\n/**\n * Load markdown documentation for a component\n */\nasync function loadComponentMarkdown(\n componentName: string\n): Promise<string | undefined> {\n try {\n const markdownPath = join(\n getDataPath(),\n 'components',\n `${componentName}.md`\n );\n const content = await readFile(markdownPath, 'utf-8');\n return content;\n } catch (error) {\n console.error(`Error loading markdown for ${componentName}:`, error);\n return undefined;\n }\n}\n\n/**\n * Get detailed documentation for specific component(s)\n */\nexport async function getComponentDocs(\n input: GetComponentDocsInput\n): Promise<GetComponentDocsOutput> {\n // Load markdown documentation for each requested component\n const docsPromises = input.components.map(async (componentName) => {\n const md = await loadComponentMarkdown(componentName);\n if (!md) {\n const json = await loadComponentData(componentName);\n return json ? JSON.stringify(json) : undefined;\n }\n return md;\n });\n\n const docsResults = await Promise.all(docsPromises);\n\n // Filter out any components that failed to load\n const docs = docsResults.filter((doc): doc is string => doc !== undefined);\n\n return { docs };\n}\n", "/**\n * Utility for finding the data directory path\n * Works both in development (from src/) and production (from dist/)\n */\n\nimport { accessSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Get the path to the data directory\n * When running from dist/, looks for dist/data\n * When running from src/, looks for package root data\n */\nexport function getDataPath(): string {\n const currentFilePath = fileURLToPath(import.meta.url);\n let dir = dirname(currentFilePath);\n\n // First check if there's a data directory in the same parent as the current file\n // This handles the dist/data case when running from dist/\n const localDataPath = join(dir, 'data');\n try {\n accessSync(localDataPath);\n return localDataPath;\n } catch {\n // Continue to package root search\n }\n\n // Walk up the directory tree to find package root (where package.json exists)\n for (let i = 0; i < 5; i++) {\n try {\n const testPath = join(dir, 'package.json');\n accessSync(testPath);\n return join(dir, 'data');\n } catch {\n // Go up one level\n const parent = dirname(dir);\n if (parent === dir) break; // Reached filesystem root\n dir = parent;\n }\n }\n\n return join(dirname(currentFilePath), '..', '..', 'data');\n}\n", "/**\n * Package scanner for discovering Brick components\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { type BrickComponent, type BrickComponentMetadata } from '../types.ts';\nimport { getDataPath } from '../utils/dataPath.ts';\n\n/**\n * Load all component metadata (lightweight, for listing)\n */\nexport async function scanAllPackages(): Promise<BrickComponentMetadata[]> {\n try {\n const metadataPath = join(getDataPath(), 'components-metadata.json');\n const content = await readFile(metadataPath, 'utf-8');\n const metadata: BrickComponentMetadata[] = JSON.parse(content);\n return metadata;\n } catch (error) {\n console.error('Error loading component metadata:', error);\n return [];\n }\n}\n\n/**\n * Load full component data for a specific component\n */\nexport async function loadComponentData(\n componentName: string\n): Promise<BrickComponent | undefined> {\n try {\n const componentPath = join(\n getDataPath(),\n 'components',\n `${componentName}.json`\n );\n const content = await readFile(componentPath, 'utf-8');\n const component: BrickComponent = JSON.parse(content);\n return component;\n } catch (error) {\n console.error(`Error loading component data for ${componentName}:`, error);\n return undefined;\n }\n}\n\n/**\n * Filter components by category or tag\n */\nexport function filterComponents(\n components: BrickComponentMetadata[],\n filter?: string\n): BrickComponentMetadata[] {\n if (!filter) {\n return components;\n }\n\n const filterLower = filter.toLowerCase();\n\n return components.filter((component) => {\n // Match against name\n if (component.name.toLowerCase().includes(filterLower)) {\n return true;\n }\n\n // Match against category\n if (component.category?.toLowerCase().includes(filterLower)) {\n return true;\n }\n\n // Match against tags\n if (\n component.tags?.some((tag) => tag.toLowerCase().includes(filterLower))\n ) {\n return true;\n }\n\n return false;\n });\n}\n", "/**\n * Get Design Tokens tool implementation\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getDataPath } from '../utils/dataPath.ts';\n\nexport interface DesignToken {\n path: string;\n name: string;\n type: string;\n value: string;\n description?: string;\n cssVariable: string;\n}\n\nexport interface GetDesignTokensInput {\n category?: 'colors' | 'spacing' | 'typography' | 'shadows' | 'borders';\n}\n\nexport interface TokensDocumentation {\n anOverview?: string;\n formats?: string;\n naming?: string;\n usage?: string;\n}\n\nexport interface GetDesignTokensOutput {\n tokens: DesignToken[];\n documentation: TokensDocumentation;\n note?: string;\n}\n\n/**\n * Get the path to the bundled tokens data\n */\nfunction getTokensDataPath(): string {\n return join(getDataPath(), 'tokens.json');\n}\n\n/**\n * Get the path to the bundled documentation data\n */\nfunction getDocumentationDataPath(): string {\n return join(getDataPath(), 'tokens-documentation.json');\n}\n\n/**\n * Load all tokens from bundled JSON data\n */\nasync function loadAllTokens(): Promise<DesignToken[]> {\n try {\n const dataPath = getTokensDataPath();\n const content = await readFile(dataPath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n console.error('Error loading tokens data:', error);\n return [];\n }\n}\n\n/**\n * Load documentation from bundled JSON data\n */\nasync function loadDocumentation(): Promise<TokensDocumentation> {\n try {\n const dataPath = getDocumentationDataPath();\n const content = await readFile(dataPath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n console.error('Error loading documentation data:', error);\n return {};\n }\n}\n\n/**\n * Get design tokens with optional filtering\n */\nexport async function getDesignTokens(\n input: GetDesignTokensInput\n): Promise<GetDesignTokensOutput> {\n const allTokens = await loadAllTokens();\n const documentation = await loadDocumentation();\n\n let filteredTokens = allTokens;\n\n // Filter by category if specified\n if (input.category) {\n filteredTokens = filteredTokens.filter((token) => {\n // Filter based on the path field which contains category information\n const path = token.path.toLowerCase();\n\n switch (input.category) {\n case 'colors':\n return path.startsWith('color.');\n case 'spacing':\n return path.startsWith('spacing.');\n case 'typography':\n return path.startsWith('typography.');\n case 'shadows':\n return path.startsWith('box-shadow.');\n case 'borders':\n return (\n path.startsWith('border-width.') ||\n path.startsWith('border-radius.') ||\n path.startsWith('border.')\n );\n default:\n return false;\n }\n });\n }\n\n return {\n tokens: filteredTokens,\n documentation,\n note: 'The \"value\" field shows example values from one theme. Actual values vary across different themes (alfa, bravo, charlie, nettavisen, alt). Use the \"cssVariable\" field for theme-aware styling.',\n };\n}\n", "/**\n * List Components tool implementation\n */\n\nimport {\n filterComponents,\n scanAllPackages,\n} from '../extractors/packageScanner.ts';\nimport type { BrickComponentMetadata } from '../types.ts';\n\nexport interface ListComponentsInput {\n filter?: string;\n}\n\nexport interface ListComponentsOutput {\n components: BrickComponentMetadata[];\n}\n\n/**\n * List all available Brick components with optional filtering\n */\nexport async function listComponents(\n input: ListComponentsInput\n): Promise<ListComponentsOutput> {\n // Scan all packages in the monorepo (returns lightweight metadata)\n const allComponents = await scanAllPackages();\n\n // Apply filter if provided\n const components = filterComponents(allComponents, input.filter);\n\n return {\n components,\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Main MCP server entry point\n */\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { createServer } from './server.ts';\n\n// Create and start the server\nconst server = createServer();\n\n// Start receiving messages on stdin and sending messages on stdout\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n", "/**\n * MCP server setup and registration\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport { getComponentDocs } from './tools/getComponentDocs.ts';\nimport { getDesignTokens } from './tools/getDesignTokens.ts';\nimport { listComponents } from './tools/listComponents.ts';\n\n/**\n * Create and configure the MCP server\n */\nexport function createServer(): McpServer {\n // Create an MCP server\n const server = new McpServer({\n name: 'brick-design-system',\n version: '1.0.0',\n });\n\n // Register list-components tool\n server.registerTool(\n 'list-components',\n {\n title: 'List Brick Components',\n description:\n 'List all available Brick components with metadata. Optionally filter by category, tag, or name.',\n inputSchema: z.object({\n filter: z\n .string()\n .optional()\n .describe('Optional filter by category, tag, or name'),\n }),\n } as const,\n async ({ filter }: { filter?: string }) => {\n const result = await listComponents({ filter });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register get-component-docs tool\n server.registerTool(\n 'get-component-docs',\n {\n title: 'Get Component Documentation',\n description:\n 'Retrieve detailed documentation for specific Brick component(s) including props, events, examples, and accessibility information.',\n inputSchema: z.object({\n components: z\n .array(z.string())\n .describe(\n 'Array of component names (e.g., [\"brick-button\", \"brick-modal\"])'\n ),\n }),\n } as const,\n async ({ components }: { components: string[] }) => {\n const result = await getComponentDocs({ components });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register get-design-tokens tool\n server.registerTool(\n 'get-design-tokens',\n {\n title: 'Get Design Tokens',\n description:\n 'Access design tokens from brick-tokens. Optionally filter by category (colors, spacing, typography, shadows, borders).',\n inputSchema: z.object({\n category: z\n .enum(['colors', 'spacing', 'typography', 'shadows', 'borders'])\n .optional()\n .describe('Filter tokens by category'),\n }),\n } as const,\n async ({\n category,\n }: {\n category?: 'colors' | 'spacing' | 'typography' | 'shadows' | 'borders';\n }) => {\n const result = await getDesignTokens({ category });\n\n return {\n content: [\n {\n type: 'text',\n text: result,\n },\n ],\n };\n }\n );\n\n return server;\n}\n", "/**\n * Get Component Docs tool implementation\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getDataPath } from '../utils/dataPath.ts';\nimport { loadComponentData } from '../extractors/packageScanner.ts';\n\nexport interface GetComponentDocsInput {\n components: string[]; // e.g., [\"brick-button\", \"brick-modal\"]\n}\n\nexport interface GetComponentDocsOutput {\n docs: string[];\n}\n\n/**\n * Load markdown documentation for a component\n */\nasync function loadComponentMarkdown(\n componentName: string\n): Promise<string | undefined> {\n try {\n const markdownPath = join(\n getDataPath(),\n 'components',\n `${componentName}.md`\n );\n const content = await readFile(markdownPath, 'utf-8');\n return content;\n } catch (error) {\n console.error(`Error loading markdown for ${componentName}:`, error);\n return undefined;\n }\n}\n\n/**\n * Get detailed documentation for specific component(s)\n */\nexport async function getComponentDocs(\n input: GetComponentDocsInput\n): Promise<GetComponentDocsOutput> {\n // Load markdown documentation for each requested component\n const docsPromises = input.components.map(async (componentName) => {\n const md = await loadComponentMarkdown(componentName);\n if (!md) {\n const json = await loadComponentData(componentName);\n return json ? JSON.stringify(json) : undefined;\n }\n return md;\n });\n\n const docsResults = await Promise.all(docsPromises);\n\n // Filter out any components that failed to load\n const docs = docsResults.filter((doc): doc is string => doc !== undefined);\n\n return { docs };\n}\n", "/**\n * Utility for finding the data directory path\n * Works both in development (from src/) and production (from dist/)\n */\n\nimport { accessSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Get the path to the data directory\n * When running from dist/, looks for dist/data\n * When running from src/, looks for package root data\n */\nexport function getDataPath(): string {\n const currentFilePath = fileURLToPath(import.meta.url);\n let dir = dirname(currentFilePath);\n\n // First check if there's a data directory in the same parent as the current file\n // This handles the dist/data case when running from dist/\n const localDataPath = join(dir, 'data');\n try {\n accessSync(localDataPath);\n return localDataPath;\n } catch {\n // Continue to package root search\n }\n\n // Walk up the directory tree to find package root (where package.json exists)\n for (let i = 0; i < 5; i++) {\n try {\n const testPath = join(dir, 'package.json');\n accessSync(testPath);\n return join(dir, 'data');\n } catch {\n // Go up one level\n const parent = dirname(dir);\n if (parent === dir) break; // Reached filesystem root\n dir = parent;\n }\n }\n\n return join(dirname(currentFilePath), '..', '..', 'data');\n}\n", "/**\n * Package scanner for discovering Brick components\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { type BrickComponent, type BrickComponentMetadata } from '../types.ts';\nimport { getDataPath } from '../utils/dataPath.ts';\n\n/**\n * Load all component metadata (lightweight, for listing)\n */\nexport async function scanAllPackages(): Promise<BrickComponentMetadata[]> {\n try {\n const metadataPath = join(getDataPath(), 'components-metadata.json');\n const content = await readFile(metadataPath, 'utf-8');\n const metadata: BrickComponentMetadata[] = JSON.parse(content);\n return metadata;\n } catch (error) {\n console.error('Error loading component metadata:', error);\n return [];\n }\n}\n\n/**\n * Load full component data for a specific component\n */\nexport async function loadComponentData(\n componentName: string\n): Promise<BrickComponent | undefined> {\n try {\n const componentPath = join(\n getDataPath(),\n 'components',\n `${componentName}.json`\n );\n const content = await readFile(componentPath, 'utf-8');\n const component: BrickComponent = JSON.parse(content);\n return component;\n } catch (error) {\n console.error(`Error loading component data for ${componentName}:`, error);\n return undefined;\n }\n}\n\n/**\n * Filter components by category or tag\n */\nexport function filterComponents(\n components: BrickComponentMetadata[],\n filter?: string\n): BrickComponentMetadata[] {\n if (!filter) {\n return components;\n }\n\n const filterLower = filter.toLowerCase();\n\n return components.filter((component) => {\n // Match against name\n if (component.name.toLowerCase().includes(filterLower)) {\n return true;\n }\n\n // Match against category\n if (component.category?.toLowerCase().includes(filterLower)) {\n return true;\n }\n\n // Match against tags\n if (\n component.tags?.some((tag) => tag.toLowerCase().includes(filterLower))\n ) {\n return true;\n }\n\n return false;\n });\n}\n", "/**\n * Get Design Tokens tool implementation\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getDataPath } from '../utils/dataPath.ts';\n\nexport interface DesignToken {\n path: string;\n name: string;\n type: string;\n value: string;\n description?: string;\n cssVariable: string;\n}\n\nexport interface GetDesignTokensInput {\n category?: 'colors' | 'spacing' | 'typography' | 'shadows' | 'borders';\n}\n\n/**\n * Category filter definitions mapping category names to path prefixes\n */\nconst CATEGORY_PREFIXES: Record<string, string[]> = {\n colors: ['color.'],\n spacing: ['spacing.'],\n typography: ['typography.'],\n shadows: ['box-shadow.'],\n borders: ['border-width.', 'border-radius.', 'border.'],\n};\n\n/**\n * Get the path to the bundled tokens data\n */\nfunction getTokensDataPath(): string {\n return join(getDataPath(), 'tokens.json');\n}\n\n/**\n * Load all tokens from bundled JSON data\n */\nasync function loadAllTokens(): Promise<DesignToken[]> {\n try {\n const dataPath = getTokensDataPath();\n const content = await readFile(dataPath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n console.error('Error loading tokens data:', error);\n return [];\n }\n}\n\n/**\n * Check if a token belongs to a given category\n */\nfunction tokenMatchesCategory(token: DesignToken, category: string): boolean {\n const prefixes = CATEGORY_PREFIXES[category];\n if (!prefixes) return false;\n const path = token.path.toLowerCase();\n return prefixes.some((prefix) => path.startsWith(prefix));\n}\n\n/**\n * Format tokens as a compact text listing\n */\nfunction formatTokensCompact(tokens: DesignToken[]): string {\n return tokens\n .map((t) => {\n const base = `${t.cssVariable}: ${t.value}`;\n return t.description ? `${base} \u2014 ${t.description}` : base;\n })\n .join('\\n');\n}\n\n/**\n * Build a category summary with counts and example token paths\n */\nfunction buildCategorySummary(allTokens: DesignToken[]): string {\n const lines: string[] = ['Available token categories:'];\n\n for (const category of Object.keys(CATEGORY_PREFIXES)) {\n const matching = allTokens.filter((t) => tokenMatchesCategory(t, category));\n const count = matching.length;\n const examples = matching\n .slice(0, 3)\n .map((t) => t.path)\n .join(', ');\n const suffix = examples ? ` (${examples}, ...)` : '';\n lines.push(`- ${category}: ${count} tokens${suffix}`);\n }\n\n lines.push('', 'Call with a specific category to see tokens.');\n return lines.join('\\n');\n}\n\n/**\n * Get design tokens with optional filtering.\n * Returns a compact text string to minimize context window usage.\n */\nexport async function getDesignTokens(\n input: GetDesignTokensInput\n): Promise<string> {\n const allTokens = await loadAllTokens();\n\n // No category: return summary instead of dumping all tokens\n if (!input.category) {\n return buildCategorySummary(allTokens);\n }\n\n const filteredTokens = allTokens.filter((t) =>\n tokenMatchesCategory(t, input.category!)\n );\n\n const header = `${input.category} tokens (${filteredTokens.length} tokens). Values shown are examples from one theme. Actual values vary across themes (alfa, bravo, charlie, nettavisen, alt). Use the CSS variable for theme-aware styling.\\n`;\n return header + formatTokensCompact(filteredTokens);\n}\n", "/**\n * List Components tool implementation\n */\n\nimport {\n filterComponents,\n scanAllPackages,\n} from '../extractors/packageScanner.ts';\nimport type { BrickComponentMetadata } from '../types.ts';\n\nexport interface ListComponentsInput {\n filter?: string;\n}\n\nexport interface ListComponentsOutput {\n components: BrickComponentMetadata[];\n}\n\n/**\n * List all available Brick components with optional filtering\n */\nexport async function listComponents(\n input: ListComponentsInput\n): Promise<ListComponentsOutput> {\n // Scan all packages in the monorepo (returns lightweight metadata)\n const allComponents = await scanAllPackages();\n\n // Apply filter if provided\n const components = filterComponents(allComponents, input.filter);\n\n return {\n components,\n };\n}\n"],
5
+ "mappings": ";AAIA,SAAS,4BAA4B;;;ACArC,SAAS,iBAAiB;AAC1B,SAAS,SAAS;;;ACDlB,SAAS,YAAAA,iBAAgB;AACzB,SAAS,QAAAC,aAAY;;;ACArB,SAAS,kBAAkB;AAC3B,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAOvB,SAAS,cAAsB;AACpC,QAAM,kBAAkB,cAAc,YAAY,GAAG;AACrD,MAAI,MAAM,QAAQ,eAAe;AAIjC,QAAM,gBAAgB,KAAK,KAAK,MAAM;AACtC,MAAI;AACF,eAAW,aAAa;AACxB,WAAO;AAAA,EACT,QAAE;AAAA,EAEF;AAGA,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAI;AACF,YAAM,WAAW,KAAK,KAAK,cAAc;AACzC,iBAAW,QAAQ;AACnB,aAAO,KAAK,KAAK,MAAM;AAAA,IACzB,QAAE;AAEA,YAAM,SAAS,QAAQ,GAAG;AAC1B,UAAI,WAAW;AAAK;AACpB,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO,KAAK,QAAQ,eAAe,GAAG,MAAM,MAAM,MAAM;AAC1D;;;ACvCA,SAAS,gBAAgB;AACzB,SAAS,QAAAC,aAAY;AAQrB,eAAsB,kBAAqD;AACzE,MAAI;AACF,UAAM,eAAeC,MAAK,YAAY,GAAG,0BAA0B;AACnE,UAAM,UAAU,MAAM,SAAS,cAAc,OAAO;AACpD,UAAM,WAAqC,KAAK,MAAM,OAAO;AAC7D,WAAO;AAAA,EACT,SAAS,OAAP;AACA,YAAQ,MAAM,qCAAqC,KAAK;AACxD,WAAO,CAAC;AAAA,EACV;AACF;AAKA,eAAsB,kBACpB,eACqC;AACrC,MAAI;AACF,UAAM,gBAAgBA;AAAA,MACpB,YAAY;AAAA,MACZ;AAAA,MACA,GAAG;AAAA,IACL;AACA,UAAM,UAAU,MAAM,SAAS,eAAe,OAAO;AACrD,UAAM,YAA4B,KAAK,MAAM,OAAO;AACpD,WAAO;AAAA,EACT,SAAS,OAAP;AACA,YAAQ,MAAM,oCAAoC,kBAAkB,KAAK;AACzE,WAAO;AAAA,EACT;AACF;AAKO,SAAS,iBACd,YACA,QAC0B;AAC1B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,OAAO,YAAY;AAEvC,SAAO,WAAW,OAAO,CAAC,cAAc;AAEtC,QAAI,UAAU,KAAK,YAAY,EAAE,SAAS,WAAW,GAAG;AACtD,aAAO;AAAA,IACT;AAGA,QAAI,UAAU,UAAU,YAAY,EAAE,SAAS,WAAW,GAAG;AAC3D,aAAO;AAAA,IACT;AAGA,QACE,UAAU,MAAM,KAAK,CAAC,QAAQ,IAAI,YAAY,EAAE,SAAS,WAAW,CAAC,GACrE;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,CAAC;AACH;;;AF1DA,eAAe,sBACb,eAC6B;AAC7B,MAAI;AACF,UAAM,eAAeC;AAAA,MACnB,YAAY;AAAA,MACZ;AAAA,MACA,GAAG;AAAA,IACL;AACA,UAAM,UAAU,MAAMC,UAAS,cAAc,OAAO;AACpD,WAAO;AAAA,EACT,SAAS,OAAP;AACA,YAAQ,MAAM,8BAA8B,kBAAkB,KAAK;AACnE,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,iBACpB,OACiC;AAEjC,QAAM,eAAe,MAAM,WAAW,IAAI,OAAO,kBAAkB;AACjE,UAAM,KAAK,MAAM,sBAAsB,aAAa;AACpD,QAAI,CAAC,IAAI;AACP,YAAM,OAAO,MAAM,kBAAkB,aAAa;AAClD,aAAO,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,IACvC;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,cAAc,MAAM,QAAQ,IAAI,YAAY;AAGlD,QAAM,OAAO,YAAY,OAAO,CAAC,QAAuB,QAAQ,MAAS;AAEzE,SAAO,EAAE,KAAK;AAChB;;;AGxDA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,QAAAC,aAAY;AAoBrB,IAAM,oBAA8C;AAAA,EAClD,QAAQ,CAAC,QAAQ;AAAA,EACjB,SAAS,CAAC,UAAU;AAAA,EACpB,YAAY,CAAC,aAAa;AAAA,EAC1B,SAAS,CAAC,aAAa;AAAA,EACvB,SAAS,CAAC,iBAAiB,kBAAkB,SAAS;AACxD;AAKA,SAAS,oBAA4B;AACnC,SAAOC,MAAK,YAAY,GAAG,aAAa;AAC1C;AAKA,eAAe,gBAAwC;AACrD,MAAI;AACF,UAAM,WAAW,kBAAkB;AACnC,UAAM,UAAU,MAAMC,UAAS,UAAU,OAAO;AAChD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAP;AACA,YAAQ,MAAM,8BAA8B,KAAK;AACjD,WAAO,CAAC;AAAA,EACV;AACF;AAKA,SAAS,qBAAqB,OAAoB,UAA2B;AAC3E,QAAM,WAAW,kBAAkB;AACnC,MAAI,CAAC;AAAU,WAAO;AACtB,QAAM,OAAO,MAAM,KAAK,YAAY;AACpC,SAAO,SAAS,KAAK,CAAC,WAAW,KAAK,WAAW,MAAM,CAAC;AAC1D;AAKA,SAAS,oBAAoB,QAA+B;AAC1D,SAAO,OACJ,IAAI,CAAC,MAAM;AACV,UAAM,OAAO,GAAG,EAAE,gBAAgB,EAAE;AACpC,WAAO,EAAE,cAAc,GAAG,gBAAW,EAAE,gBAAgB;AAAA,EACzD,CAAC,EACA,KAAK,IAAI;AACd;AAKA,SAAS,qBAAqB,WAAkC;AAC9D,QAAM,QAAkB,CAAC,6BAA6B;AAEtD,aAAW,YAAY,OAAO,KAAK,iBAAiB,GAAG;AACrD,UAAM,WAAW,UAAU,OAAO,CAAC,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAC1E,UAAM,QAAQ,SAAS;AACvB,UAAM,WAAW,SACd,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,IAAI;AACZ,UAAM,SAAS,WAAW,KAAK,mBAAmB;AAClD,UAAM,KAAK,KAAK,aAAa,eAAe,QAAQ;AAAA,EACtD;AAEA,QAAM,KAAK,IAAI,8CAA8C;AAC7D,SAAO,MAAM,KAAK,IAAI;AACxB;AAMA,eAAsB,gBACpB,OACiB;AACjB,QAAM,YAAY,MAAM,cAAc;AAGtC,MAAI,CAAC,MAAM,UAAU;AACnB,WAAO,qBAAqB,SAAS;AAAA,EACvC;AAEA,QAAM,iBAAiB,UAAU;AAAA,IAAO,CAAC,MACvC,qBAAqB,GAAG,MAAM,QAAS;AAAA,EACzC;AAEA,QAAM,SAAS,GAAG,MAAM,oBAAoB,eAAe;AAAA;AAC3D,SAAO,SAAS,oBAAoB,cAAc;AACpD;;;AChGA,eAAsB,eACpB,OAC+B;AAE/B,QAAM,gBAAgB,MAAM,gBAAgB;AAG5C,QAAM,aAAa,iBAAiB,eAAe,MAAM,MAAM;AAE/D,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;ALnBO,SAAS,eAA0B;AAExC,QAAMC,UAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAGD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAa,EAAE,OAAO;AAAA,QACpB,QAAQ,EACL,OAAO,EACP,SAAS,EACT,SAAS,2CAA2C;AAAA,MACzD,CAAC;AAAA,IACH;AAAA,IACA,OAAO,EAAE,OAAO,MAA2B;AACzC,YAAM,SAAS,MAAM,eAAe,EAAE,OAAO,CAAC;AAE9C,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAa,EAAE,OAAO;AAAA,QACpB,YAAY,EACT,MAAM,EAAE,OAAO,CAAC,EAChB;AAAA,UACC;AAAA,QACF;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,IACA,OAAO,EAAE,WAAW,MAAgC;AAClD,YAAM,SAAS,MAAM,iBAAiB,EAAE,WAAW,CAAC;AAEpD,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAa,EAAE,OAAO;AAAA,QACpB,UAAU,EACP,KAAK,CAAC,UAAU,WAAW,cAAc,WAAW,SAAS,CAAC,EAC9D,SAAS,EACT,SAAS,2BAA2B;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,IACA,OAAO;AAAA,MACL;AAAA,IACF,MAEM;AACJ,YAAM,SAAS,MAAM,gBAAgB,EAAE,SAAS,CAAC;AAEjD,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAOA;AACT;;;ADtGA,IAAM,SAAS,aAAa;AAG5B,IAAM,YAAY,IAAI,qBAAqB;AAC3C,MAAM,OAAO,QAAQ,SAAS;",
6
6
  "names": ["readFile", "join", "join", "join", "join", "readFile", "readFile", "join", "join", "readFile", "server"]
7
7
  }
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@amedia/brick-mcp",
3
3
  "homepage": "https://github.com/amedia/brick.git",
4
4
  "author": "Amedia",
5
- "version": "0.1.6",
5
+ "version": "0.1.8",
6
6
  "description": "This is a MCP server for Brick",
7
7
  "license": "MIT",
8
8
  "type": "module",
@@ -37,41 +37,41 @@
37
37
  "zod-to-json-schema": "3.24.6"
38
38
  },
39
39
  "devDependencies": {
40
- "@amedia/brick-alt-teaser": "8.1.13",
41
- "@amedia/brick-avatar": "0.2.54",
42
- "@amedia/brick-button": "9.4.12",
43
- "@amedia/brick-byline": "1.0.16",
44
- "@amedia/brick-card": "7.3.26",
45
- "@amedia/brick-carousel": "2.2.15",
40
+ "@amedia/brick-alt-teaser": "8.1.17",
41
+ "@amedia/brick-avatar": "0.2.55",
42
+ "@amedia/brick-button": "9.4.13",
43
+ "@amedia/brick-byline": "1.0.17",
44
+ "@amedia/brick-card": "7.3.27",
45
+ "@amedia/brick-carousel": "2.3.0",
46
46
  "@amedia/brick-classnames": "3.0.2",
47
- "@amedia/brick-countdown": "3.0.0",
48
- "@amedia/brick-dialog": "2.1.9",
49
- "@amedia/brick-expand": "0.0.20",
47
+ "@amedia/brick-countdown": "3.0.2",
48
+ "@amedia/brick-dialog": "2.1.10",
49
+ "@amedia/brick-expand": "0.0.22",
50
50
  "@amedia/brick-fonts": "2.0.2",
51
- "@amedia/brick-helloworld": "2.0.19",
52
- "@amedia/brick-icon": "2.3.18",
51
+ "@amedia/brick-helloworld": "2.0.20",
52
+ "@amedia/brick-icon": "2.3.19",
53
53
  "@amedia/brick-icons": "2.2.4",
54
54
  "@amedia/brick-illustrations": "1.3.0",
55
- "@amedia/brick-image": "6.0.21",
56
- "@amedia/brick-input": "4.0.0",
57
- "@amedia/brick-pill": "10.0.0",
58
- "@amedia/brick-player": "2.3.0",
59
- "@amedia/brick-published": "4.0.17",
60
- "@amedia/brick-share": "0.3.22",
61
- "@amedia/brick-stepper": "1.1.3",
62
- "@amedia/brick-tab": "0.1.24",
63
- "@amedia/brick-tabs": "0.1.25",
64
- "@amedia/brick-tag": "0.0.24",
65
- "@amedia/brick-teaser": "22.0.5",
66
- "@amedia/brick-teaser-player": "1.1.12",
67
- "@amedia/brick-teaser-reels": "0.4.15",
55
+ "@amedia/brick-image": "6.0.22",
56
+ "@amedia/brick-input": "4.0.1",
57
+ "@amedia/brick-pill": "10.1.1",
58
+ "@amedia/brick-player": "2.3.2",
59
+ "@amedia/brick-published": "4.0.18",
60
+ "@amedia/brick-share": "0.3.23",
61
+ "@amedia/brick-stepper": "1.1.4",
62
+ "@amedia/brick-tab": "0.1.25",
63
+ "@amedia/brick-tabs": "0.1.26",
64
+ "@amedia/brick-tag": "0.0.25",
65
+ "@amedia/brick-teaser": "22.0.9",
66
+ "@amedia/brick-teaser-player": "1.1.14",
67
+ "@amedia/brick-teaser-reels": "0.4.16",
68
68
  "@amedia/brick-template": "2.0.1",
69
- "@amedia/brick-textarea": "2.0.20",
69
+ "@amedia/brick-textarea": "2.0.21",
70
70
  "@amedia/brick-themes": "1.0.2",
71
- "@amedia/brick-toast": "0.1.38",
72
- "@amedia/brick-toggle": "3.1.24",
73
- "@amedia/brick-tokens": "6.0.10",
74
- "@amedia/brick-tooltip": "1.0.27"
71
+ "@amedia/brick-toast": "0.1.39",
72
+ "@amedia/brick-toggle": "3.1.25",
73
+ "@amedia/brick-tokens": "6.0.11",
74
+ "@amedia/brick-tooltip": "1.0.28"
75
75
  },
76
76
  "eik": {
77
77
  "server": "https://assets.acdn.no",