@scalar/agent-chat 0.12.42 → 0.12.43
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/dist/components/RequestPreview.vue.d.ts.map +1 -1
- package/dist/components/RequestPreview.vue.js +1 -1
- package/dist/components/RequestPreview.vue.js.map +1 -1
- package/dist/components/RequestPreview.vue.script.js.map +1 -1
- package/dist/entities/registry/document.d.ts.map +1 -1
- package/dist/entities/registry/document.js.map +1 -1
- package/dist/entities/tools/ask-for-authentication.d.ts.map +1 -1
- package/dist/entities/tools/ask-for-authentication.js.map +1 -1
- package/dist/entities/tools/execute-request.d.ts +1 -1
- package/dist/entities/tools/execute-request.d.ts.map +1 -1
- package/dist/entities/tools/execute-request.js.map +1 -1
- package/dist/entities/tools/search-openapi-operations.d.ts.map +1 -1
- package/dist/entities/tools/search-openapi-operations.js.map +1 -1
- package/dist/hooks/use-chat-error.d.ts.map +1 -1
- package/dist/hooks/use-chat-error.js.map +1 -1
- package/dist/hooks/use-chat-scroll.d.ts.map +1 -1
- package/dist/hooks/use-chat-scroll.js.map +1 -1
- package/dist/hooks/use-search.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/style.css +80 -81
- package/dist/views/PromptForm.vue.js +1 -1
- package/dist/views/PromptForm.vue.js.map +1 -1
- package/dist/views/PromptForm.vue.script.js.map +1 -1
- package/dist/vue-styles.css +55 -55
- package/package.json +12 -12
package/dist/style.css
CHANGED
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
@supports (((-webkit-hyphens: none)) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color: rgb(from red r g b)))) {
|
|
12
12
|
*, :before, :after, ::backdrop {
|
|
13
13
|
--tw-font-weight: initial;
|
|
14
|
-
--tw-border-style: solid;
|
|
15
14
|
--tw-shadow: 0 0 #0000;
|
|
16
15
|
--tw-shadow-color: initial;
|
|
17
16
|
--tw-shadow-alpha: 100%;
|
|
@@ -47,6 +46,7 @@
|
|
|
47
46
|
--tw-skew-x: initial;
|
|
48
47
|
--tw-skew-y: initial;
|
|
49
48
|
--tw-divide-y-reverse: 0;
|
|
49
|
+
--tw-border-style: solid;
|
|
50
50
|
--tw-mask-linear: linear-gradient(#fff, #fff);
|
|
51
51
|
--tw-mask-radial: linear-gradient(#fff, #fff);
|
|
52
52
|
--tw-mask-conic: linear-gradient(#fff, #fff);
|
|
@@ -1196,10 +1196,9 @@
|
|
|
1196
1196
|
|
|
1197
1197
|
:where(body, dialog) > .scalar-tooltip:before {
|
|
1198
1198
|
content: "";
|
|
1199
|
+
border: var(--scalar-border-width) solid var(--scalar-border-color);
|
|
1199
1200
|
z-index: calc(1 * -1);
|
|
1200
1201
|
border-radius: var(--scalar-radius-lg);
|
|
1201
|
-
border-style: var(--tw-border-style);
|
|
1202
|
-
border-width: var(--scalar-border-width);
|
|
1203
1202
|
background-color: var(--scalar-tooltip-background);
|
|
1204
1203
|
--tw-shadow: var(--scalar-shadow-1);
|
|
1205
1204
|
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
@@ -1231,12 +1230,6 @@
|
|
|
1231
1230
|
inherits: false
|
|
1232
1231
|
}
|
|
1233
1232
|
|
|
1234
|
-
@property --tw-border-style {
|
|
1235
|
-
syntax: "*";
|
|
1236
|
-
inherits: false;
|
|
1237
|
-
initial-value: solid;
|
|
1238
|
-
}
|
|
1239
|
-
|
|
1240
1233
|
@property --tw-shadow {
|
|
1241
1234
|
syntax: "*";
|
|
1242
1235
|
inherits: false;
|
|
@@ -1875,45 +1868,45 @@
|
|
|
1875
1868
|
}
|
|
1876
1869
|
}
|
|
1877
1870
|
|
|
1878
|
-
[data-v-
|
|
1871
|
+
[data-v-344240b0] .code-input-lite__editor {
|
|
1879
1872
|
font-family: var(--scalar-font);
|
|
1880
1873
|
font-size: var(--scalar-small);
|
|
1881
1874
|
background-color: #0000;
|
|
1882
1875
|
padding: 5px 8px;
|
|
1883
1876
|
}
|
|
1884
1877
|
|
|
1885
|
-
[data-v-
|
|
1878
|
+
[data-v-344240b0] .scalar-pill:not(:last-of-type) {
|
|
1886
1879
|
margin-right: .15em;
|
|
1887
1880
|
}
|
|
1888
1881
|
|
|
1889
|
-
[data-v-
|
|
1882
|
+
[data-v-344240b0] .scalar-pill:not(:first-of-type) {
|
|
1890
1883
|
margin-left: .5px;
|
|
1891
1884
|
}
|
|
1892
1885
|
|
|
1893
|
-
[data-v-
|
|
1886
|
+
[data-v-ec7e5b86] .cm-content {
|
|
1894
1887
|
font-size: var(--scalar-small);
|
|
1895
1888
|
}
|
|
1896
1889
|
|
|
1897
|
-
[data-v-
|
|
1890
|
+
[data-v-029a43f5] .code-input-lite__editor {
|
|
1898
1891
|
font-family: var(--scalar-font);
|
|
1899
1892
|
font-size: var(--scalar-small);
|
|
1900
1893
|
background-color: #0000;
|
|
1901
1894
|
padding: 5px 8px;
|
|
1902
1895
|
}
|
|
1903
1896
|
|
|
1904
|
-
[data-v-
|
|
1897
|
+
[data-v-029a43f5] .scalar-pill:not(:last-of-type) {
|
|
1905
1898
|
margin-right: .15em;
|
|
1906
1899
|
}
|
|
1907
1900
|
|
|
1908
|
-
[data-v-
|
|
1901
|
+
[data-v-029a43f5] .scalar-pill:not(:first-of-type) {
|
|
1909
1902
|
margin-left: .5px;
|
|
1910
1903
|
}
|
|
1911
1904
|
|
|
1912
|
-
input[data-v-
|
|
1905
|
+
input[data-v-029a43f5]::placeholder {
|
|
1913
1906
|
color: var(--scalar-color-3);
|
|
1914
1907
|
}
|
|
1915
1908
|
|
|
1916
|
-
.scalar-password-input[data-v-
|
|
1909
|
+
.scalar-password-input[data-v-029a43f5] {
|
|
1917
1910
|
text-security: disc;
|
|
1918
1911
|
-webkit-text-security: disc;
|
|
1919
1912
|
-moz-text-security: disc;
|
|
@@ -1950,38 +1943,38 @@ input[data-v-ce270af2]::placeholder {
|
|
|
1950
1943
|
scrollbar-width: none;
|
|
1951
1944
|
}
|
|
1952
1945
|
|
|
1953
|
-
.request-section-content[data-v-
|
|
1946
|
+
.request-section-content[data-v-a55ce987] {
|
|
1954
1947
|
--scalar-border-width: .5px;
|
|
1955
1948
|
}
|
|
1956
1949
|
|
|
1957
|
-
.request-section-content-filter[data-v-
|
|
1950
|
+
.request-section-content-filter[data-v-a55ce987] {
|
|
1958
1951
|
box-shadow: 0 -10px 0 10px var(--scalar-background-1);
|
|
1959
1952
|
}
|
|
1960
1953
|
|
|
1961
|
-
.request-item:focus-within .request-meta-buttons[data-v-
|
|
1954
|
+
.request-item:focus-within .request-meta-buttons[data-v-a55ce987] {
|
|
1962
1955
|
opacity: 1;
|
|
1963
1956
|
}
|
|
1964
1957
|
|
|
1965
|
-
.group-hover-input[data-v-
|
|
1958
|
+
.group-hover-input[data-v-a55ce987] {
|
|
1966
1959
|
border-width: var(--scalar-border-width);
|
|
1967
1960
|
border-color: #0000;
|
|
1968
1961
|
}
|
|
1969
1962
|
|
|
1970
|
-
.group:hover .group-hover-input[data-v-
|
|
1963
|
+
.group:hover .group-hover-input[data-v-a55ce987] {
|
|
1971
1964
|
background: var(--scalar-background-1);
|
|
1972
1965
|
}
|
|
1973
1966
|
|
|
1974
1967
|
@supports (color: color-mix(in lab, red, red)) {
|
|
1975
|
-
.group:hover .group-hover-input[data-v-
|
|
1968
|
+
.group:hover .group-hover-input[data-v-a55ce987] {
|
|
1976
1969
|
background: color-mix(in srgb, var(--scalar-background-1), var(--scalar-background-2));
|
|
1977
1970
|
}
|
|
1978
1971
|
}
|
|
1979
1972
|
|
|
1980
|
-
.group:hover .group-hover-input[data-v-
|
|
1973
|
+
.group:hover .group-hover-input[data-v-a55ce987] {
|
|
1981
1974
|
border-color: var(--scalar-border-color);
|
|
1982
1975
|
}
|
|
1983
1976
|
|
|
1984
|
-
.group-hover-input[data-v-
|
|
1977
|
+
.group-hover-input[data-v-a55ce987]:focus {
|
|
1985
1978
|
border-color: var(--scalar-border-color) !important;
|
|
1986
1979
|
background: none !important;
|
|
1987
1980
|
}
|
|
@@ -4452,6 +4445,12 @@ input[data-v-ce270af2]::placeholder {
|
|
|
4452
4445
|
initial-value: 0;
|
|
4453
4446
|
}
|
|
4454
4447
|
|
|
4448
|
+
@property --tw-border-style {
|
|
4449
|
+
syntax: "*";
|
|
4450
|
+
inherits: false;
|
|
4451
|
+
initial-value: solid;
|
|
4452
|
+
}
|
|
4453
|
+
|
|
4455
4454
|
@property --tw-mask-linear {
|
|
4456
4455
|
syntax: "*";
|
|
4457
4456
|
inherits: false;
|
|
@@ -4916,37 +4915,37 @@ input[data-v-ce270af2]::placeholder {
|
|
|
4916
4915
|
}
|
|
4917
4916
|
}
|
|
4918
4917
|
|
|
4919
|
-
.requestHeaderContainer[data-v-
|
|
4918
|
+
.requestHeaderContainer[data-v-e049f4c9] {
|
|
4920
4919
|
display: flex;
|
|
4921
4920
|
align-items: center;
|
|
4922
4921
|
justify-content: space-between;
|
|
4923
4922
|
padding: 0 5px;
|
|
4924
4923
|
}
|
|
4925
|
-
.requestPreview[data-v-
|
|
4924
|
+
.requestPreview[data-v-e049f4c9] {
|
|
4926
4925
|
border-radius: var(--scalar-radius-2xl);
|
|
4927
4926
|
display: flex;
|
|
4928
4927
|
flex-direction: column;
|
|
4929
4928
|
width: 100%;
|
|
4930
4929
|
position: relative;
|
|
4931
4930
|
}
|
|
4932
|
-
.requestContent[data-v-
|
|
4931
|
+
.requestContent[data-v-e049f4c9] {
|
|
4933
4932
|
display: grid;
|
|
4934
4933
|
grid-template-rows: 0fr;
|
|
4935
4934
|
min-height: 0;
|
|
4936
4935
|
overflow: hidden;
|
|
4937
4936
|
transition: grid-template-rows 0.2s ease-out;
|
|
4938
4937
|
}
|
|
4939
|
-
.requestPreview.open .requestContent[data-v-
|
|
4938
|
+
.requestPreview.open .requestContent[data-v-e049f4c9] {
|
|
4940
4939
|
grid-template-rows: 1fr;
|
|
4941
4940
|
}
|
|
4942
|
-
.requestPreview.succeeded[data-v-
|
|
4941
|
+
.requestPreview.succeeded[data-v-e049f4c9] {
|
|
4943
4942
|
padding: 0;
|
|
4944
4943
|
}
|
|
4945
|
-
.requestContentInner[data-v-
|
|
4944
|
+
.requestContentInner[data-v-e049f4c9] {
|
|
4946
4945
|
min-height: 0;
|
|
4947
4946
|
overflow: hidden;
|
|
4948
4947
|
}
|
|
4949
|
-
.code[data-v-
|
|
4948
|
+
.code[data-v-e049f4c9] {
|
|
4950
4949
|
display: flex;
|
|
4951
4950
|
flex-direction: column;
|
|
4952
4951
|
font-size: var(--scalar-font-size-4);
|
|
@@ -4959,34 +4958,34 @@ input[data-v-ce270af2]::placeholder {
|
|
|
4959
4958
|
overflow: hidden;
|
|
4960
4959
|
margin-bottom: 12px;
|
|
4961
4960
|
}
|
|
4962
|
-
.dark-mode .code[data-v-
|
|
4961
|
+
.dark-mode .code[data-v-e049f4c9] {
|
|
4963
4962
|
background: var(--scalar-background-2);
|
|
4964
4963
|
}
|
|
4965
|
-
.code h1[data-v-
|
|
4964
|
+
.code h1[data-v-e049f4c9] {
|
|
4966
4965
|
font-size: var(--scalar-font-size-3);
|
|
4967
4966
|
color: var(--scalar-color-3);
|
|
4968
4967
|
padding: 8px;
|
|
4969
4968
|
}
|
|
4970
|
-
.code[data-v-
|
|
4969
|
+
.code[data-v-e049f4c9] .codeBlock {
|
|
4971
4970
|
max-height: calc(50vh - 100px);
|
|
4972
4971
|
padding-top: 0;
|
|
4973
4972
|
}
|
|
4974
|
-
.autosendContainer[data-v-
|
|
4973
|
+
.autosendContainer[data-v-e049f4c9] {
|
|
4975
4974
|
display: flex;
|
|
4976
4975
|
justify-content: space-between;
|
|
4977
4976
|
}
|
|
4978
|
-
.sendButton[data-v-
|
|
4977
|
+
.sendButton[data-v-e049f4c9] {
|
|
4979
4978
|
background: var(--scalar-color-blue);
|
|
4980
4979
|
color: white;
|
|
4981
4980
|
font-weight: var(--scalar-semibold);
|
|
4982
4981
|
padding: 5px 10px;
|
|
4983
4982
|
}
|
|
4984
|
-
.sendButton[data-v-
|
|
4985
|
-
.sendButton[data-v-
|
|
4983
|
+
.sendButton[data-v-e049f4c9]:hover,
|
|
4984
|
+
.sendButton[data-v-e049f4c9]:active {
|
|
4986
4985
|
background: color-mix(in srgb, var(--scalar-color-blue), black 10%);
|
|
4987
4986
|
color: white !important;
|
|
4988
4987
|
}
|
|
4989
|
-
.toggleButton[data-v-
|
|
4988
|
+
.toggleButton[data-v-e049f4c9] {
|
|
4990
4989
|
background: none;
|
|
4991
4990
|
border: none;
|
|
4992
4991
|
cursor: pointer;
|
|
@@ -4998,7 +4997,7 @@ input[data-v-ce270af2]::placeholder {
|
|
|
4998
4997
|
justify-content: space-between;
|
|
4999
4998
|
border-radius: var(--scalar-radius-lg);
|
|
5000
4999
|
}
|
|
5001
|
-
.toggleButton[data-v-
|
|
5000
|
+
.toggleButton[data-v-e049f4c9]:hover {
|
|
5002
5001
|
text-decoration: underline;
|
|
5003
5002
|
}
|
|
5004
5003
|
|
|
@@ -5571,7 +5570,7 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5571
5570
|
width: 20px;
|
|
5572
5571
|
}
|
|
5573
5572
|
|
|
5574
|
-
.actionContainer[data-v-
|
|
5573
|
+
.actionContainer[data-v-3a0f1d21] {
|
|
5575
5574
|
background: color-mix(
|
|
5576
5575
|
in srgb,
|
|
5577
5576
|
var(--scalar-background-2),
|
|
@@ -5584,7 +5583,7 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5584
5583
|
/* visually hides overflowing text below */
|
|
5585
5584
|
box-shadow: 0 24px 0 2px var(--scalar-background-1);
|
|
5586
5585
|
}
|
|
5587
|
-
.promptForm[data-v-
|
|
5586
|
+
.promptForm[data-v-3a0f1d21] {
|
|
5588
5587
|
width: 100%;
|
|
5589
5588
|
position: relative;
|
|
5590
5589
|
display: flex;
|
|
@@ -5595,23 +5594,23 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5595
5594
|
0 0 0 var(--scalar-border-width) var(--scalar-border-color);
|
|
5596
5595
|
border-radius: var(--scalar-radius-3xl);
|
|
5597
5596
|
}
|
|
5598
|
-
.inputActionsContainer[data-v-
|
|
5597
|
+
.inputActionsContainer[data-v-3a0f1d21] {
|
|
5599
5598
|
display: flex;
|
|
5600
5599
|
justify-content: space-between;
|
|
5601
5600
|
padding: 0 8px 8px 8px;
|
|
5602
5601
|
}
|
|
5603
|
-
.inputActionsLeft[data-v-
|
|
5602
|
+
.inputActionsLeft[data-v-3a0f1d21] {
|
|
5604
5603
|
display: flex;
|
|
5605
5604
|
flex-wrap: wrap; /* key: allows pills to go to next line */
|
|
5606
5605
|
align-items: center;
|
|
5607
5606
|
gap: 5px; /* spacing between pills */
|
|
5608
5607
|
}
|
|
5609
|
-
.inputActionsRight[data-v-
|
|
5608
|
+
.inputActionsRight[data-v-3a0f1d21] {
|
|
5610
5609
|
display: flex;
|
|
5611
5610
|
gap: 5px;
|
|
5612
5611
|
position: relative;
|
|
5613
5612
|
}
|
|
5614
|
-
.apiPill[data-v-
|
|
5613
|
+
.apiPill[data-v-3a0f1d21] {
|
|
5615
5614
|
font-size: var(--scalar-font-size-3);
|
|
5616
5615
|
border: var(--scalar-border-width) solid var(--scalar-border-color);
|
|
5617
5616
|
color: var(--scalar-color-2);
|
|
@@ -5626,10 +5625,10 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5626
5625
|
gap: 4px;
|
|
5627
5626
|
user-select: none;
|
|
5628
5627
|
}
|
|
5629
|
-
.apiPillLogo[data-v-
|
|
5628
|
+
.apiPillLogo[data-v-3a0f1d21] {
|
|
5630
5629
|
width: 15px;
|
|
5631
5630
|
}
|
|
5632
|
-
.apiPillRemove[data-v-
|
|
5631
|
+
.apiPillRemove[data-v-3a0f1d21] {
|
|
5633
5632
|
width: 24px;
|
|
5634
5633
|
height: 24px;
|
|
5635
5634
|
margin-right: -6px;
|
|
@@ -5638,16 +5637,16 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5638
5637
|
align-items: center;
|
|
5639
5638
|
justify-content: center;
|
|
5640
5639
|
}
|
|
5641
|
-
.apiPill:hover .apiPillRemove[data-v-
|
|
5640
|
+
.apiPill:hover .apiPillRemove[data-v-3a0f1d21] {
|
|
5642
5641
|
background: var(--scalar-background-2);
|
|
5643
5642
|
}
|
|
5644
|
-
.dark-mode .apiPill:hover .apiPillRemove[data-v-
|
|
5643
|
+
.dark-mode .apiPill:hover .apiPillRemove[data-v-3a0f1d21] {
|
|
5645
5644
|
background: var(--scalar-background-3);
|
|
5646
5645
|
}
|
|
5647
|
-
.apiPillRemove[data-v-
|
|
5646
|
+
.apiPillRemove[data-v-3a0f1d21]:hover {
|
|
5648
5647
|
color: var(--scalar-color-1);
|
|
5649
5648
|
}
|
|
5650
|
-
.prompt[data-v-
|
|
5649
|
+
.prompt[data-v-3a0f1d21] {
|
|
5651
5650
|
width: 100%;
|
|
5652
5651
|
outline: none;
|
|
5653
5652
|
border: none;
|
|
@@ -5664,13 +5663,13 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5664
5663
|
font-size: 16px;
|
|
5665
5664
|
padding: 12px 12px 14px 12px;
|
|
5666
5665
|
}
|
|
5667
|
-
.dark-mode .promptForm[data-v-
|
|
5666
|
+
.dark-mode .promptForm[data-v-3a0f1d21] {
|
|
5668
5667
|
background: var(--scalar-background-2);
|
|
5669
5668
|
}
|
|
5670
|
-
.prompt[data-v-
|
|
5669
|
+
.prompt[data-v-3a0f1d21]:disabled {
|
|
5671
5670
|
color: var(--scalar-color-3);
|
|
5672
5671
|
}
|
|
5673
|
-
.addAPIButton[data-v-
|
|
5672
|
+
.addAPIButton[data-v-3a0f1d21] {
|
|
5674
5673
|
display: flex;
|
|
5675
5674
|
align-items: center;
|
|
5676
5675
|
justify-content: center;
|
|
@@ -5687,7 +5686,7 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5687
5686
|
z-index: 1;
|
|
5688
5687
|
box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);
|
|
5689
5688
|
}
|
|
5690
|
-
.addAPIButton[data-v-
|
|
5689
|
+
.addAPIButton[data-v-3a0f1d21]:hover {
|
|
5691
5690
|
background: color-mix(
|
|
5692
5691
|
in srgb,
|
|
5693
5692
|
var(--scalar-background-2),
|
|
@@ -5695,47 +5694,47 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5695
5694
|
);
|
|
5696
5695
|
box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);
|
|
5697
5696
|
}
|
|
5698
|
-
.dark-mode .addAPIButton[data-v-
|
|
5697
|
+
.dark-mode .addAPIButton[data-v-3a0f1d21]:hover {
|
|
5699
5698
|
background: var(--scalar-background-3);
|
|
5700
5699
|
}
|
|
5701
|
-
.settingsButton[data-v-
|
|
5700
|
+
.settingsButton[data-v-3a0f1d21] {
|
|
5702
5701
|
color: var(--scalar-color-3) !important;
|
|
5703
5702
|
border-radius: var(--scalar-radius-full) !important;
|
|
5704
5703
|
margin: 0 !important;
|
|
5705
5704
|
z-index: 1;
|
|
5706
5705
|
}
|
|
5707
|
-
.settingsButton[aria-disabled='true'][data-v-
|
|
5706
|
+
.settingsButton[aria-disabled='true'][data-v-3a0f1d21] {
|
|
5708
5707
|
background: var(--scalar-background-2);
|
|
5709
5708
|
}
|
|
5710
|
-
.dark-mode .settingsButton[data-v-
|
|
5709
|
+
.dark-mode .settingsButton[data-v-3a0f1d21]:hover {
|
|
5711
5710
|
background: var(--scalar-background-3);
|
|
5712
5711
|
}
|
|
5713
|
-
.sendButton[data-v-
|
|
5712
|
+
.sendButton[data-v-3a0f1d21] {
|
|
5714
5713
|
background: var(--scalar-color-blue) !important;
|
|
5715
5714
|
border-radius: var(--scalar-radius-full) !important;
|
|
5716
5715
|
margin: 0 !important;
|
|
5717
5716
|
z-index: 1;
|
|
5718
5717
|
border: var(--scalar-border-width) solid var(--scalar-color-blue);
|
|
5719
5718
|
}
|
|
5720
|
-
.sendButton[data-v-
|
|
5719
|
+
.sendButton[data-v-3a0f1d21]:not([aria-disabled='true']) {
|
|
5721
5720
|
color: white !important;
|
|
5722
5721
|
}
|
|
5723
|
-
.sendButton[data-v-
|
|
5722
|
+
.sendButton[data-v-3a0f1d21]:not([aria-disabled='true']):hover {
|
|
5724
5723
|
background: color-mix(
|
|
5725
5724
|
in srgb,
|
|
5726
5725
|
var(--scalar-color-blue),
|
|
5727
5726
|
transparent 10%
|
|
5728
5727
|
) !important;
|
|
5729
5728
|
}
|
|
5730
|
-
.sendButton[aria-disabled='true'][data-v-
|
|
5729
|
+
.sendButton[aria-disabled='true'][data-v-3a0f1d21] {
|
|
5731
5730
|
background: var(--scalar-background-2) !important;
|
|
5732
5731
|
color: var(--scalar-color-3) !important;
|
|
5733
5732
|
border: var(--scalar-border-width) solid var(--scalar-border-color);
|
|
5734
5733
|
}
|
|
5735
|
-
.dark-mode .sendButton[aria-disabled='true'][data-v-
|
|
5734
|
+
.dark-mode .sendButton[aria-disabled='true'][data-v-3a0f1d21] {
|
|
5736
5735
|
background: var(--scalar-background-3) !important;
|
|
5737
5736
|
}
|
|
5738
|
-
.contextContainer[data-v-
|
|
5737
|
+
.contextContainer[data-v-3a0f1d21] {
|
|
5739
5738
|
display: flex;
|
|
5740
5739
|
width: 100%;
|
|
5741
5740
|
padding: 10px 12px 12px 12px;
|
|
@@ -5744,25 +5743,25 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5744
5743
|
user-select: none;
|
|
5745
5744
|
justify-content: space-between;
|
|
5746
5745
|
}
|
|
5747
|
-
.settingsButton[data-v-
|
|
5746
|
+
.settingsButton[data-v-3a0f1d21] {
|
|
5748
5747
|
font-weight: var(--scalar-semibold);
|
|
5749
5748
|
border-radius: var(--scalar-radius-lg);
|
|
5750
5749
|
padding: 4px 6px;
|
|
5751
5750
|
margin: -4px -6px;
|
|
5752
5751
|
}
|
|
5753
|
-
.settingsButton[data-v-
|
|
5752
|
+
.settingsButton[data-v-3a0f1d21]:hover {
|
|
5754
5753
|
background: var(--scalar-background-2);
|
|
5755
5754
|
box-shadow: 0 0 var(--scalar-border-width) 0 var(--scalar-border-color);
|
|
5756
5755
|
cursor: pointer;
|
|
5757
5756
|
}
|
|
5758
|
-
.agentLabel[data-v-
|
|
5757
|
+
.agentLabel[data-v-3a0f1d21] {
|
|
5759
5758
|
font-size: 0px;
|
|
5760
5759
|
position: absolute;
|
|
5761
5760
|
width: 100%;
|
|
5762
5761
|
height: 100%;
|
|
5763
5762
|
cursor: text;
|
|
5764
5763
|
}
|
|
5765
|
-
.sendCheckboxContinue[data-v-
|
|
5764
|
+
.sendCheckboxContinue[data-v-3a0f1d21]:has(input) {
|
|
5766
5765
|
display: flex;
|
|
5767
5766
|
align-items: center;
|
|
5768
5767
|
border-radius: var(--scalar-radius-3xl);
|
|
@@ -5774,11 +5773,11 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5774
5773
|
user-select: none;
|
|
5775
5774
|
height: 28px;
|
|
5776
5775
|
}
|
|
5777
|
-
.dark-mode .sendCheckboxContinue[data-v-
|
|
5776
|
+
.dark-mode .sendCheckboxContinue[data-v-3a0f1d21]:has(input) {
|
|
5778
5777
|
background: var(--scalar-background-3);
|
|
5779
5778
|
box-shadow: 0 0 0 1.5px var(--scalar-background-3);
|
|
5780
5779
|
}
|
|
5781
|
-
.addMoreContext[data-v-
|
|
5780
|
+
.addMoreContext[data-v-3a0f1d21] {
|
|
5782
5781
|
height: 40px;
|
|
5783
5782
|
display: flex;
|
|
5784
5783
|
position: relative;
|
|
@@ -5787,7 +5786,7 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5787
5786
|
padding: 0 8px 0 12px;
|
|
5788
5787
|
align-items: center;
|
|
5789
5788
|
}
|
|
5790
|
-
.addMoreContext[data-v-
|
|
5789
|
+
.addMoreContext[data-v-3a0f1d21]:before {
|
|
5791
5790
|
content: '';
|
|
5792
5791
|
width: 8px;
|
|
5793
5792
|
height: 8px;
|
|
@@ -5804,10 +5803,10 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5804
5803
|
-0.5px -0.5px 0 var(--scalar-border-color),
|
|
5805
5804
|
inset 0.5px 0.5px 1px var(--scalar-border-color);
|
|
5806
5805
|
}
|
|
5807
|
-
.dark-mode .addMoreContext[data-v-
|
|
5806
|
+
.dark-mode .addMoreContext[data-v-3a0f1d21]:before {
|
|
5808
5807
|
box-shadow: -0.5px -0.5px 0 var(--scalar-border-color);
|
|
5809
5808
|
}
|
|
5810
|
-
.addAPIContext[data-v-
|
|
5809
|
+
.addAPIContext[data-v-3a0f1d21] {
|
|
5811
5810
|
width: 28px;
|
|
5812
5811
|
height: 28px;
|
|
5813
5812
|
border-radius: var(--scalar-radius-full);
|
|
@@ -5816,7 +5815,7 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5816
5815
|
justify-content: center;
|
|
5817
5816
|
border: var(--scalar-border-width) solid var(--scalar-border-color);
|
|
5818
5817
|
}
|
|
5819
|
-
.termsAgree[data-v-
|
|
5818
|
+
.termsAgree[data-v-3a0f1d21] {
|
|
5820
5819
|
display: flex;
|
|
5821
5820
|
cursor: pointer;
|
|
5822
5821
|
height: inherit;
|
|
@@ -5825,14 +5824,14 @@ input[data-v-ce270af2]::placeholder {
|
|
|
5825
5824
|
gap: 5px;
|
|
5826
5825
|
margin: 0px 5px;
|
|
5827
5826
|
}
|
|
5828
|
-
.termsAgree[data-v-
|
|
5827
|
+
.termsAgree[data-v-3a0f1d21]:hover {
|
|
5829
5828
|
color: var(--scalar-color-1);
|
|
5830
5829
|
}
|
|
5831
|
-
.termsAgree:hover .termsAgreeIcon[data-v-
|
|
5830
|
+
.termsAgree:hover .termsAgreeIcon[data-v-3a0f1d21] {
|
|
5832
5831
|
background: var(--scalar-color-1);
|
|
5833
5832
|
color: var(--scalar-background-1);
|
|
5834
5833
|
}
|
|
5835
|
-
.termsAgreeIcon[data-v-
|
|
5834
|
+
.termsAgreeIcon[data-v-3a0f1d21] {
|
|
5836
5835
|
width: inherit;
|
|
5837
5836
|
height: inherit;
|
|
5838
5837
|
padding: 2px;
|
|
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../_virtual/_plugin-vue_export-he
|
|
|
2
2
|
import PromptForm_vue_vue_type_script_setup_true_lang_default from "./PromptForm.vue.script.js";
|
|
3
3
|
/* empty css */
|
|
4
4
|
//#region src/views/PromptForm.vue
|
|
5
|
-
var PromptForm_default = /*#__PURE__*/ _plugin_vue_export_helper_default(PromptForm_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
5
|
+
var PromptForm_default = /*#__PURE__*/ _plugin_vue_export_helper_default(PromptForm_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-3a0f1d21"]]);
|
|
6
6
|
//#endregion
|
|
7
7
|
export { PromptForm_default as default };
|
|
8
8
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptForm.vue.js","names":[],"sources":["../../src/views/PromptForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarIconButton } from '@scalar/components/icon-button'\nimport { ScalarLoading } from '@scalar/components/loading'\nimport { ScalarTooltip } from '@scalar/components/tooltip'\nimport {\n ScalarIconArrowUp,\n ScalarIconCheck,\n ScalarIconLockSimple,\n ScalarIconPlus,\n ScalarIconX,\n} from '@scalar/icons'\nimport { computed, useTemplateRef, watch } from 'vue'\n\nimport ActionsDropdown from '@/components/ActionsDropdown.vue'\nimport ApprovalSection from '@/components/ApprovalSection.vue'\nimport ErrorMessageMessage from '@/components/ErrorMessage.vue'\nimport FreeMessagesInfoSection from '@/components/FreeMessagesInfoSection.vue'\nimport PaymentSection from '@/components/PaymentSection.vue'\nimport SearchPopover from '@/components/SearchPopover.vue'\nimport UploadSection from '@/components/UploadSection.vue'\nimport { AgentErrorCodes } from '@/entities/error/constants'\nimport { MAX_PROMPT_SIZE } from '@/entities/prompt/constants'\nimport { useRequestApprovals } from '@/hooks/use-chat-approvals'\nimport { useChatError } from '@/hooks/use-chat-error'\nimport { useChatPendingClientToolParts } from '@/hooks/use-chat-pending-client-tool-parts'\nimport { useUploadTmpDocument } from '@/hooks/use-upload-tmp-document'\nimport { useState } from '@/state/state'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\ndefineExpose({ focusPrompt })\n\nconst promptRef = useTemplateRef<HTMLTextAreaElement>('agentPrompt')\n\nconst state = useState()\n\nconst inputHasContent = computed(() => state.prompt.value.trim().length > 0)\nconst promptTooLarge = computed(\n () => state.prompt.value.trim().length > MAX_PROMPT_SIZE,\n)\n\n/** Show free messages info only after at least one message has been sent and when no API key is set. */\nconst showFreeMessagesInfo = computed(\n () =>\n state.chat.messages.length > 1 &&\n !state.getAgentKey?.() &&\n chatError?.value?.code !== AgentErrorCodes.LIMIT_REACHED,\n)\n\nwatch(state.prompt, () => {\n if (!promptRef?.value) {\n return\n }\n\n if (!state.prompt.value.length) {\n promptRef.value.style.height = '0px'\n return\n }\n\n promptRef.value.style.height = 'auto'\n promptRef.value.style.height = promptRef.value.scrollHeight + 'px'\n})\n\nfunction handlePromptKeydown(e: KeyboardEvent) {\n // Ignore the Enter that only commits an IME composition (e.g. Japanese, Chinese,\n // Korean). On macOS Chrome that keydown still reports key === 'Enter' with\n // isComposing === true, so without this guard the message sends mid-composition.\n if (e.isComposing) {\n return\n }\n\n if (state.loading.value) {\n return\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmit()\n window.scrollTo(0, document.body.scrollHeight)\n }\n}\n\nfunction focusPrompt() {\n promptRef.value?.focus()\n}\n\nwatch(\n () => state.chat.status,\n (status) => {\n if (status === 'ready' || status === 'error') {\n promptRef.value?.focus()\n }\n },\n)\n\nconst { approvalRequiredParts, respondToRequestApprovals } =\n useRequestApprovals()\n\nconst { pendingClientToolParts } = useChatPendingClientToolParts()\n\nconst uploadTmpDoc = useUploadTmpDocument()\n\nfunction acceptTerms() {\n state.terms.accept()\n\n if (state.mode === 'preview' && state.getActiveDocumentJson) {\n uploadTmpDoc.uploadTempDocument(state.getActiveDocumentJson(), true)\n }\n}\n\nconst isPending = computed(() =>\n Object.values(state.pendingDocuments).some(Boolean),\n)\n\nconst submitDisabled = computed(() => {\n const tooLarge = promptTooLarge.value\n const missingInput = !inputHasContent.value\n const awaitingApproval = approvalRequiredParts.value.length > 0\n const pendingToolParts = pendingClientToolParts.value.length > 0\n\n const isPreview = state.mode === 'preview'\n\n const termsNotAccepted = isPreview && !state.terms.accepted.value\n const uploadingTmpDoc = isPreview && !!uploadTmpDoc.uploadState.value\n const isLoading = isPending.value\n\n return (\n tooLarge ||\n missingInput ||\n awaitingApproval ||\n pendingToolParts ||\n termsNotAccepted ||\n uploadingTmpDoc ||\n isLoading\n )\n})\n\nfunction handleSubmit() {\n if (submitDisabled.value) {\n return\n }\n\n emit('submit')\n}\n\nconst chatError = useChatError()\n</script>\n\n<template>\n <div class=\"actionContainer\">\n <UploadSection\n v-if=\"uploadTmpDoc.uploadState.value || isPending\"\n :uploadState=\"uploadTmpDoc.uploadState.value ?? { type: 'loading' }\" />\n <ErrorMessageMessage\n v-if=\"chatError\"\n :error=\"chatError\" />\n <ApprovalSection\n v-if=\"approvalRequiredParts.length\"\n @approve=\"respondToRequestApprovals(true)\"\n @reject=\"respondToRequestApprovals(false)\" />\n <PaymentSection v-if=\"chatError?.code === AgentErrorCodes.LIMIT_REACHED\" />\n <FreeMessagesInfoSection v-if=\"showFreeMessagesInfo\" />\n <form\n class=\"promptForm\"\n @submit.prevent=\"handleSubmit\">\n <label\n class=\"agentLabel\"\n for=\"agentTextarea\">\n Type a Request To get Started\n </label>\n <textarea\n id=\"agentTextarea\"\n ref=\"agentPrompt\"\n v-model=\"state.prompt.value\"\n class=\"prompt custom-scroll\"\n :disabled=\"state.loading.value\"\n name=\"prompt\"\n placeholder=\"Ask me anything…\"\n @keydown=\"handlePromptKeydown\" />\n <div class=\"inputActionsContainer\">\n <div class=\"inputActionsLeft\">\n <template v-if=\"!state.hideAddApi\">\n <SearchPopover v-if=\"!state.isLoggedIn?.value\">\n <button\n class=\"addAPIButton\"\n type=\"button\">\n <ScalarIconPlus\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </SearchPopover>\n <ActionsDropdown\n v-else\n @uploadApi=\"$emit('uploadApi')\">\n <button\n class=\"addAPIButton\"\n type=\"button\">\n <ScalarIconPlus\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </ActionsDropdown>\n </template>\n <div\n v-for=\"document in state.registryDocuments.value\"\n :key=\"document.id\"\n class=\"apiPill\">\n <img\n v-if=\"document.logoUrl\"\n class=\"apiPillLogo\"\n :src=\"document.logoUrl\" />\n {{ document.title }}\n <button\n v-if=\"document.removable\"\n class=\"apiPillRemove\"\n type=\"button\"\n @click=\"state.removeDocument(document)\">\n <ScalarIconX\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </div>\n </div>\n\n <div class=\"inputActionsRight\">\n <template v-if=\"!state.loading.value\">\n <ScalarTooltip content=\"Settings\">\n <ScalarIconButton\n class=\"settingsButton h-7 w-7 p-1.5\"\n :icon=\"ScalarIconLockSimple\"\n label=\"Scalar\"\n size=\"md\"\n weight=\"bold\"\n @click=\"state.settingsModal.show()\" />\n </ScalarTooltip>\n </template>\n <div class=\"sendCheckboxContinue\">\n <div\n v-if=\"!state.terms.accepted.value && state.mode === 'preview'\"\n class=\"relative flex items-center gap-1.5\">\n <input\n id=\"agentTermsAgree\"\n class=\"sr-only\"\n type=\"checkbox\"\n @change=\"acceptTerms\" />\n <label\n class=\"termsAgree\"\n for=\"agentTermsAgree\">\n <ScalarIconCheck\n class=\"termsAgreeIcon\"\n weight=\"bold\" />\n Agree to Terms & Conditions\n </label>\n </div>\n <ScalarIconButton\n v-if=\"!state.loading.value\"\n class=\"sendButton h-7 w-7 p-1.5\"\n :disabled=\"submitDisabled\"\n :icon=\"ScalarIconArrowUp\"\n label=\"Scalar\"\n size=\"md\"\n type=\"submit\"\n weight=\"bold\" />\n <ScalarLoading\n v-else\n class=\"loader h-7 w-7\"\n :loader=\"{\n isLoading: state.loading.value,\n isValid: false,\n clear: async () => {},\n invalidate: async () => {},\n isInvalid: false,\n isActive: false,\n validate: async () => {},\n start: () => {},\n }\"\n size=\"2xl\" />\n </div>\n </div>\n </div>\n </form>\n\n <div\n v-if=\"state.chat.messages.length <= 1 && !state.hideAddApi\"\n class=\"addMoreContext\">\n <span>Load additional APIs</span>\n <div class=\"ml-auto flex items-center gap-1\">\n <button\n v-for=\"doc of state.curatedDocuments.value\"\n :key=\"doc.id\"\n class=\"addAPIContext\"\n type=\"button\"\n @click=\"state.addDocument(doc)\">\n <img\n v-if=\"doc.logoUrl\"\n :alt=\"doc.title\"\n class=\"size-4\"\n :src=\"doc.logoUrl\" />\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.actionContainer {\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: var(--scalar-radius-3xl);\n width: 100%;\n position: relative;\n /* visually hides overflowing text below */\n box-shadow: 0 24px 0 2px var(--scalar-background-1);\n}\n.promptForm {\n width: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n background: var(--scalar-background-1);\n box-shadow:\n var(--scalar-shadow-1),\n 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n border-radius: var(--scalar-radius-3xl);\n}\n\n.inputActionsContainer {\n display: flex;\n justify-content: space-between;\n padding: 0 8px 8px 8px;\n}\n\n.inputActionsLeft {\n display: flex;\n flex-wrap: wrap; /* key: allows pills to go to next line */\n align-items: center;\n gap: 5px; /* spacing between pills */\n}\n\n.inputActionsRight {\n display: flex;\n gap: 5px;\n position: relative;\n}\n\n.apiPill {\n font-size: var(--scalar-font-size-3);\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n color: var(--scalar-color-2);\n font-weight: var(--scalar-semibold);\n height: 28px;\n align-items: center;\n display: flex;\n border-radius: var(--scalar-radius-3xl);\n padding: 0 8px;\n pointer-events: all;\n z-index: 1;\n gap: 4px;\n user-select: none;\n}\n.apiPillLogo {\n width: 15px;\n}\n\n.apiPillRemove {\n width: 24px;\n height: 24px;\n margin-right: -6px;\n border-radius: var(--scalar-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.apiPill:hover .apiPillRemove {\n background: var(--scalar-background-2);\n}\n.dark-mode .apiPill:hover .apiPillRemove {\n background: var(--scalar-background-3);\n}\n\n.apiPillRemove:hover {\n color: var(--scalar-color-1);\n}\n\n.prompt {\n width: 100%;\n outline: none;\n border: none;\n resize: none;\n field-sizing: content;\n min-height: 64px;\n z-index: 1;\n max-height: 250px;\n max-width: 100%;\n overflow-y: auto;\n scrollbar-width: thin;\n word-wrap: break-word;\n font-family: var(--scalar-font);\n font-size: 16px;\n padding: 12px 12px 14px 12px;\n}\n.dark-mode .promptForm {\n background: var(--scalar-background-2);\n}\n\n.prompt:disabled {\n color: var(--scalar-color-3);\n}\n\n.addAPIButton {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n height: 28px;\n width: 28px;\n font-weight: var(--scalar-bold);\n border-radius: var(--scalar-radius-full);\n display: flex;\n align-items: center;\n gap: 4px;\n pointer-events: all;\n z-index: 1;\n box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n}\n.addAPIButton:hover {\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n}\n.dark-mode .addAPIButton:hover {\n background: var(--scalar-background-3);\n}\n\n.settingsButton {\n color: var(--scalar-color-3) !important;\n border-radius: var(--scalar-radius-full) !important;\n margin: 0 !important;\n z-index: 1;\n}\n.settingsButton[aria-disabled='true'] {\n background: var(--scalar-background-2);\n}\n.dark-mode .settingsButton:hover {\n background: var(--scalar-background-3);\n}\n\n.sendButton {\n background: var(--scalar-color-blue) !important;\n border-radius: var(--scalar-radius-full) !important;\n margin: 0 !important;\n z-index: 1;\n border: var(--scalar-border-width) solid var(--scalar-color-blue);\n}\n.sendButton:not([aria-disabled='true']) {\n color: white !important;\n}\n.sendButton:not([aria-disabled='true']):hover {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n transparent 10%\n ) !important;\n}\n.sendButton[aria-disabled='true'] {\n background: var(--scalar-background-2) !important;\n color: var(--scalar-color-3) !important;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n\n.dark-mode .sendButton[aria-disabled='true'] {\n background: var(--scalar-background-3) !important;\n}\n.contextContainer {\n display: flex;\n width: 100%;\n padding: 10px 12px 12px 12px;\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n user-select: none;\n justify-content: space-between;\n}\n\n.settingsButton {\n font-weight: var(--scalar-semibold);\n border-radius: var(--scalar-radius-lg);\n padding: 4px 6px;\n margin: -4px -6px;\n}\n.settingsButton:hover {\n background: var(--scalar-background-2);\n box-shadow: 0 0 var(--scalar-border-width) 0 var(--scalar-border-color);\n cursor: pointer;\n}\n\n.agentLabel {\n font-size: 0px;\n position: absolute;\n width: 100%;\n height: 100%;\n cursor: text;\n}\n.sendCheckboxContinue:has(input) {\n display: flex;\n align-items: center;\n border-radius: var(--scalar-radius-3xl);\n background: var(--scalar-background-2);\n box-shadow: 0 0 0 1.5px var(--scalar-background-2);\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n font-weight: var(--scalar-semibold);\n user-select: none;\n height: 28px;\n}\n.dark-mode .sendCheckboxContinue:has(input) {\n background: var(--scalar-background-3);\n box-shadow: 0 0 0 1.5px var(--scalar-background-3);\n}\n\n.addMoreContext {\n height: 40px;\n display: flex;\n position: relative;\n font-size: var(--scalar-font-size-3);\n color: var(--scalar-color-3);\n padding: 0 8px 0 12px;\n align-items: center;\n}\n.addMoreContext:before {\n content: '';\n width: 8px;\n height: 8px;\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n transform: rotate(45deg);\n left: 18px;\n top: -3px;\n position: absolute;\n box-shadow:\n -0.5px -0.5px 0 var(--scalar-border-color),\n inset 0.5px 0.5px 1px var(--scalar-border-color);\n}\n.dark-mode .addMoreContext:before {\n box-shadow: -0.5px -0.5px 0 var(--scalar-border-color);\n}\n.addAPIContext {\n width: 28px;\n height: 28px;\n border-radius: var(--scalar-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n\n.termsAgree {\n display: flex;\n cursor: pointer;\n height: inherit;\n align-items: center;\n border-radius: var(--scalar-radius-3xl);\n gap: 5px;\n margin: 0px 5px;\n}\n\n.termsAgree:hover {\n color: var(--scalar-color-1);\n}\n\n.termsAgree:hover .termsAgreeIcon {\n background: var(--scalar-color-1);\n color: var(--scalar-background-1);\n}\n\n.termsAgreeIcon {\n width: inherit;\n height: inherit;\n padding: 2px;\n border-radius: var(--scalar-radius-full);\n background: var(--scalar-background-2);\n}\n</style>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"PromptForm.vue.js","names":[],"sources":["../../src/views/PromptForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarIconButton } from '@scalar/components/icon-button'\nimport { ScalarLoading } from '@scalar/components/loading'\nimport { ScalarTooltip } from '@scalar/components/tooltip'\nimport {\n ScalarIconArrowUp,\n ScalarIconCheck,\n ScalarIconLockSimple,\n ScalarIconPlus,\n ScalarIconX,\n} from '@scalar/icons'\nimport { computed, useTemplateRef, watch } from 'vue'\n\nimport ActionsDropdown from '@/components/ActionsDropdown.vue'\nimport ApprovalSection from '@/components/ApprovalSection.vue'\nimport ErrorMessageMessage from '@/components/ErrorMessage.vue'\nimport FreeMessagesInfoSection from '@/components/FreeMessagesInfoSection.vue'\nimport PaymentSection from '@/components/PaymentSection.vue'\nimport SearchPopover from '@/components/SearchPopover.vue'\nimport UploadSection from '@/components/UploadSection.vue'\nimport { AgentErrorCodes } from '@/entities/error/constants'\nimport { MAX_PROMPT_SIZE } from '@/entities/prompt/constants'\nimport { useRequestApprovals } from '@/hooks/use-chat-approvals'\nimport { useChatError } from '@/hooks/use-chat-error'\nimport { useChatPendingClientToolParts } from '@/hooks/use-chat-pending-client-tool-parts'\nimport { useUploadTmpDocument } from '@/hooks/use-upload-tmp-document'\nimport { useState } from '@/state/state'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\ndefineExpose({ focusPrompt })\n\nconst promptRef = useTemplateRef<HTMLTextAreaElement>('agentPrompt')\n\nconst state = useState()\n\nconst inputHasContent = computed(() => state.prompt.value.trim().length > 0)\nconst promptTooLarge = computed(\n () => state.prompt.value.trim().length > MAX_PROMPT_SIZE,\n)\n\n/** Show free messages info only after at least one message has been sent and when no API key is set. */\nconst showFreeMessagesInfo = computed(\n () =>\n state.chat.messages.length > 1 &&\n !state.getAgentKey?.() &&\n chatError?.value?.code !== AgentErrorCodes.LIMIT_REACHED,\n)\n\nwatch(state.prompt, () => {\n if (!promptRef?.value) {\n return\n }\n\n if (!state.prompt.value.length) {\n promptRef.value.style.height = '0px'\n return\n }\n\n promptRef.value.style.height = 'auto'\n promptRef.value.style.height = promptRef.value.scrollHeight + 'px'\n})\n\nfunction handlePromptKeydown(e: KeyboardEvent) {\n // Ignore the Enter that only commits an IME composition (e.g. Japanese, Chinese,\n // Korean). On macOS Chrome that keydown still reports key === 'Enter' with\n // isComposing === true, so without this guard the message sends mid-composition.\n if (e.isComposing) {\n return\n }\n\n if (state.loading.value) {\n return\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmit()\n window.scrollTo(0, document.body.scrollHeight)\n }\n}\n\nfunction focusPrompt() {\n promptRef.value?.focus()\n}\n\nwatch(\n () => state.chat.status,\n (status) => {\n if (status === 'ready' || status === 'error') {\n promptRef.value?.focus()\n }\n },\n)\n\nconst { approvalRequiredParts, respondToRequestApprovals } =\n useRequestApprovals()\n\nconst { pendingClientToolParts } = useChatPendingClientToolParts()\n\nconst uploadTmpDoc = useUploadTmpDocument()\n\nfunction acceptTerms() {\n state.terms.accept()\n\n if (state.mode === 'preview' && state.getActiveDocumentJson) {\n void uploadTmpDoc.uploadTempDocument(state.getActiveDocumentJson(), true)\n }\n}\n\nconst isPending = computed(() =>\n Object.values(state.pendingDocuments).some(Boolean),\n)\n\nconst submitDisabled = computed(() => {\n const tooLarge = promptTooLarge.value\n const missingInput = !inputHasContent.value\n const awaitingApproval = approvalRequiredParts.value.length > 0\n const pendingToolParts = pendingClientToolParts.value.length > 0\n\n const isPreview = state.mode === 'preview'\n\n const termsNotAccepted = isPreview && !state.terms.accepted.value\n const uploadingTmpDoc = isPreview && !!uploadTmpDoc.uploadState.value\n const isLoading = isPending.value\n\n return (\n tooLarge ||\n missingInput ||\n awaitingApproval ||\n pendingToolParts ||\n termsNotAccepted ||\n uploadingTmpDoc ||\n isLoading\n )\n})\n\nfunction handleSubmit() {\n if (submitDisabled.value) {\n return\n }\n\n emit('submit')\n}\n\nconst chatError = useChatError()\n</script>\n\n<template>\n <div class=\"actionContainer\">\n <UploadSection\n v-if=\"uploadTmpDoc.uploadState.value || isPending\"\n :uploadState=\"uploadTmpDoc.uploadState.value ?? { type: 'loading' }\" />\n <ErrorMessageMessage\n v-if=\"chatError\"\n :error=\"chatError\" />\n <ApprovalSection\n v-if=\"approvalRequiredParts.length\"\n @approve=\"respondToRequestApprovals(true)\"\n @reject=\"respondToRequestApprovals(false)\" />\n <PaymentSection v-if=\"chatError?.code === AgentErrorCodes.LIMIT_REACHED\" />\n <FreeMessagesInfoSection v-if=\"showFreeMessagesInfo\" />\n <form\n class=\"promptForm\"\n @submit.prevent=\"handleSubmit\">\n <label\n class=\"agentLabel\"\n for=\"agentTextarea\">\n Type a Request To get Started\n </label>\n <textarea\n id=\"agentTextarea\"\n ref=\"agentPrompt\"\n v-model=\"state.prompt.value\"\n class=\"prompt custom-scroll\"\n :disabled=\"state.loading.value\"\n name=\"prompt\"\n placeholder=\"Ask me anything…\"\n @keydown=\"handlePromptKeydown\" />\n <div class=\"inputActionsContainer\">\n <div class=\"inputActionsLeft\">\n <template v-if=\"!state.hideAddApi\">\n <SearchPopover v-if=\"!state.isLoggedIn?.value\">\n <button\n class=\"addAPIButton\"\n type=\"button\">\n <ScalarIconPlus\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </SearchPopover>\n <ActionsDropdown\n v-else\n @uploadApi=\"$emit('uploadApi')\">\n <button\n class=\"addAPIButton\"\n type=\"button\">\n <ScalarIconPlus\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </ActionsDropdown>\n </template>\n <div\n v-for=\"document in state.registryDocuments.value\"\n :key=\"document.id\"\n class=\"apiPill\">\n <img\n v-if=\"document.logoUrl\"\n class=\"apiPillLogo\"\n :src=\"document.logoUrl\" />\n {{ document.title }}\n <button\n v-if=\"document.removable\"\n class=\"apiPillRemove\"\n type=\"button\"\n @click=\"state.removeDocument(document)\">\n <ScalarIconX\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </div>\n </div>\n\n <div class=\"inputActionsRight\">\n <template v-if=\"!state.loading.value\">\n <ScalarTooltip content=\"Settings\">\n <ScalarIconButton\n class=\"settingsButton h-7 w-7 p-1.5\"\n :icon=\"ScalarIconLockSimple\"\n label=\"Scalar\"\n size=\"md\"\n weight=\"bold\"\n @click=\"state.settingsModal.show()\" />\n </ScalarTooltip>\n </template>\n <div class=\"sendCheckboxContinue\">\n <div\n v-if=\"!state.terms.accepted.value && state.mode === 'preview'\"\n class=\"relative flex items-center gap-1.5\">\n <input\n id=\"agentTermsAgree\"\n class=\"sr-only\"\n type=\"checkbox\"\n @change=\"acceptTerms\" />\n <label\n class=\"termsAgree\"\n for=\"agentTermsAgree\">\n <ScalarIconCheck\n class=\"termsAgreeIcon\"\n weight=\"bold\" />\n Agree to Terms & Conditions\n </label>\n </div>\n <ScalarIconButton\n v-if=\"!state.loading.value\"\n class=\"sendButton h-7 w-7 p-1.5\"\n :disabled=\"submitDisabled\"\n :icon=\"ScalarIconArrowUp\"\n label=\"Scalar\"\n size=\"md\"\n type=\"submit\"\n weight=\"bold\" />\n <ScalarLoading\n v-else\n class=\"loader h-7 w-7\"\n :loader=\"{\n isLoading: state.loading.value,\n isValid: false,\n clear: async () => {},\n invalidate: async () => {},\n isInvalid: false,\n isActive: false,\n validate: async () => {},\n start: () => {},\n }\"\n size=\"2xl\" />\n </div>\n </div>\n </div>\n </form>\n\n <div\n v-if=\"state.chat.messages.length <= 1 && !state.hideAddApi\"\n class=\"addMoreContext\">\n <span>Load additional APIs</span>\n <div class=\"ml-auto flex items-center gap-1\">\n <button\n v-for=\"doc of state.curatedDocuments.value\"\n :key=\"doc.id\"\n class=\"addAPIContext\"\n type=\"button\"\n @click=\"state.addDocument(doc)\">\n <img\n v-if=\"doc.logoUrl\"\n :alt=\"doc.title\"\n class=\"size-4\"\n :src=\"doc.logoUrl\" />\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.actionContainer {\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: var(--scalar-radius-3xl);\n width: 100%;\n position: relative;\n /* visually hides overflowing text below */\n box-shadow: 0 24px 0 2px var(--scalar-background-1);\n}\n.promptForm {\n width: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n background: var(--scalar-background-1);\n box-shadow:\n var(--scalar-shadow-1),\n 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n border-radius: var(--scalar-radius-3xl);\n}\n\n.inputActionsContainer {\n display: flex;\n justify-content: space-between;\n padding: 0 8px 8px 8px;\n}\n\n.inputActionsLeft {\n display: flex;\n flex-wrap: wrap; /* key: allows pills to go to next line */\n align-items: center;\n gap: 5px; /* spacing between pills */\n}\n\n.inputActionsRight {\n display: flex;\n gap: 5px;\n position: relative;\n}\n\n.apiPill {\n font-size: var(--scalar-font-size-3);\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n color: var(--scalar-color-2);\n font-weight: var(--scalar-semibold);\n height: 28px;\n align-items: center;\n display: flex;\n border-radius: var(--scalar-radius-3xl);\n padding: 0 8px;\n pointer-events: all;\n z-index: 1;\n gap: 4px;\n user-select: none;\n}\n.apiPillLogo {\n width: 15px;\n}\n\n.apiPillRemove {\n width: 24px;\n height: 24px;\n margin-right: -6px;\n border-radius: var(--scalar-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.apiPill:hover .apiPillRemove {\n background: var(--scalar-background-2);\n}\n.dark-mode .apiPill:hover .apiPillRemove {\n background: var(--scalar-background-3);\n}\n\n.apiPillRemove:hover {\n color: var(--scalar-color-1);\n}\n\n.prompt {\n width: 100%;\n outline: none;\n border: none;\n resize: none;\n field-sizing: content;\n min-height: 64px;\n z-index: 1;\n max-height: 250px;\n max-width: 100%;\n overflow-y: auto;\n scrollbar-width: thin;\n word-wrap: break-word;\n font-family: var(--scalar-font);\n font-size: 16px;\n padding: 12px 12px 14px 12px;\n}\n.dark-mode .promptForm {\n background: var(--scalar-background-2);\n}\n\n.prompt:disabled {\n color: var(--scalar-color-3);\n}\n\n.addAPIButton {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n height: 28px;\n width: 28px;\n font-weight: var(--scalar-bold);\n border-radius: var(--scalar-radius-full);\n display: flex;\n align-items: center;\n gap: 4px;\n pointer-events: all;\n z-index: 1;\n box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n}\n.addAPIButton:hover {\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n}\n.dark-mode .addAPIButton:hover {\n background: var(--scalar-background-3);\n}\n\n.settingsButton {\n color: var(--scalar-color-3) !important;\n border-radius: var(--scalar-radius-full) !important;\n margin: 0 !important;\n z-index: 1;\n}\n.settingsButton[aria-disabled='true'] {\n background: var(--scalar-background-2);\n}\n.dark-mode .settingsButton:hover {\n background: var(--scalar-background-3);\n}\n\n.sendButton {\n background: var(--scalar-color-blue) !important;\n border-radius: var(--scalar-radius-full) !important;\n margin: 0 !important;\n z-index: 1;\n border: var(--scalar-border-width) solid var(--scalar-color-blue);\n}\n.sendButton:not([aria-disabled='true']) {\n color: white !important;\n}\n.sendButton:not([aria-disabled='true']):hover {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n transparent 10%\n ) !important;\n}\n.sendButton[aria-disabled='true'] {\n background: var(--scalar-background-2) !important;\n color: var(--scalar-color-3) !important;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n\n.dark-mode .sendButton[aria-disabled='true'] {\n background: var(--scalar-background-3) !important;\n}\n.contextContainer {\n display: flex;\n width: 100%;\n padding: 10px 12px 12px 12px;\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n user-select: none;\n justify-content: space-between;\n}\n\n.settingsButton {\n font-weight: var(--scalar-semibold);\n border-radius: var(--scalar-radius-lg);\n padding: 4px 6px;\n margin: -4px -6px;\n}\n.settingsButton:hover {\n background: var(--scalar-background-2);\n box-shadow: 0 0 var(--scalar-border-width) 0 var(--scalar-border-color);\n cursor: pointer;\n}\n\n.agentLabel {\n font-size: 0px;\n position: absolute;\n width: 100%;\n height: 100%;\n cursor: text;\n}\n.sendCheckboxContinue:has(input) {\n display: flex;\n align-items: center;\n border-radius: var(--scalar-radius-3xl);\n background: var(--scalar-background-2);\n box-shadow: 0 0 0 1.5px var(--scalar-background-2);\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n font-weight: var(--scalar-semibold);\n user-select: none;\n height: 28px;\n}\n.dark-mode .sendCheckboxContinue:has(input) {\n background: var(--scalar-background-3);\n box-shadow: 0 0 0 1.5px var(--scalar-background-3);\n}\n\n.addMoreContext {\n height: 40px;\n display: flex;\n position: relative;\n font-size: var(--scalar-font-size-3);\n color: var(--scalar-color-3);\n padding: 0 8px 0 12px;\n align-items: center;\n}\n.addMoreContext:before {\n content: '';\n width: 8px;\n height: 8px;\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n transform: rotate(45deg);\n left: 18px;\n top: -3px;\n position: absolute;\n box-shadow:\n -0.5px -0.5px 0 var(--scalar-border-color),\n inset 0.5px 0.5px 1px var(--scalar-border-color);\n}\n.dark-mode .addMoreContext:before {\n box-shadow: -0.5px -0.5px 0 var(--scalar-border-color);\n}\n.addAPIContext {\n width: 28px;\n height: 28px;\n border-radius: var(--scalar-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n\n.termsAgree {\n display: flex;\n cursor: pointer;\n height: inherit;\n align-items: center;\n border-radius: var(--scalar-radius-3xl);\n gap: 5px;\n margin: 0px 5px;\n}\n\n.termsAgree:hover {\n color: var(--scalar-color-1);\n}\n\n.termsAgree:hover .termsAgreeIcon {\n background: var(--scalar-color-1);\n color: var(--scalar-background-1);\n}\n\n.termsAgreeIcon {\n width: inherit;\n height: inherit;\n padding: 2px;\n border-radius: var(--scalar-radius-full);\n background: var(--scalar-background-2);\n}\n</style>\n"],"mappings":""}
|