@scalar/api-client 3.13.4 → 3.13.6
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/CHANGELOG.md +23 -0
- package/dist/style.css +73 -57
- package/dist/v2/components/code-input/CodeInput.vue.d.ts.map +1 -1
- package/dist/v2/components/code-input/CodeInput.vue.js +1 -1
- package/dist/v2/components/code-input/CodeInput.vue.js.map +1 -1
- package/dist/v2/components/code-input/CodeInput.vue.script.js.map +1 -1
- package/dist/v2/components/code-input/CodeInputLite.vue.js +1 -1
- package/dist/v2/components/code-input/CodeInputLite.vue.js.map +1 -1
- package/dist/v2/components/code-input/CodeInputLite.vue.script.js.map +1 -1
- package/dist/v2/constants.js +1 -1
- package/dist/vue-styles.css +26 -27
- package/package.json +15 -15
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# @scalar/api-client
|
|
2
2
|
|
|
3
|
+
## 3.13.6
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#9687](https://github.com/scalar/scalar/pull/9687): feat(themes): derive the border radius scale from `--scalar-radius`
|
|
8
|
+
|
|
9
|
+
The radius tokens used to be independent, so setting `--scalar-radius: 0` still left rounded corners
|
|
10
|
+
behind on anything using `--scalar-radius-lg`, `--scalar-radius-xl` or `rounded-full`. They now all
|
|
11
|
+
derive from `--scalar-radius`, which means overriding that single variable rescales every corner in the
|
|
12
|
+
interface, and `0` squares it off completely.
|
|
13
|
+
|
|
14
|
+
Two new tokens fill out the scale, `--scalar-radius-2xl` (12px) and `--scalar-radius-3xl` (16px), along
|
|
15
|
+
with `--scalar-radius-full` for pills and circles. The matching `rounded-2xl` and `rounded-3xl` Tailwind
|
|
16
|
+
utilities now emit CSS; previously they were silently dropped.
|
|
17
|
+
|
|
18
|
+
Every default value is unchanged, so nothing shifts unless you were relying on the old behaviour. If
|
|
19
|
+
your theme sets `--scalar-radius` on its own and expects the larger radii to stay put, set those tokens
|
|
20
|
+
explicitly. Override `--scalar-radius` on `:root`: a custom property substitutes `var()` at the element
|
|
21
|
+
where it is declared, so setting the base further down the tree moves it without moving anything derived
|
|
22
|
+
from it.
|
|
23
|
+
|
|
24
|
+
## 3.13.5
|
|
25
|
+
|
|
3
26
|
## 3.13.4
|
|
4
27
|
|
|
5
28
|
### Patch Changes
|
package/dist/style.css
CHANGED
|
@@ -100,8 +100,13 @@
|
|
|
100
100
|
:root {
|
|
101
101
|
--scalar-border-width: .5px;
|
|
102
102
|
--scalar-radius: 3px;
|
|
103
|
-
--scalar-radius-
|
|
104
|
-
--scalar-radius-
|
|
103
|
+
--scalar-radius-max: 20px;
|
|
104
|
+
--scalar-radius-md: min(var(--scalar-radius), var(--scalar-radius-max));
|
|
105
|
+
--scalar-radius-lg: min(calc(var(--scalar-radius) * 2), var(--scalar-radius-max));
|
|
106
|
+
--scalar-radius-xl: min(calc(var(--scalar-radius) * 8 / 3), var(--scalar-radius-max));
|
|
107
|
+
--scalar-radius-2xl: min(calc(var(--scalar-radius) * 4), var(--scalar-radius-max));
|
|
108
|
+
--scalar-radius-3xl: min(calc(var(--scalar-radius) * 16 / 3), var(--scalar-radius-max));
|
|
109
|
+
--scalar-radius-full: calc(var(--scalar-radius) * 9999);
|
|
105
110
|
--scalar-font: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol",
|
|
106
111
|
"Noto Color Emoji";
|
|
107
112
|
--scalar-font-code: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
|
@@ -438,7 +443,7 @@
|
|
|
438
443
|
}
|
|
439
444
|
|
|
440
445
|
:where(.scalar-app) input:where(:not([type="button"], [type="reset"], [type="submit"])), :where(.scalar-app) select, :where(.scalar-app) textarea {
|
|
441
|
-
border-radius: var(--scalar-radius);
|
|
446
|
+
border-radius: var(--scalar-radius-md);
|
|
442
447
|
border-width: 1px;
|
|
443
448
|
}
|
|
444
449
|
|
|
@@ -474,7 +479,6 @@
|
|
|
474
479
|
}
|
|
475
480
|
|
|
476
481
|
:where(.scalar-app) :focus-visible {
|
|
477
|
-
border-radius: var(--scalar-radius);
|
|
478
482
|
outline-style: solid;
|
|
479
483
|
}
|
|
480
484
|
|
|
@@ -955,7 +959,7 @@
|
|
|
955
959
|
}
|
|
956
960
|
|
|
957
961
|
.scalar-app .markdown img {
|
|
958
|
-
border-radius: var(--scalar-radius);
|
|
962
|
+
border-radius: var(--scalar-radius-md);
|
|
959
963
|
max-width: 100%;
|
|
960
964
|
display: inline-block;
|
|
961
965
|
overflow: hidden;
|
|
@@ -1015,7 +1019,7 @@
|
|
|
1015
1019
|
.scalar-app .markdown table {
|
|
1016
1020
|
table-layout: fixed;
|
|
1017
1021
|
border: var(--scalar-border-width) solid var(--scalar-border-color);
|
|
1018
|
-
border-radius: var(--scalar-radius);
|
|
1022
|
+
border-radius: var(--scalar-radius-md);
|
|
1019
1023
|
border-spacing: 0;
|
|
1020
1024
|
width: max-content;
|
|
1021
1025
|
max-width: 100%;
|
|
@@ -1085,11 +1089,11 @@
|
|
|
1085
1089
|
}
|
|
1086
1090
|
|
|
1087
1091
|
.scalar-app .markdown th:first-of-type {
|
|
1088
|
-
border-top-left-radius: var(--scalar-radius);
|
|
1092
|
+
border-top-left-radius: var(--scalar-radius-md);
|
|
1089
1093
|
}
|
|
1090
1094
|
|
|
1091
1095
|
.scalar-app .markdown th:last-of-type {
|
|
1092
|
-
border-top-right-radius: var(--scalar-radius);
|
|
1096
|
+
border-top-right-radius: var(--scalar-radius-md);
|
|
1093
1097
|
}
|
|
1094
1098
|
|
|
1095
1099
|
.scalar-app .markdown tr > [align="left"] {
|
|
@@ -1128,13 +1132,13 @@
|
|
|
1128
1132
|
}
|
|
1129
1133
|
|
|
1130
1134
|
.scalar-app .markdown summary {
|
|
1135
|
+
border-radius: var(--scalar-radius);
|
|
1131
1136
|
min-height: 40px;
|
|
1132
1137
|
font-weight: var(--scalar-semibold);
|
|
1133
1138
|
line-height: var(--markdown-line-height);
|
|
1134
1139
|
cursor: pointer;
|
|
1135
1140
|
-webkit-user-select: none;
|
|
1136
1141
|
user-select: none;
|
|
1137
|
-
border-radius: 2.5px;
|
|
1138
1142
|
align-items: flex-start;
|
|
1139
1143
|
gap: 8px;
|
|
1140
1144
|
padding: 7px 14px;
|
|
@@ -1253,7 +1257,7 @@
|
|
|
1253
1257
|
background-color: var(--scalar-background-2);
|
|
1254
1258
|
box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);
|
|
1255
1259
|
font-size: var(--scalar-micro);
|
|
1256
|
-
border-radius:
|
|
1260
|
+
border-radius: var(--scalar-radius-md);
|
|
1257
1261
|
padding: 0 3px;
|
|
1258
1262
|
}
|
|
1259
1263
|
|
|
@@ -1327,7 +1331,7 @@
|
|
|
1327
1331
|
}
|
|
1328
1332
|
|
|
1329
1333
|
.scalar-app .markdown .markdown-alert {
|
|
1330
|
-
border-radius: var(--scalar-radius);
|
|
1334
|
+
border-radius: var(--scalar-radius-md);
|
|
1331
1335
|
background-color: var(--scalar-background-2);
|
|
1332
1336
|
align-items: stretch;
|
|
1333
1337
|
}
|
|
@@ -1689,7 +1693,7 @@
|
|
|
1689
1693
|
:where(body) > .scalar-tooltip:before {
|
|
1690
1694
|
content: "";
|
|
1691
1695
|
z-index: calc(1 * -1);
|
|
1692
|
-
border-radius: var(--scalar-radius);
|
|
1696
|
+
border-radius: var(--scalar-radius-md);
|
|
1693
1697
|
background-color: var(--scalar-tooltip-background);
|
|
1694
1698
|
--tw-backdrop-blur: blur(8px);
|
|
1695
1699
|
-webkit-backdrop-filter: var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );
|
|
@@ -1852,21 +1856,21 @@
|
|
|
1852
1856
|
display: none;
|
|
1853
1857
|
}
|
|
1854
1858
|
|
|
1855
|
-
.scalar-virtual-text[data-v-
|
|
1859
|
+
.scalar-virtual-text[data-v-77b9d685]:focus {
|
|
1856
1860
|
outline: none;
|
|
1857
1861
|
}
|
|
1858
1862
|
|
|
1859
|
-
.scalar-virtual-text-highlight[data-v-
|
|
1863
|
+
.scalar-virtual-text-highlight[data-v-77b9d685] {
|
|
1860
1864
|
background: var(--scalar-background-accent);
|
|
1861
1865
|
color: inherit;
|
|
1862
|
-
border-radius:
|
|
1866
|
+
border-radius: var(--scalar-radius);
|
|
1863
1867
|
padding: 1px 0;
|
|
1864
1868
|
}
|
|
1865
1869
|
|
|
1866
|
-
.scalar-virtual-text-highlight-active[data-v-
|
|
1870
|
+
.scalar-virtual-text-highlight-active[data-v-77b9d685] {
|
|
1867
1871
|
background: var(--scalar-color-accent);
|
|
1868
1872
|
color: var(--scalar-background-1);
|
|
1869
|
-
border-radius:
|
|
1873
|
+
border-radius: var(--scalar-radius);
|
|
1870
1874
|
}
|
|
1871
1875
|
|
|
1872
1876
|
.sidebar-heading-type[data-v-bdef8365] {
|
|
@@ -3368,7 +3372,15 @@
|
|
|
3368
3372
|
}
|
|
3369
3373
|
|
|
3370
3374
|
.scalar-app .rounded {
|
|
3371
|
-
border-radius: var(--scalar-radius);
|
|
3375
|
+
border-radius: var(--scalar-radius-md);
|
|
3376
|
+
}
|
|
3377
|
+
|
|
3378
|
+
.scalar-app .rounded-2xl {
|
|
3379
|
+
border-radius: var(--scalar-radius-2xl);
|
|
3380
|
+
}
|
|
3381
|
+
|
|
3382
|
+
.scalar-app .rounded-3xl {
|
|
3383
|
+
border-radius: var(--scalar-radius-3xl);
|
|
3372
3384
|
}
|
|
3373
3385
|
|
|
3374
3386
|
.scalar-app .rounded-\[inherit\] {
|
|
@@ -3376,7 +3388,7 @@
|
|
|
3376
3388
|
}
|
|
3377
3389
|
|
|
3378
3390
|
.scalar-app .rounded-full {
|
|
3379
|
-
border-radius:
|
|
3391
|
+
border-radius: var(--scalar-radius-full);
|
|
3380
3392
|
}
|
|
3381
3393
|
|
|
3382
3394
|
.scalar-app .rounded-lg {
|
|
@@ -3384,7 +3396,7 @@
|
|
|
3384
3396
|
}
|
|
3385
3397
|
|
|
3386
3398
|
.scalar-app .rounded-md {
|
|
3387
|
-
border-radius: var(--scalar-radius);
|
|
3399
|
+
border-radius: var(--scalar-radius-md);
|
|
3388
3400
|
}
|
|
3389
3401
|
|
|
3390
3402
|
.scalar-app .rounded-none {
|
|
@@ -3400,8 +3412,8 @@
|
|
|
3400
3412
|
}
|
|
3401
3413
|
|
|
3402
3414
|
.scalar-app .rounded-t {
|
|
3403
|
-
border-top-left-radius: var(--scalar-radius);
|
|
3404
|
-
border-top-right-radius: var(--scalar-radius);
|
|
3415
|
+
border-top-left-radius: var(--scalar-radius-md);
|
|
3416
|
+
border-top-right-radius: var(--scalar-radius-md);
|
|
3405
3417
|
}
|
|
3406
3418
|
|
|
3407
3419
|
.scalar-app .rounded-t-lg {
|
|
@@ -3415,8 +3427,8 @@
|
|
|
3415
3427
|
}
|
|
3416
3428
|
|
|
3417
3429
|
.scalar-app .rounded-b {
|
|
3418
|
-
border-bottom-right-radius: var(--scalar-radius);
|
|
3419
|
-
border-bottom-left-radius: var(--scalar-radius);
|
|
3430
|
+
border-bottom-right-radius: var(--scalar-radius-md);
|
|
3431
|
+
border-bottom-left-radius: var(--scalar-radius-md);
|
|
3420
3432
|
}
|
|
3421
3433
|
|
|
3422
3434
|
.scalar-app .rounded-b-lg {
|
|
@@ -4463,6 +4475,11 @@
|
|
|
4463
4475
|
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
4464
4476
|
}
|
|
4465
4477
|
|
|
4478
|
+
.scalar-app .ring {
|
|
4479
|
+
--tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
|
4480
|
+
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
4481
|
+
}
|
|
4482
|
+
|
|
4466
4483
|
.scalar-app .outline {
|
|
4467
4484
|
outline-style: var(--tw-outline-style);
|
|
4468
4485
|
outline-width: 1px;
|
|
@@ -4687,7 +4704,7 @@
|
|
|
4687
4704
|
}
|
|
4688
4705
|
|
|
4689
4706
|
:is(.scalar-app .\*\:rounded > *) {
|
|
4690
|
-
border-radius: var(--scalar-radius);
|
|
4707
|
+
border-radius: var(--scalar-radius-md);
|
|
4691
4708
|
}
|
|
4692
4709
|
|
|
4693
4710
|
:is(.scalar-app .\*\:rounded-none > *) {
|
|
@@ -4997,7 +5014,7 @@
|
|
|
4997
5014
|
|
|
4998
5015
|
.scalar-app .after\:rounded:after {
|
|
4999
5016
|
content: var(--tw-content);
|
|
5000
|
-
border-radius: var(--scalar-radius);
|
|
5017
|
+
border-radius: var(--scalar-radius-md);
|
|
5001
5018
|
}
|
|
5002
5019
|
|
|
5003
5020
|
.scalar-app .after\:bg-blue:after {
|
|
@@ -5021,8 +5038,8 @@
|
|
|
5021
5038
|
}
|
|
5022
5039
|
|
|
5023
5040
|
:is(.scalar-app .\*\:first\:rounded-l > *):first-child {
|
|
5024
|
-
border-top-left-radius: var(--scalar-radius);
|
|
5025
|
-
border-bottom-left-radius: var(--scalar-radius);
|
|
5041
|
+
border-top-left-radius: var(--scalar-radius-md);
|
|
5042
|
+
border-bottom-left-radius: var(--scalar-radius-md);
|
|
5026
5043
|
}
|
|
5027
5044
|
|
|
5028
5045
|
:is(.scalar-app .\*\:first\:border-t-0 > *):first-child, :is(.scalar-app .first\:\*\:border-t-0:first-child > *) {
|
|
@@ -5046,8 +5063,8 @@
|
|
|
5046
5063
|
}
|
|
5047
5064
|
|
|
5048
5065
|
:is(.scalar-app .\*\:last\:rounded-r > *):last-child {
|
|
5049
|
-
border-top-right-radius: var(--scalar-radius);
|
|
5050
|
-
border-bottom-right-radius: var(--scalar-radius);
|
|
5066
|
+
border-top-right-radius: var(--scalar-radius-md);
|
|
5067
|
+
border-bottom-right-radius: var(--scalar-radius-md);
|
|
5051
5068
|
}
|
|
5052
5069
|
|
|
5053
5070
|
.scalar-app .last-of-type\:first-of-type\:border-b-0:last-of-type:first-of-type {
|
|
@@ -6008,23 +6025,23 @@ to {
|
|
|
6008
6025
|
/*
|
|
6009
6026
|
Deep styling for customizing Codemirror
|
|
6010
6027
|
*/
|
|
6011
|
-
[data-v-
|
|
6028
|
+
[data-v-dfc591f4] .cm-editor {
|
|
6012
6029
|
height: 100%;
|
|
6013
6030
|
outline: none;
|
|
6014
6031
|
padding: 0;
|
|
6015
6032
|
background: transparent;
|
|
6016
6033
|
}
|
|
6017
|
-
[data-v-
|
|
6034
|
+
[data-v-dfc591f4] .cm-placeholder {
|
|
6018
6035
|
color: var(--scalar-color-3);
|
|
6019
6036
|
}
|
|
6020
|
-
[data-v-
|
|
6037
|
+
[data-v-dfc591f4] .cm-content {
|
|
6021
6038
|
font-family: var(--scalar-font-code);
|
|
6022
6039
|
font-size: var(--scalar-small);
|
|
6023
6040
|
max-height: 20px;
|
|
6024
6041
|
padding: 8px 0;
|
|
6025
6042
|
}
|
|
6026
6043
|
/* Tooltip helper */
|
|
6027
|
-
[data-v-
|
|
6044
|
+
[data-v-dfc591f4] .cm-tooltip {
|
|
6028
6045
|
background: transparent !important;
|
|
6029
6046
|
filter: brightness(var(--scalar-lifted-brightness));
|
|
6030
6047
|
border-radius: var(--scalar-radius);
|
|
@@ -6033,43 +6050,43 @@ to {
|
|
|
6033
6050
|
outline: none !important;
|
|
6034
6051
|
overflow: hidden !important;
|
|
6035
6052
|
}
|
|
6036
|
-
[data-v-
|
|
6053
|
+
[data-v-dfc591f4] .cm-tooltip-autocomplete ul li {
|
|
6037
6054
|
padding: 3px 6px !important;
|
|
6038
6055
|
}
|
|
6039
|
-
[data-v-
|
|
6056
|
+
[data-v-dfc591f4] .cm-completionIcon-type:after {
|
|
6040
6057
|
color: var(--scalar-color-3) !important;
|
|
6041
6058
|
}
|
|
6042
|
-
[data-v-
|
|
6059
|
+
[data-v-dfc591f4] .cm-tooltip-autocomplete ul li[aria-selected] {
|
|
6043
6060
|
background: var(--scalar-background-2) !important;
|
|
6044
6061
|
color: var(--scalar-color-1) !important;
|
|
6045
6062
|
}
|
|
6046
|
-
[data-v-
|
|
6063
|
+
[data-v-dfc591f4] .cm-tooltip-autocomplete ul {
|
|
6047
6064
|
padding: 6px !important;
|
|
6048
6065
|
position: relative;
|
|
6049
6066
|
}
|
|
6050
|
-
[data-v-
|
|
6067
|
+
[data-v-dfc591f4] .cm-tooltip-autocomplete ul li:hover {
|
|
6051
6068
|
border-radius: 3px;
|
|
6052
6069
|
color: var(--scalar-color-1) !important;
|
|
6053
6070
|
background: var(--scalar-background-3) !important;
|
|
6054
6071
|
}
|
|
6055
6072
|
/* Disable active line highlighting */
|
|
6056
|
-
[data-v-
|
|
6073
|
+
[data-v-dfc591f4] .cm-activeLine,[data-v-dfc591f4] .cm-activeLineGutter {
|
|
6057
6074
|
background-color: transparent;
|
|
6058
6075
|
}
|
|
6059
6076
|
/* Color selection matching */
|
|
6060
|
-
[data-v-
|
|
6077
|
+
[data-v-dfc591f4] .cm-selectionMatch,[data-v-dfc591f4] .cm-matchingBracket {
|
|
6061
6078
|
border-radius: var(--scalar-radius);
|
|
6062
6079
|
background: var(--scalar-background-4) !important;
|
|
6063
6080
|
}
|
|
6064
6081
|
/* Color Picker Swatches */
|
|
6065
|
-
[data-v-
|
|
6082
|
+
[data-v-dfc591f4] .cm-css-color-picker-wrapper {
|
|
6066
6083
|
display: inline-flex;
|
|
6067
6084
|
outline: 1px solid var(--scalar-background-3);
|
|
6068
6085
|
border-radius: 3px;
|
|
6069
6086
|
overflow: hidden;
|
|
6070
6087
|
}
|
|
6071
6088
|
/* Number gutter */
|
|
6072
|
-
[data-v-
|
|
6089
|
+
[data-v-dfc591f4] .cm-gutters {
|
|
6073
6090
|
background-color: transparent;
|
|
6074
6091
|
border-right: none;
|
|
6075
6092
|
color: var(--scalar-color-3);
|
|
@@ -6077,7 +6094,7 @@ to {
|
|
|
6077
6094
|
line-height: 22px;
|
|
6078
6095
|
border-radius: 0 0 0 3px;
|
|
6079
6096
|
}
|
|
6080
|
-
[data-v-
|
|
6097
|
+
[data-v-dfc591f4] .cm-gutters:before {
|
|
6081
6098
|
content: '';
|
|
6082
6099
|
position: absolute;
|
|
6083
6100
|
top: 2px;
|
|
@@ -6087,7 +6104,7 @@ to {
|
|
|
6087
6104
|
border-radius: var(--scalar-radius) 0 0 var(--scalar-radius);
|
|
6088
6105
|
background-color: var(--scalar-background-1);
|
|
6089
6106
|
}
|
|
6090
|
-
[data-v-
|
|
6107
|
+
[data-v-dfc591f4] .cm-gutterElement {
|
|
6091
6108
|
font-family: var(--scalar-font-code) !important;
|
|
6092
6109
|
padding-left: 0px !important;
|
|
6093
6110
|
padding-right: 6px !important;
|
|
@@ -6096,16 +6113,16 @@ to {
|
|
|
6096
6113
|
justify-content: flex-end;
|
|
6097
6114
|
position: relative;
|
|
6098
6115
|
}
|
|
6099
|
-
[data-v-
|
|
6116
|
+
[data-v-dfc591f4] .cm-lineNumbers .cm-gutterElement {
|
|
6100
6117
|
min-width: fit-content;
|
|
6101
6118
|
}
|
|
6102
|
-
[data-v-
|
|
6119
|
+
[data-v-dfc591f4] .cm-gutter + .cm-gutter :not(.cm-foldGutter) .cm-gutterElement {
|
|
6103
6120
|
padding-left: 0 !important;
|
|
6104
6121
|
}
|
|
6105
|
-
[data-v-
|
|
6122
|
+
[data-v-dfc591f4] .cm-scroller {
|
|
6106
6123
|
overflow: auto;
|
|
6107
6124
|
}
|
|
6108
|
-
.line-wrapping[data-v-
|
|
6125
|
+
.line-wrapping[data-v-dfc591f4]:focus-within .cm-content {
|
|
6109
6126
|
display: inline-table;
|
|
6110
6127
|
min-height: fit-content;
|
|
6111
6128
|
padding: 3px 6px;
|
|
@@ -6116,9 +6133,8 @@ to {
|
|
|
6116
6133
|
.cm-pill {
|
|
6117
6134
|
color: var(--scalar-color-1) !important;
|
|
6118
6135
|
padding: 0px 9px;
|
|
6119
|
-
border-radius: 3px;
|
|
6120
6136
|
display: inline-block;
|
|
6121
|
-
border-radius:
|
|
6137
|
+
border-radius: var(--scalar-radius-full);
|
|
6122
6138
|
font-size: var(--scalar-small);
|
|
6123
6139
|
}
|
|
6124
6140
|
.light-mode .cm-pill {
|
|
@@ -6361,13 +6377,13 @@ to {
|
|
|
6361
6377
|
display: none;
|
|
6362
6378
|
}
|
|
6363
6379
|
|
|
6364
|
-
.code-input-lite[data-v-
|
|
6380
|
+
.code-input-lite[data-v-f03d0c9d] {
|
|
6365
6381
|
/* Flex so the editor centres vertically in whatever height the cell gives us.
|
|
6366
6382
|
Font properties inherit so we adopt the surrounding typography. */
|
|
6367
6383
|
display: flex;
|
|
6368
6384
|
align-items: center;
|
|
6369
6385
|
}
|
|
6370
|
-
.code-input-lite__editor[data-v-
|
|
6386
|
+
.code-input-lite__editor[data-v-f03d0c9d] {
|
|
6371
6387
|
/* Everything font-related inherits from the surrounding context. */
|
|
6372
6388
|
font: inherit;
|
|
6373
6389
|
letter-spacing: inherit;
|
|
@@ -6389,7 +6405,7 @@ to {
|
|
|
6389
6405
|
/* Positioning context for the absolutely positioned placeholder. */
|
|
6390
6406
|
position: relative;
|
|
6391
6407
|
}
|
|
6392
|
-
.code-input-lite__editor[data-v-
|
|
6408
|
+
.code-input-lite__editor[data-v-f03d0c9d]::-webkit-scrollbar {
|
|
6393
6409
|
display: none;
|
|
6394
6410
|
}
|
|
6395
6411
|
|
|
@@ -6397,7 +6413,7 @@ to {
|
|
|
6397
6413
|
contenteditable; otherwise the caret would land after it on focus.
|
|
6398
6414
|
`pointer-events: none` lets clicks fall through to focus the editor.
|
|
6399
6415
|
Hidden on focus so it never renders on top of the text caret. */
|
|
6400
|
-
.code-input-lite--empty .code-input-lite__editor[data-v-
|
|
6416
|
+
.code-input-lite--empty .code-input-lite__editor[data-v-f03d0c9d]:not(:focus)::before {
|
|
6401
6417
|
content: attr(data-placeholder);
|
|
6402
6418
|
color: var(--scalar-color-3);
|
|
6403
6419
|
pointer-events: none;
|
|
@@ -6408,7 +6424,7 @@ to {
|
|
|
6408
6424
|
display: flex;
|
|
6409
6425
|
align-items: center;
|
|
6410
6426
|
}
|
|
6411
|
-
.code-input-lite--error .code-input-lite__editor[data-v-
|
|
6427
|
+
.code-input-lite--error .code-input-lite__editor[data-v-f03d0c9d] {
|
|
6412
6428
|
outline: 1px solid var(--scalar-color-red);
|
|
6413
6429
|
}
|
|
6414
6430
|
|
|
@@ -6416,7 +6432,7 @@ to {
|
|
|
6416
6432
|
an atomic widget; the caret lands before or after it, never inside. */
|
|
6417
6433
|
.scalar-pill {
|
|
6418
6434
|
color: var(--scalar-color-2);
|
|
6419
|
-
border-radius:
|
|
6435
|
+
border-radius: var(--scalar-radius-full);
|
|
6420
6436
|
display: inline-block;
|
|
6421
6437
|
font-family: var(--scalar-font-code);
|
|
6422
6438
|
font-size: 0.9em;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeInput.vue.d.ts","sourceRoot":"","sources":["../../../../src/v2/components/code-input/CodeInput.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CodeInput.vue.d.ts","sourceRoot":"","sources":["../../../../src/v2/components/code-input/CodeInput.vue"],"names":[],"mappings":"AAwsBA,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACf,MAAM,wBAAwB,CAAA;AAM/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2EAA2E,CAAA;AAEnH,OAAO,EAAyC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAIrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKrD,MAAM,MAAM,mBAAmB,GAC3B,MAAM,GACN,MAAM,GACN,OAAO,GACP,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;wBACkB,OAAO,YAAY;AAAxC,wBAAyC;AAKzC,QAAA,MAAM,YAAY;gBAEJ,mBAAmB;IAC/B,6FAA6F;iBAChF,kBAAkB,GAAG,SAAS;IAC3C,mEAAmE;WAC5D,MAAM,GAAG,MAAM,EAAE;IACxB,sCAAsC;eAC3B,OAAO;IAClB,yBAAyB;YACjB,OAAO;IACf,kDAAkD;aACzC,YAAY;IACrB,mDAAmD;WAC5C,MAAM,EAAE;IACf,2CAA2C;eAChC,MAAM,EAAE;IACnB,2CAA2C;;IAE3C,2CAA2C;eAChC,OAAO;IAClB,uCAAuC;kBACzB,MAAM;IACpB,8BAA8B;eACnB,OAAO;IAClB,oCAAoC;kBACtB,OAAO;IACrB,kCAAkC;kBACpB,OAAO;IACrB,qBAAqB;WACd,OAAO;IACd,2BAA2B;mBACZ,OAAO;IACtB,+BAA+B;eACpB,kBAAkB;IAC7B,uCAAuC;iBAC1B,SAAS,EAAE;IACxB,sCAAsC;uBACnB,OAAO;IAC1B,wBAAwB;mBACT,OAAO;IACtB,wCAAwC;2BACjB,OAAO;IAC9B,gCAAgC;iBACnB,OAAO;IACpB,wCAAwC;oBACxB,OAAO;IACvB,yHAAyH;mBAC1G,OAAO;IACtB,sDAAsD;uBACnC,OAAO;IAC1B,mDAAmD;wBAC/B,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;IAC3C,mDAAmD;wBAC/B,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;IAC3C,0CAA0C;kBAC5B,OAAO;;IAwRrB;;;;OAIG;uBACgB,OAAO,GAAG,KAAK,GAAG,MAAM;;0BAtMhB,MAAM,KAAG,IAAI;0BAiBjC,MAAM,SACN,aAAa,GAAG,UAAU,KAChC,IAAI;wBAWoB,MAAM,SAAS,UAAU,KAAG,IAAI;;;;;;;4BAiE5B,mBAAmB,KAAG,MAAM;;;;;;cAhJ7B,UAAU;cAAQ,aAAa;;;gBA5F/C,mBAAmB;IAC/B,6FAA6F;iBAChF,kBAAkB,GAAG,SAAS;IAC3C,mEAAmE;WAC5D,MAAM,GAAG,MAAM,EAAE;IACxB,sCAAsC;eAC3B,OAAO;IAClB,yBAAyB;YACjB,OAAO;IACf,kDAAkD;aACzC,YAAY;IACrB,mDAAmD;WAC5C,MAAM,EAAE;IACf,2CAA2C;eAChC,MAAM,EAAE;IACnB,2CAA2C;;IAE3C,2CAA2C;eAChC,OAAO;IAClB,uCAAuC;kBACzB,MAAM;IACpB,8BAA8B;eACnB,OAAO;IAClB,oCAAoC;kBACtB,OAAO;IACrB,kCAAkC;kBACpB,OAAO;IACrB,qBAAqB;WACd,OAAO;IACd,2BAA2B;mBACZ,OAAO;IACtB,+BAA+B;eACpB,kBAAkB;IAC7B,uCAAuC;iBAC1B,SAAS,EAAE;IACxB,sCAAsC;uBACnB,OAAO;IAC1B,wBAAwB;mBACT,OAAO;IACtB,wCAAwC;2BACjB,OAAO;IAC9B,gCAAgC;iBACnB,OAAO;IACpB,wCAAwC;oBACxB,OAAO;IACvB,yHAAyH;mBAC1G,OAAO;IACtB,sDAAsD;uBACnC,OAAO;IAC1B,mDAAmD;wBAC/B,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;IAC3C,mDAAmD;wBAC/B,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;IAC3C,0CAA0C;kBAC5B,OAAO;;;;;;cAsCO,UAAU;cAAQ,aAAa;;;cAmoB/C,CAAC,KAAK,IAAiB,KAAK,GAAG;;WAClC,CAAC,KAAK,IAAiB,KAAK,GAAG;EAYtC,CAAC;AACL,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
|
|
@@ -3,7 +3,7 @@ import CodeInput_vue_vue_type_script_setup_true_lang_default from "./CodeInput.v
|
|
|
3
3
|
/* empty css */
|
|
4
4
|
/* empty css */
|
|
5
5
|
//#region src/v2/components/code-input/CodeInput.vue
|
|
6
|
-
var CodeInput_default = /* @__PURE__ */ _plugin_vue_export_helper_default(CodeInput_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
6
|
+
var CodeInput_default = /* @__PURE__ */ _plugin_vue_export_helper_default(CodeInput_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-dfc591f4"]]);
|
|
7
7
|
//#endregion
|
|
8
8
|
export { CodeInput_default as default };
|
|
9
9
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeInput.vue.js","names":[],"sources":["../../../../src/v2/components/code-input/CodeInput.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type CodeInputModelValue =\n | string\n | number\n | boolean\n | Array<string | number | boolean>\n | Record<string, unknown>\n\n/**\n * CodeInput\n *\n * A versatile input component that adapts its rendering based on props:\n * - Disabled mode: Read-only text display\n * - Select mode: Dropdown for enums, booleans, or examples\n * - Editor mode: CodeMirror with environment variable support\n *\n * Type `{{` to trigger autocomplete for environment variables and runtime context functions\n * (for example `{{$guid}}`) when an environment is provided.\n * It takes in any data but always will emit a string value,\n * this string should then be parsed in accordance to the schema or content type.\n *\n * @example\n * ```vue\n * <!-- Basic input with environment variables -->\n * <CodeInput v-model=\"value\" :environment=\"env\" />\n *\n * <!-- Boolean select -->\n * <CodeInput v-model=\"flag\" type=\"boolean\" />\n *\n * <!-- JSON editor with linting -->\n * <CodeInput v-model=\"data\" language=\"json\" :lint=\"true\" />\n * ```\n */\nexport default {\n inheritAttrs: false,\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { isDefined } from '@scalar/helpers/array/is-defined'\nimport {\n colorPicker as colorPickerExtension,\n useCodeMirror,\n useDropdown,\n type CodeMirrorLanguage,\n type Extension,\n} from '@scalar/use-codemirror'\nimport {\n CONTEXT_FUNCTION_NAMES,\n getContextFunctionComment,\n isContextFunctionName,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport { nanoid } from 'nanoid'\nimport { computed, ref, toRef, useAttrs, watch, type Ref } from 'vue'\n\nimport DataTableInputSelect from '@/v2/components/data-table/DataTableInputSelect.vue'\nimport EnvironmentVariableDropdown from '@/v2/features/environments/components/EnvironmentVariablesDropdown.vue'\nimport type { ClientLayout } from '@/v2/types/layout'\n\nimport { backspaceCommand, pillPlugin } from './code-variable-widget'\n\ntype Props = {\n modelValue: CodeInputModelValue\n /** Environment for variable substitution. Pass undefined to disable environment variables */\n environment: XScalarEnvironment | undefined\n /** Type of the input value, affects rendering mode for booleans */\n type?: string | string[]\n /** Render as disabled text display */\n disabled?: boolean\n /** Show error styling */\n error?: boolean\n /** Layout context affects styling and behavior */\n layout?: ClientLayout\n /** Predefined enum values, triggers select mode */\n enum?: string[]\n /** Example values, triggers select mode */\n examples?: string[]\n /** Default value to show in select mode */\n default?: Props['modelValue']\n /** Allow null in boolean select options */\n nullable?: boolean\n /** Placeholder text for empty input */\n placeholder?: string\n /** Show required indicator */\n required?: boolean\n /** Enable color picker extension */\n colorPicker?: boolean\n /** Show line numbers in editor */\n lineNumbers?: boolean\n /** Enable linting */\n lint?: boolean\n /** Enable line wrapping */\n lineWrapping?: boolean\n /** CodeMirror language mode */\n language?: CodeMirrorLanguage\n /** Additional CodeMirror extensions */\n extensions?: Extension[]\n /** Disable tab key for indentation */\n disableTabIndent?: boolean\n /** Disable enter key */\n disableEnter?: boolean\n /** Disable automatic bracket closing */\n disableCloseBrackets?: boolean\n /** Emit submit event on blur */\n emitOnBlur?: boolean\n /** Enable environment variable pills */\n withVariables?: boolean\n /** Enable fake data suggestions like $guid, $timestamp, etc. Should only be enabled for parameters and request bodies */\n withFakeData?: boolean\n /** Emit change event even if the value is the same */\n alwaysEmitChange?: boolean\n /** Custom change handler, prevents default emit */\n handleFieldChange?: (value: string) => void\n /** Custom submit handler, prevents default emit */\n handleFieldSubmit?: (value: string) => void\n /** Put a linethrough on the input text */\n linethrough?: boolean\n}\n\nconst {\n modelValue,\n environment,\n type,\n disabled = false,\n error = false,\n layout = 'desktop',\n enum: enumProp,\n examples,\n default: defaultProp,\n nullable = false,\n placeholder,\n required,\n colorPicker = false,\n lineNumbers = false,\n lint = false,\n lineWrapping = false,\n language,\n extensions = [],\n disableTabIndent = false,\n disableEnter = false,\n disableCloseBrackets = false,\n emitOnBlur = true,\n alwaysEmitChange = false,\n withVariables = true,\n withFakeData = false,\n handleFieldChange,\n handleFieldSubmit,\n} = defineProps<Props>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n 'submit': [value: string, event: KeyboardEvent | FocusEvent]\n 'navigate': [route: { page: 'document'; path: 'environment' }]\n 'blur': [value: string, event: FocusEvent]\n}>()\n\n// ---------------------------------------------------------------------------\n// Component identity and focus state\n\nconst attrs = useAttrs() as { id?: string }\nconst componentId = attrs.id || `id-${nanoid()}`\nconst isFocused = ref(false)\n\n// ---------------------------------------------------------------------------\n// Rendering mode detection\n\n/**\n * Determines if we should render a select dropdown for boolean types.\n */\nconst isBooleanMode = computed((): boolean => {\n if (enumProp?.length) {\n return false\n }\n return type === 'boolean' || (Array.isArray(type) && type.includes('boolean'))\n})\n\n/**\n * Options for boolean select mode.\n */\nconst booleanOptions = computed((): string[] =>\n nullable ? ['true', 'false', 'null'] : ['true', 'false'],\n)\n\n/**\n * Default type when dealing with type arrays.\n * Finds the first non-null type.\n */\nconst defaultType = computed((): string | undefined => {\n if (Array.isArray(type)) {\n return type.find((t) => t !== 'null') ?? 'string'\n }\n return type\n})\n\n// ---------------------------------------------------------------------------\n// Event handlers\n\n/**\n * Handles value changes during typing.\n */\nconst handleChange = (value: string): void => {\n if (!alwaysEmitChange && value === serializeValue(modelValue)) {\n return\n }\n\n // Use custom handler or emit update\n if (handleFieldChange) {\n handleFieldChange(value)\n } else {\n emit('update:modelValue', value)\n }\n}\n\n/**\n * Handles form submission (enter key or blur with emitOnBlur).\n */\nconst handleSubmit = (\n value: string,\n event: KeyboardEvent | FocusEvent,\n): void => {\n if (handleFieldSubmit) {\n handleFieldSubmit(value)\n } else {\n emit('submit', value, event)\n }\n}\n\n/**\n * Handles input blur event.\n */\nconst handleBlur = (value: string, event: FocusEvent): void => {\n isFocused.value = false\n\n if (emitOnBlur && modelValue) {\n handleSubmit(value, event)\n }\n\n emit('blur', value, event)\n}\n\n/**\n * Handles model value updates from select components.\n */\nconst handleSelectChange = (value: string): void =>\n emit('update:modelValue', value)\n\n// ---------------------------------------------------------------------------\n// CodeMirror setup\n\n/**\n * Build extensions array.\n * Note: Extensions are not reactive after initialization.\n */\nconst buildExtensions = (): Extension[] => {\n const extensionsList: Extension[] = [...extensions]\n\n if (colorPicker) {\n extensionsList.push(colorPickerExtension)\n }\n\n return extensionsList\n}\n\n/**\n * Reactive pill plugin for environment variable visualization.\n */\nconst contextFunctionDropdownItems = computed(() =>\n withFakeData\n ? CONTEXT_FUNCTION_NAMES.map((key) => ({\n key,\n description: getContextFunctionComment(key),\n }))\n : [],\n)\n\nconst pillPluginExtension = computed(() =>\n pillPlugin({\n environment,\n isContextFunctionName,\n isReadOnly: layout === 'modal',\n }),\n)\n\n/**\n * Combined extensions for CodeMirror.\n */\nconst codeMirrorExtensions = computed((): Extension[] => [\n ...buildExtensions(),\n pillPluginExtension.value,\n backspaceCommand,\n])\n\nconst codeMirrorRef: Ref<HTMLDivElement | null> = ref(null)\n\n/** Converts the model value to a string for CodeMirror */\nconst serializeValue = (value: CodeInputModelValue): string => {\n if (typeof value === 'string') {\n return value\n }\n return JSON.stringify(value)\n}\n\nconst { codeMirror, setCodeMirrorContent } = useCodeMirror({\n content: toRef(() => serializeValue(modelValue)),\n onChange: (value) => {\n handleChange(value)\n updateDropdownVisibility()\n },\n onFocus: () => {\n isFocused.value = true\n },\n onBlur: handleBlur,\n codeMirrorRef,\n disableTabIndent: toRef(() => disableTabIndent),\n disableEnter: toRef(() => disableEnter),\n disableCloseBrackets: toRef(() => disableCloseBrackets),\n lineNumbers: toRef(() => lineNumbers),\n language: toRef(() => language),\n lint: toRef(() => lint),\n extensions: codeMirrorExtensions,\n placeholder: toRef(() => placeholder),\n})\n\n/**\n * Handle autofocus attribute.\n */\nwatch(codeMirror, () => {\n if (codeMirror.value && Object.hasOwn(attrs, 'autofocus')) {\n codeMirror.value.focus()\n }\n})\n\n// ---------------------------------------------------------------------------\n// Environment variable dropdown\n\nconst showDropdown = ref(false)\nconst dropdownQuery = ref('')\nconst dropdownPosition = ref({ left: 0, top: 0 })\nconst dropdownRef = ref<InstanceType<\n typeof EnvironmentVariableDropdown\n> | null>(null)\n\nconst { handleDropdownSelect, updateDropdownVisibility } = useDropdown({\n codeMirror,\n query: dropdownQuery,\n showDropdown,\n dropdownPosition,\n})\n\n/**\n * Determines if the environment variable dropdown should be visible.\n * Shows when environment is defined (for env vars) or withFakeData is true (for context functions)\n */\nconst displayVariablesDropdown = computed((): boolean => {\n return (\n showDropdown.value &&\n withVariables &&\n layout !== 'modal' &&\n (Boolean(environment) || withFakeData)\n )\n})\n\n// ---------------------------------------------------------------------------\n// Keyboard event handling\n\n/**\n * Handles keyboard navigation for dropdown and form submission.\n */\nconst handleKeyDown = (key: string, event: KeyboardEvent): void => {\n if (showDropdown.value) {\n if (key === 'down' || key === 'up') {\n event.preventDefault()\n dropdownRef.value?.handleArrowKey(key)\n } else if (key === 'enter') {\n event.preventDefault()\n dropdownRef.value?.handleSelect()\n }\n return\n }\n\n if (key === 'escape' && !disableTabIndent) {\n event.stopPropagation()\n }\n\n if (key === 'enter' && event.target instanceof HTMLDivElement) {\n handleSubmit(codeMirror.value?.state.doc.toString() ?? '', event)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n\ndefineExpose({\n /**\n * Focus the codemirror element\n *\n * @param cursorAtEnd boolean place the cursor at the end of the input\n */\n focus: (position?: 'start' | 'end' | number) => {\n if (!codeMirror.value) {\n return\n }\n codeMirror.value.focus()\n\n if (!isDefined(position)) {\n return\n }\n\n const anchor = (() => {\n if (position === 'start') {\n return 0\n }\n if (position === 'end') {\n return codeMirror.value.state.doc.length\n }\n return position\n })()\n\n // Move the cursor to the specified position\n codeMirror.value.dispatch({\n selection: { anchor },\n scrollIntoView: true,\n })\n },\n isFocused,\n handleChange,\n handleSubmit,\n handleBlur,\n booleanOptions,\n codeMirror,\n codeMirrorRef,\n modelValue,\n setCodeMirrorContent,\n cursorPosition: () => codeMirror.value?.state.selection.main.head,\n serializeValue,\n})\n</script>\n\n<template>\n <!-- Disabled mode: read-only text display -->\n <div\n v-if=\"disabled\"\n class=\"text-c-2 flex cursor-default items-center justify-center\"\n :class=\"{\n 'font-code pr-2 pl-1 text-base': layout === 'modal',\n 'px-2': layout !== 'modal',\n 'line-through': linethrough,\n }\"\n data-testid=\"code-input-disabled\">\n <span class=\"whitespace-nowrap\">{{ modelValue }}</span>\n </div>\n\n <!-- Enum mode: select dropdown with predefined values -->\n <DataTableInputSelect\n v-else-if=\"enumProp?.length\"\n :default=\"defaultProp\"\n :modelValue=\"modelValue\"\n :type=\"defaultType\"\n :value=\"enumProp\"\n @update:modelValue=\"handleSelectChange\" />\n\n <!-- Boolean mode: select dropdown with true/false (and optionally null) -->\n <DataTableInputSelect\n v-else-if=\"isBooleanMode\"\n :default=\"defaultProp\"\n :modelValue=\"modelValue\"\n :value=\"booleanOptions\"\n @update:modelValue=\"handleSelectChange\" />\n\n <!-- Examples mode: select dropdown with example values -->\n <DataTableInputSelect\n v-else-if=\"examples?.length\"\n :default=\"defaultProp\"\n :modelValue=\"modelValue\"\n :value=\"examples\"\n @update:modelValue=\"handleSelectChange\" />\n\n <!-- Editor mode: CodeMirror with environment variable support -->\n <div\n v-else\n :id=\"componentId\"\n v-bind=\"$attrs\"\n ref=\"codeMirrorRef\"\n class=\"group/input group-[.alert]:outline-orange group-[.error]:outline-red font-code peer relative w-full overflow-hidden text-xs leading-[1.44] whitespace-nowrap -outline-offset-1 has-[:focus-visible]:rounded-[4px] has-[:focus-visible]:outline\"\n :class=\"{\n 'line-wrapping has-[:focus-visible]:bg-b-1 has-[:focus-visible]:absolute has-[:focus-visible]:z-1':\n lineWrapping,\n 'flow-code-input--error': error,\n 'line-through': linethrough,\n }\"\n @keydown.down.stop=\"handleKeyDown('down', $event)\"\n @keydown.enter=\"handleKeyDown('enter', $event)\"\n @keydown.escape=\"handleKeyDown('escape', $event)\"\n @keydown.up.stop=\"handleKeyDown('up', $event)\">\n <!-- Tab exit hint (shown when focused) -->\n <div\n v-if=\"!disableTabIndent\"\n class=\"z-context text-c-2 absolute right-1.5 bottom-1 hidden font-sans group-has-[:focus-visible]/input:block\"\n role=\"alert\">\n Press\n <kbd class=\"-mx-0.25 rounded border px-0.5 font-mono\">Esc</kbd> then\n <kbd class=\"-mx-0.25 rounded border px-0.5 font-mono\">Tab</kbd> to exit\n </div>\n </div>\n\n <!-- Warning slot (positioned absolutely) -->\n <div\n v-if=\"$slots.warning\"\n class=\"centered-y text-orange absolute right-7 text-xs\">\n <slot name=\"warning\" />\n </div>\n\n <!-- Icon slot (positioned absolutely) -->\n <div\n v-if=\"$slots.icon\"\n class=\"centered-y absolute right-0 flex h-full items-center p-1.5 group-has-[.cm-focused]:z-1\">\n <slot name=\"icon\" />\n </div>\n\n <!-- Required indicator -->\n <div\n v-if=\"required\"\n class=\"required centered-y text-xxs text-c-3 group-[.error]:text-red bg-b-1 pointer-events-none absolute right-0 mr-0.5 pt-px pr-2 opacity-100 shadow-[-8px_0_4px_var(--scalar-background-1)] transition-opacity duration-150 group-[.alert]:bg-transparent group-[.alert]:shadow-none group-[.error]:bg-transparent group-[.error]:shadow-none peer-has-[.cm-focused]:opacity-0\">\n Required\n </div>\n\n <!-- Environment variable autocomplete dropdown -->\n <EnvironmentVariableDropdown\n v-if=\"displayVariablesDropdown\"\n ref=\"dropdownRef\"\n :contextFunctionItems=\"contextFunctionDropdownItems\"\n :dropdownPosition=\"dropdownPosition\"\n :environment=\"environment\"\n :query=\"dropdownQuery\"\n @close=\"showDropdown = false\"\n @redirect=\"emit('navigate', { page: 'document', path: 'environment' })\"\n @select=\"handleDropdownSelect\" />\n</template>\n<style scoped>\n/*\n Deep styling for customizing Codemirror\n */\n:deep(.cm-editor) {\n height: 100%;\n outline: none;\n padding: 0;\n background: transparent;\n}\n:deep(.cm-placeholder) {\n color: var(--scalar-color-3);\n}\n:deep(.cm-content) {\n font-family: var(--scalar-font-code);\n font-size: var(--scalar-small);\n max-height: 20px;\n padding: 8px 0;\n}\n/* Tooltip helper */\n:deep(.cm-tooltip) {\n background: transparent !important;\n filter: brightness(var(--scalar-lifted-brightness));\n border-radius: var(--scalar-radius);\n box-shadow: var(--scalar-shadow-2);\n border: none !important;\n outline: none !important;\n overflow: hidden !important;\n}\n:deep(.cm-tooltip-autocomplete ul li) {\n padding: 3px 6px !important;\n}\n:deep(.cm-completionIcon-type:after) {\n color: var(--scalar-color-3) !important;\n}\n:deep(.cm-tooltip-autocomplete ul li[aria-selected]) {\n background: var(--scalar-background-2) !important;\n color: var(--scalar-color-1) !important;\n}\n:deep(.cm-tooltip-autocomplete ul) {\n padding: 6px !important;\n position: relative;\n}\n:deep(.cm-tooltip-autocomplete ul li:hover) {\n border-radius: 3px;\n color: var(--scalar-color-1) !important;\n background: var(--scalar-background-3) !important;\n}\n/* Disable active line highlighting */\n:deep(.cm-activeLine),\n:deep(.cm-activeLineGutter) {\n background-color: transparent;\n}\n/* Color selection matching */\n:deep(.cm-selectionMatch),\n:deep(.cm-matchingBracket) {\n border-radius: var(--scalar-radius);\n background: var(--scalar-background-4) !important;\n}\n/* Color Picker Swatches */\n:deep(.cm-css-color-picker-wrapper) {\n display: inline-flex;\n outline: 1px solid var(--scalar-background-3);\n border-radius: 3px;\n overflow: hidden;\n}\n/* Number gutter */\n:deep(.cm-gutters) {\n background-color: transparent;\n border-right: none;\n color: var(--scalar-color-3);\n font-size: var(--scalar-small);\n line-height: 22px;\n border-radius: 0 0 0 3px;\n}\n:deep(.cm-gutters:before) {\n content: '';\n position: absolute;\n top: 2px;\n left: 2px;\n width: calc(100% - 2px);\n height: calc(100% - 4px);\n border-radius: var(--scalar-radius) 0 0 var(--scalar-radius);\n background-color: var(--scalar-background-1);\n}\n:deep(.cm-gutterElement) {\n font-family: var(--scalar-font-code) !important;\n padding-left: 0px !important;\n padding-right: 6px !important;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n position: relative;\n}\n:deep(.cm-lineNumbers .cm-gutterElement) {\n min-width: fit-content;\n}\n:deep(.cm-gutter + .cm-gutter :not(.cm-foldGutter) .cm-gutterElement) {\n padding-left: 0 !important;\n}\n:deep(.cm-scroller) {\n overflow: auto;\n}\n.line-wrapping:focus-within :deep(.cm-content) {\n display: inline-table;\n min-height: fit-content;\n padding: 3px 6px;\n white-space: break-spaces;\n word-break: break-all;\n}\n</style>\n<style>\n.cm-pill {\n color: var(--scalar-color-1) !important;\n padding: 0px 9px;\n border-radius: 3px;\n display: inline-block;\n border-radius: 30px;\n font-size: var(--scalar-small);\n}\n.light-mode .cm-pill {\n background: var(--scalar-background-3) !important;\n}\n.dark-mode .cm-pill {\n background: color-mix(in srgb, var(--tw-bg-base), transparent 90%) !important;\n}\n.cm-pill--context-fn {\n border: 1px dashed color-mix(in srgb, var(--scalar-color-3), transparent 35%);\n padding: 0px 8px;\n}\n.light-mode .cm-pill--context-fn {\n background: color-mix(\n in srgb,\n var(--scalar-background-3),\n transparent 40%\n ) !important;\n}\n.dark-mode .cm-pill--context-fn {\n background: color-mix(\n in srgb,\n var(--scalar-background-3),\n transparent 55%\n ) !important;\n}\n.cm-pill:first-of-type {\n margin-left: 0;\n}\n.cm-editor .cm-widgetBuffer {\n display: none;\n}\n.cm-foldPlaceholder:hover {\n color: var(--scalar-color-1);\n}\n.cm-foldGutter .cm-gutterElement {\n font-size: var(--scalar-heading-4);\n padding: 2px !important;\n}\n.cm-foldGutter .cm-gutterElement:first-of-type {\n display: none;\n}\n.cm-foldGutter .cm-gutterElement .cm-foldMarker {\n padding: 2px;\n padding-top: 2px;\n}\n.cm-foldGutter .cm-gutterElement:hover .cm-foldMarker {\n background: var(--scalar-background-2);\n border-radius: var(--scalar-radius);\n color: var(--scalar-color-1);\n}\n</style>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"CodeInput.vue.js","names":[],"sources":["../../../../src/v2/components/code-input/CodeInput.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type CodeInputModelValue =\n | string\n | number\n | boolean\n | Array<string | number | boolean>\n | Record<string, unknown>\n\n/**\n * CodeInput\n *\n * A versatile input component that adapts its rendering based on props:\n * - Disabled mode: Read-only text display\n * - Select mode: Dropdown for enums, booleans, or examples\n * - Editor mode: CodeMirror with environment variable support\n *\n * Type `{{` to trigger autocomplete for environment variables and runtime context functions\n * (for example `{{$guid}}`) when an environment is provided.\n * It takes in any data but always will emit a string value,\n * this string should then be parsed in accordance to the schema or content type.\n *\n * @example\n * ```vue\n * <!-- Basic input with environment variables -->\n * <CodeInput v-model=\"value\" :environment=\"env\" />\n *\n * <!-- Boolean select -->\n * <CodeInput v-model=\"flag\" type=\"boolean\" />\n *\n * <!-- JSON editor with linting -->\n * <CodeInput v-model=\"data\" language=\"json\" :lint=\"true\" />\n * ```\n */\nexport default {\n inheritAttrs: false,\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { isDefined } from '@scalar/helpers/array/is-defined'\nimport {\n colorPicker as colorPickerExtension,\n useCodeMirror,\n useDropdown,\n type CodeMirrorLanguage,\n type Extension,\n} from '@scalar/use-codemirror'\nimport {\n CONTEXT_FUNCTION_NAMES,\n getContextFunctionComment,\n isContextFunctionName,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport { nanoid } from 'nanoid'\nimport { computed, ref, toRef, useAttrs, watch, type Ref } from 'vue'\n\nimport DataTableInputSelect from '@/v2/components/data-table/DataTableInputSelect.vue'\nimport EnvironmentVariableDropdown from '@/v2/features/environments/components/EnvironmentVariablesDropdown.vue'\nimport type { ClientLayout } from '@/v2/types/layout'\n\nimport { backspaceCommand, pillPlugin } from './code-variable-widget'\n\ntype Props = {\n modelValue: CodeInputModelValue\n /** Environment for variable substitution. Pass undefined to disable environment variables */\n environment: XScalarEnvironment | undefined\n /** Type of the input value, affects rendering mode for booleans */\n type?: string | string[]\n /** Render as disabled text display */\n disabled?: boolean\n /** Show error styling */\n error?: boolean\n /** Layout context affects styling and behavior */\n layout?: ClientLayout\n /** Predefined enum values, triggers select mode */\n enum?: string[]\n /** Example values, triggers select mode */\n examples?: string[]\n /** Default value to show in select mode */\n default?: Props['modelValue']\n /** Allow null in boolean select options */\n nullable?: boolean\n /** Placeholder text for empty input */\n placeholder?: string\n /** Show required indicator */\n required?: boolean\n /** Enable color picker extension */\n colorPicker?: boolean\n /** Show line numbers in editor */\n lineNumbers?: boolean\n /** Enable linting */\n lint?: boolean\n /** Enable line wrapping */\n lineWrapping?: boolean\n /** CodeMirror language mode */\n language?: CodeMirrorLanguage\n /** Additional CodeMirror extensions */\n extensions?: Extension[]\n /** Disable tab key for indentation */\n disableTabIndent?: boolean\n /** Disable enter key */\n disableEnter?: boolean\n /** Disable automatic bracket closing */\n disableCloseBrackets?: boolean\n /** Emit submit event on blur */\n emitOnBlur?: boolean\n /** Enable environment variable pills */\n withVariables?: boolean\n /** Enable fake data suggestions like $guid, $timestamp, etc. Should only be enabled for parameters and request bodies */\n withFakeData?: boolean\n /** Emit change event even if the value is the same */\n alwaysEmitChange?: boolean\n /** Custom change handler, prevents default emit */\n handleFieldChange?: (value: string) => void\n /** Custom submit handler, prevents default emit */\n handleFieldSubmit?: (value: string) => void\n /** Put a linethrough on the input text */\n linethrough?: boolean\n}\n\nconst {\n modelValue,\n environment,\n type,\n disabled = false,\n error = false,\n layout = 'desktop',\n enum: enumProp,\n examples,\n default: defaultProp,\n nullable = false,\n placeholder,\n required,\n colorPicker = false,\n lineNumbers = false,\n lint = false,\n lineWrapping = false,\n language,\n extensions = [],\n disableTabIndent = false,\n disableEnter = false,\n disableCloseBrackets = false,\n emitOnBlur = true,\n alwaysEmitChange = false,\n withVariables = true,\n withFakeData = false,\n handleFieldChange,\n handleFieldSubmit,\n} = defineProps<Props>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n 'submit': [value: string, event: KeyboardEvent | FocusEvent]\n 'navigate': [route: { page: 'document'; path: 'environment' }]\n 'blur': [value: string, event: FocusEvent]\n}>()\n\n// ---------------------------------------------------------------------------\n// Component identity and focus state\n\nconst attrs = useAttrs() as { id?: string }\nconst componentId = attrs.id || `id-${nanoid()}`\nconst isFocused = ref(false)\n\n// ---------------------------------------------------------------------------\n// Rendering mode detection\n\n/**\n * Determines if we should render a select dropdown for boolean types.\n */\nconst isBooleanMode = computed((): boolean => {\n if (enumProp?.length) {\n return false\n }\n return type === 'boolean' || (Array.isArray(type) && type.includes('boolean'))\n})\n\n/**\n * Options for boolean select mode.\n */\nconst booleanOptions = computed((): string[] =>\n nullable ? ['true', 'false', 'null'] : ['true', 'false'],\n)\n\n/**\n * Default type when dealing with type arrays.\n * Finds the first non-null type.\n */\nconst defaultType = computed((): string | undefined => {\n if (Array.isArray(type)) {\n return type.find((t) => t !== 'null') ?? 'string'\n }\n return type\n})\n\n// ---------------------------------------------------------------------------\n// Event handlers\n\n/**\n * Handles value changes during typing.\n */\nconst handleChange = (value: string): void => {\n if (!alwaysEmitChange && value === serializeValue(modelValue)) {\n return\n }\n\n // Use custom handler or emit update\n if (handleFieldChange) {\n handleFieldChange(value)\n } else {\n emit('update:modelValue', value)\n }\n}\n\n/**\n * Handles form submission (enter key or blur with emitOnBlur).\n */\nconst handleSubmit = (\n value: string,\n event: KeyboardEvent | FocusEvent,\n): void => {\n if (handleFieldSubmit) {\n handleFieldSubmit(value)\n } else {\n emit('submit', value, event)\n }\n}\n\n/**\n * Handles input blur event.\n */\nconst handleBlur = (value: string, event: FocusEvent): void => {\n isFocused.value = false\n\n if (emitOnBlur && modelValue) {\n handleSubmit(value, event)\n }\n\n emit('blur', value, event)\n}\n\n/**\n * Handles model value updates from select components.\n */\nconst handleSelectChange = (value: string): void =>\n emit('update:modelValue', value)\n\n// ---------------------------------------------------------------------------\n// CodeMirror setup\n\n/**\n * Build extensions array.\n * Note: Extensions are not reactive after initialization.\n */\nconst buildExtensions = (): Extension[] => {\n const extensionsList: Extension[] = [...extensions]\n\n if (colorPicker) {\n extensionsList.push(colorPickerExtension)\n }\n\n return extensionsList\n}\n\n/**\n * Reactive pill plugin for environment variable visualization.\n */\nconst contextFunctionDropdownItems = computed(() =>\n withFakeData\n ? CONTEXT_FUNCTION_NAMES.map((key) => ({\n key,\n description: getContextFunctionComment(key),\n }))\n : [],\n)\n\nconst pillPluginExtension = computed(() =>\n pillPlugin({\n environment,\n isContextFunctionName,\n isReadOnly: layout === 'modal',\n }),\n)\n\n/**\n * Combined extensions for CodeMirror.\n */\nconst codeMirrorExtensions = computed((): Extension[] => [\n ...buildExtensions(),\n pillPluginExtension.value,\n backspaceCommand,\n])\n\nconst codeMirrorRef: Ref<HTMLDivElement | null> = ref(null)\n\n/** Converts the model value to a string for CodeMirror */\nconst serializeValue = (value: CodeInputModelValue): string => {\n if (typeof value === 'string') {\n return value\n }\n return JSON.stringify(value)\n}\n\nconst { codeMirror, setCodeMirrorContent } = useCodeMirror({\n content: toRef(() => serializeValue(modelValue)),\n onChange: (value) => {\n handleChange(value)\n updateDropdownVisibility()\n },\n onFocus: () => {\n isFocused.value = true\n },\n onBlur: handleBlur,\n codeMirrorRef,\n disableTabIndent: toRef(() => disableTabIndent),\n disableEnter: toRef(() => disableEnter),\n disableCloseBrackets: toRef(() => disableCloseBrackets),\n lineNumbers: toRef(() => lineNumbers),\n language: toRef(() => language),\n lint: toRef(() => lint),\n extensions: codeMirrorExtensions,\n placeholder: toRef(() => placeholder),\n})\n\n/**\n * Handle autofocus attribute.\n */\nwatch(codeMirror, () => {\n if (codeMirror.value && Object.hasOwn(attrs, 'autofocus')) {\n codeMirror.value.focus()\n }\n})\n\n// ---------------------------------------------------------------------------\n// Environment variable dropdown\n\nconst showDropdown = ref(false)\nconst dropdownQuery = ref('')\nconst dropdownPosition = ref({ left: 0, top: 0 })\nconst dropdownRef = ref<InstanceType<\n typeof EnvironmentVariableDropdown\n> | null>(null)\n\nconst { handleDropdownSelect, updateDropdownVisibility } = useDropdown({\n codeMirror,\n query: dropdownQuery,\n showDropdown,\n dropdownPosition,\n})\n\n/**\n * Determines if the environment variable dropdown should be visible.\n * Shows when environment is defined (for env vars) or withFakeData is true (for context functions)\n */\nconst displayVariablesDropdown = computed((): boolean => {\n return (\n showDropdown.value &&\n withVariables &&\n layout !== 'modal' &&\n (Boolean(environment) || withFakeData)\n )\n})\n\n// ---------------------------------------------------------------------------\n// Keyboard event handling\n\n/**\n * Handles keyboard navigation for dropdown and form submission.\n */\nconst handleKeyDown = (key: string, event: KeyboardEvent): void => {\n if (showDropdown.value) {\n if (key === 'down' || key === 'up') {\n event.preventDefault()\n dropdownRef.value?.handleArrowKey(key)\n } else if (key === 'enter') {\n event.preventDefault()\n dropdownRef.value?.handleSelect()\n }\n return\n }\n\n if (key === 'escape' && !disableTabIndent) {\n event.stopPropagation()\n }\n\n if (key === 'enter' && event.target instanceof HTMLDivElement) {\n handleSubmit(codeMirror.value?.state.doc.toString() ?? '', event)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n\ndefineExpose({\n /**\n * Focus the codemirror element\n *\n * @param cursorAtEnd boolean place the cursor at the end of the input\n */\n focus: (position?: 'start' | 'end' | number) => {\n if (!codeMirror.value) {\n return\n }\n codeMirror.value.focus()\n\n if (!isDefined(position)) {\n return\n }\n\n const anchor = (() => {\n if (position === 'start') {\n return 0\n }\n if (position === 'end') {\n return codeMirror.value.state.doc.length\n }\n return position\n })()\n\n // Move the cursor to the specified position\n codeMirror.value.dispatch({\n selection: { anchor },\n scrollIntoView: true,\n })\n },\n isFocused,\n handleChange,\n handleSubmit,\n handleBlur,\n booleanOptions,\n codeMirror,\n codeMirrorRef,\n modelValue,\n setCodeMirrorContent,\n cursorPosition: () => codeMirror.value?.state.selection.main.head,\n serializeValue,\n})\n</script>\n\n<template>\n <!-- Disabled mode: read-only text display -->\n <div\n v-if=\"disabled\"\n class=\"text-c-2 flex cursor-default items-center justify-center\"\n :class=\"{\n 'font-code pr-2 pl-1 text-base': layout === 'modal',\n 'px-2': layout !== 'modal',\n 'line-through': linethrough,\n }\"\n data-testid=\"code-input-disabled\">\n <span class=\"whitespace-nowrap\">{{ modelValue }}</span>\n </div>\n\n <!-- Enum mode: select dropdown with predefined values -->\n <DataTableInputSelect\n v-else-if=\"enumProp?.length\"\n :default=\"defaultProp\"\n :modelValue=\"modelValue\"\n :type=\"defaultType\"\n :value=\"enumProp\"\n @update:modelValue=\"handleSelectChange\" />\n\n <!-- Boolean mode: select dropdown with true/false (and optionally null) -->\n <DataTableInputSelect\n v-else-if=\"isBooleanMode\"\n :default=\"defaultProp\"\n :modelValue=\"modelValue\"\n :value=\"booleanOptions\"\n @update:modelValue=\"handleSelectChange\" />\n\n <!-- Examples mode: select dropdown with example values -->\n <DataTableInputSelect\n v-else-if=\"examples?.length\"\n :default=\"defaultProp\"\n :modelValue=\"modelValue\"\n :value=\"examples\"\n @update:modelValue=\"handleSelectChange\" />\n\n <!-- Editor mode: CodeMirror with environment variable support -->\n <div\n v-else\n :id=\"componentId\"\n v-bind=\"$attrs\"\n ref=\"codeMirrorRef\"\n class=\"group/input group-[.alert]:outline-orange group-[.error]:outline-red font-code peer relative w-full overflow-hidden text-xs leading-[1.44] whitespace-nowrap -outline-offset-1 has-[:focus-visible]:rounded-[4px] has-[:focus-visible]:outline\"\n :class=\"{\n 'line-wrapping has-[:focus-visible]:bg-b-1 has-[:focus-visible]:absolute has-[:focus-visible]:z-1':\n lineWrapping,\n 'flow-code-input--error': error,\n 'line-through': linethrough,\n }\"\n @keydown.down.stop=\"handleKeyDown('down', $event)\"\n @keydown.enter=\"handleKeyDown('enter', $event)\"\n @keydown.escape=\"handleKeyDown('escape', $event)\"\n @keydown.up.stop=\"handleKeyDown('up', $event)\">\n <!-- Tab exit hint (shown when focused) -->\n <div\n v-if=\"!disableTabIndent\"\n class=\"z-context text-c-2 absolute right-1.5 bottom-1 hidden font-sans group-has-[:focus-visible]/input:block\"\n role=\"alert\">\n Press\n <kbd class=\"-mx-0.25 rounded border px-0.5 font-mono\">Esc</kbd> then\n <kbd class=\"-mx-0.25 rounded border px-0.5 font-mono\">Tab</kbd> to exit\n </div>\n </div>\n\n <!-- Warning slot (positioned absolutely) -->\n <div\n v-if=\"$slots.warning\"\n class=\"centered-y text-orange absolute right-7 text-xs\">\n <slot name=\"warning\" />\n </div>\n\n <!-- Icon slot (positioned absolutely) -->\n <div\n v-if=\"$slots.icon\"\n class=\"centered-y absolute right-0 flex h-full items-center p-1.5 group-has-[.cm-focused]:z-1\">\n <slot name=\"icon\" />\n </div>\n\n <!-- Required indicator -->\n <div\n v-if=\"required\"\n class=\"required centered-y text-xxs text-c-3 group-[.error]:text-red bg-b-1 pointer-events-none absolute right-0 mr-0.5 pt-px pr-2 opacity-100 shadow-[-8px_0_4px_var(--scalar-background-1)] transition-opacity duration-150 group-[.alert]:bg-transparent group-[.alert]:shadow-none group-[.error]:bg-transparent group-[.error]:shadow-none peer-has-[.cm-focused]:opacity-0\">\n Required\n </div>\n\n <!-- Environment variable autocomplete dropdown -->\n <EnvironmentVariableDropdown\n v-if=\"displayVariablesDropdown\"\n ref=\"dropdownRef\"\n :contextFunctionItems=\"contextFunctionDropdownItems\"\n :dropdownPosition=\"dropdownPosition\"\n :environment=\"environment\"\n :query=\"dropdownQuery\"\n @close=\"showDropdown = false\"\n @redirect=\"emit('navigate', { page: 'document', path: 'environment' })\"\n @select=\"handleDropdownSelect\" />\n</template>\n<style scoped>\n/*\n Deep styling for customizing Codemirror\n */\n:deep(.cm-editor) {\n height: 100%;\n outline: none;\n padding: 0;\n background: transparent;\n}\n:deep(.cm-placeholder) {\n color: var(--scalar-color-3);\n}\n:deep(.cm-content) {\n font-family: var(--scalar-font-code);\n font-size: var(--scalar-small);\n max-height: 20px;\n padding: 8px 0;\n}\n/* Tooltip helper */\n:deep(.cm-tooltip) {\n background: transparent !important;\n filter: brightness(var(--scalar-lifted-brightness));\n border-radius: var(--scalar-radius);\n box-shadow: var(--scalar-shadow-2);\n border: none !important;\n outline: none !important;\n overflow: hidden !important;\n}\n:deep(.cm-tooltip-autocomplete ul li) {\n padding: 3px 6px !important;\n}\n:deep(.cm-completionIcon-type:after) {\n color: var(--scalar-color-3) !important;\n}\n:deep(.cm-tooltip-autocomplete ul li[aria-selected]) {\n background: var(--scalar-background-2) !important;\n color: var(--scalar-color-1) !important;\n}\n:deep(.cm-tooltip-autocomplete ul) {\n padding: 6px !important;\n position: relative;\n}\n:deep(.cm-tooltip-autocomplete ul li:hover) {\n border-radius: 3px;\n color: var(--scalar-color-1) !important;\n background: var(--scalar-background-3) !important;\n}\n/* Disable active line highlighting */\n:deep(.cm-activeLine),\n:deep(.cm-activeLineGutter) {\n background-color: transparent;\n}\n/* Color selection matching */\n:deep(.cm-selectionMatch),\n:deep(.cm-matchingBracket) {\n border-radius: var(--scalar-radius);\n background: var(--scalar-background-4) !important;\n}\n/* Color Picker Swatches */\n:deep(.cm-css-color-picker-wrapper) {\n display: inline-flex;\n outline: 1px solid var(--scalar-background-3);\n border-radius: 3px;\n overflow: hidden;\n}\n/* Number gutter */\n:deep(.cm-gutters) {\n background-color: transparent;\n border-right: none;\n color: var(--scalar-color-3);\n font-size: var(--scalar-small);\n line-height: 22px;\n border-radius: 0 0 0 3px;\n}\n:deep(.cm-gutters:before) {\n content: '';\n position: absolute;\n top: 2px;\n left: 2px;\n width: calc(100% - 2px);\n height: calc(100% - 4px);\n border-radius: var(--scalar-radius) 0 0 var(--scalar-radius);\n background-color: var(--scalar-background-1);\n}\n:deep(.cm-gutterElement) {\n font-family: var(--scalar-font-code) !important;\n padding-left: 0px !important;\n padding-right: 6px !important;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n position: relative;\n}\n:deep(.cm-lineNumbers .cm-gutterElement) {\n min-width: fit-content;\n}\n:deep(.cm-gutter + .cm-gutter :not(.cm-foldGutter) .cm-gutterElement) {\n padding-left: 0 !important;\n}\n:deep(.cm-scroller) {\n overflow: auto;\n}\n.line-wrapping:focus-within :deep(.cm-content) {\n display: inline-table;\n min-height: fit-content;\n padding: 3px 6px;\n white-space: break-spaces;\n word-break: break-all;\n}\n</style>\n<style>\n.cm-pill {\n color: var(--scalar-color-1) !important;\n padding: 0px 9px;\n display: inline-block;\n border-radius: var(--scalar-radius-full);\n font-size: var(--scalar-small);\n}\n.light-mode .cm-pill {\n background: var(--scalar-background-3) !important;\n}\n.dark-mode .cm-pill {\n background: color-mix(in srgb, var(--tw-bg-base), transparent 90%) !important;\n}\n.cm-pill--context-fn {\n border: 1px dashed color-mix(in srgb, var(--scalar-color-3), transparent 35%);\n padding: 0px 8px;\n}\n.light-mode .cm-pill--context-fn {\n background: color-mix(\n in srgb,\n var(--scalar-background-3),\n transparent 40%\n ) !important;\n}\n.dark-mode .cm-pill--context-fn {\n background: color-mix(\n in srgb,\n var(--scalar-background-3),\n transparent 55%\n ) !important;\n}\n.cm-pill:first-of-type {\n margin-left: 0;\n}\n.cm-editor .cm-widgetBuffer {\n display: none;\n}\n.cm-foldPlaceholder:hover {\n color: var(--scalar-color-1);\n}\n.cm-foldGutter .cm-gutterElement {\n font-size: var(--scalar-heading-4);\n padding: 2px !important;\n}\n.cm-foldGutter .cm-gutterElement:first-of-type {\n display: none;\n}\n.cm-foldGutter .cm-gutterElement .cm-foldMarker {\n padding: 2px;\n padding-top: 2px;\n}\n.cm-foldGutter .cm-gutterElement:hover .cm-foldMarker {\n background: var(--scalar-background-2);\n border-radius: var(--scalar-radius);\n color: var(--scalar-color-1);\n}\n</style>\n"],"mappings":""}
|