@kyndryl-design-system/shidoka-applications 2.46.0 → 2.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -7,331 +7,326 @@
|
|
|
7
7
|
$shidoka-code-view-background: var(--kd-color-code-view-background);
|
|
8
8
|
|
|
9
9
|
.shidoka-syntax-theme {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
&--dark {
|
|
14
|
-
color-scheme: dark;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
&--light {
|
|
18
|
-
color-scheme: light;
|
|
19
|
-
}
|
|
10
|
+
background: $shidoka-code-view-background;
|
|
11
|
+
font-weight: 500;
|
|
20
12
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
color: var(--kd-color-code-view-default);
|
|
25
|
-
font-family: var(--kd-font-family-code-view);
|
|
13
|
+
&--dark {
|
|
14
|
+
color-scheme: dark;
|
|
15
|
+
}
|
|
26
16
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
17
|
+
&--light {
|
|
18
|
+
color-scheme: light;
|
|
19
|
+
}
|
|
30
20
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
21
|
+
code[class*='language-'],
|
|
22
|
+
pre[class*='language-'] {
|
|
23
|
+
background: $shidoka-code-view-background;
|
|
24
|
+
color: var(--kd-color-code-view-default);
|
|
25
|
+
font-family: var(--kd-font-family-code-view);
|
|
26
|
+
|
|
27
|
+
-moz-tab-size: 4;
|
|
28
|
+
-o-tab-size: 4;
|
|
29
|
+
tab-size: 4;
|
|
30
|
+
|
|
31
|
+
-webkit-hyphens: none;
|
|
32
|
+
-moz-hyphens: none;
|
|
33
|
+
-ms-hyphens: none;
|
|
34
|
+
hyphens: none;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
pre[class*='language-']::selection,
|
|
38
|
+
pre[class*='language-'] ::selection,
|
|
39
|
+
code[class*='language-']::selection,
|
|
40
|
+
code[class*='language-'] ::selection {
|
|
41
|
+
text-shadow: none;
|
|
42
|
+
background: inherit;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
pre[class*='language-']::-moz-selection,
|
|
46
|
+
pre[class*='language-'] ::-moz-selection,
|
|
47
|
+
code[class*='language-']::-moz-selection,
|
|
48
|
+
code[class*='language-'] ::-moz-selection {
|
|
49
|
+
text-shadow: none;
|
|
50
|
+
background: inherit;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@media print {
|
|
54
|
+
code[class*='language-'],
|
|
55
|
+
pre[class*='language-'] {
|
|
56
|
+
text-shadow: none;
|
|
35
57
|
}
|
|
58
|
+
}
|
|
36
59
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
code[class*="language-"] ::selection {
|
|
41
|
-
text-shadow: none;
|
|
42
|
-
background: inherit;
|
|
60
|
+
.token {
|
|
61
|
+
&.atrule {
|
|
62
|
+
color: var(--kd-color-code-view-atrule);
|
|
43
63
|
}
|
|
44
64
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
code[class*="language-"]::-moz-selection,
|
|
48
|
-
code[class*="language-"] ::-moz-selection {
|
|
49
|
-
text-shadow: none;
|
|
50
|
-
background: inherit;
|
|
65
|
+
&.attr-name {
|
|
66
|
+
color: var(--kd-color-code-viewattr-name);
|
|
51
67
|
}
|
|
52
68
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
code[class*="language-"],
|
|
56
|
-
pre[class*="language-"] {
|
|
57
|
-
text-shadow: none;
|
|
58
|
-
}
|
|
69
|
+
&.attr-value {
|
|
70
|
+
color: var(--kd-color-code-view-attr-value);
|
|
59
71
|
}
|
|
60
72
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
&.attr-name {
|
|
67
|
-
color: var(--kd-color-code-viewattr-name);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
&.attr-value {
|
|
71
|
-
color: var(--kd-color-code-view-attr-value);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
&.boolean {
|
|
75
|
-
color: var(--kd-color-code-view-boolean);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
&.bold {
|
|
79
|
-
font-weight: bold;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
&.builtin {
|
|
83
|
-
color: var(--kd-color-code-view-builtin);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
&.cdata {
|
|
87
|
-
color: var(--kd-color-code-view-cdata);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
&.char {
|
|
91
|
-
color: var(--kd-color-code-view-char);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
&.class {
|
|
95
|
-
color: var(--kd-color-code-view-class);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
&.class-name {
|
|
99
|
-
color: var(--kd-color-code-view-class-name);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
&.comment {
|
|
103
|
-
color: var(--kd-color-code-view-comment);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
&.console {
|
|
107
|
-
color: var(--kd-color-code-view-console);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
&.constant {
|
|
111
|
-
color: var(--kd-color-code-view-constant);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
&.deleted {
|
|
115
|
-
color: var(--kd-color-code-view-deleted);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
&.doctype {
|
|
119
|
-
color: var(--kd-color-code-view-doctype);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
&.entity {
|
|
123
|
-
color: var(--kd-color-code-view-entity);
|
|
124
|
-
cursor: help;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
&.function {
|
|
128
|
-
color: var(--kd-color-code-view-function);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
&.hexcode {
|
|
132
|
-
color: var(--kd-color-code-view-hexcode);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
&.id {
|
|
136
|
-
color: var(--kd-color-code-view-id);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
&.important {
|
|
140
|
-
color: var(--kd-color-code-view-important);
|
|
141
|
-
font-weight: bold;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
&.inserted {
|
|
145
|
-
color: var(--kd-color-code-view-inserted);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
&.italic {
|
|
149
|
-
font-style: italic;
|
|
150
|
-
}
|
|
73
|
+
&.boolean {
|
|
74
|
+
color: var(--kd-color-code-view-boolean);
|
|
75
|
+
}
|
|
151
76
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
77
|
+
&.bold {
|
|
78
|
+
font-weight: bold;
|
|
79
|
+
}
|
|
155
80
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
81
|
+
&.builtin {
|
|
82
|
+
color: var(--kd-color-code-view-builtin);
|
|
83
|
+
}
|
|
159
84
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
85
|
+
&.cdata {
|
|
86
|
+
color: var(--kd-color-code-view-cdata);
|
|
87
|
+
}
|
|
163
88
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
89
|
+
&.char {
|
|
90
|
+
color: var(--kd-color-code-view-char);
|
|
91
|
+
}
|
|
167
92
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
93
|
+
&.class {
|
|
94
|
+
color: var(--kd-color-code-view-class);
|
|
95
|
+
}
|
|
171
96
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
97
|
+
&.class-name {
|
|
98
|
+
color: var(--kd-color-code-view-class-name);
|
|
99
|
+
}
|
|
175
100
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
101
|
+
&.comment {
|
|
102
|
+
color: var(--kd-color-code-view-comment);
|
|
103
|
+
}
|
|
179
104
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
105
|
+
&.console {
|
|
106
|
+
color: var(--kd-color-code-view-console);
|
|
107
|
+
}
|
|
183
108
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
109
|
+
&.constant {
|
|
110
|
+
color: var(--kd-color-code-view-constant);
|
|
111
|
+
}
|
|
187
112
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
113
|
+
&.deleted {
|
|
114
|
+
color: var(--kd-color-code-view-deleted);
|
|
115
|
+
}
|
|
191
116
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
117
|
+
&.doctype {
|
|
118
|
+
color: var(--kd-color-code-view-doctype);
|
|
119
|
+
}
|
|
195
120
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
121
|
+
&.entity {
|
|
122
|
+
color: var(--kd-color-code-view-entity);
|
|
123
|
+
cursor: help;
|
|
124
|
+
}
|
|
199
125
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
126
|
+
&.function {
|
|
127
|
+
color: var(--kd-color-code-view-function);
|
|
128
|
+
}
|
|
203
129
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
130
|
+
&.hexcode {
|
|
131
|
+
color: var(--kd-color-code-view-hexcode);
|
|
132
|
+
}
|
|
207
133
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
}
|
|
134
|
+
&.id {
|
|
135
|
+
color: var(--kd-color-code-view-id);
|
|
136
|
+
}
|
|
212
137
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
138
|
+
&.important {
|
|
139
|
+
color: var(--kd-color-code-view-important);
|
|
140
|
+
font-weight: bold;
|
|
141
|
+
}
|
|
216
142
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
143
|
+
&.inserted {
|
|
144
|
+
color: var(--kd-color-code-view-inserted);
|
|
145
|
+
}
|
|
220
146
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
147
|
+
&.italic {
|
|
148
|
+
font-style: italic;
|
|
149
|
+
}
|
|
224
150
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
151
|
+
&.keyword {
|
|
152
|
+
color: var(--kd-color-code-view-keyword);
|
|
153
|
+
}
|
|
228
154
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
}
|
|
155
|
+
&.language-javascript {
|
|
156
|
+
color: var(--kd-color-code-language-javascript);
|
|
232
157
|
}
|
|
233
158
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
color: var(--kd-color-code-view-string)
|
|
159
|
+
&.method {
|
|
160
|
+
color: var(--kd-color-code-view-method);
|
|
237
161
|
}
|
|
238
162
|
|
|
239
|
-
|
|
240
|
-
|
|
163
|
+
&.namespace {
|
|
164
|
+
opacity: 0.7;
|
|
241
165
|
}
|
|
242
166
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
background: $shidoka-code-view-background !important;
|
|
167
|
+
&.number {
|
|
168
|
+
color: var(--kd-color-code-view-number);
|
|
169
|
+
}
|
|
247
170
|
|
|
248
|
-
|
|
171
|
+
&.operator {
|
|
172
|
+
color: var(--kd-color-code-view-operator);
|
|
173
|
+
}
|
|
249
174
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
175
|
+
&.parameter {
|
|
176
|
+
color: var(--kd-color-code-view-parameter);
|
|
177
|
+
}
|
|
253
178
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
}
|
|
179
|
+
&.prolog {
|
|
180
|
+
color: var(--kd-color-code-view-prolog);
|
|
181
|
+
}
|
|
258
182
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
183
|
+
&.property {
|
|
184
|
+
color: var(--kd-color-code-view-property);
|
|
185
|
+
}
|
|
262
186
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
border-radius: 4px;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
187
|
+
&.pseudo-class {
|
|
188
|
+
color: var(--kd-color-code-view-pseudo-class);
|
|
268
189
|
}
|
|
269
190
|
|
|
270
|
-
&.
|
|
271
|
-
|
|
272
|
-
|
|
191
|
+
&.pseudo-element {
|
|
192
|
+
color: var(--kd-color-code-view-pseudo-element);
|
|
193
|
+
}
|
|
273
194
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
195
|
+
&.punctuation {
|
|
196
|
+
color: var(--kd-color-code-view-punctuation);
|
|
197
|
+
}
|
|
277
198
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
}
|
|
199
|
+
&.regex {
|
|
200
|
+
color: var(--kd-color-code-view-regex);
|
|
201
|
+
}
|
|
282
202
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
}
|
|
203
|
+
&.selector {
|
|
204
|
+
color: var(--kd-color-code-view-selector);
|
|
205
|
+
}
|
|
287
206
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
}
|
|
207
|
+
&.string,
|
|
208
|
+
&.string-literal {
|
|
209
|
+
color: var(--kd-color-code-view-string);
|
|
292
210
|
}
|
|
293
211
|
|
|
294
|
-
|
|
295
|
-
|
|
212
|
+
&.symbol {
|
|
213
|
+
color: var(--kd-color-code-view-symbol);
|
|
296
214
|
}
|
|
297
215
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
justify-content: center;
|
|
302
|
-
padding: 0.5rem;
|
|
216
|
+
&.tag {
|
|
217
|
+
color: var(--kd-color-code-view-tag);
|
|
218
|
+
}
|
|
303
219
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
align-items: center;
|
|
308
|
-
justify-content: center;
|
|
309
|
-
}
|
|
220
|
+
&.unit {
|
|
221
|
+
color: var(--kd-color-code-view-unit);
|
|
222
|
+
}
|
|
310
223
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
}
|
|
224
|
+
&.url {
|
|
225
|
+
color: var(--kd-color-code-view-url);
|
|
226
|
+
}
|
|
315
227
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
min-width: unset;
|
|
319
|
-
}
|
|
228
|
+
&.variable {
|
|
229
|
+
color: var(--kd-color-code-view-variable);
|
|
320
230
|
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.token.string,
|
|
234
|
+
.style .token.string {
|
|
235
|
+
color: var(--kd-color-code-view-string);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.language-css .token.string {
|
|
239
|
+
color: var(--kd-color-code-view-languagestring);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/// scrollbar styles
|
|
243
|
+
&.single-line .code-snippet-wrapper {
|
|
244
|
+
pre {
|
|
245
|
+
background: $shidoka-code-view-background !important;
|
|
246
|
+
|
|
247
|
+
scrollbar-color: light-dark(rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.3))
|
|
248
|
+
light-dark(rgba(255, 255, 255, 0.1), rgba(0, 0, 0, 0.1));
|
|
249
|
+
|
|
250
|
+
&::-webkit-scrollbar {
|
|
251
|
+
width: 8px;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
&::-webkit-scrollbar-thumb {
|
|
255
|
+
background: light-dark(rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.3));
|
|
256
|
+
border-radius: 4px;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
&::-webkit-scrollbar-thumb:hover {
|
|
260
|
+
background: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5));
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
&::-webkit-scrollbar-track {
|
|
264
|
+
background: light-dark(rgba(255, 255, 255, 0.1), rgba(0, 0, 0, 0.1));
|
|
265
|
+
border-radius: 4px;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
&.multi-line .code-snippet-wrapper {
|
|
271
|
+
pre {
|
|
272
|
+
scrollbar-color: light-dark(rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.3))
|
|
273
|
+
light-dark(rgba(255, 255, 255, 0.1), rgba(0, 0, 0, 0.1));
|
|
274
|
+
|
|
275
|
+
&::-webkit-scrollbar {
|
|
276
|
+
width: 8px;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
&::-webkit-scrollbar-track {
|
|
280
|
+
background: light-dark(rgba(255, 255, 255, 0.1), rgba(0, 0, 0, 0.1));
|
|
281
|
+
border-radius: 4px;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
&::-webkit-scrollbar-thumb {
|
|
285
|
+
background: light-dark(rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.3));
|
|
286
|
+
border-radius: 4px;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
&::-webkit-scrollbar-thumb:hover {
|
|
290
|
+
background: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5));
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
321
294
|
|
|
322
|
-
|
|
295
|
+
.code-snippet-wrapper {
|
|
296
|
+
background: $shidoka-code-view-background;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.code-view__copy-button {
|
|
300
|
+
display: inline-flex;
|
|
301
|
+
align-items: center;
|
|
302
|
+
justify-content: center;
|
|
303
|
+
padding: 0.5rem;
|
|
304
|
+
|
|
305
|
+
.copy-icon,
|
|
306
|
+
.copy-text {
|
|
307
|
+
display: inline-flex;
|
|
308
|
+
align-items: center;
|
|
309
|
+
justify-content: center;
|
|
310
|
+
}
|
|
323
311
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
}
|
|
312
|
+
&.icon-only {
|
|
313
|
+
padding: 8px;
|
|
314
|
+
min-width: unset;
|
|
328
315
|
}
|
|
316
|
+
}
|
|
329
317
|
|
|
330
|
-
|
|
331
|
-
.
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
background-color: light-dark(rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.3));
|
|
335
|
-
color: inherit;
|
|
318
|
+
.code-view__expand-button {
|
|
319
|
+
.expand-icon {
|
|
320
|
+
fill: var(--kd-color-text-level-tertiary);
|
|
321
|
+
color: var(--kd-color-text-level-tertiary);
|
|
336
322
|
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.code-snippet-wrapper pre::selection,
|
|
326
|
+
.code-snippet-wrapper pre *::selection,
|
|
327
|
+
.code-snippet-wrapper pre::-moz-selection,
|
|
328
|
+
.code-snippet-wrapper pre *::-moz-selection {
|
|
329
|
+
background-color: light-dark(rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.3));
|
|
330
|
+
color: inherit;
|
|
331
|
+
}
|
|
337
332
|
}
|
|
@@ -579,10 +579,6 @@ code.language-git:before {
|
|
|
579
579
|
align-items: center;
|
|
580
580
|
justify-content: center;
|
|
581
581
|
}
|
|
582
|
-
.shidoka-syntax-theme .code-view__copy-button .copy-icon {
|
|
583
|
-
color: var(--kd-color-text-link-level-default);
|
|
584
|
-
fill: var(--kd-color-text-link-level-default);
|
|
585
|
-
}
|
|
586
582
|
.shidoka-syntax-theme .code-view__copy-button.icon-only {
|
|
587
583
|
padding: 8px;
|
|
588
584
|
min-width: unset;
|
|
@@ -617,16 +613,16 @@ code.language-git:before {
|
|
|
617
613
|
`}getContainerClasses(){return a({"code-view__container":!0,"single-line":this._isSingleLine,"multi-line":!this._isSingleLine,"copy-button-text-true":this.copyButtonText&&this.copyButtonText.length>0,"copy-button-text-false":!this.copyButtonText,"shidoka-syntax-theme":!0,"shidoka-syntax-theme--dark":"dark"===this.darkTheme,"shidoka-syntax-theme--light":"light"===this.darkTheme,"expanded-code-view":this.codeExpanded,"has-overflow":this.hasOverflow})}renderCopyButton(){return this.copyOptionVisible?d`
|
|
618
614
|
<kyn-button
|
|
619
615
|
class="code-view__copy-button"
|
|
620
|
-
kind="
|
|
616
|
+
kind="secondary"
|
|
621
617
|
size="small"
|
|
622
618
|
iconPosition="left"
|
|
623
619
|
?disabled=${this._copyState.copied}
|
|
624
620
|
description=${n(this.copyButtonDescriptionAttr)}
|
|
625
621
|
@click=${this.copyCode}
|
|
626
622
|
>
|
|
627
|
-
<span slot="icon" class="copy-icon"
|
|
628
|
-
|
|
629
|
-
>
|
|
623
|
+
<span slot="icon" class="copy-icon">
|
|
624
|
+
${this._copyState.copied?t(p):t(g)}
|
|
625
|
+
</span>
|
|
630
626
|
${this._copyState.text?d`<span class="copy-text">${this._copyState.text}</span>`:null}
|
|
631
627
|
</kyn-button>
|
|
632
628
|
`:null}renderExpandButton(){return!this.codeViewExpandable||!this.hasOverflow&&this._codeFitsContainerOnLoad?null:d`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blockCodeView.js","sources":["../../../../src/components/reusable/blockCodeView/blockCodeView.ts"],"sourcesContent":["import { unsafeSVG } from 'lit-html/directives/unsafe-svg.js';\nimport { html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { deepmerge } from 'deepmerge-ts';\n\nimport Prism from 'prismjs';\nimport 'prismjs/plugins/autoloader/prism-autoloader';\nimport 'prismjs/plugins/line-numbers/prism-line-numbers';\nimport 'prismjs-components-importer';\nPrism.plugins.autoloader.languages_path = 'node_modules/prismjs/components/';\n\nimport copyIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/20/copy.svg';\nimport checkmarkIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/20/checkmark.svg';\nimport chevronDown from '@kyndryl-design-system/shidoka-icons/svg/monochrome/16/chevron-down.svg';\n\nimport '../button';\n\nimport BlockCodeViewStyles from './blockCodeView.scss';\nimport ShidokaSyntaxTheme from '../../../common/scss/shidoka-syntax-theme.scss';\n\ninterface LanguageMatch {\n language: string;\n relevance: number;\n}\n\nconst _defaultTextStrings = {\n collapsed: 'Collapsed',\n expanded: 'Expanded',\n};\n\nconst LANGUAGE_SPECIFIC_TOKENS: Record<string, string[]> = {\n markup: ['<', '>', '/', 'div', 'span', 'class', 'id'],\n html: ['<', '>', '/', 'div', 'span', 'class', 'id'],\n css: ['{', '}', ':', ';', '#', '.'],\n javascript: ['function', 'const', 'let', 'var', '=>'],\n typescript: ['interface', 'type', ':', 'as'],\n python: ['def', 'import', 'from', 'class'],\n java: ['public', 'private', 'class', 'void'],\n};\n\n/**\n * `<kyn-block-code-view>` component to display `<code>` snippets as standalone single-/multi-line block elements.\n * @fires on-copy - Emits when the copy button is clicked.\n */\n@customElement('kyn-block-code-view')\nexport class BlockCodeView extends LitElement {\n static override styles = [BlockCodeViewStyles, ShidokaSyntaxTheme];\n\n /** Sets background and text theming. */\n @property({ type: String })\n darkTheme: 'light' | 'dark' | 'default' = 'default';\n\n /** If empty string, attempt language syntax auto-detection. Setting a value will override auto-detection and manually configure desired language. */\n @property({ type: String })\n language = '';\n\n /** Optionally display line numbers. */\n @property({ type: Boolean })\n lineNumbers = false;\n\n /** Sets the starting line number when lineNumbers is true. Must be a positive integer. */\n @property({ type: Number })\n startLineNumber = 1;\n\n /** Customizable max-height setting for code snippet container. */\n @property({ type: Number })\n maxHeight: number | null = null;\n\n /** Optionally displayed label above code snippet container. */\n @property({ type: String })\n codeViewLabel = '';\n\n /** Optionally display button to copy code snippet. */\n @property({ type: Boolean })\n copyOptionVisible = false;\n\n /** Optionally display button to expand code snippet container. */\n @property({ type: Boolean })\n codeViewExpandable = false;\n\n /** Sets copy code button text (optional). */\n @property({ type: String })\n copyButtonText = '';\n\n /** Sets copy button description attr value. */\n @property({ type: String })\n copyButtonDescriptionAttr = '';\n\n /** Sets code snippet for display -- NOTE: original formatting is preserved. */\n @property({ type: String })\n codeSnippet = '';\n\n /** Text string customization. */\n @property({ type: Object })\n textStrings = _defaultTextStrings;\n\n /** Internal text strings.\n * @internal\n */\n @state()\n private _textStrings = _defaultTextStrings;\n\n /** Auto-detect whether code snippet is single line (boolean) -- styled accordingly (boolean).\n * @internal\n */\n @state()\n private _isSingleLine = false;\n\n /** Auto-detect whether code snippet exceeds the max-height allowance (boolean).\n * @internal\n */\n @state()\n private hasOverflow = false;\n\n /** Value indicating whether overflow code sample is expanded (boolean).\n * @internal\n */\n @state()\n private codeExpanded = false;\n\n /** Copy key-values to communicate copy button styling and state.\n * @internal\n */\n @state()\n private _copyState = { copied: false, text: '' };\n\n /** Detected language for the code snippet.\n * @internal\n */\n @state()\n private _effectiveLanguage = '';\n\n /** Code snippet fits into the height of the container -- no expansion needed.\n * @internal\n */\n @state()\n private _codeFitsContainerOnLoad = true;\n\n /** If expandable -- height of the container when fully expanded.\n * @internal\n */\n @state()\n private _expandedHeight: number | null = null;\n\n override updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has('darkTheme')) this.requestUpdate();\n\n const codeChanged =\n changedProperties.has('codeSnippet') ||\n changedProperties.has('language') ||\n changedProperties.has('maxHeight');\n\n // race condition guard: force complete re-highlighting when line numbers toggle\n if (changedProperties.has('lineNumbers')) {\n setTimeout(() => {\n this.highlightCode();\n this.checkOverflow();\n }, 0);\n } else if (codeChanged) {\n this.highlightCode();\n this.checkOverflow();\n }\n\n if (changedProperties.has('copyButtonText')) {\n this._copyState = { ...this._copyState, text: this.copyButtonText };\n }\n\n if (changedProperties.has('startLineNumber')) {\n // Ensure startLineNumber is at least 1\n if (this.startLineNumber < 1) {\n this.startLineNumber = 1;\n }\n this.highlightCode();\n }\n\n super.updated(changedProperties);\n }\n\n override render() {\n const containerStyle = `${this.getContainerStyle()};`;\n return html`\n ${this.codeViewLabel\n ? html`<div class=\"code-view__label\">\n <label>${this.codeViewLabel}</label>\n </div>`\n : null}\n <div class=\"${this.getContainerClasses()}\" style=\"${containerStyle}\">\n <div class=\"code-snippet-wrapper\">\n <pre\n @keydown=${this.handleKeypress}\n role=\"region\"\n class=${this.lineNumbers && !this._isSingleLine\n ? 'line-numbers'\n : 'no-line-numbers'}\n data-start=${ifDefined(\n this.lineNumbers ? Math.max(1, this.startLineNumber) : undefined\n )}\n >\n <code tabindex=\"0\" class=\"language-${this\n ._effectiveLanguage}\"></code>\n </pre>\n </div>\n ${this.renderCopyButton()} ${this.renderExpandButton()}\n </div>\n `;\n }\n\n private getContainerClasses() {\n return classMap({\n 'code-view__container': true,\n 'single-line': this._isSingleLine,\n 'multi-line': !this._isSingleLine,\n 'copy-button-text-true':\n this.copyButtonText && this.copyButtonText.length > 0,\n 'copy-button-text-false': !this.copyButtonText,\n 'shidoka-syntax-theme': true,\n 'shidoka-syntax-theme--dark': this.darkTheme === 'dark',\n 'shidoka-syntax-theme--light': this.darkTheme === 'light',\n 'expanded-code-view': this.codeExpanded,\n 'has-overflow': this.hasOverflow,\n });\n }\n\n private renderCopyButton() {\n if (!this.copyOptionVisible) return null;\n return html`\n <kyn-button\n class=\"code-view__copy-button\"\n kind=\"tertiary\"\n size=\"small\"\n iconPosition=\"left\"\n ?disabled=${this._copyState.copied}\n description=${ifDefined(this.copyButtonDescriptionAttr)}\n @click=${this.copyCode}\n >\n <span slot=\"icon\" class=\"copy-icon\"\n >${this._copyState.copied\n ? unsafeSVG(checkmarkIcon)\n : unsafeSVG(copyIcon)}</span\n >\n ${this._copyState.text\n ? html`<span class=\"copy-text\">${this._copyState.text}</span>`\n : null}\n </kyn-button>\n `;\n }\n\n private renderExpandButton() {\n if (\n !this.codeViewExpandable ||\n (!this.hasOverflow && this._codeFitsContainerOnLoad)\n )\n return null;\n return html`\n <kyn-button\n class=\"code-view__expand-button\"\n kind=\"tertiary\"\n size=\"small\"\n iconPosition=\"left\"\n outlineOnly\n description=${this.codeExpanded\n ? this._textStrings.expanded\n : this._textStrings.collapsed}\n @click=${this.expandCodeView}\n >\n <span slot=\"icon\" class=\"expand-icon\">${unsafeSVG(chevronDown)}</span>\n </kyn-button>\n `;\n }\n\n override willUpdate(changedProps: Map<string, unknown>) {\n if (changedProps.has('codeExpanded')) {\n this._textStrings = deepmerge(_defaultTextStrings, this.textStrings);\n }\n }\n\n private highlightCode() {\n const processedCode = this.removeLeadingWhitespace(this.codeSnippet);\n this._isSingleLine = processedCode.trim().split('\\n').length === 1;\n this._effectiveLanguage =\n this.language || this.detectLanguage(processedCode);\n\n const preEl = this.shadowRoot?.querySelector('pre');\n const codeEl = preEl?.querySelector('code');\n\n if (!codeEl || !preEl) return;\n\n const existingLineNumbers = preEl.querySelector('.line-numbers-rows');\n if (existingLineNumbers) {\n existingLineNumbers.remove();\n }\n\n codeEl.className = `language-${this._effectiveLanguage}`;\n codeEl.textContent = processedCode;\n\n if (this.lineNumbers && !this._isSingleLine) {\n preEl.classList.add('line-numbers');\n preEl.setAttribute('data-start', String(this.startLineNumber));\n } else {\n preEl.classList.remove('line-numbers');\n preEl.removeAttribute('data-start');\n }\n\n setTimeout(() => {\n Prism.highlightElement(codeEl);\n\n setTimeout(() => {\n if (this.lineNumbers) {\n try {\n if ((Prism as any).plugins?.lineNumbers) {\n if (!preEl.querySelector('.line-numbers-rows')) {\n (Prism as any).hooks.run('complete', { element: codeEl });\n (Prism as any).plugins.lineNumbers.resize(preEl);\n }\n }\n\n if (!preEl.querySelector('.line-numbers-rows')) {\n this.addLineNumbers(preEl, codeEl);\n }\n } catch (e) {\n console.warn('Line numbers initialization error:', e);\n this.addLineNumbers(preEl, codeEl);\n }\n }\n\n this.checkOverflow();\n }, 50);\n }, 0);\n }\n\n private addLineNumbers(preEl: HTMLElement, codeEl: HTMLElement) {\n if (preEl.querySelector('.line-numbers-rows')) return;\n\n const linesCount = (codeEl.textContent || '').split('\\n').length;\n const startLineNumber = Math.max(\n 1,\n parseInt(preEl.getAttribute('data-start') || '1', 10)\n );\n\n const lineNumbersWrapper = document.createElement('span');\n lineNumbersWrapper.className = 'line-numbers-rows';\n\n const spans = Array(linesCount).fill('<span></span>').join('');\n lineNumbersWrapper.innerHTML = spans;\n\n preEl.appendChild(lineNumbersWrapper);\n preEl.style.counterReset = `linenumber ${startLineNumber - 1}`;\n }\n\n private detectLanguage(code: string): string {\n if (!code.trim()) return 'plaintext';\n\n const languages = [\n 'markup',\n 'html',\n 'xml',\n 'svg',\n 'mathml',\n 'css',\n 'javascript',\n 'typescript',\n 'python',\n 'java',\n 'c',\n 'cpp',\n ];\n let bestMatch: LanguageMatch = { language: 'plaintext', relevance: 0 };\n\n for (const lang of languages) {\n if (Prism.languages[lang]) {\n const tokens = Prism.tokenize(code, Prism.languages[lang]);\n const relevance = this.calculateRelevance(tokens, lang);\n if (relevance > bestMatch.relevance) {\n bestMatch = { language: lang, relevance };\n }\n }\n }\n\n return bestMatch.language === 'markup'\n ? this.determineMarkupLanguage(code)\n : bestMatch.language;\n }\n\n private calculateRelevance(\n tokens: (string | Prism.Token)[],\n language: string\n ): number {\n return tokens.reduce((relevance, token) => {\n if (typeof token !== 'string') {\n relevance += this.getTokenRelevance(token, language);\n }\n return relevance;\n }, 0);\n }\n\n private getTokenRelevance(token: Prism.Token, language: string): number {\n let relevance =\n 1 +\n (token.alias ? (Array.isArray(token.alias) ? token.alias.length : 1) : 0);\n if (this.isLanguageSpecificToken(token, language)) relevance += 2;\n if (token.content) {\n if (Array.isArray(token.content)) {\n relevance += token.content.reduce(\n (acc, t) =>\n acc +\n (typeof t === 'string' ? 0 : this.getTokenRelevance(t, language)),\n 0\n );\n } else if (typeof token.content !== 'string') {\n relevance += this.getTokenRelevance(token.content, language);\n }\n }\n return relevance;\n }\n\n private isLanguageSpecificToken(\n token: Prism.Token,\n language: string\n ): boolean {\n const specificTokens = LANGUAGE_SPECIFIC_TOKENS[language] || [];\n return specificTokens.some((t) => token.content.toString().includes(t));\n }\n\n private determineMarkupLanguage(code: string): string {\n if (/<\\/?[a-z][\\s\\S]*>/i.test(code)) return 'html';\n if (/<\\?xml/i.test(code)) return 'xml';\n if (/<svg/i.test(code)) return 'svg';\n if (/<math/i.test(code)) return 'mathml';\n return 'markup';\n }\n\n private checkOverflow() {\n setTimeout(() => {\n requestAnimationFrame(() => {\n const container = this.shadowRoot?.querySelector(\n '.code-snippet-wrapper'\n ) as HTMLElement;\n const pre = container?.querySelector('pre') as HTMLElement;\n if (pre && container) {\n const naturalHeight = pre.scrollHeight;\n const calcHeight = this.codeExpanded\n ? this._expandedHeight || container.clientHeight\n : this.maxHeight !== null\n ? this.maxHeight\n : container.clientHeight;\n\n this.hasOverflow = naturalHeight > calcHeight;\n this._codeFitsContainerOnLoad =\n naturalHeight <= (this.maxHeight || container.clientHeight);\n }\n });\n }, 100);\n }\n\n private removeLeadingWhitespace(code: string): string {\n if (!code) return '';\n const lines = code.split('\\n');\n const minIndent = lines.reduce((min, line) => {\n const match = line.match(/^[ \\t]*/);\n const indent = match ? match[0].length : 0;\n return line.trim().length ? Math.min(min, indent) : min;\n }, Infinity);\n return lines\n .map((line) => line.slice(minIndent))\n .join('\\n')\n .trim();\n }\n\n private formatExampleCode(code: string) {\n return { code };\n }\n\n private copyCode(e: Event) {\n const originalText = this._copyState.text;\n navigator.clipboard\n .writeText(this.codeSnippet)\n .then(() => {\n this._copyState = {\n copied: true,\n text: originalText.length > 1 ? 'Copied!' : '',\n };\n this.requestUpdate();\n this.dispatchEvent(\n new CustomEvent('on-copy', {\n detail: {\n origEvent: e,\n fullSnippet: this.formatExampleCode(this.codeSnippet),\n },\n })\n );\n setTimeout(() => {\n this._copyState = { copied: false, text: originalText };\n this.requestUpdate();\n }, 5000);\n })\n .catch((err) => console.error('Failed to copy code:', err));\n }\n\n private getContainerStyle(): string {\n if (this.codeExpanded) {\n return this._expandedHeight\n ? `max-height: ${this._expandedHeight}px`\n : '';\n }\n return this.maxHeight !== null ? `max-height: ${this.maxHeight}px` : '';\n }\n\n private expandCodeView() {\n this.codeExpanded = !this.codeExpanded;\n\n if (this.codeExpanded) {\n const pre = this.shadowRoot?.querySelector('pre') as HTMLElement;\n this._expandedHeight = pre?.scrollHeight || null;\n } else {\n this._expandedHeight = null;\n }\n\n this.requestUpdate();\n setTimeout(() => this.checkOverflow(), 0);\n }\n\n private handleKeypress(e: KeyboardEvent) {\n const pre = e.currentTarget as HTMLPreElement;\n const scrollAmount = 40;\n\n const isVerticallyScrollable = pre.scrollHeight > pre.clientHeight;\n const isHorizontallyScrollable = pre.scrollWidth > pre.clientWidth;\n\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n if (isVerticallyScrollable) {\n pre.scrollTop += e.key === 'ArrowDown' ? scrollAmount : -scrollAmount;\n e.preventDefault();\n }\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowLeft') {\n if (isHorizontallyScrollable) {\n pre.scrollLeft += e.key === 'ArrowRight' ? scrollAmount : -scrollAmount;\n e.preventDefault();\n }\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kyn-block-code-view': BlockCodeView;\n }\n}\n"],"names":["Prism","plugins","autoloader","languages_path","_defaultTextStrings","collapsed","expanded","LANGUAGE_SPECIFIC_TOKENS","markup","html","css","javascript","typescript","python","java","BlockCodeView","LitElement","constructor","this","darkTheme","language","lineNumbers","startLineNumber","maxHeight","codeViewLabel","copyOptionVisible","codeViewExpandable","copyButtonText","copyButtonDescriptionAttr","codeSnippet","textStrings","_textStrings","_isSingleLine","hasOverflow","codeExpanded","_copyState","copied","text","_effectiveLanguage","_codeFitsContainerOnLoad","_expandedHeight","updated","changedProperties","has","requestUpdate","codeChanged","setTimeout","highlightCode","checkOverflow","super","render","containerStyle","getContainerStyle","getContainerClasses","handleKeypress","ifDefined","Math","max","undefined","renderCopyButton","renderExpandButton","classMap","length","copyCode","unsafeSVG","checkmarkIcon","copyIcon","expandCodeView","chevronDown","willUpdate","changedProps","deepmerge","processedCode","removeLeadingWhitespace","trim","split","detectLanguage","preEl","_a","shadowRoot","querySelector","codeEl","existingLineNumbers","remove","className","textContent","classList","add","setAttribute","String","removeAttribute","highlightElement","hooks","run","element","resize","addLineNumbers","e","console","warn","linesCount","parseInt","getAttribute","lineNumbersWrapper","document","createElement","spans","Array","fill","join","innerHTML","appendChild","style","counterReset","code","languages","bestMatch","relevance","lang","tokens","tokenize","calculateRelevance","determineMarkupLanguage","reduce","token","getTokenRelevance","alias","isArray","isLanguageSpecificToken","content","acc","t","some","toString","includes","test","requestAnimationFrame","container","pre","naturalHeight","scrollHeight","calcHeight","clientHeight","lines","minIndent","min","line","match","indent","Infinity","map","slice","formatExampleCode","originalText","navigator","clipboard","writeText","then","dispatchEvent","CustomEvent","detail","origEvent","fullSnippet","catch","err","error","currentTarget","isVerticallyScrollable","isHorizontallyScrollable","scrollWidth","clientWidth","key","scrollTop","preventDefault","scrollLeft","styles","BlockCodeViewStyles","ShidokaSyntaxTheme","__decorate","property","type","prototype","Boolean","Number","Object","state","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"blockCodeView.js","sources":["../../../../src/components/reusable/blockCodeView/blockCodeView.ts"],"sourcesContent":["import { unsafeSVG } from 'lit-html/directives/unsafe-svg.js';\nimport { html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { deepmerge } from 'deepmerge-ts';\n\nimport Prism from 'prismjs';\nimport 'prismjs/plugins/autoloader/prism-autoloader';\nimport 'prismjs/plugins/line-numbers/prism-line-numbers';\nimport 'prismjs-components-importer';\nPrism.plugins.autoloader.languages_path = 'node_modules/prismjs/components/';\n\nimport copyIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/20/copy.svg';\nimport checkmarkIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/20/checkmark.svg';\nimport chevronDown from '@kyndryl-design-system/shidoka-icons/svg/monochrome/16/chevron-down.svg';\n\nimport '../button';\n\nimport BlockCodeViewStyles from './blockCodeView.scss';\nimport ShidokaSyntaxTheme from '../../../common/scss/shidoka-syntax-theme.scss';\n\ninterface LanguageMatch {\n language: string;\n relevance: number;\n}\n\nconst _defaultTextStrings = {\n collapsed: 'Collapsed',\n expanded: 'Expanded',\n};\n\nconst LANGUAGE_SPECIFIC_TOKENS: Record<string, string[]> = {\n markup: ['<', '>', '/', 'div', 'span', 'class', 'id'],\n html: ['<', '>', '/', 'div', 'span', 'class', 'id'],\n css: ['{', '}', ':', ';', '#', '.'],\n javascript: ['function', 'const', 'let', 'var', '=>'],\n typescript: ['interface', 'type', ':', 'as'],\n python: ['def', 'import', 'from', 'class'],\n java: ['public', 'private', 'class', 'void'],\n};\n\n/**\n * `<kyn-block-code-view>` component to display `<code>` snippets as standalone single-/multi-line block elements.\n * @fires on-copy - Emits when the copy button is clicked.\n */\n@customElement('kyn-block-code-view')\nexport class BlockCodeView extends LitElement {\n static override styles = [BlockCodeViewStyles, ShidokaSyntaxTheme];\n\n /** Sets background and text theming. */\n @property({ type: String })\n darkTheme: 'light' | 'dark' | 'default' = 'default';\n\n /** If empty string, attempt language syntax auto-detection. Setting a value will override auto-detection and manually configure desired language. */\n @property({ type: String })\n language = '';\n\n /** Optionally display line numbers. */\n @property({ type: Boolean })\n lineNumbers = false;\n\n /** Sets the starting line number when lineNumbers is true. Must be a positive integer. */\n @property({ type: Number })\n startLineNumber = 1;\n\n /** Customizable max-height setting for code snippet container. */\n @property({ type: Number })\n maxHeight: number | null = null;\n\n /** Optionally displayed label above code snippet container. */\n @property({ type: String })\n codeViewLabel = '';\n\n /** Optionally display button to copy code snippet. */\n @property({ type: Boolean })\n copyOptionVisible = false;\n\n /** Optionally display button to expand code snippet container. */\n @property({ type: Boolean })\n codeViewExpandable = false;\n\n /** Sets copy code button text (optional). */\n @property({ type: String })\n copyButtonText = '';\n\n /** Sets copy button description attr value. */\n @property({ type: String })\n copyButtonDescriptionAttr = '';\n\n /** Sets code snippet for display -- NOTE: original formatting is preserved. */\n @property({ type: String })\n codeSnippet = '';\n\n /** Text string customization. */\n @property({ type: Object })\n textStrings = _defaultTextStrings;\n\n /** Internal text strings.\n * @internal\n */\n @state()\n private _textStrings = _defaultTextStrings;\n\n /** Auto-detect whether code snippet is single line (boolean) -- styled accordingly (boolean).\n * @internal\n */\n @state()\n private _isSingleLine = false;\n\n /** Auto-detect whether code snippet exceeds the max-height allowance (boolean).\n * @internal\n */\n @state()\n private hasOverflow = false;\n\n /** Value indicating whether overflow code sample is expanded (boolean).\n * @internal\n */\n @state()\n private codeExpanded = false;\n\n /** Copy key-values to communicate copy button styling and state.\n * @internal\n */\n @state()\n private _copyState = { copied: false, text: '' };\n\n /** Detected language for the code snippet.\n * @internal\n */\n @state()\n private _effectiveLanguage = '';\n\n /** Code snippet fits into the height of the container -- no expansion needed.\n * @internal\n */\n @state()\n private _codeFitsContainerOnLoad = true;\n\n /** If expandable -- height of the container when fully expanded.\n * @internal\n */\n @state()\n private _expandedHeight: number | null = null;\n\n override updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has('darkTheme')) this.requestUpdate();\n\n const codeChanged =\n changedProperties.has('codeSnippet') ||\n changedProperties.has('language') ||\n changedProperties.has('maxHeight');\n\n // race condition guard: force complete re-highlighting when line numbers toggle\n if (changedProperties.has('lineNumbers')) {\n setTimeout(() => {\n this.highlightCode();\n this.checkOverflow();\n }, 0);\n } else if (codeChanged) {\n this.highlightCode();\n this.checkOverflow();\n }\n\n if (changedProperties.has('copyButtonText')) {\n this._copyState = { ...this._copyState, text: this.copyButtonText };\n }\n\n if (changedProperties.has('startLineNumber')) {\n // Ensure startLineNumber is at least 1\n if (this.startLineNumber < 1) {\n this.startLineNumber = 1;\n }\n this.highlightCode();\n }\n\n super.updated(changedProperties);\n }\n\n override render() {\n const containerStyle = `${this.getContainerStyle()};`;\n return html`\n ${this.codeViewLabel\n ? html`<div class=\"code-view__label\">\n <label>${this.codeViewLabel}</label>\n </div>`\n : null}\n <div class=\"${this.getContainerClasses()}\" style=\"${containerStyle}\">\n <div class=\"code-snippet-wrapper\">\n <pre\n @keydown=${this.handleKeypress}\n role=\"region\"\n class=${this.lineNumbers && !this._isSingleLine\n ? 'line-numbers'\n : 'no-line-numbers'}\n data-start=${ifDefined(\n this.lineNumbers ? Math.max(1, this.startLineNumber) : undefined\n )}\n >\n <code tabindex=\"0\" class=\"language-${this\n ._effectiveLanguage}\"></code>\n </pre>\n </div>\n ${this.renderCopyButton()} ${this.renderExpandButton()}\n </div>\n `;\n }\n\n private getContainerClasses() {\n return classMap({\n 'code-view__container': true,\n 'single-line': this._isSingleLine,\n 'multi-line': !this._isSingleLine,\n 'copy-button-text-true':\n this.copyButtonText && this.copyButtonText.length > 0,\n 'copy-button-text-false': !this.copyButtonText,\n 'shidoka-syntax-theme': true,\n 'shidoka-syntax-theme--dark': this.darkTheme === 'dark',\n 'shidoka-syntax-theme--light': this.darkTheme === 'light',\n 'expanded-code-view': this.codeExpanded,\n 'has-overflow': this.hasOverflow,\n });\n }\n\n private renderCopyButton() {\n if (!this.copyOptionVisible) return null;\n return html`\n <kyn-button\n class=\"code-view__copy-button\"\n kind=\"secondary\"\n size=\"small\"\n iconPosition=\"left\"\n ?disabled=${this._copyState.copied}\n description=${ifDefined(this.copyButtonDescriptionAttr)}\n @click=${this.copyCode}\n >\n <span slot=\"icon\" class=\"copy-icon\">\n ${this._copyState.copied\n ? unsafeSVG(checkmarkIcon)\n : unsafeSVG(copyIcon)}\n </span>\n ${this._copyState.text\n ? html`<span class=\"copy-text\">${this._copyState.text}</span>`\n : null}\n </kyn-button>\n `;\n }\n\n private renderExpandButton() {\n if (\n !this.codeViewExpandable ||\n (!this.hasOverflow && this._codeFitsContainerOnLoad)\n )\n return null;\n return html`\n <kyn-button\n class=\"code-view__expand-button\"\n kind=\"tertiary\"\n size=\"small\"\n iconPosition=\"left\"\n outlineOnly\n description=${this.codeExpanded\n ? this._textStrings.expanded\n : this._textStrings.collapsed}\n @click=${this.expandCodeView}\n >\n <span slot=\"icon\" class=\"expand-icon\">${unsafeSVG(chevronDown)}</span>\n </kyn-button>\n `;\n }\n\n override willUpdate(changedProps: Map<string, unknown>) {\n if (changedProps.has('codeExpanded')) {\n this._textStrings = deepmerge(_defaultTextStrings, this.textStrings);\n }\n }\n\n private highlightCode() {\n const processedCode = this.removeLeadingWhitespace(this.codeSnippet);\n this._isSingleLine = processedCode.trim().split('\\n').length === 1;\n this._effectiveLanguage =\n this.language || this.detectLanguage(processedCode);\n\n const preEl = this.shadowRoot?.querySelector('pre');\n const codeEl = preEl?.querySelector('code');\n\n if (!codeEl || !preEl) return;\n\n const existingLineNumbers = preEl.querySelector('.line-numbers-rows');\n if (existingLineNumbers) {\n existingLineNumbers.remove();\n }\n\n codeEl.className = `language-${this._effectiveLanguage}`;\n codeEl.textContent = processedCode;\n\n if (this.lineNumbers && !this._isSingleLine) {\n preEl.classList.add('line-numbers');\n preEl.setAttribute('data-start', String(this.startLineNumber));\n } else {\n preEl.classList.remove('line-numbers');\n preEl.removeAttribute('data-start');\n }\n\n setTimeout(() => {\n Prism.highlightElement(codeEl);\n\n setTimeout(() => {\n if (this.lineNumbers) {\n try {\n if ((Prism as any).plugins?.lineNumbers) {\n if (!preEl.querySelector('.line-numbers-rows')) {\n (Prism as any).hooks.run('complete', { element: codeEl });\n (Prism as any).plugins.lineNumbers.resize(preEl);\n }\n }\n\n if (!preEl.querySelector('.line-numbers-rows')) {\n this.addLineNumbers(preEl, codeEl);\n }\n } catch (e) {\n console.warn('Line numbers initialization error:', e);\n this.addLineNumbers(preEl, codeEl);\n }\n }\n\n this.checkOverflow();\n }, 50);\n }, 0);\n }\n\n private addLineNumbers(preEl: HTMLElement, codeEl: HTMLElement) {\n if (preEl.querySelector('.line-numbers-rows')) return;\n\n const linesCount = (codeEl.textContent || '').split('\\n').length;\n const startLineNumber = Math.max(\n 1,\n parseInt(preEl.getAttribute('data-start') || '1', 10)\n );\n\n const lineNumbersWrapper = document.createElement('span');\n lineNumbersWrapper.className = 'line-numbers-rows';\n\n const spans = Array(linesCount).fill('<span></span>').join('');\n lineNumbersWrapper.innerHTML = spans;\n\n preEl.appendChild(lineNumbersWrapper);\n preEl.style.counterReset = `linenumber ${startLineNumber - 1}`;\n }\n\n private detectLanguage(code: string): string {\n if (!code.trim()) return 'plaintext';\n\n const languages = [\n 'markup',\n 'html',\n 'xml',\n 'svg',\n 'mathml',\n 'css',\n 'javascript',\n 'typescript',\n 'python',\n 'java',\n 'c',\n 'cpp',\n ];\n let bestMatch: LanguageMatch = { language: 'plaintext', relevance: 0 };\n\n for (const lang of languages) {\n if (Prism.languages[lang]) {\n const tokens = Prism.tokenize(code, Prism.languages[lang]);\n const relevance = this.calculateRelevance(tokens, lang);\n if (relevance > bestMatch.relevance) {\n bestMatch = { language: lang, relevance };\n }\n }\n }\n\n return bestMatch.language === 'markup'\n ? this.determineMarkupLanguage(code)\n : bestMatch.language;\n }\n\n private calculateRelevance(\n tokens: (string | Prism.Token)[],\n language: string\n ): number {\n return tokens.reduce((relevance, token) => {\n if (typeof token !== 'string') {\n relevance += this.getTokenRelevance(token, language);\n }\n return relevance;\n }, 0);\n }\n\n private getTokenRelevance(token: Prism.Token, language: string): number {\n let relevance =\n 1 +\n (token.alias ? (Array.isArray(token.alias) ? token.alias.length : 1) : 0);\n if (this.isLanguageSpecificToken(token, language)) relevance += 2;\n if (token.content) {\n if (Array.isArray(token.content)) {\n relevance += token.content.reduce(\n (acc, t) =>\n acc +\n (typeof t === 'string' ? 0 : this.getTokenRelevance(t, language)),\n 0\n );\n } else if (typeof token.content !== 'string') {\n relevance += this.getTokenRelevance(token.content, language);\n }\n }\n return relevance;\n }\n\n private isLanguageSpecificToken(\n token: Prism.Token,\n language: string\n ): boolean {\n const specificTokens = LANGUAGE_SPECIFIC_TOKENS[language] || [];\n return specificTokens.some((t) => token.content.toString().includes(t));\n }\n\n private determineMarkupLanguage(code: string): string {\n if (/<\\/?[a-z][\\s\\S]*>/i.test(code)) return 'html';\n if (/<\\?xml/i.test(code)) return 'xml';\n if (/<svg/i.test(code)) return 'svg';\n if (/<math/i.test(code)) return 'mathml';\n return 'markup';\n }\n\n private checkOverflow() {\n setTimeout(() => {\n requestAnimationFrame(() => {\n const container = this.shadowRoot?.querySelector(\n '.code-snippet-wrapper'\n ) as HTMLElement;\n const pre = container?.querySelector('pre') as HTMLElement;\n if (pre && container) {\n const naturalHeight = pre.scrollHeight;\n const calcHeight = this.codeExpanded\n ? this._expandedHeight || container.clientHeight\n : this.maxHeight !== null\n ? this.maxHeight\n : container.clientHeight;\n\n this.hasOverflow = naturalHeight > calcHeight;\n this._codeFitsContainerOnLoad =\n naturalHeight <= (this.maxHeight || container.clientHeight);\n }\n });\n }, 100);\n }\n\n private removeLeadingWhitespace(code: string): string {\n if (!code) return '';\n const lines = code.split('\\n');\n const minIndent = lines.reduce((min, line) => {\n const match = line.match(/^[ \\t]*/);\n const indent = match ? match[0].length : 0;\n return line.trim().length ? Math.min(min, indent) : min;\n }, Infinity);\n return lines\n .map((line) => line.slice(minIndent))\n .join('\\n')\n .trim();\n }\n\n private formatExampleCode(code: string) {\n return { code };\n }\n\n private copyCode(e: Event) {\n const originalText = this._copyState.text;\n navigator.clipboard\n .writeText(this.codeSnippet)\n .then(() => {\n this._copyState = {\n copied: true,\n text: originalText.length > 1 ? 'Copied!' : '',\n };\n this.requestUpdate();\n this.dispatchEvent(\n new CustomEvent('on-copy', {\n detail: {\n origEvent: e,\n fullSnippet: this.formatExampleCode(this.codeSnippet),\n },\n })\n );\n setTimeout(() => {\n this._copyState = { copied: false, text: originalText };\n this.requestUpdate();\n }, 5000);\n })\n .catch((err) => console.error('Failed to copy code:', err));\n }\n\n private getContainerStyle(): string {\n if (this.codeExpanded) {\n return this._expandedHeight\n ? `max-height: ${this._expandedHeight}px`\n : '';\n }\n return this.maxHeight !== null ? `max-height: ${this.maxHeight}px` : '';\n }\n\n private expandCodeView() {\n this.codeExpanded = !this.codeExpanded;\n\n if (this.codeExpanded) {\n const pre = this.shadowRoot?.querySelector('pre') as HTMLElement;\n this._expandedHeight = pre?.scrollHeight || null;\n } else {\n this._expandedHeight = null;\n }\n\n this.requestUpdate();\n setTimeout(() => this.checkOverflow(), 0);\n }\n\n private handleKeypress(e: KeyboardEvent) {\n const pre = e.currentTarget as HTMLPreElement;\n const scrollAmount = 40;\n\n const isVerticallyScrollable = pre.scrollHeight > pre.clientHeight;\n const isHorizontallyScrollable = pre.scrollWidth > pre.clientWidth;\n\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n if (isVerticallyScrollable) {\n pre.scrollTop += e.key === 'ArrowDown' ? scrollAmount : -scrollAmount;\n e.preventDefault();\n }\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowLeft') {\n if (isHorizontallyScrollable) {\n pre.scrollLeft += e.key === 'ArrowRight' ? scrollAmount : -scrollAmount;\n e.preventDefault();\n }\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kyn-block-code-view': BlockCodeView;\n }\n}\n"],"names":["Prism","plugins","autoloader","languages_path","_defaultTextStrings","collapsed","expanded","LANGUAGE_SPECIFIC_TOKENS","markup","html","css","javascript","typescript","python","java","BlockCodeView","LitElement","constructor","this","darkTheme","language","lineNumbers","startLineNumber","maxHeight","codeViewLabel","copyOptionVisible","codeViewExpandable","copyButtonText","copyButtonDescriptionAttr","codeSnippet","textStrings","_textStrings","_isSingleLine","hasOverflow","codeExpanded","_copyState","copied","text","_effectiveLanguage","_codeFitsContainerOnLoad","_expandedHeight","updated","changedProperties","has","requestUpdate","codeChanged","setTimeout","highlightCode","checkOverflow","super","render","containerStyle","getContainerStyle","getContainerClasses","handleKeypress","ifDefined","Math","max","undefined","renderCopyButton","renderExpandButton","classMap","length","copyCode","unsafeSVG","checkmarkIcon","copyIcon","expandCodeView","chevronDown","willUpdate","changedProps","deepmerge","processedCode","removeLeadingWhitespace","trim","split","detectLanguage","preEl","_a","shadowRoot","querySelector","codeEl","existingLineNumbers","remove","className","textContent","classList","add","setAttribute","String","removeAttribute","highlightElement","hooks","run","element","resize","addLineNumbers","e","console","warn","linesCount","parseInt","getAttribute","lineNumbersWrapper","document","createElement","spans","Array","fill","join","innerHTML","appendChild","style","counterReset","code","languages","bestMatch","relevance","lang","tokens","tokenize","calculateRelevance","determineMarkupLanguage","reduce","token","getTokenRelevance","alias","isArray","isLanguageSpecificToken","content","acc","t","some","toString","includes","test","requestAnimationFrame","container","pre","naturalHeight","scrollHeight","calcHeight","clientHeight","lines","minIndent","min","line","match","indent","Infinity","map","slice","formatExampleCode","originalText","navigator","clipboard","writeText","then","dispatchEvent","CustomEvent","detail","origEvent","fullSnippet","catch","err","error","currentTarget","isVerticallyScrollable","isHorizontallyScrollable","scrollWidth","clientWidth","key","scrollTop","preventDefault","scrollLeft","styles","BlockCodeViewStyles","ShidokaSyntaxTheme","__decorate","property","type","prototype","Boolean","Number","Object","state","customElement"],"mappings":"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"}
|