@kb-labs/studio-ui-kit 2.118.2 → 2.119.0-canary.0b4b21a55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -47,7 +47,7 @@ function MyComponent() {
47
47
  ## 📊 Component Stats
48
48
 
49
49
  - **Total Components:** 52
50
- - **With Tests:** 4/52 (8%)
50
+ - **With Tests:** 6/52 (12%)
51
51
 
52
52
  **By Category:**
53
53
 
@@ -87,7 +87,7 @@ Essential UI components
87
87
  | **UICopyButton** | UICopyButton — one-click copy with built-in visual feedback. | ❌ |
88
88
  | **UIIcon** | UIIcon component - Icon wrapper with proper theming | ❌ |
89
89
  | **UIShimmerText** | UIShimmerText - Animated gradient shimmer on text | ❌ |
90
- | **UITag** | UITag component - Label/category tag with semantic colors | ❌ |
90
+ | **UITag** | UITag component - Label/category tag with semantic colors | ✅ |
91
91
  | **UITitle** | UITitle component - Page/section titles with hierarchy | ❌ |
92
92
 
93
93
  ### Layout
@@ -153,7 +153,7 @@ Feedback and notification components
153
153
  | **UIEmptyState** | UIEmptyState component - Empty state placeholder | ❌ |
154
154
  | **UIErrorState** | UIErrorState component - Error state display | ❌ |
155
155
  | **UIResult** | UIResult component - Result page | ❌ |
156
- | **UISkeleton** | UISkeleton component - Loading skeleton | ❌ |
156
+ | **UISkeleton** | UISkeleton component - Loading skeleton | ✅ |
157
157
  | **UISpin** | UISpin component - Loading spinner | ❌ |
158
158
 
159
159
  ### Overlay
package/dist/index.css CHANGED
@@ -1,74 +1,74 @@
1
- /* src/core/UIButton.module.css */
2
- .uiButton {
1
+ /* kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UIButton.module.css?kb-css-modules-css */
2
+ .uiButton_3Yg7B {
3
3
  }
4
- .uiButton svg {
4
+ .uiButton_3Yg7B svg {
5
5
  color: inherit !important;
6
6
  stroke: currentColor !important;
7
7
  fill: currentColor !important;
8
8
  }
9
- .uiButton:disabled svg,
10
- .uiButton.ant-btn-disabled svg {
9
+ .uiButton_3Yg7B:disabled svg,
10
+ .uiButton_3Yg7B.ant-btn-disabled svg {
11
11
  opacity: 0.4;
12
12
  }
13
- .uiButton.ant-btn-sm svg {
13
+ .uiButton_3Yg7B.ant-btn-sm svg {
14
14
  width: 14px;
15
15
  height: 14px;
16
16
  }
17
- .uiButton svg {
17
+ .uiButton_3Yg7B svg {
18
18
  width: 16px;
19
19
  height: 16px;
20
20
  }
21
- .uiButton.ant-btn-lg svg {
21
+ .uiButton_3Yg7B.ant-btn-lg svg {
22
22
  width: 18px;
23
23
  height: 18px;
24
24
  }
25
- .uiButton .ant-btn-icon {
25
+ .uiButton_3Yg7B .ant-btn-icon {
26
26
  color: inherit !important;
27
27
  display: inline-flex;
28
28
  align-items: center;
29
29
  justify-content: center;
30
30
  }
31
- .uiButton .ant-btn-icon svg {
31
+ .uiButton_3Yg7B .ant-btn-icon svg {
32
32
  vertical-align: middle;
33
33
  display: block;
34
34
  }
35
- .uiButton {
35
+ .uiButton_3Yg7B {
36
36
  transition:
37
37
  transform 100ms ease,
38
38
  box-shadow 150ms ease,
39
39
  opacity 100ms ease;
40
40
  }
41
- .uiButton:active:not(:disabled):not(.ant-btn-disabled) {
41
+ .uiButton_3Yg7B:active:not(:disabled):not(.ant-btn-disabled) {
42
42
  transform: scale(0.96);
43
43
  transition: transform 60ms ease;
44
44
  }
45
- .uiButton.ant-btn-primary {
45
+ .uiButton_3Yg7B.ant-btn-primary {
46
46
  transition: transform 150ms ease, box-shadow 150ms ease;
47
47
  }
48
- .uiButton.ant-btn-primary:hover:not(:disabled):not(.ant-btn-disabled) {
48
+ .uiButton_3Yg7B.ant-btn-primary:hover:not(:disabled):not(.ant-btn-disabled) {
49
49
  transform: translateY(-1px);
50
50
  box-shadow: 0 4px 12px rgba(12, 102, 255, 0.3);
51
51
  }
52
- .uiButton.ant-btn-primary:active:not(:disabled):not(.ant-btn-disabled) {
52
+ .uiButton_3Yg7B.ant-btn-primary:active:not(:disabled):not(.ant-btn-disabled) {
53
53
  transform: scale(0.97);
54
54
  box-shadow: none;
55
55
  transition: transform 60ms ease;
56
56
  }
57
- .uiButton.ant-btn-default:active:not(:disabled):not(.ant-btn-disabled),
58
- .uiButton.ant-btn-dashed:active:not(:disabled):not(.ant-btn-disabled) {
57
+ .uiButton_3Yg7B.ant-btn-default:active:not(:disabled):not(.ant-btn-disabled),
58
+ .uiButton_3Yg7B.ant-btn-dashed:active:not(:disabled):not(.ant-btn-disabled) {
59
59
  opacity: 0.75;
60
60
  }
61
- .uiButton.ant-btn-text:active:not(:disabled):not(.ant-btn-disabled),
62
- .uiButton.ant-btn-link:active:not(:disabled):not(.ant-btn-disabled) {
61
+ .uiButton_3Yg7B.ant-btn-text:active:not(:disabled):not(.ant-btn-disabled),
62
+ .uiButton_3Yg7B.ant-btn-link:active:not(:disabled):not(.ant-btn-disabled) {
63
63
  background: rgba(0, 0, 0, 0.06) !important;
64
64
  transform: scale(0.95);
65
65
  }
66
- [dir=rtl] .uiButton .ant-btn-icon {
66
+ [dir=rtl] .uiButton_3Yg7B .ant-btn-icon {
67
67
  transform: scaleX(-1);
68
68
  }
69
69
 
70
- /* src/core/UICard.module.css */
71
- .card {
70
+ /* kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UICard.module.css?kb-css-modules-css */
71
+ .card_0vX7- {
72
72
  --card-accent: var(--border-primary);
73
73
  box-shadow: 0 1px 2px var(--shadow);
74
74
  transition:
@@ -77,7 +77,7 @@
77
77
  border-color 200ms ease;
78
78
  position: relative;
79
79
  }
80
- .card::before {
80
+ .card_0vX7-::before {
81
81
  content: "";
82
82
  position: absolute;
83
83
  top: 0;
@@ -89,17 +89,17 @@
89
89
  opacity: 0;
90
90
  transition: opacity 200ms ease;
91
91
  }
92
- .card.accented::before {
92
+ .card_0vX7-.accented_yICrq::before {
93
93
  opacity: 1;
94
94
  }
95
- .card.hoverable:hover {
95
+ .card_0vX7-.hoverable_NBVEA:hover {
96
96
  box-shadow: 0 8px 20px -4px var(--shadow-hover);
97
97
  border-color: var(--border-secondary);
98
98
  transform: translateY(-1px);
99
99
  }
100
100
 
101
- /* src/core/UITag.module.css */
102
- .kb-ui-tag {
101
+ /* kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UITag.module.css?kb-css-modules-css */
102
+ .kb-ui-tag_D2ji0 {
103
103
  transition:
104
104
  opacity 100ms ease,
105
105
  transform 100ms ease,
@@ -108,105 +108,105 @@
108
108
  background-color 150ms ease,
109
109
  filter 150ms ease;
110
110
  }
111
- .kb-ui-tag:not([disabled]):hover {
111
+ .kb-ui-tag_D2ji0:not([disabled]):hover {
112
112
  filter: brightness(1.06);
113
113
  }
114
- .kb-ui-tag--clickable {
114
+ .kb-ui-tag--clickable_FGDC8 {
115
115
  cursor: pointer;
116
116
  }
117
- .kb-ui-tag--clickable:not([disabled]):hover {
117
+ .kb-ui-tag--clickable_FGDC8:not([disabled]):hover {
118
118
  transform: translateY(-1px);
119
119
  box-shadow: 0 2px 8px var(--shadow-hover, rgba(0, 0, 0, 0.1));
120
120
  border-color: var(--border-secondary);
121
121
  }
122
- .kb-ui-tag--clickable:not([disabled]):active {
122
+ .kb-ui-tag--clickable_FGDC8:not([disabled]):active {
123
123
  opacity: 0.7;
124
124
  transform: scale(0.94);
125
125
  box-shadow: none;
126
126
  transition: opacity 50ms ease, transform 50ms ease;
127
127
  }
128
128
 
129
- /* src/core/UIIcon.module.css */
130
- .uiIcon {
129
+ /* kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UIIcon.module.css?kb-css-modules-css */
130
+ .uiIcon_k0ec4 {
131
131
  display: inline-flex;
132
132
  align-items: center;
133
133
  justify-content: center;
134
134
  vertical-align: middle;
135
135
  }
136
- .uiIcon svg {
136
+ .uiIcon_k0ec4 svg {
137
137
  color: currentColor;
138
138
  stroke: currentColor;
139
139
  fill: none;
140
140
  display: block;
141
141
  }
142
- .uiIcon .anticon {
142
+ .uiIcon_k0ec4 .anticon {
143
143
  color: currentColor;
144
144
  }
145
- .uiIcon.clickable {
145
+ .uiIcon_k0ec4.clickable_OssZj {
146
146
  cursor: pointer;
147
147
  transition: opacity 0.2s ease, transform 0.1s ease;
148
148
  }
149
- .uiIcon.clickable:hover {
149
+ .uiIcon_k0ec4.clickable_OssZj:hover {
150
150
  opacity: 0.8;
151
151
  }
152
- .uiIcon.clickable:active {
152
+ .uiIcon_k0ec4.clickable_OssZj:active {
153
153
  transform: scale(0.95);
154
154
  }
155
- .uiIcon.size-xs {
155
+ .uiIcon_k0ec4.size-xs_M79Cj {
156
156
  font-size: 12px;
157
157
  width: 12px;
158
158
  height: 12px;
159
159
  }
160
- .uiIcon.size-sm {
160
+ .uiIcon_k0ec4.size-sm_10jDl {
161
161
  font-size: 14px;
162
162
  width: 14px;
163
163
  height: 14px;
164
164
  }
165
- .uiIcon.size-base {
165
+ .uiIcon_k0ec4.size-base_h9Lkp {
166
166
  font-size: 16px;
167
167
  width: 16px;
168
168
  height: 16px;
169
169
  }
170
- .uiIcon.size-lg {
170
+ .uiIcon_k0ec4.size-lg_O0C5x {
171
171
  font-size: 20px;
172
172
  width: 20px;
173
173
  height: 20px;
174
174
  }
175
- .uiIcon.size-xl {
175
+ .uiIcon_k0ec4.size-xl_WXfPC {
176
176
  font-size: 24px;
177
177
  width: 24px;
178
178
  height: 24px;
179
179
  }
180
- .uiIcon.size-2xl {
180
+ .uiIcon_k0ec4.size-2xl_32DCm {
181
181
  font-size: 32px;
182
182
  width: 32px;
183
183
  height: 32px;
184
184
  }
185
- .uiIcon.color-primary {
185
+ .uiIcon_k0ec4.color-primary_h3CLu {
186
186
  color: var(--link, #2563EB);
187
187
  }
188
- .uiIcon.color-secondary {
188
+ .uiIcon_k0ec4.color-secondary_4pb5w {
189
189
  color: var(--text-secondary, #6B7280);
190
190
  }
191
- .uiIcon.color-success {
191
+ .uiIcon_k0ec4.color-success_O8h6- {
192
192
  color: var(--success, #16A34A);
193
193
  }
194
- .uiIcon.color-warning {
194
+ .uiIcon_k0ec4.color-warning_dYWdv {
195
195
  color: var(--warning, #F59E0B);
196
196
  }
197
- .uiIcon.color-error {
197
+ .uiIcon_k0ec4.color-error_adjhG {
198
198
  color: var(--error, #DC2626);
199
199
  }
200
- .uiIcon.color-info {
200
+ .uiIcon_k0ec4.color-info_TwzBK {
201
201
  color: var(--info, #0EA5E9);
202
202
  }
203
- .uiIcon.color-inherit {
203
+ .uiIcon_k0ec4.color-inherit_YCf-Z {
204
204
  color: inherit;
205
205
  }
206
- .uiIcon.spin {
207
- animation: uiIconSpin 1s linear infinite;
206
+ .uiIcon_k0ec4.spin_rwV9G {
207
+ animation: uiIconSpin_JA9h9 1s linear infinite;
208
208
  }
209
- @keyframes uiIconSpin {
209
+ @keyframes uiIconSpin_JA9h9 {
210
210
  from {
211
211
  transform: rotate(0deg);
212
212
  }
@@ -214,14 +214,14 @@
214
214
  transform: rotate(360deg);
215
215
  }
216
216
  }
217
- .uiIcon.disabled {
217
+ .uiIcon_k0ec4.disabled_sSgts {
218
218
  opacity: 0.4;
219
219
  cursor: not-allowed;
220
220
  pointer-events: none;
221
221
  }
222
222
 
223
- /* src/core/UIShimmerText.module.css */
224
- .shimmer {
223
+ /* kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UIShimmerText.module.css?kb-css-modules-css */
224
+ .shimmer_Vu6DO {
225
225
  background:
226
226
  linear-gradient(
227
227
  90deg,
@@ -235,10 +235,10 @@
235
235
  background-clip: text;
236
236
  -webkit-text-fill-color: transparent;
237
237
  color: transparent;
238
- animation: shimmerMove var(--shimmer-duration, 2s) linear infinite;
238
+ animation: shimmerMove_64hFq var(--shimmer-duration, 2s) linear infinite;
239
239
  display: inline-block;
240
240
  }
241
- @keyframes shimmerMove {
241
+ @keyframes shimmerMove_64hFq {
242
242
  0% {
243
243
  background-position: 100% 0;
244
244
  }
@@ -247,8 +247,8 @@
247
247
  }
248
248
  }
249
249
 
250
- /* src/feedback/UISkeleton.module.css */
251
- @keyframes skeletonLoading {
250
+ /* kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/feedback/UISkeleton.module.css?kb-css-modules-css */
251
+ @keyframes skeletonLoading_Cb6ey {
252
252
  0% {
253
253
  background-position: 100% 50%;
254
254
  }
@@ -256,7 +256,7 @@
256
256
  background-position: 0% 50%;
257
257
  }
258
258
  }
259
- .skeletonText {
260
- animation: skeletonLoading 1.4s ease infinite;
259
+ .skeletonText_D4KLj {
260
+ animation: skeletonLoading_Cb6ey 1.4s ease infinite;
261
261
  }
262
262
  /*# sourceMappingURL=index.css.map */
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/UIButton.module.css","../src/core/UICard.module.css","../src/core/UITag.module.css","../src/core/UIIcon.module.css","../src/core/UIShimmerText.module.css","../src/feedback/UISkeleton.module.css"],"sourcesContent":["/**\n * UIButton styles - Proper SVG icon theming\n *\n * This ensures all SVG icons (lucide-react, etc.) inherit colors from CSS variables\n * and work correctly in both light and dark themes.\n */\n\n.uiButton {\n /* Button inherits theme colors from Ant Design tokens */\n}\n\n/*\n * CRITICAL: SVG icon color inheritance\n *\n * Force all SVG icons to inherit button text color automatically\n * Works for lucide-react, heroicons, and any other icon libraries\n */\n.uiButton svg {\n color: inherit !important;\n stroke: currentColor !important;\n fill: currentColor !important;\n}\n\n/*\n * Disabled state - reduce opacity\n */\n.uiButton:disabled svg,\n.uiButton.ant-btn-disabled svg {\n opacity: 0.4;\n}\n\n/*\n * Size variants - ensure SVG scales properly\n */\n.uiButton.ant-btn-sm svg {\n /* Small button icons */\n width: 14px;\n height: 14px;\n}\n\n.uiButton svg {\n /* Default (middle) button icons */\n width: 16px;\n height: 16px;\n}\n\n.uiButton.ant-btn-lg svg {\n /* Large button icons */\n width: 18px;\n height: 18px;\n}\n\n/*\n * Icon positioning within button\n * Ensures proper spacing between icon and text\n */\n.uiButton .ant-btn-icon {\n /* Icon wrapper - CRITICAL: must inherit color for SVG to get correct color */\n color: inherit !important;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.uiButton .ant-btn-icon svg {\n /* SVG inside icon wrapper */\n vertical-align: middle;\n display: block; /* Remove inline spacing */\n}\n\n/*\n * All buttons — base transition and press feedback\n */\n.uiButton {\n transition: transform 100ms ease, box-shadow 150ms ease, opacity 100ms ease;\n}\n\n.uiButton:active:not(:disabled):not(.ant-btn-disabled) {\n transform: scale(0.96);\n transition: transform 60ms ease;\n}\n\n/*\n * Primary button — subtle lift on hover, snap back on press\n */\n.uiButton.ant-btn-primary {\n transition: transform 150ms ease, box-shadow 150ms ease;\n}\n\n.uiButton.ant-btn-primary:hover:not(:disabled):not(.ant-btn-disabled) {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(12, 102, 255, 0.3);\n}\n\n.uiButton.ant-btn-primary:active:not(:disabled):not(.ant-btn-disabled) {\n transform: scale(0.97);\n box-shadow: none;\n transition: transform 60ms ease;\n}\n\n/*\n * Default / dashed — dim on press\n */\n.uiButton.ant-btn-default:active:not(:disabled):not(.ant-btn-disabled),\n.uiButton.ant-btn-dashed:active:not(:disabled):not(.ant-btn-disabled) {\n opacity: 0.75;\n}\n\n/*\n * Text / link — background flash on press for clear tactile signal\n */\n.uiButton.ant-btn-text:active:not(:disabled):not(.ant-btn-disabled),\n.uiButton.ant-btn-link:active:not(:disabled):not(.ant-btn-disabled) {\n background: rgba(0, 0, 0, 0.06) !important;\n transform: scale(0.95);\n}\n\n/*\n * RTL (Right-to-Left) support\n */\n[dir='rtl'] .uiButton .ant-btn-icon {\n /* Mirror icon position in RTL */\n transform: scaleX(-1);\n}\n",".card {\n --card-accent: var(--border-primary);\n box-shadow: 0 1px 2px var(--shadow);\n transition: box-shadow 200ms ease, transform 200ms ease, border-color 200ms ease;\n position: relative;\n}\n\n.card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 16px;\n right: 16px;\n height: 2px;\n border-radius: 0 0 2px 2px;\n background: var(--card-accent);\n opacity: 0;\n transition: opacity 200ms ease;\n}\n\n.card.accented::before {\n opacity: 1;\n}\n\n.card.hoverable:hover {\n box-shadow: 0 8px 20px -4px var(--shadow-hover);\n border-color: var(--border-secondary);\n transform: translateY(-1px);\n}\n","/*\n * UITag styles — interactive feedback for clickable tags\n *\n * Class name is hardcoded ('kb-ui-tag') because tsup doesn't map\n * CSS module class names in the dist bundle — styles.className is always {}.\n */\n\n.kb-ui-tag {\n transition: opacity 100ms ease, transform 100ms ease, box-shadow 150ms ease, border-color 150ms ease, background-color 150ms ease, filter 150ms ease;\n}\n\n/*\n * All tags, even plain informational ones (e.g. capability badges on a\n * card), get a subtle brightness lift on hover so the whole UI feels alive.\n */\n.kb-ui-tag:not([disabled]):hover {\n filter: brightness(1.06);\n}\n\n/* Tags with an onClick additionally get lift/press feedback — they're pressable. */\n.kb-ui-tag--clickable {\n cursor: pointer;\n}\n\n.kb-ui-tag--clickable:not([disabled]):hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px var(--shadow-hover, rgba(0, 0, 0, 0.1));\n border-color: var(--border-secondary);\n}\n\n.kb-ui-tag--clickable:not([disabled]):active {\n opacity: 0.7;\n transform: scale(0.94);\n box-shadow: none;\n transition: opacity 50ms ease, transform 50ms ease;\n}\n","/**\n * UIIcon styles - Proper SVG and icon font theming\n *\n * Ensures all icons (Ant Design icons, lucide-react, custom SVG)\n * inherit colors from CSS variables and work in both light and dark themes.\n */\n\n.uiIcon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n vertical-align: middle;\n}\n\n/*\n * SVG icons (lucide-react, custom SVG)\n * Use currentColor to inherit from parent color\n */\n.uiIcon svg {\n color: currentColor;\n stroke: currentColor;\n fill: none; /* Most icon libraries use stroke, not fill */\n display: block; /* Remove inline spacing */\n}\n\n/*\n * Ant Design icons (icon fonts)\n * Already use currentColor by default, but ensure it's explicit\n */\n.uiIcon .anticon {\n color: currentColor;\n}\n\n/*\n * Clickable icons (icon buttons)\n */\n.uiIcon.clickable {\n cursor: pointer;\n transition: opacity 0.2s ease, transform 0.1s ease;\n}\n\n.uiIcon.clickable:hover {\n opacity: 0.8;\n}\n\n.uiIcon.clickable:active {\n transform: scale(0.95);\n}\n\n/*\n * Size variants\n */\n.uiIcon.size-xs {\n font-size: 12px;\n width: 12px;\n height: 12px;\n}\n\n.uiIcon.size-sm {\n font-size: 14px;\n width: 14px;\n height: 14px;\n}\n\n.uiIcon.size-base {\n font-size: 16px;\n width: 16px;\n height: 16px;\n}\n\n.uiIcon.size-lg {\n font-size: 20px;\n width: 20px;\n height: 20px;\n}\n\n.uiIcon.size-xl {\n font-size: 24px;\n width: 24px;\n height: 24px;\n}\n\n.uiIcon.size-2xl {\n font-size: 32px;\n width: 32px;\n height: 32px;\n}\n\n/*\n * Color variants using CSS variables\n */\n.uiIcon.color-primary {\n color: var(--link, #2563EB);\n}\n\n.uiIcon.color-secondary {\n color: var(--text-secondary, #6B7280);\n}\n\n.uiIcon.color-success {\n color: var(--success, #16A34A);\n}\n\n.uiIcon.color-warning {\n color: var(--warning, #F59E0B);\n}\n\n.uiIcon.color-error {\n color: var(--error, #DC2626);\n}\n\n.uiIcon.color-info {\n color: var(--info, #0EA5E9);\n}\n\n.uiIcon.color-inherit {\n color: inherit;\n}\n\n/*\n * Spin animation\n */\n.uiIcon.spin {\n animation: uiIconSpin 1s linear infinite;\n}\n\n@keyframes uiIconSpin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/*\n * Disabled state\n */\n.uiIcon.disabled {\n opacity: 0.4;\n cursor: not-allowed;\n pointer-events: none;\n}\n","/**\n * UIShimmerText - Animated gradient shimmer on text\n * Classic \"Cursor / ClickUp\" loading text effect.\n */\n\n.shimmer {\n background: linear-gradient(\n 90deg,\n var(--shimmer-color-1, #888) 0%,\n var(--shimmer-color-2, #888) 25%,\n var(--shimmer-highlight, #fff) 50%,\n var(--shimmer-color-2, #888) 75%,\n var(--shimmer-color-1, #888) 100%\n );\n background-size: 200% 100%;\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n color: transparent;\n animation: shimmerMove var(--shimmer-duration, 2s) linear infinite;\n display: inline-block;\n}\n\n@keyframes shimmerMove {\n 0% { background-position: 100% 0; }\n 100% { background-position: -100% 0; }\n}\n","@keyframes skeletonLoading {\n 0% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n}\n\n.skeletonText {\n animation: skeletonLoading 1.4s ease infinite;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UIButton.module.css?kb-css-modules-css","kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UICard.module.css?kb-css-modules-css","kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UITag.module.css?kb-css-modules-css","kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UIIcon.module.css?kb-css-modules-css","kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UIShimmerText.module.css?kb-css-modules-css","kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/feedback/UISkeleton.module.css?kb-css-modules-css"],"sourcesContent":["/**\n * UIButton styles - Proper SVG icon theming\n *\n * This ensures all SVG icons (lucide-react, etc.) inherit colors from CSS variables\n * and work correctly in both light and dark themes.\n *\n * `.ant-btn-*` / `.ant-btn-icon` are Ant Design's own (unscoped) classes on the\n * rendered DOM — wrapped in :global() so CSS Modules doesn't hash them away\n * from under the real selectors.\n */\n\n.uiButton_3Yg7B {\n /* Button inherits theme colors from Ant Design tokens */\n}\n\n/*\n * CRITICAL: SVG icon color inheritance\n *\n * Force all SVG icons to inherit button text color automatically\n * Works for lucide-react, heroicons, and any other icon libraries\n */\n.uiButton_3Yg7B svg {\n color: inherit !important;\n stroke: currentColor !important;\n fill: currentColor !important;\n}\n\n/*\n * Disabled state - reduce opacity\n */\n.uiButton_3Yg7B:disabled svg,\n.uiButton_3Yg7B.ant-btn-disabled svg {\n opacity: 0.4;\n}\n\n/*\n * Size variants - ensure SVG scales properly\n */\n.uiButton_3Yg7B.ant-btn-sm svg {\n /* Small button icons */\n width: 14px;\n height: 14px;\n}\n\n.uiButton_3Yg7B svg {\n /* Default (middle) button icons */\n width: 16px;\n height: 16px;\n}\n\n.uiButton_3Yg7B.ant-btn-lg svg {\n /* Large button icons */\n width: 18px;\n height: 18px;\n}\n\n/*\n * Icon positioning within button\n * Ensures proper spacing between icon and text\n */\n.uiButton_3Yg7B .ant-btn-icon {\n /* Icon wrapper - CRITICAL: must inherit color for SVG to get correct color */\n color: inherit !important;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.uiButton_3Yg7B .ant-btn-icon svg {\n /* SVG inside icon wrapper */\n vertical-align: middle;\n display: block; /* Remove inline spacing */\n}\n\n/*\n * All buttons — base transition and press feedback\n */\n.uiButton_3Yg7B {\n transition: transform 100ms ease, box-shadow 150ms ease, opacity 100ms ease;\n}\n\n.uiButton_3Yg7B:active:not(:disabled):not(.ant-btn-disabled) {\n transform: scale(0.96);\n transition: transform 60ms ease;\n}\n\n/*\n * Primary button — subtle lift on hover, snap back on press\n */\n.uiButton_3Yg7B.ant-btn-primary {\n transition: transform 150ms ease, box-shadow 150ms ease;\n}\n\n.uiButton_3Yg7B.ant-btn-primary:hover:not(:disabled):not(.ant-btn-disabled) {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(12, 102, 255, 0.3);\n}\n\n.uiButton_3Yg7B.ant-btn-primary:active:not(:disabled):not(.ant-btn-disabled) {\n transform: scale(0.97);\n box-shadow: none;\n transition: transform 60ms ease;\n}\n\n/*\n * Default / dashed — dim on press\n */\n.uiButton_3Yg7B.ant-btn-default:active:not(:disabled):not(.ant-btn-disabled),\n.uiButton_3Yg7B.ant-btn-dashed:active:not(:disabled):not(.ant-btn-disabled) {\n opacity: 0.75;\n}\n\n/*\n * Text / link — background flash on press for clear tactile signal\n */\n.uiButton_3Yg7B.ant-btn-text:active:not(:disabled):not(.ant-btn-disabled),\n.uiButton_3Yg7B.ant-btn-link:active:not(:disabled):not(.ant-btn-disabled) {\n background: rgba(0, 0, 0, 0.06) !important;\n transform: scale(0.95);\n}\n\n/*\n * RTL (Right-to-Left) support\n */\n[dir='rtl'] .uiButton_3Yg7B .ant-btn-icon {\n /* Mirror icon position in RTL */\n transform: scaleX(-1);\n}\n",".card_0vX7- {\n --card-accent: var(--border-primary);\n box-shadow: 0 1px 2px var(--shadow);\n transition: box-shadow 200ms ease, transform 200ms ease, border-color 200ms ease;\n position: relative;\n}\n\n.card_0vX7-::before {\n content: '';\n position: absolute;\n top: 0;\n left: 16px;\n right: 16px;\n height: 2px;\n border-radius: 0 0 2px 2px;\n background: var(--card-accent);\n opacity: 0;\n transition: opacity 200ms ease;\n}\n\n.card_0vX7-.accented_yICrq::before {\n opacity: 1;\n}\n\n.card_0vX7-.hoverable_NBVEA:hover {\n box-shadow: 0 8px 20px -4px var(--shadow-hover);\n border-color: var(--border-secondary);\n transform: translateY(-1px);\n}\n","/*\n * UITag styles — interactive feedback for clickable tags\n */\n\n.kb-ui-tag_D2ji0 {\n transition: opacity 100ms ease, transform 100ms ease, box-shadow 150ms ease, border-color 150ms ease, background-color 150ms ease, filter 150ms ease;\n}\n\n/*\n * All tags, even plain informational ones (e.g. capability badges on a\n * card), get a subtle brightness lift on hover so the whole UI feels alive.\n */\n.kb-ui-tag_D2ji0:not([disabled]):hover {\n filter: brightness(1.06);\n}\n\n/* Tags with an onClick additionally get lift/press feedback — they're pressable. */\n.kb-ui-tag--clickable_FGDC8 {\n cursor: pointer;\n}\n\n.kb-ui-tag--clickable_FGDC8:not([disabled]):hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px var(--shadow-hover, rgba(0, 0, 0, 0.1));\n border-color: var(--border-secondary);\n}\n\n.kb-ui-tag--clickable_FGDC8:not([disabled]):active {\n opacity: 0.7;\n transform: scale(0.94);\n box-shadow: none;\n transition: opacity 50ms ease, transform 50ms ease;\n}\n","/**\n * UIIcon styles - Proper SVG and icon font theming\n *\n * Ensures all icons (Ant Design icons, lucide-react, custom SVG)\n * inherit colors from CSS variables and work in both light and dark themes.\n */\n\n.uiIcon_k0ec4 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n vertical-align: middle;\n}\n\n/*\n * SVG icons (lucide-react, custom SVG)\n * Use currentColor to inherit from parent color\n */\n.uiIcon_k0ec4 svg {\n color: currentColor;\n stroke: currentColor;\n fill: none; /* Most icon libraries use stroke, not fill */\n display: block; /* Remove inline spacing */\n}\n\n/*\n * Ant Design icons (icon fonts)\n * Already use currentColor by default, but ensure it's explicit\n * `.anticon` is Ant Design's own (unscoped) class — wrapped in :global()\n * so CSS Modules doesn't hash it away from the real DOM class.\n */\n.uiIcon_k0ec4 .anticon {\n color: currentColor;\n}\n\n/*\n * Clickable icons (icon buttons)\n */\n.uiIcon_k0ec4.clickable_OssZj {\n cursor: pointer;\n transition: opacity 0.2s ease, transform 0.1s ease;\n}\n\n.uiIcon_k0ec4.clickable_OssZj:hover {\n opacity: 0.8;\n}\n\n.uiIcon_k0ec4.clickable_OssZj:active {\n transform: scale(0.95);\n}\n\n/*\n * Size variants\n */\n.uiIcon_k0ec4.size-xs_M79Cj {\n font-size: 12px;\n width: 12px;\n height: 12px;\n}\n\n.uiIcon_k0ec4.size-sm_10jDl {\n font-size: 14px;\n width: 14px;\n height: 14px;\n}\n\n.uiIcon_k0ec4.size-base_h9Lkp {\n font-size: 16px;\n width: 16px;\n height: 16px;\n}\n\n.uiIcon_k0ec4.size-lg_O0C5x {\n font-size: 20px;\n width: 20px;\n height: 20px;\n}\n\n.uiIcon_k0ec4.size-xl_WXfPC {\n font-size: 24px;\n width: 24px;\n height: 24px;\n}\n\n.uiIcon_k0ec4.size-2xl_32DCm {\n font-size: 32px;\n width: 32px;\n height: 32px;\n}\n\n/*\n * Color variants using CSS variables\n */\n.uiIcon_k0ec4.color-primary_h3CLu {\n color: var(--link, #2563EB);\n}\n\n.uiIcon_k0ec4.color-secondary_4pb5w {\n color: var(--text-secondary, #6B7280);\n}\n\n.uiIcon_k0ec4.color-success_O8h6- {\n color: var(--success, #16A34A);\n}\n\n.uiIcon_k0ec4.color-warning_dYWdv {\n color: var(--warning, #F59E0B);\n}\n\n.uiIcon_k0ec4.color-error_adjhG {\n color: var(--error, #DC2626);\n}\n\n.uiIcon_k0ec4.color-info_TwzBK {\n color: var(--info, #0EA5E9);\n}\n\n.uiIcon_k0ec4.color-inherit_YCf-Z {\n color: inherit;\n}\n\n/*\n * Spin animation\n */\n.uiIcon_k0ec4.spin_rwV9G {\n animation: uiIconSpin_JA9h9 1s linear infinite;\n}\n\n@keyframes uiIconSpin_JA9h9 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/*\n * Disabled state\n */\n.uiIcon_k0ec4.disabled_sSgts {\n opacity: 0.4;\n cursor: not-allowed;\n pointer-events: none;\n}\n","/**\n * UIShimmerText - Animated gradient shimmer on text\n * Classic \"Cursor / ClickUp\" loading text effect.\n */\n\n.shimmer_Vu6DO {\n background: linear-gradient(\n 90deg,\n var(--shimmer-color-1, #888) 0%,\n var(--shimmer-color-2, #888) 25%,\n var(--shimmer-highlight, #fff) 50%,\n var(--shimmer-color-2, #888) 75%,\n var(--shimmer-color-1, #888) 100%\n );\n background-size: 200% 100%;\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n color: transparent;\n animation: shimmerMove_64hFq var(--shimmer-duration, 2s) linear infinite;\n display: inline-block;\n}\n\n@keyframes shimmerMove_64hFq {\n 0% { background-position: 100% 0; }\n 100% { background-position: -100% 0; }\n}\n","@keyframes skeletonLoading_Cb6ey {\n 0% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n}\n\n.skeletonText_D4KLj {\n animation: skeletonLoading_Cb6ey 1.4s ease infinite;\n}\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -3,10 +3,12 @@ import { typography, spacing } from '@kb-labs/studio-ui-core';
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import * as React4 from 'react';
5
5
  import { useMemo } from 'react';
6
+ import clsx from 'clsx';
6
7
  import { Line, Column, Area, Pie, Bar } from '@ant-design/charts';
7
8
  import dayjs from 'dayjs';
8
9
  import { useNavigate, useSearchParams, useParams } from 'react-router-dom';
9
10
  import { marked } from 'marked';
11
+ import DOMPurify from 'dompurify';
10
12
 
11
13
  // src/primitives/UIText.tsx
12
14
  var { useToken } = theme;
@@ -187,11 +189,11 @@ function UIBadge({ variant = "default", children, ...props }) {
187
189
  );
188
190
  }
189
191
 
190
- // src/core/UIButton.module.css
191
- var UIButton_default = {};
192
+ // kb-css-modules-tokens:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UIButton.module.css?kb-css-modules-tokens
193
+ var UIButton_module_default = { "uiButton": "uiButton_3Yg7B" };
192
194
  var UIButton = React4.forwardRef(
193
195
  function UIButton2({ variant = "default", className, ...rest }, ref) {
194
- const combinedClassName = [UIButton_default.uiButton, className].filter(Boolean).join(" ");
196
+ const combinedClassName = [UIButton_module_default.uiButton, className].filter(Boolean).join(" ");
195
197
  return /* @__PURE__ */ jsx(
196
198
  Button,
197
199
  {
@@ -204,8 +206,8 @@ var UIButton = React4.forwardRef(
204
206
  }
205
207
  );
206
208
 
207
- // src/core/UICard.module.css
208
- var UICard_default = {};
209
+ // kb-css-modules-tokens:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UICard.module.css?kb-css-modules-tokens
210
+ var UICard_module_default = { "card": "card_0vX7-", "accented": "accented_yICrq", "hoverable": "hoverable_NBVEA" };
209
211
  var { useToken: useToken3 } = theme;
210
212
  var variantTokens = {
211
213
  default: { accent: "var(--border-primary)" },
@@ -243,12 +245,12 @@ function UICard({
243
245
  hoverable: false,
244
246
  loading,
245
247
  ...rest,
246
- className: [
247
- UICard_default.card,
248
- hoverable && UICard_default.hoverable,
249
- status !== "default" && UICard_default.accented,
248
+ className: clsx(
249
+ UICard_module_default.card,
250
+ hoverable && UICard_module_default.hoverable,
251
+ status !== "default" && UICard_module_default.accented,
250
252
  rest.className
251
- ].filter(Boolean).join(" "),
253
+ ),
252
254
  style: {
253
255
  borderColor: token.colorBorder,
254
256
  overflow: "hidden",
@@ -262,6 +264,9 @@ function UICard({
262
264
  }
263
265
  );
264
266
  }
267
+
268
+ // kb-css-modules-tokens:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UITag.module.css?kb-css-modules-tokens
269
+ var UITag_module_default = { "kb-ui-tag": "kb-ui-tag_D2ji0", "kb-ui-tag--clickable": "kb-ui-tag--clickable_FGDC8" };
265
270
  function UITag({
266
271
  variant = "default",
267
272
  color,
@@ -281,7 +286,11 @@ function UITag({
281
286
  default: void 0,
282
287
  neutral: void 0
283
288
  };
284
- const combinedClassName = ["kb-ui-tag", onClick && "kb-ui-tag--clickable", className].filter(Boolean).join(" ");
289
+ const combinedClassName = clsx(
290
+ UITag_module_default["kb-ui-tag"],
291
+ onClick && UITag_module_default["kb-ui-tag--clickable"],
292
+ className
293
+ );
285
294
  return /* @__PURE__ */ jsx(
286
295
  Tag,
287
296
  {
@@ -324,8 +333,8 @@ function UITitle({
324
333
  return /* @__PURE__ */ jsx(AntTitle, { level, className, style: { marginBottom: spacing[3], ...style }, children });
325
334
  }
326
335
 
327
- // src/core/UIIcon.module.css
328
- var UIIcon_default = {};
336
+ // kb-css-modules-tokens:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UIIcon.module.css?kb-css-modules-tokens
337
+ var UIIcon_module_default = { "uiIcon": "uiIcon_k0ec4", "clickable": "clickable_OssZj", "size-xs": "size-xs_M79Cj", "size-sm": "size-sm_10jDl", "size-base": "size-base_h9Lkp", "size-lg": "size-lg_O0C5x", "size-xl": "size-xl_WXfPC", "size-2xl": "size-2xl_32DCm", "color-primary": "color-primary_h3CLu", "color-secondary": "color-secondary_4pb5w", "color-success": "color-success_O8h6-", "color-warning": "color-warning_dYWdv", "color-error": "color-error_adjhG", "color-info": "color-info_TwzBK", "color-inherit": "color-inherit_YCf-Z", "spin": "spin_rwV9G", "uiIconSpin": "uiIconSpin_JA9h9", "disabled": "disabled_sSgts" };
329
338
  var _iconRenderer = null;
330
339
  function registerIconRenderer(renderer) {
331
340
  _iconRenderer = renderer;
@@ -340,15 +349,15 @@ function UIIcon({
340
349
  className,
341
350
  style: customStyle
342
351
  }) {
343
- const classes = [
344
- UIIcon_default.uiIcon,
352
+ const classes = clsx(
353
+ UIIcon_module_default.uiIcon,
345
354
  "anticon",
346
- UIIcon_default[`size-${size}`],
347
- UIIcon_default[`color-${color}`],
348
- spin && UIIcon_default.spin,
349
- onClick && UIIcon_default.clickable,
355
+ UIIcon_module_default[`size-${size}`],
356
+ UIIcon_module_default[`color-${color}`],
357
+ spin && UIIcon_module_default.spin,
358
+ onClick && UIIcon_module_default.clickable,
350
359
  className
351
- ].filter(Boolean).join(" ");
360
+ );
352
361
  let iconElement = null;
353
362
  const iconName = name || (typeof icon === "string" ? icon : null);
354
363
  if (iconName) {
@@ -412,8 +421,8 @@ function useUITheme() {
412
421
  return result;
413
422
  }
414
423
 
415
- // src/core/UIShimmerText.module.css
416
- var UIShimmerText_default = {};
424
+ // kb-css-modules-tokens:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UIShimmerText.module.css?kb-css-modules-tokens
425
+ var UIShimmerText_module_default = { "shimmer": "shimmer_Vu6DO"};
417
426
  function UIShimmerText({
418
427
  children,
419
428
  color = "var(--text-secondary, #9CA3AF)",
@@ -425,7 +434,7 @@ function UIShimmerText({
425
434
  return /* @__PURE__ */ jsx(
426
435
  "span",
427
436
  {
428
- className: [UIShimmerText_default.shimmer, className].filter(Boolean).join(" "),
437
+ className: clsx(UIShimmerText_module_default.shimmer, className),
429
438
  style: {
430
439
  "--shimmer-color-1": color,
431
440
  "--shimmer-color-2": color,
@@ -1719,8 +1728,8 @@ function UIErrorState({
1719
1728
  ] }) });
1720
1729
  }
1721
1730
 
1722
- // src/feedback/UISkeleton.module.css
1723
- var UISkeleton_default = {};
1731
+ // kb-css-modules-tokens:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/feedback/UISkeleton.module.css?kb-css-modules-tokens
1732
+ var UISkeleton_module_default = { "skeletonText": "skeletonText_D4KLj"};
1724
1733
  function UISkeleton({
1725
1734
  loading = true,
1726
1735
  children,
@@ -1777,7 +1786,7 @@ function UISkeletonText({
1777
1786
  children: widths.map((w, i) => /* @__PURE__ */ jsx(
1778
1787
  "span",
1779
1788
  {
1780
- className: UISkeleton_default.skeletonText,
1789
+ className: clsx(UISkeleton_module_default.skeletonText),
1781
1790
  style: {
1782
1791
  display: "block",
1783
1792
  width: isArray ? typeof w === "number" ? `${w}px` : w : "100%",
@@ -1892,6 +1901,8 @@ function UIMarkdownViewer({ content, className, style: customStyle }) {
1892
1901
  const { token } = useToken16();
1893
1902
  const css = `
1894
1903
  .kb-md { font-size: ${token.fontSize}px; line-height: 1.6; color: ${token.colorText}; font-family: ${token.fontFamily}; }
1904
+ .kb-md > *:first-child { margin-top: 0; }
1905
+ .kb-md > *:last-child { margin-bottom: 0; }
1895
1906
  .kb-md h1,.kb-md h2,.kb-md h3,.kb-md h4,.kb-md h5,.kb-md h6 { font-weight:600; line-height:1.3; margin:1.2em 0 0.4em; color:${token.colorTextHeading}; }
1896
1907
  .kb-md h1:first-child,.kb-md h2:first-child,.kb-md h3:first-child { margin-top:0; }
1897
1908
  .kb-md h1 { font-size:1.5em; padding-bottom:0.3em; border-bottom:1px solid ${token.colorBorderSecondary}; }
@@ -1905,7 +1916,12 @@ function UIMarkdownViewer({ content, className, style: customStyle }) {
1905
1916
  .kb-md pre { background:${token.colorFillQuaternary}; border:1px solid ${token.colorBorderSecondary}; border-radius:${token.borderRadius}px; padding:12px 16px; overflow-x:auto; margin:0.75em 0; }
1906
1917
  .kb-md pre code { background:none; padding:0; font-size:0.85em; color:${token.colorText}; }
1907
1918
  .kb-md ul,.kb-md ol { padding-left:1.5em; margin:0.6em 0; }
1908
- .kb-md li { margin:0.2em 0; }
1919
+ .kb-md ul { list-style: disc; }
1920
+ .kb-md ol { list-style: decimal; }
1921
+ .kb-md ul ul { list-style: circle; }
1922
+ .kb-md ol ol, .kb-md ul ol { list-style: decimal; }
1923
+ .kb-md li { margin:0.2em 0; list-style: inherit; }
1924
+ .kb-md li::marker { color:${token.colorTextTertiary}; }
1909
1925
  .kb-md blockquote { margin:0.75em 0; padding:0.4em 1em; border-left:4px solid ${token.colorPrimaryBorder}; background:${token.colorFillQuaternary}; color:${token.colorTextSecondary}; border-radius:0 ${token.borderRadiusSM}px ${token.borderRadiusSM}px 0; }
1910
1926
  .kb-md blockquote p { margin:0; }
1911
1927
  .kb-md hr { border:none; border-top:1px solid ${token.colorBorderSecondary}; margin:1.2em 0; }
@@ -1915,13 +1931,14 @@ function UIMarkdownViewer({ content, className, style: customStyle }) {
1915
1931
  .kb-md tr:nth-child(even) td { background:${token.colorFillQuaternary}; }
1916
1932
  .kb-md img { max-width:100%; border-radius:${token.borderRadius}px; }
1917
1933
  `;
1934
+ const html = DOMPurify.sanitize(marked.parse(content));
1918
1935
  return /* @__PURE__ */ jsxs(UIBox, { className, style: { padding: token.padding, ...customStyle }, children: [
1919
1936
  /* @__PURE__ */ jsx("style", { children: css }),
1920
1937
  /* @__PURE__ */ jsx(
1921
1938
  "div",
1922
1939
  {
1923
1940
  className: "kb-md",
1924
- dangerouslySetInnerHTML: { __html: marked(content) }
1941
+ dangerouslySetInnerHTML: { __html: html }
1925
1942
  }
1926
1943
  )
1927
1944
  ] });
@@ -1974,9 +1991,15 @@ function UIJsonViewer({
1974
1991
  return /* @__PURE__ */ jsx(UIBox, { className, style, children: /* @__PURE__ */ jsx("pre", { style: codeStyle, children: showLineNumbers ? lines.map((line, index) => /* @__PURE__ */ jsxs("div", { children: [
1975
1992
  /* @__PURE__ */ jsx("span", { style: lineNumberStyle, children: index + 1 }),
1976
1993
  /* @__PURE__ */ jsx("span", { dangerouslySetInnerHTML: { __html: highlightJson(line, token) } })
1977
- ] }, index)) : /* @__PURE__ */ jsx("span", { dangerouslySetInnerHTML: { __html: highlightedJson } }) }) });
1994
+ ] }, index)) : /* @__PURE__ */ jsx(
1995
+ "span",
1996
+ {
1997
+ dangerouslySetInnerHTML: { __html: highlightedJson }
1998
+ }
1999
+ ) }) });
1978
2000
  }
1979
2001
  function highlightJson(json, token) {
2002
+ json = json.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
1980
2003
  json = json.replace(/"([^"]+)":/g, `<span style="color: ${token.colorPrimary}">"$1"</span>:`);
1981
2004
  json = json.replace(/: "([^"]*)"/g, `: <span style="color: ${token.colorSuccess}">"$1"</span>`);
1982
2005
  json = json.replace(/: (\d+)/g, `: <span style="color: ${token.colorWarning}">$1</span>`);