- swipes library
- CSS for mobile,
- swipe left/right on last msg to regenerate
This commit is contained in:
RossAsscends
2023-03-15 23:27:00 +09:00
parent 5f2882e33f
commit 9483ec464a
7 changed files with 297 additions and 33 deletions

View File

@@ -22,6 +22,7 @@
<script src="scripts/showdown.min.js"></script> <script src="scripts/showdown.min.js"></script>
<script src="scripts/popper.js"></script> <script src="scripts/popper.js"></script>
<script type="module" src="scripts/RossAscends-mods.js"></script> <script type="module" src="scripts/RossAscends-mods.js"></script>
<script type="module" src="scripts/swiped-events.js"></script>
<link rel="stylesheet" type="text/css" href="style.css"> <link rel="stylesheet" type="text/css" href="style.css">
<link rel="stylesheet" href="css/bg_load.css"> <link rel="stylesheet" href="css/bg_load.css">
<link rel="icon" type="image/x-icon" href="favicon.ico"> <link rel="icon" type="image/x-icon" href="favicon.ico">
@@ -102,7 +103,7 @@
<div id="talkativeness_div"> <div id="talkativeness_div">
<h4>Talkativeness</h4> <h4>Talkativeness</h4>
<h5>How often does the character speak randomly.&nbsp;<span class="warning">Affects group chats only!</span> <h5>How often the chracter speaks in &nbsp;<span class="warning">group chats!</span>
</h5> </h5>
<input id="talkativeness_slider" name="talkativeness" type="range" min="0" max="1" step="0.05" value="0.5" <input id="talkativeness_slider" name="talkativeness" type="range" min="0" max="1" step="0.05" value="0.5"
form="form_create"> form="form_create">

View File

@@ -16,7 +16,8 @@ export {
api_server, api_server,
api_key_novel, api_key_novel,
getCharacters, getCharacters,
is_send_press is_send_press,
chat
} }
// API OBJECT FOR EXTERNAL WIRING // API OBJECT FOR EXTERNAL WIRING
@@ -825,19 +826,23 @@ window['TavernAI'] = {};
typeWriter($("#chat").children().filter('[mesid="' + count_view_mes + '"]').children('.mes_block').children('.mes_text'), messageText, 50, 0); typeWriter($("#chat").children().filter('[mesid="' + count_view_mes + '"]').children('.mes_block').children('.mes_text'), messageText, 50, 0);
} }
count_view_mes++; count_view_mes++;
//console.log('add mes without animation = '+add_mes_without_animation);
//console.log(!add_mes_without_animation);
if (!add_mes_without_animation) { if (!add_mes_without_animation) {
$('#chat').children().last().css("opacity", 1.0); console.log('adding mes with animation')
$('#chat').children().last().transition({ //$('#chat').children().last().css('transition','all 2s ease-in-out');
opacity: 1.0, $('#chat').children().last().css("opacity", "1");
duration: 700, //$('#chat').children().last().css('transition','all 2s ease-in-out');
easing: "",
complete: function () { }
}); }else {
} else { console.log('add mes with animation was false, and is set to false again')
add_mes_without_animation = false; add_mes_without_animation = false;
} }
var $textchat = $('#chat'); var $textchat = $('#chat');
$textchat.scrollTop($textchat[0].scrollHeight); //$('#chat').children().last().css("opacity", "1");
$textchat.scrollTop(($textchat[0].scrollHeight));
} }
function typeWriter(target, text, speed, i) { function typeWriter(target, text, speed, i) {
if (i < text.length) { if (i < text.length) {
@@ -1003,11 +1008,14 @@ window['TavernAI'] = {};
if (chat[chat.length - 1]['is_user']) {//If last message from You if (chat[chat.length - 1]['is_user']) {//If last message from You
} else { } else {
//console.log('about to remove last msg')
chat.length = chat.length - 1; chat.length = chat.length - 1;
count_view_mes -= 1; count_view_mes -= 1;
//console.log('removing last msg') //$('#chat').children().last().css({'transition':'all 0.5s ease-in-out'});
$('#chat').children().last().remove(); //$('#chat').children().last().css({'transform':'translateX(100vh) scale(0.1,0.1)'});
//$('#chat').children().last().css({'opacity':'0'});
setTimeout(function(){
$('#chat').children().last().remove();
},1000);
} }
} }

View File

@@ -15,7 +15,8 @@ import {
api_server, api_server,
api_key_novel, api_key_novel,
getCharacters, getCharacters,
is_send_press is_send_press,
chat
} from "../script.js"; } from "../script.js";
var NavToggle = document.getElementById("nav-toggle"); var NavToggle = document.getElementById("nav-toggle");
@@ -339,6 +340,37 @@ $("document").ready(function () {
(this.scrollHeight) + 'px'; (this.scrollHeight) + 'px';
}); });
//Regenerate if user swipes on the last mesage in chat
//TODO:
//1. Make it detect if the last message is from user, and ignore swipes then...
//2. find a way to make the chat slide down smoothly when the last mes div gets .remove()-d
document.addEventListener('swiped-left', function(e) {
var SwipeTargetMesClassParent = e.target.closest('.mes');
if (is_send_press == false){
if (SwipeTargetMesClassParent !== null && SwipeTargetMesClassParent.nextSibling == null ){
$('#chat').children().last().css({'transition':'all 0.5s ease-in-out'});
$('#chat').children().last().css({'transform':'translateX(-100vw) scale(0,0)','overflow':'hidden'});
$('#chat').children().last().css({'opacity':'0'});
Generate('regenerate');
}
}
});
document.addEventListener('swiped-right', function(e) {
var SwipeTargetMesClassParent = e.target.closest('.mes');
console.log(is_send_press);
if (is_send_press === false){
if (SwipeTargetMesClassParent !== null && SwipeTargetMesClassParent.nextSibling == null){
$('#chat').children().last().css({'transition':'all 0.5s ease-in-out'});
$('#chat').children().last().css({'transform':'translateX(100vh) scale(0,0)','overflow':'hidden'});
$('#chat').children().last().css({'opacity':'0'});
Generate('regenerate');
console.log(is_send_press);
}
}
});
//Additional hotkeys CTRL+ENTER and CTRL+UPARROW //Additional hotkeys CTRL+ENTER and CTRL+UPARROW
document.addEventListener("keydown", (event) => { document.addEventListener("keydown", (event) => {
if (event.ctrlKey && event.key == "Enter") { if (event.ctrlKey && event.key == "Enter") {

View File

@@ -0,0 +1,165 @@
/*!
* swiped-events.js - v@version@
* Pure JavaScript swipe events
* https://github.com/john-doherty/swiped-events
* @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element
* @author John Doherty <www.johndoherty.info>
* @license MIT
*/
(function (window, document) {
'use strict';
// patch CustomEvent to allow constructor creation (IE/Chrome)
if (typeof window.CustomEvent !== 'function') {
window.CustomEvent = function (event, params) {
params = params || { bubbles: false, cancelable: false, detail: undefined };
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
return evt;
};
window.CustomEvent.prototype = window.Event.prototype;
}
document.addEventListener('touchstart', handleTouchStart, false);
document.addEventListener('touchmove', handleTouchMove, false);
document.addEventListener('touchend', handleTouchEnd, false);
var xDown = null;
var yDown = null;
var xDiff = null;
var yDiff = null;
var timeDown = null;
var startEl = null;
/**
* Fires swiped event if swipe detected on touchend
* @param {object} e - browser event object
* @returns {void}
*/
function handleTouchEnd(e) {
// if the user released on a different target, cancel!
if (startEl !== e.target) return;
var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20 units
var swipeUnit = getNearestAttribute(startEl, 'data-swipe-unit', 'px'); // default px
var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10); // default 500ms
var timeDiff = Date.now() - timeDown;
var eventType = '';
var changedTouches = e.changedTouches || e.touches || [];
if (swipeUnit === 'vh') {
swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientHeight); // get percentage of viewport height in pixels
}
if (swipeUnit === 'vw') {
swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientWidth); // get percentage of viewport height in pixels
}
if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant
if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {
if (xDiff > 0) {
eventType = 'swiped-left';
}
else {
eventType = 'swiped-right';
}
}
}
else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {
if (yDiff > 0) {
eventType = 'swiped-up';
}
else {
eventType = 'swiped-down';
}
}
if (eventType !== '') {
var eventData = {
dir: eventType.replace(/swiped-/, ''),
touchType: (changedTouches[0] || {}).touchType || 'direct',
xStart: parseInt(xDown, 10),
xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),
yStart: parseInt(yDown, 10),
yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)
};
// fire `swiped` event event on the element that started the swipe
startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));
// fire `swiped-dir` event on the element that started the swipe
startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));
}
// reset values
xDown = null;
yDown = null;
timeDown = null;
}
/**
* Records current location on touchstart event
* @param {object} e - browser event object
* @returns {void}
*/
function handleTouchStart(e) {
// if the element has data-swipe-ignore="true" we stop listening for swipe events
if (e.target.getAttribute('data-swipe-ignore') === 'true') return;
startEl = e.target;
timeDown = Date.now();
xDown = e.touches[0].clientX;
yDown = e.touches[0].clientY;
xDiff = 0;
yDiff = 0;
}
/**
* Records location diff in px on touchmove event
* @param {object} e - browser event object
* @returns {void}
*/
function handleTouchMove(e) {
if (!xDown || !yDown) return;
var xUp = e.touches[0].clientX;
var yUp = e.touches[0].clientY;
xDiff = xDown - xUp;
yDiff = yDown - yUp;
}
/**
* Gets attribute off HTML element or nearest parent
* @param {object} el - HTML element to retrieve attribute from
* @param {string} attributeName - name of the attribute
* @param {any} defaultValue - default value to return if no match found
* @returns {any} attribute value or defaultValue
*/
function getNearestAttribute(el, attributeName, defaultValue) {
// walk up the dom tree looking for attributeName
while (el && el !== document.documentElement) {
var attributeValue = el.getAttribute(attributeName);
if (attributeValue) {
return attributeValue;
}
el = el.parentNode;
}
return defaultValue;
}
}(window, document));

View File

@@ -1 +1 @@
{"username":"You","api_server":"http://localhost:5000/api","api_server_textgenerationwebui":"http://127.0.0.1:7860","preset_settings":"gui","preset_settings_novel":"Classic-Euterpe","user_avatar":"legat.png","temp":0.43,"amount_gen":90,"max_context":2048,"anchor_order":0,"style_anchor":false,"character_anchor":true,"auto_connect":false,"auto_load_chat":false,"main_api":"kobold","api_key_novel":"","rep_pen":1.17,"rep_pen_size":1024,"model_novel":"euterpe-v2","temp_novel":1.11,"rep_pen_novel":1.11,"rep_pen_size_novel":320,"world_info":null,"world_info_depth":2,"world_info_budget":200,"active_character":"0","textgenerationwebui_settings":{"temp":0.5,"top_p":0.9,"top_k":0,"typical_p":1,"rep_pen":1.1,"rep_pen_size":0,"penalty_alpha":0}} {"username":"You","api_server":"http://localhost:5000/api","api_server_textgenerationwebui":"","preset_settings":"gui","preset_settings_novel":"Classic-Euterpe","user_avatar":"legat.png","temp":0.43,"amount_gen":180,"max_context":2048,"anchor_order":0,"style_anchor":false,"character_anchor":false,"auto_connect":true,"auto_load_chat":true,"main_api":"kobold","api_key_novel":"","rep_pen":1.17,"rep_pen_size":1024,"model_novel":"euterpe-v2","temp_novel":1.11,"rep_pen_novel":1.11,"rep_pen_size_novel":320,"world_info":null,"world_info_depth":2,"world_info_budget":200,"active_character":"0","textgenerationwebui_settings":{"temp":0.5,"top_p":0.9,"top_k":0,"typical_p":1,"rep_pen":1.1,"rep_pen_size":0,"penalty_alpha":0}}

View File

@@ -32,8 +32,11 @@
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
-moz-appearance: initial; -moz-appearance: initial;
scrolling-behaviour: smooth;
} }
html { scroll-behaviour: smooth;}
body { body {
margin: 0; margin: 0;
padding: 0; padding: 0;
@@ -45,18 +48,11 @@ body {
background-size: cover; background-size: cover;
font-family: "Noto Sans", "Noto Color Emoji", sans-serif; font-family: "Noto Sans", "Noto Color Emoji", sans-serif;
font-size: 15px; font-size: 15px;
/*1rem*/
color: var(--ivory); color: var(--ivory);
} }
@media screen and (max-width: 450px) {
body {
margin-left: auto;
margin-right: auto;
overflow-x: hidden;
}
}
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 0.6em; width: 0.6em;
@@ -191,6 +187,7 @@ code {
-webkit-backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);
text-shadow: #000 0 0 3px; text-shadow: #000 0 0 3px;
scrollbar-width: thin; scrollbar-width: thin;
transition: all 1s ease-in-out;
} }
@@ -811,7 +808,7 @@ input[type=search]:focus::-webkit-search-cancel-button {
margin-top: 0; margin-top: 0;
margin-left: 2px; margin-left: 2px;
cursor: pointer; cursor: pointer;
position: absolute; position: fixed;
z-index: 2050; z-index: 2050;
-webkit-user-select: none; -webkit-user-select: none;
-webkit-touch-callout: none; -webkit-touch-callout: none;
@@ -1055,7 +1052,7 @@ input[type=search]:focus::-webkit-search-cancel-button {
margin-top: 36vh; margin-top: 36vh;
box-shadow: 0 0 5px 5px var(--fullred); box-shadow: 0 0 5px 5px var(--fullred);
padding: 4px; padding: 4px;
background-color: var(--black30a); background-color: var(--black70a);
border-radius: 10px; border-radius: 10px;
} }
@@ -1788,6 +1785,7 @@ input[type="range"] {
#character_popup { #character_popup {
display: none; display: none;
position:fixed;
background-color: var(--black30a); background-color: var(--black30a);
backdrop-filter: blur(50px); backdrop-filter: blur(50px);
-webkit-backdrop-filter: blur(30px); -webkit-backdrop-filter: blur(30px);
@@ -1796,7 +1794,7 @@ input[type="range"] {
max-width: 800px; max-width: 800px;
height: calc(100vh - 50px); height: calc(100vh - 50px);
position: absolute; position: absolute;
z-index: 2065; z-index: 3002;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
left: 0; left: 0;
@@ -2429,14 +2427,11 @@ a {
} }
@media screen and (max-width: 450px) { @media screen and (max-width: 450px) {
#right-nav-panel {
width: 100%;
box-shadow: none;
}
} }
#nav-toggle { #nav-toggle {
position: absolute; position: fixed;
right: 13px; right: 13px;
top: 12px; top: 12px;
padding: 0; padding: 0;
@@ -2496,8 +2491,70 @@ a {
display: none; display: none;
} }
@media screen and (max-width: 450px) { /*styles for mobile phones (tested on iPhone 13 Pro)*/
body {
font-size: 18px;
}
#bg1, #bg2 {position:fixed;}
#sheld { /*margin around the sides, and a larger one on bottom to avoid iOS Home bar*/
height: calc(100svh - 15px);
margin-left: 5px;
margin-right: 5px;
position: fixed;
}
#send_textarea { /*larger input bar for mobile screens, easier to tap*/
font-size: 1.25rem;
line-height: 1.5rem;
min-height: calc(2rem + 0.75rem + 2px);
max-height: 35vh;
word-wrap: break-word;
height: 40px;
resize: vertical;
display: block;
background-color: rgba(255, 0, 0, 0);
border: 0;
box-shadow: none;
padding: 6px 0 6px 0;
font-family: "Noto Sans", "Noto Color Emoji", sans-serif;
margin: 0;
text-shadow: #000 0 0 3px;
}
#rm_ch_create_block textarea { /*without this the text areas display far too large*/
max-height: 300px;
}
#right-nav-panel, #character_popup { /* character_popup display needs work, "width:100%" items push outside the box */
width: 100%;
box-shadow: none;
}
#character_popup {
margin-top:0;
height:100dvh;
padding-left:15px;
padding-right: 15px;
width: 100vw;
position: fixed;
}
#talkativeness_hint span {
min-width: 33%;
}
/*for debug purposes*/
/** {border: 1px solid purple;}*/
}
@media (max-width: 768px) { @media (max-width: 768px) {
.mes img.img_extra { .mes img.img_extra {
max-width: 100%; max-width: 100%;
} }
}
@media all and (display-mode: browser) { /*Even in iOS WebApp mode the window detects as this; unhelpful.*/
* {
}
} }

View File

@@ -9,7 +9,7 @@
* World Info * World Info
* OobaBooga's TextGen WebUI API connection * OobaBooga's TextGen WebUI API connection
* Soft prompts * Soft prompts
* installing SillyLossy's TAI-extras will give support for * installing [SillyLossy's TAI-extras](https://github.com/SillyLossy/TavernAI-extras) will give support for
* Character emotional expressions * Character emotional expressions
* Auto-Summary of the chat history * Auto-Summary of the chat history
* sending images to chat, and the AI interpreting the content. * sending images to chat, and the AI interpreting the content.
@@ -70,6 +70,7 @@ Save the file.
Restart your TAI server. Restart your TAI server.
You will now be able to connect from other devices. You will now be able to connect from other devices.
***Disclaimer: Anyone else who knows your IP address and TAI port number will be able to as well*** ***Disclaimer: Anyone else who knows your IP address and TAI port number will be able to as well***
To connect over wifi you'll need your PC's local wifi IP address To connect over wifi you'll need your PC's local wifi IP address