~starkingdoms/starkingdoms

58de35ad8a57ed3e02011aadda229de500a3ff73 — core 1 year, 11 months ago 011c521
TextInput element
M starkingdoms-client/src/components/Chatbox.svelte => starkingdoms-client/src/components/Chatbox.svelte +6 -11
@@ 4,6 4,7 @@
  import { sendPacket } from "../hub.ts";
  import { global } from "../globals.js";
  import { afterUpdate } from "svelte";
  import TextInput from "./ui/TextInput.svelte";

  interface Message {
    classname: string;


@@ 12,15 13,11 @@

  let messages: Message[] = [];
  let chatbox: HTMLDivElement | null;
  let chatentry;
  let value = "";

  export function addMessage(classname: string, message: string) {
    messages.push({ classname: classname, message: message });
    messages = messages; // Trigger Svelte reactivity

    if (messages.length > 128) {
      delete messages[0];
    }
  }

  afterUpdate(() => {


@@ 31,14 28,12 @@

  function onkeydown(e: KeyboardEvent) {
    if (e.key === "Enter") {
      let value = chatentry!.value;

      if (value.startsWith(".msg")) {
        let args = value.split(" ");
        if (args.length < 3) {
          addMessage("server-error", "Command error");

          chatentry!.value = "";
          value = "";
          return;
        }
        let target = args[1];


@@ 63,7 58,7 @@
        };
        sendPacket(global.client!, chat_packet);
      }
      chatentry!.value = "";
      value = "";
    }
  }
</script>


@@ 74,8 69,8 @@
      <p class="message {message.classname}">{message.message}</p>
    {/each}
  </div>
  <input
    bind:this={chatentry}
  <TextInput
    bind:value
    on:keydown={onkeydown}
    placeholder="Enter message or command here..."
    class="chat-box"

A starkingdoms-client/src/components/ui/TextInput.svelte => starkingdoms-client/src/components/ui/TextInput.svelte +40 -0
@@ 0,0 1,40 @@
<script lang="ts">
  let clazz: string = "";
  export { clazz as class };
  export let id: string = "";
  export let disabled = false;
  export let style = "";
  export let required = false;
  export let autocomplete = "";
  export let value = "";
  export let placeholder = "";
</script>

<input
  bind:value
  type="text"
  {id}
  class="txt {clazz}"
  {disabled}
  on:click
  on:focus
  on:input
  on:change
  on:keydown
  on:keyup
  {style}
  {required}
  {autocomplete}
  {placeholder} />

<style lang="scss">
  .txt {
    appearance: none;
    background: transparent;
    color: var(--text);
    padding: 0.675em 1em;
    border: 1px solid var(--links);
    border-radius: 0.25rem;
    cursor: text;
  }
</style>

M starkingdoms-client/src/pages/Home.svelte => starkingdoms-client/src/pages/Home.svelte +6 -5
@@ 8,6 8,7 @@
  import WarningIcon from "../icons/WarningIcon.svelte";
  import Popup from "../components/ui/Popup.svelte";
  import Button from "../components/ui/Button.svelte";
  import TextInput from "../components/ui/TextInput.svelte";

  let config = DEFAULT_CONFIG;
  // Top-level await. Sets the default config, and overwrites it when the new config is avail. Thanks reactivity!


@@ 33,10 34,10 @@

  const is_development = window.localStorage.getItem("stk-mode") === "debug";

  let nonprod_warning;
  let nonprod_warning: HTMLSpanElement;

  let server;
  let username;
  let server = "";
  let username = "";

  function playGame() {
    window.location.href = `/play/?srv=${server}&username=${username}`;


@@ 59,9 60,9 @@

  <form id="join-fm" class="form" on:submit|preventDefault={playGame}>
    <label for="username" class="label">Username</label>
    <input
    <TextInput
      style="width: 100%; max-width: 100%;"
      bind:value={username}
      class="textentry"
      id="username"
      required
      autocomplete="off" />