generated from nhcarrigan/template
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6999bae5cf |
+1
-1
@@ -23,7 +23,7 @@
|
|||||||
"@tauri-apps/cli": "2.5.0",
|
"@tauri-apps/cli": "2.5.0",
|
||||||
"@types/react": "19.1.2",
|
"@types/react": "19.1.2",
|
||||||
"@types/react-dom": "19.1.2",
|
"@types/react-dom": "19.1.2",
|
||||||
"autoprefixer": "10.4.21",
|
"autoprefixer": "10.4.27",
|
||||||
"eslint": "9.25.1",
|
"eslint": "9.25.1",
|
||||||
"postcss": "8.5.3",
|
"postcss": "8.5.3",
|
||||||
"tailwindcss": "3.4.17",
|
"tailwindcss": "3.4.17",
|
||||||
|
|||||||
Generated
+9
-16
@@ -43,8 +43,8 @@ importers:
|
|||||||
specifier: 4.4.1
|
specifier: 4.4.1
|
||||||
version: 4.4.1(vite@6.3.2(jiti@1.21.7)(yaml@2.8.3))
|
version: 4.4.1(vite@6.3.2(jiti@1.21.7)(yaml@2.8.3))
|
||||||
autoprefixer:
|
autoprefixer:
|
||||||
specifier: 10.4.21
|
specifier: 10.4.27
|
||||||
version: 10.4.21(postcss@8.5.3)
|
version: 10.4.27(postcss@8.5.3)
|
||||||
eslint:
|
eslint:
|
||||||
specifier: 9.25.1
|
specifier: 9.25.1
|
||||||
version: 9.25.1(jiti@1.21.7)
|
version: 9.25.1(jiti@1.21.7)
|
||||||
@@ -935,8 +935,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
|
resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
autoprefixer@10.4.21:
|
autoprefixer@10.4.27:
|
||||||
resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==}
|
resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==}
|
||||||
engines: {node: ^10 || ^12 || >=14}
|
engines: {node: ^10 || ^12 || >=14}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -1364,8 +1364,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
|
resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
fraction.js@4.3.7:
|
fraction.js@5.3.4:
|
||||||
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
|
resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
|
||||||
|
|
||||||
fsevents@2.3.2:
|
fsevents@2.3.2:
|
||||||
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
|
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
|
||||||
@@ -1755,10 +1755,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
|
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
normalize-range@0.1.2:
|
|
||||||
resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
|
|
||||||
engines: {node: '>=0.10.0'}
|
|
||||||
|
|
||||||
object-assign@4.1.1:
|
object-assign@4.1.1:
|
||||||
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
|
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
@@ -3283,12 +3279,11 @@ snapshots:
|
|||||||
|
|
||||||
async-function@1.0.0: {}
|
async-function@1.0.0: {}
|
||||||
|
|
||||||
autoprefixer@10.4.21(postcss@8.5.3):
|
autoprefixer@10.4.27(postcss@8.5.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
browserslist: 4.28.2
|
browserslist: 4.28.2
|
||||||
caniuse-lite: 1.0.30001787
|
caniuse-lite: 1.0.30001787
|
||||||
fraction.js: 4.3.7
|
fraction.js: 5.3.4
|
||||||
normalize-range: 0.1.2
|
|
||||||
picocolors: 1.1.1
|
picocolors: 1.1.1
|
||||||
postcss: 8.5.3
|
postcss: 8.5.3
|
||||||
postcss-value-parser: 4.2.0
|
postcss-value-parser: 4.2.0
|
||||||
@@ -3877,7 +3872,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-callable: 1.2.7
|
is-callable: 1.2.7
|
||||||
|
|
||||||
fraction.js@4.3.7: {}
|
fraction.js@5.3.4: {}
|
||||||
|
|
||||||
fsevents@2.3.2:
|
fsevents@2.3.2:
|
||||||
optional: true
|
optional: true
|
||||||
@@ -4257,8 +4252,6 @@ snapshots:
|
|||||||
|
|
||||||
normalize-path@3.0.0: {}
|
normalize-path@3.0.0: {}
|
||||||
|
|
||||||
normalize-range@0.1.2: {}
|
|
||||||
|
|
||||||
object-assign@4.1.1: {}
|
object-assign@4.1.1: {}
|
||||||
|
|
||||||
object-hash@3.0.0: {}
|
object-hash@3.0.0: {}
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 364 KiB After Width: | Height: | Size: 155 KiB |
+8
-12
@@ -83,26 +83,22 @@ fn build_user_gemini_parts(
|
|||||||
user_image_base64: &Option<String>,
|
user_image_base64: &Option<String>,
|
||||||
user_image_mime: &Option<String>,
|
user_image_mime: &Option<String>,
|
||||||
) -> Vec<Value> {
|
) -> Vec<Value> {
|
||||||
if let Some(image_data) = user_image_base64.as_deref() {
|
if mode == "replace" && user_image_base64.is_some() {
|
||||||
let mime = user_image_mime.as_deref().unwrap_or("image/png");
|
let mime = user_image_mime.as_deref().unwrap_or("image/png");
|
||||||
|
let data = user_image_base64.as_deref().unwrap_or("");
|
||||||
let base_text = user_text.as_deref().unwrap_or("");
|
let base_text = user_text.as_deref().unwrap_or("");
|
||||||
let final_text = if mode == "replace" {
|
let final_text = if base_text.is_empty() {
|
||||||
if base_text.is_empty() {
|
|
||||||
REPLACE_MODE_APPEND.to_string()
|
REPLACE_MODE_APPEND.to_string()
|
||||||
} else {
|
} else {
|
||||||
format!("{}\n{}", base_text, REPLACE_MODE_APPEND)
|
format!("{}\n{}", base_text, REPLACE_MODE_APPEND)
|
||||||
}
|
|
||||||
} else {
|
|
||||||
base_text.to_string()
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut parts = vec![json!({"inlineData": {"mimeType": mime, "data": image_data}})];
|
vec![
|
||||||
if !final_text.is_empty() {
|
json!({"inlineData": {"mimeType": mime, "data": data}}),
|
||||||
parts.push(json!({"text": final_text}));
|
json!({"text": final_text}),
|
||||||
}
|
]
|
||||||
parts
|
|
||||||
} else {
|
} else {
|
||||||
// No image: text-only message
|
// Art/avatar mode, or replace mode follow-up correction (text only)
|
||||||
let text = user_text.as_deref().unwrap_or("");
|
let text = user_text.as_deref().unwrap_or("");
|
||||||
vec![json!({"text": text})]
|
vec![json!({"text": text})]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -256,8 +256,7 @@ const inputArea = ({
|
|||||||
if (isInitialReplace && imageBase64 === undefined) {
|
if (isInitialReplace && imageBase64 === undefined) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const hasContent = text.trim().length > 0 || imageBase64 !== undefined;
|
if (!isInitialReplace && text.trim().length === 0) {
|
||||||
if (!isInitialReplace && !hasContent) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,9 +332,6 @@ const inputArea = ({
|
|||||||
: dropZoneInactiveClass,
|
: dropZoneInactiveClass,
|
||||||
].join(" ");
|
].join(" ");
|
||||||
|
|
||||||
const hasNoContent = text.trim().length === 0 && imageBase64 === undefined;
|
|
||||||
const isSendDisabled = isLoading || hasNoContent;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="border-t border-purple-900/30 p-4 bg-[#0f0a1a]">
|
<div className="border-t border-purple-900/30 p-4 bg-[#0f0a1a]">
|
||||||
<div className="flex items-center gap-2 mb-2">
|
<div className="flex items-center gap-2 mb-2">
|
||||||
@@ -401,15 +397,6 @@ const inputArea = ({
|
|||||||
type="file"
|
type="file"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<textarea
|
|
||||||
className={textareaClass}
|
|
||||||
disabled={isLoading}
|
|
||||||
onChange={handleTextChange}
|
|
||||||
placeholder="Add notes to include with the image (optional)..."
|
|
||||||
rows={2}
|
|
||||||
value={text}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<button
|
<button
|
||||||
className={replaceButtonClass}
|
className={replaceButtonClass}
|
||||||
disabled={isLoading || imageBase64 === undefined}
|
disabled={isLoading || imageBase64 === undefined}
|
||||||
@@ -427,16 +414,15 @@ const inputArea = ({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
: <div className="flex flex-col gap-3">
|
: <div className="flex flex-col gap-3">
|
||||||
<div className="flex flex-col gap-2">
|
{mode === "replace"
|
||||||
|
? <div className="flex flex-col gap-2">
|
||||||
{imagePreview === undefined
|
{imagePreview === undefined
|
||||||
? <button
|
? <button
|
||||||
className={pasteButtonClass}
|
className={pasteButtonClass}
|
||||||
onClick={handlePasteButtonClick}
|
onClick={handlePasteButtonClick}
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
{mode === "replace"
|
{"๐ Paste replacement image (optional)"}
|
||||||
? "๐ Paste replacement image (optional)"
|
|
||||||
: "๐ Paste image (optional)"}
|
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
: <div className="relative inline-block">
|
: <div className="relative inline-block">
|
||||||
@@ -462,6 +448,8 @@ const inputArea = ({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
: null}
|
||||||
|
|
||||||
<div className="flex gap-3 items-end">
|
<div className="flex gap-3 items-end">
|
||||||
<textarea
|
<textarea
|
||||||
className={textareaClass}
|
className={textareaClass}
|
||||||
@@ -476,7 +464,7 @@ const inputArea = ({
|
|||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
className={sendButtonClass}
|
className={sendButtonClass}
|
||||||
disabled={isSendDisabled}
|
disabled={isLoading || text.trim().length === 0}
|
||||||
onClick={handleSend}
|
onClick={handleSend}
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in New Issue
Block a user