@le-space/ui 0.3.0 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -3
- package/react/index.d.ts +4 -0
- package/react/index.js +496 -55
- package/shared/index.d.ts +7 -1
- package/shared/index.js +397 -14
- package/styles.css +9 -5
- package/svelte/SponsorRelayFab.svelte +67 -18
- package/svelte/components/LauncherButton.svelte +3 -3
- package/svelte/styles/theme.css +9 -5
package/styles.css
CHANGED
|
@@ -5,13 +5,17 @@
|
|
|
5
5
|
"DM Sans", "Inter", "Segoe UI", sans-serif;
|
|
6
6
|
--relay-font-mono:
|
|
7
7
|
"DM Mono", "SFMono-Regular", "Menlo", monospace;
|
|
8
|
-
--relay-panel-bg: rgba(
|
|
9
|
-
--relay-panel-border: rgba(
|
|
10
|
-
--relay-panel-shadow: 0 28px 80px rgba(
|
|
8
|
+
--relay-panel-bg: rgba(49, 46, 129, 0.94);
|
|
9
|
+
--relay-panel-border: rgba(199, 210, 254, 0.22);
|
|
10
|
+
--relay-panel-shadow: 0 28px 80px rgba(49, 46, 129, 0.34);
|
|
11
11
|
--relay-text: #f8fafc;
|
|
12
12
|
--relay-muted: #9fb2ca;
|
|
13
|
-
--relay-blue: #
|
|
14
|
-
--relay-red: #
|
|
13
|
+
--relay-blue: #4f46e5;
|
|
14
|
+
--relay-red: #6366f1;
|
|
15
15
|
--relay-yellow: #ffc83f;
|
|
16
16
|
--relay-green: #37d67a;
|
|
17
|
+
--relay-launcher-border: rgba(199, 210, 254, 0.42);
|
|
18
|
+
--relay-launcher-badge-bg: rgba(49, 46, 129, 0.92);
|
|
19
|
+
--relay-launcher-badge-border: rgba(191, 219, 254, 0.24);
|
|
20
|
+
--relay-backdrop-accent: rgba(79, 70, 229, 0.2);
|
|
17
21
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import { onDestroy, onMount } from 'svelte'
|
|
3
3
|
|
|
4
|
-
import { createSponsorRelayController, formatDateTime, formatNumber, joinMappedPorts, joinRequiredPortForwards, shortHash } from '../shared/index'
|
|
4
|
+
import { createSponsorRelayController, formatDateTime, formatNumber, formatTierSpecLabel, joinMappedPorts, joinRequiredPortForwards, shortHash } from '../shared/index'
|
|
5
5
|
import AccordionSection from './components/AccordionSection.svelte'
|
|
6
6
|
import CopyButton from './components/CopyButton.svelte'
|
|
7
7
|
import LauncherButton from './components/LauncherButton.svelte'
|
|
@@ -104,10 +104,6 @@ export let apiHost = undefined
|
|
|
104
104
|
<p class="status-text">{state.statusText}</p>
|
|
105
105
|
|
|
106
106
|
<div class="grid">
|
|
107
|
-
<label class="field">
|
|
108
|
-
<span>Manifest URL</span>
|
|
109
|
-
<input value={state.manifestUrl} on:input={(event) => controller.setManifestUrl(event.currentTarget.value)} />
|
|
110
|
-
</label>
|
|
111
107
|
<label class="field">
|
|
112
108
|
<span>Instance Name</span>
|
|
113
109
|
<input value={state.instanceName} on:input={(event) => controller.setInstanceName(event.currentTarget.value)} />
|
|
@@ -115,23 +111,40 @@ export let apiHost = undefined
|
|
|
115
111
|
<label class="field">
|
|
116
112
|
<span>Tier</span>
|
|
117
113
|
<select value={state.pricingSummary.tier?.id ?? state.tierId} on:change={(event) => controller.setTierId(event.currentTarget.value)}>
|
|
118
|
-
{#each state.pricingSummary.pricing?.tiers
|
|
119
|
-
<option value={tier.id}>
|
|
114
|
+
{#each (state.pricingSummary.pricing?.tiers?.length ? state.pricingSummary.pricing.tiers : [{ id: state.tierId, compute_units: 1 }]) as tier}
|
|
115
|
+
<option value={tier.id}>
|
|
116
|
+
{tier.id} {formatTierSpecLabel(
|
|
117
|
+
state.pricingSummary.pricing ? state.pricingSummary.pricing.compute_unit.vcpus * tier.compute_units : null,
|
|
118
|
+
state.pricingSummary.pricing ? state.pricingSummary.pricing.compute_unit.memory_mib * tier.compute_units : null,
|
|
119
|
+
state.pricingSummary.pricing ? state.pricingSummary.pricing.compute_unit.disk_mib * tier.compute_units : null
|
|
120
|
+
)}
|
|
121
|
+
</option>
|
|
120
122
|
{/each}
|
|
121
123
|
</select>
|
|
122
|
-
|
|
123
|
-
<label class="field wide">
|
|
124
|
-
<span>SSH Public Key</span>
|
|
125
|
-
<textarea rows="3" on:input={(event) => controller.setSshPublicKey(event.currentTarget.value)}>{state.sshPublicKey}</textarea>
|
|
124
|
+
<small>{formatTierSpecLabel(state.pricingSummary.vcpus, state.pricingSummary.memoryMiB, state.pricingSummary.diskMiB)}</small>
|
|
126
125
|
</label>
|
|
127
126
|
</div>
|
|
128
127
|
|
|
129
|
-
<
|
|
130
|
-
<
|
|
131
|
-
|
|
132
|
-
<
|
|
133
|
-
|
|
134
|
-
|
|
128
|
+
<details class="accordion" open={state.showAdvanced} on:toggle={(event) => controller.setShowAdvanced(event.currentTarget.open)}>
|
|
129
|
+
<summary>Advanced</summary>
|
|
130
|
+
<div class="accordion-body advanced-grid">
|
|
131
|
+
<label class="field wide">
|
|
132
|
+
<span>Manifest URL</span>
|
|
133
|
+
<input value={state.manifestUrl} on:input={(event) => controller.setManifestUrl(event.currentTarget.value)} />
|
|
134
|
+
</label>
|
|
135
|
+
<label class="field wide">
|
|
136
|
+
<span>SSH Public Key</span>
|
|
137
|
+
<textarea rows="3" on:input={(event) => controller.setSshPublicKey(event.currentTarget.value)}>{state.sshPublicKey}</textarea>
|
|
138
|
+
</label>
|
|
139
|
+
|
|
140
|
+
<AccordionSection title="Paste Manifest" open={state.showPasteManifest}>
|
|
141
|
+
<label class="field wide">
|
|
142
|
+
<span>Pasted rootfs manifest JSON</span>
|
|
143
|
+
<textarea rows="7" on:input={(event) => controller.setManifestJson(event.currentTarget.value)}>{state.manifestJson}</textarea>
|
|
144
|
+
</label>
|
|
145
|
+
</AccordionSection>
|
|
146
|
+
</div>
|
|
147
|
+
</details>
|
|
135
148
|
|
|
136
149
|
<div class="metrics">
|
|
137
150
|
<div class="metric-card">
|
|
@@ -262,7 +275,7 @@ export let apiHost = undefined
|
|
|
262
275
|
position: fixed;
|
|
263
276
|
inset: 0;
|
|
264
277
|
z-index: 9998;
|
|
265
|
-
background: radial-gradient(circle at 88% 82%,
|
|
278
|
+
background: radial-gradient(circle at 88% 82%, var(--relay-backdrop-accent), transparent 34%);
|
|
266
279
|
backdrop-filter: blur(2px);
|
|
267
280
|
}
|
|
268
281
|
|
|
@@ -404,10 +417,46 @@ export let apiHost = undefined
|
|
|
404
417
|
gap: 0.4rem;
|
|
405
418
|
}
|
|
406
419
|
|
|
420
|
+
.field small {
|
|
421
|
+
color: var(--relay-muted);
|
|
422
|
+
font-size: 0.72rem;
|
|
423
|
+
line-height: 1.35;
|
|
424
|
+
}
|
|
425
|
+
|
|
407
426
|
.field.wide {
|
|
408
427
|
grid-column: 1 / -1;
|
|
409
428
|
}
|
|
410
429
|
|
|
430
|
+
.accordion {
|
|
431
|
+
margin-top: 0.9rem;
|
|
432
|
+
border: 1px solid var(--relay-panel-border);
|
|
433
|
+
border-radius: 1rem;
|
|
434
|
+
background: rgba(255, 255, 255, 0.035);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
.accordion summary {
|
|
438
|
+
cursor: pointer;
|
|
439
|
+
list-style: none;
|
|
440
|
+
padding: 0.8rem 0.95rem;
|
|
441
|
+
color: var(--relay-text);
|
|
442
|
+
font: 700 0.8rem/1.1 var(--relay-font-heading);
|
|
443
|
+
text-transform: uppercase;
|
|
444
|
+
letter-spacing: 0.08em;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
.accordion summary::-webkit-details-marker {
|
|
448
|
+
display: none;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
.accordion-body {
|
|
452
|
+
padding: 0 0.95rem 0.95rem;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
.advanced-grid {
|
|
456
|
+
display: grid;
|
|
457
|
+
gap: 0.75rem;
|
|
458
|
+
}
|
|
459
|
+
|
|
411
460
|
input,
|
|
412
461
|
select,
|
|
413
462
|
textarea {
|
|
@@ -10,12 +10,12 @@
|
|
|
10
10
|
|
|
11
11
|
<style>
|
|
12
12
|
.launcher {
|
|
13
|
-
border: 2px solid
|
|
13
|
+
border: 2px solid var(--relay-launcher-border);
|
|
14
14
|
border-radius: 999px;
|
|
15
15
|
padding: 0.9rem 1.2rem;
|
|
16
|
-
background: linear-gradient(135deg, var(--relay-
|
|
16
|
+
background: linear-gradient(135deg, var(--relay-blue) 0%, var(--relay-red) 100%);
|
|
17
17
|
color: white;
|
|
18
|
-
box-shadow: 0 18px 40px rgba(
|
|
18
|
+
box-shadow: 0 18px 40px rgba(79, 70, 229, 0.28);
|
|
19
19
|
font: 700 0.84rem/1 var(--relay-font-heading);
|
|
20
20
|
letter-spacing: 0.08em;
|
|
21
21
|
text-transform: uppercase;
|
package/svelte/styles/theme.css
CHANGED
|
@@ -5,13 +5,17 @@
|
|
|
5
5
|
"DM Sans", "Inter", "Segoe UI", sans-serif;
|
|
6
6
|
--relay-font-mono:
|
|
7
7
|
"DM Mono", "SFMono-Regular", "Menlo", monospace;
|
|
8
|
-
--relay-panel-bg: rgba(
|
|
9
|
-
--relay-panel-border: rgba(
|
|
10
|
-
--relay-panel-shadow: 0 28px 80px rgba(
|
|
8
|
+
--relay-panel-bg: rgba(49, 46, 129, 0.94);
|
|
9
|
+
--relay-panel-border: rgba(199, 210, 254, 0.22);
|
|
10
|
+
--relay-panel-shadow: 0 28px 80px rgba(49, 46, 129, 0.34);
|
|
11
11
|
--relay-text: #f8fafc;
|
|
12
12
|
--relay-muted: #9fb2ca;
|
|
13
|
-
--relay-blue: #
|
|
14
|
-
--relay-red: #
|
|
13
|
+
--relay-blue: #4f46e5;
|
|
14
|
+
--relay-red: #6366f1;
|
|
15
15
|
--relay-yellow: #ffc83f;
|
|
16
16
|
--relay-green: #37d67a;
|
|
17
|
+
--relay-launcher-border: rgba(199, 210, 254, 0.42);
|
|
18
|
+
--relay-launcher-badge-bg: rgba(49, 46, 129, 0.92);
|
|
19
|
+
--relay-launcher-badge-border: rgba(191, 219, 254, 0.24);
|
|
20
|
+
--relay-backdrop-accent: rgba(79, 70, 229, 0.2);
|
|
17
21
|
}
|