ui-tweaks

#1
by victor HF staff - opened
Files changed (1) hide show
  1. public/index.html +89 -81
public/index.html CHANGED
@@ -10,7 +10,8 @@
10
  <div class="flex flex-col md:flex-row" x-data="app()" x-init="init()">
11
  <div
12
  class="hero md:h-screen bg-stone-100 transition-[width] delay-150 ease-in-out"
13
- :class="open ? 'w-full md:w-2/6' : 'w-full md:w-6/6'">
 
14
  <div class="hero-content text-center">
15
  <div class="flex flex-col w-full md:max-w-xl space-y-3 md:space-y-6">
16
  <h1
@@ -18,12 +19,15 @@
18
  :class="open
19
  ? 'text-2xl md:text-3xl lg:text-4xl'
20
  : 'text-2xl md:text-3xl lg:text-6xl'"
21
- >Webapp Factory 🏭</h1>
 
 
22
  <div
23
  class="py-1 md:py-2 space-y-2 md:space-y-4 text-stone-600 transition-all delay-150 ease-in-out"
24
  :class="open
25
  ? 'text-lg md:text-xl lg:text-2xl'
26
- : 'text-lg md:text-xl lg:text-2xl'">
 
27
  <p>A space to generate web content using WizardCoder.</p>
28
  <p>Running on πŸ€— Inference Endpoints.</p>
29
  </div>
@@ -32,10 +36,7 @@
32
  x-model="promptDraft"
33
  rows="10"
34
  placeholder="A simple page to compute the BMI (use SI units)"
35
- class="input input-bordered w-full rounded text-stone-500 bg-stone-300 font-mono
36
- text-md md:text-lg
37
- h-24 md:h-48
38
- "
39
  ></textarea>
40
  <button
41
  class="btn disabled:text-stone-400"
@@ -47,99 +48,106 @@
47
  <span x-show="promptDraft.length >= minPromptSize && state !== 'stopped'">Stop now</span>
48
  <span x-show="promptDraft.length >= minPromptSize && state === 'stopped'">Generate!</span>
49
  </button>
50
- <span class="py-3" x-show="state === 'loading'">Waiting for the stream to begin (might take a few minutes)..</span>
 
 
51
  <span class="py-3" x-show="state === 'streaming'">
52
- Streamed <span x-text="humanFileSize(size, true, 2)"></span> so far..<br/>Note: this version generates up to 1024 tokens.</span>
 
 
53
  </div>
54
  </div>
55
  </div>
56
  <div
57
  class="flex transition-[width] delay-150 ease-in-out md:h-screen"
58
- :class="open ? 'w-full md:w-4/6' : 'w-full md:w-0'">
 
59
  <iframe
60
  id="iframe"
61
- class="border-none w-full md:h-screen"
62
  :src="!open
63
  ? '/placeholder.html'
64
  : `/app?prompt=${encodeURIComponent(prompt)}`
65
- "></iframe>
 
66
  </div>
67
  </div>
68
  <script>
69
  /**
70
- * Format bytes as human-readable text.
71
- *
72
- * @param bytes Number of bytes.
73
- * @param si True to use metric (SI) units, aka powers of 1000. False to use
74
- * binary (IEC), aka powers of 1024.
75
- * @param dp Number of decimal places to display.
76
- *
77
- * @return Formatted string.
78
- */
79
- function humanFileSize(bytes, si=false, dp=1) {
80
- const thresh = si ? 1000 : 1024;
81
 
82
- if (Math.abs(bytes) < thresh) {
83
- return bytes + ' B';
84
- }
85
 
86
- const units = si
87
- ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
88
- : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
89
- let u = -1;
90
- const r = 10**dp;
91
 
92
- do {
93
- bytes /= thresh;
94
- ++u;
95
- } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);
96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
 
98
- return bytes.toFixed(dp) + ' ' + units[u];
99
- }
100
- function app() {
101
- return {
102
- open: false,
103
- promptDraft: new URLSearchParams(window.location.search).get('prompt') || 'A simple page to compute the BMI (use SI units)',
104
- prompt: '',
105
- size: 0,
106
- minPromptSize: 16, // if you change this, you will need to also change in src/index.mts
107
- timeoutInSec: 10, // time before we determine something went wrong
108
- state: 'stopped',
109
- lastTokenAt: + new Date(),
110
- init() {
111
- setInterval(() => {
112
- if (this.state === 'stopped') {
113
- this.lastTokenAt = +new Date()
114
- return
115
- }
116
- const html = document?.getElementById('iframe')?.contentWindow?.document?.documentElement?.outerHTML
117
- const size = Number(html?.length) // count how many characters we have generated
118
-
119
- if (isNaN(size) || !isFinite(size)) {
120
- this.size = 0
121
- this.state = 'loading'
122
- return
123
- }
124
- this.size = new Blob([html]).size
125
- this.state = 'streaming'
126
- const lastTokenAt = + new Date()
127
- const elapsed = (lastTokenAt - this.lastTokenAt) / 1000
128
- this.lastTokenAt = lastTokenAt
129
- if (elapsed > this.timeoutInSec) {
130
- console.log(`Something went wrong, it too more than ${this.timeoutInSec} seconds to generate a token.`)
131
- this.state = 'stopped'
132
- return
133
- }
134
- if (html.includes('</html>')) {
135
- // console.log('We reached the natural end of the stream, it seems.')
136
- // this.state === 'stopped'
137
- return
138
- }
139
- }, 100)
140
- },
141
- }
142
- }
143
  </script>
144
  </body>
145
- </html>
 
10
  <div class="flex flex-col md:flex-row" x-data="app()" x-init="init()">
11
  <div
12
  class="hero md:h-screen bg-stone-100 transition-[width] delay-150 ease-in-out"
13
+ :class="open ? 'w-full md:w-2/6' : 'w-full md:w-6/6'"
14
+ >
15
  <div class="hero-content text-center">
16
  <div class="flex flex-col w-full md:max-w-xl space-y-3 md:space-y-6">
17
  <h1
 
19
  :class="open
20
  ? 'text-2xl md:text-3xl lg:text-4xl'
21
  : 'text-2xl md:text-3xl lg:text-6xl'"
22
+ >
23
+ Webapp Factory 🏭
24
+ </h1>
25
  <div
26
  class="py-1 md:py-2 space-y-2 md:space-y-4 text-stone-600 transition-all delay-150 ease-in-out"
27
  :class="open
28
  ? 'text-lg md:text-xl lg:text-2xl'
29
+ : 'text-lg md:text-xl lg:text-2xl'"
30
+ >
31
  <p>A space to generate web content using WizardCoder.</p>
32
  <p>Running on πŸ€— Inference Endpoints.</p>
33
  </div>
 
36
  x-model="promptDraft"
37
  rows="10"
38
  placeholder="A simple page to compute the BMI (use SI units)"
39
+ class="input input-bordered w-full rounded text-stone-500 bg-stone-300 font-mono text-md md:text-lg h-24 md:h-48"
 
 
 
40
  ></textarea>
41
  <button
42
  class="btn disabled:text-stone-400"
 
48
  <span x-show="promptDraft.length >= minPromptSize && state !== 'stopped'">Stop now</span>
49
  <span x-show="promptDraft.length >= minPromptSize && state === 'stopped'">Generate!</span>
50
  </button>
51
+ <span class="py-3" x-show="state === 'loading'"
52
+ >Waiting for the stream to begin (might take a few minutes)..</span
53
+ >
54
  <span class="py-3" x-show="state === 'streaming'">
55
+ Streamed <span x-text="humanFileSize(size, true, 2)"></span> so far..<br />Note: this version generates up
56
+ to 1024 tokens.</span
57
+ >
58
  </div>
59
  </div>
60
  </div>
61
  <div
62
  class="flex transition-[width] delay-150 ease-in-out md:h-screen"
63
+ :class="open ? 'w-full md:w-4/6' : 'w-full md:w-0'"
64
+ >
65
  <iframe
66
  id="iframe"
67
+ class="border-none w-full md:min-h-screen p-4 md:p-8"
68
  :src="!open
69
  ? '/placeholder.html'
70
  : `/app?prompt=${encodeURIComponent(prompt)}`
71
+ "
72
+ ></iframe>
73
  </div>
74
  </div>
75
  <script>
76
  /**
77
+ * Format bytes as human-readable text.
78
+ *
79
+ * @param bytes Number of bytes.
80
+ * @param si True to use metric (SI) units, aka powers of 1000. False to use
81
+ * binary (IEC), aka powers of 1024.
82
+ * @param dp Number of decimal places to display.
83
+ *
84
+ * @return Formatted string.
85
+ */
86
+ function humanFileSize(bytes, si = false, dp = 1) {
87
+ const thresh = si ? 1000 : 1024;
88
 
89
+ if (Math.abs(bytes) < thresh) {
90
+ return bytes + " B";
91
+ }
92
 
93
+ const units = si
94
+ ? ["kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
95
+ : ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
96
+ let u = -1;
97
+ const r = 10 ** dp;
98
 
99
+ do {
100
+ bytes /= thresh;
101
+ ++u;
102
+ } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);
103
 
104
+ return bytes.toFixed(dp) + " " + units[u];
105
+ }
106
+ function app() {
107
+ return {
108
+ open: false,
109
+ promptDraft:
110
+ new URLSearchParams(window.location.search).get("prompt") ||
111
+ "A simple page to compute the BMI (use SI units)",
112
+ prompt: "",
113
+ size: 0,
114
+ minPromptSize: 16, // if you change this, you will need to also change in src/index.mts
115
+ timeoutInSec: 10, // time before we determine something went wrong
116
+ state: "stopped",
117
+ lastTokenAt: +new Date(),
118
+ init() {
119
+ setInterval(() => {
120
+ if (this.state === "stopped") {
121
+ this.lastTokenAt = +new Date();
122
+ return;
123
+ }
124
+ const html = document?.getElementById("iframe")?.contentWindow?.document?.documentElement?.outerHTML;
125
+ const size = Number(html?.length); // count how many characters we have generated
126
 
127
+ if (isNaN(size) || !isFinite(size)) {
128
+ this.size = 0;
129
+ this.state = "loading";
130
+ return;
131
+ }
132
+ this.size = new Blob([html]).size;
133
+ this.state = "streaming";
134
+ const lastTokenAt = +new Date();
135
+ const elapsed = (lastTokenAt - this.lastTokenAt) / 1000;
136
+ this.lastTokenAt = lastTokenAt;
137
+ if (elapsed > this.timeoutInSec) {
138
+ console.log(`Something went wrong, it too more than ${this.timeoutInSec} seconds to generate a token.`);
139
+ this.state = "stopped";
140
+ return;
141
+ }
142
+ if (html.includes("</html>")) {
143
+ // console.log('We reached the natural end of the stream, it seems.')
144
+ // this.state === 'stopped'
145
+ return;
146
+ }
147
+ }, 100);
148
+ },
149
+ };
150
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
  </script>
152
  </body>
153
+ </html>