border: none;
outline: none;
+ z-index: 1;
+
}
.menu {
position: fixed;
margin-left: 20px;
margin-top: 20px;
+
+ z-index: 2;
+
}
.menuButton {
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="13.795" height="12.759" viewBox="0 0 13.795 12.759">
+ <g id="Group_544" data-name="Group 544" transform="translate(-4127 -507)">
+ <g id="Group_33" data-name="Group 33" transform="translate(4127 507)">
+ <g id="Group_32" data-name="Group 32" transform="translate(0 0)">
+ <g id="Group_31" data-name="Group 31" transform="translate(0 6.627)">
+ <circle id="Ellipse_50" data-name="Ellipse 50" cx="3.066" cy="3.066" r="3.066" transform="translate(0 0)" fill="#383838"/>
+ <circle id="Ellipse_51" data-name="Ellipse 51" cx="3.066" cy="3.066" r="3.066" transform="translate(7.664 0)" fill="#383838"/>
+ </g>
+ <circle id="Ellipse_52" data-name="Ellipse 52" cx="3.066" cy="3.066" r="3.066" transform="translate(3.826 0)" fill="#383838"/>
+ <path id="Path_150" data-name="Path 150" d="M36.27,83.67" transform="translate(-33.199 -73.977)" fill="#ff0"/>
+ </g>
+ </g>
+ </g>
+</svg>
interface RenderMessage {
content: string;
+ avatar: string;
context: string;
subContext: string;
modifier: string;
<TextInput
v-else
- :input="input"
- :textXoffset="textInputXoffset"
- :textYoffset="textInputYoffset"
+ :input="input"
/>
</template>
const {
input,
visualizeStream,
-
- textInputXoffset,
- textInputYoffset,
-
audioBubbleWidth,
paths,
} = useInputController();
return {
input,
-
- textInputXoffset,
- textInputYoffset,
visualizeStream,
audioBubbleWidth,
return {
input,
visualizeStream,
- textInputXoffset,
- textInputYoffset,
audioBubbleWidth,
paths
}
<template>
- <foreignObject
- class="inputContainer"
- :x="textXoffset"
- :y="textYoffset"
- width="55%"
- height="50%"
- >
- <div xmlns="http://www.w3.org/1999/xhtml">
+ <div class="inputBox">
<div class="inputBubble" v-show="input.length > 0">
<p>{{ input }}</p>
</div>
</div>
- </foreignObject>
-
</template>
<script lang="ts">
name: "TextInput",
props: {
input: String,
- textXoffset: String,
- textYoffset: String,
},
});
</script>
<style lang="scss" scoped>
-.inputBubble {
+
+.inputBox {
position: fixed;
+ width: 100vw;
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ bottom: 0;
+
+ z-index: 1;
+}
+
+.inputBubble {
max-width: 180px;
min-height: 32px;
font-size: 14px;
- bottom: 20px;
- margin-left: 50%;
-
p {
max-width: 150px;
overflow-wrap: break-word;
padding: 7px 10px 5px 10px;
margin: 0;
}
+
+ margin-bottom: 20px;
+
+ z-index: 1;
}
</style>
export interface Message {
content: string;
+ avatar: string;
context: string;
subContext: string;
modifier: string;
export interface MessageAnimeFunc {
(message: SVGElement, transform: MessageTransform, scrollHeight?: number | undefined, targetList?: NodeList | undefined): void;
-}
-
+}
\ No newline at end of file
</div>
<!-- message context -->
- <div class="context">
+ <span class="context">
+
+ <!-- Render Crimata icon or initials. -->
+ <div v-if="message.avatar == 'crimata'" class="photo">
+ <img src="@/assets/crimata.svg"/>
+ </div>
+
+ <div v-else class="photo">
+ {{ message.avatar }}
+ </div>
+
{{ message.context }}
- </div>
+
+ </span>
</div>
// Render a message.
const render = (message: Message) => {
messages.push(message)
- console.log(`Pushing: ${message.modifier}: ${message.content}`)
+ console.log(`Pushing: ${message.modifier}: ${message.avatar}, ${message.content}`)
}
onMounted(() => {
background-color: #EBEBEB;
- top: 0;
bottom: 0;
- z-index: -1px;
+ }
+
+ #messenger::-webkit-scrollbar {
+ display: none;
}
.message {
}
.context {
+ display: flex;
+ align-items: center;
+
font-family: "SF Compact Display";
font-size: 12px;
font-weight: bold;
margin-top: 5px;
}
+ .photo {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ margin-right: 5px;
+
+ width: 30px;
+ height: 30px;
+
+ font-size: 14px;
+
+ background-color: white;
+ border-radius: 15px;
+ }
+
</style>