@rool-dev/extension 0.3.7 → 0.3.8-dev.368b058
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/README.md +21 -8
- package/dist/cli/build-pipeline.js +1 -1
- package/dist/cli/dev.js +1 -1
- package/dist/cli/init.js +1 -1
- package/dist/dev/DevHostController.d.ts +5 -0
- package/dist/dev/DevHostController.d.ts.map +1 -1
- package/dist/dev/DevHostController.js +22 -1
- package/dist/dev/HostShell.svelte +11 -8
- package/dist/dev/HostShell.svelte.d.ts +1 -8
- package/dist/dev/HostShell.svelte.d.ts.map +1 -1
- package/dist/dev/Sidebar.svelte +14 -1
- package/dist/dev/Sidebar.svelte.d.ts +1 -0
- package/dist/dev/Sidebar.svelte.d.ts.map +1 -1
- package/dist/dev/app.css +1 -0
- package/dist/dev/host-shell.js +280 -72
- package/dist/dev/host-shell.js.map +1 -1
- package/dist/host.d.ts +9 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +28 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/protocol.d.ts +10 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/reactive.svelte.d.ts +68 -37
- package/dist/reactive.svelte.d.ts.map +1 -1
- package/dist/reactive.svelte.js +388 -103
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/client.d.ts +0 -139
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -360
package/README.md
CHANGED
|
@@ -14,10 +14,10 @@ Everything else (Vite config, entry point, HTML, Tailwind CSS) is provided by th
|
|
|
14
14
|
## Quick Start
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
|
-
npx rool-extension
|
|
17
|
+
npx @rool-dev/cli extension create my-extension
|
|
18
18
|
cd my-extension
|
|
19
19
|
pnpm install
|
|
20
|
-
|
|
20
|
+
pnpm dev
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
This opens a dev host at `/__rool-host/` that loads your extension in a sandboxed iframe, connected to a real Rool Space.
|
|
@@ -183,6 +183,7 @@ These are Svelte 5 `$state` properties — use them directly in templates or `$e
|
|
|
183
183
|
| `role` | `RoolUserRole` | User's role (`owner`, `admin`, `editor`, `viewer`) |
|
|
184
184
|
| `linkAccess` | `LinkAccess` | URL sharing level |
|
|
185
185
|
| `userId` | `string` | Current user's ID |
|
|
186
|
+
| `user` | `BridgeUser` | Current user info (`{ id, name, email }`) |
|
|
186
187
|
| `isReadOnly` | `boolean` | True if viewer role |
|
|
187
188
|
|
|
188
189
|
### Object Operations
|
|
@@ -343,7 +344,7 @@ await thread.rename('Research Thread');
|
|
|
343
344
|
thread.close(); // Stop listening for updates
|
|
344
345
|
```
|
|
345
346
|
|
|
346
|
-
Conversations are auto-created on first interaction — no explicit create step needed. All conversations share one bridge connection. The
|
|
347
|
+
Conversations are auto-created on first interaction — no explicit create step needed. All conversations share one bridge connection. The 200-interaction cap applies per conversation.
|
|
347
348
|
|
|
348
349
|
### Events
|
|
349
350
|
|
|
@@ -409,18 +410,28 @@ Extensions run in a sandboxed iframe (`allow-scripts allow-same-origin`). The ho
|
|
|
409
410
|
|
|
410
411
|
The bridge protocol:
|
|
411
412
|
1. Extension sends `rool:ready`
|
|
412
|
-
2. Host responds with `rool:init` (channel metadata, schema, space info)
|
|
413
|
+
2. Host responds with `rool:init` (channel metadata, schema, space info, user identity)
|
|
413
414
|
3. Extension calls channel methods → `rool:request` → host executes → `rool:response`
|
|
414
415
|
4. Host pushes real-time events → `rool:event` → extension updates reactive state
|
|
415
416
|
|
|
417
|
+
When creating a bridge host, pass `user` so the extension can display the current user's name:
|
|
418
|
+
|
|
419
|
+
```typescript
|
|
420
|
+
const host = createBridgeHost({
|
|
421
|
+
channel,
|
|
422
|
+
iframe,
|
|
423
|
+
user: { id: currentUser.id, name: currentUser.name, email: currentUser.email },
|
|
424
|
+
});
|
|
425
|
+
```
|
|
426
|
+
|
|
416
427
|
## CLI Commands
|
|
417
428
|
|
|
418
429
|
| Command | Description |
|
|
419
430
|
|---------|-------------|
|
|
420
|
-
| `rool
|
|
421
|
-
| `rool
|
|
422
|
-
| `rool
|
|
423
|
-
| `rool
|
|
431
|
+
| `rool extension create [name]` | Scaffold a new extension project |
|
|
432
|
+
| `rool extension dev` | Start the dev server with host shell |
|
|
433
|
+
| `rool extension build` | Build the extension |
|
|
434
|
+
| `rool extension publish` | Build and publish the extension |
|
|
424
435
|
|
|
425
436
|
## Exported Types
|
|
426
437
|
|
|
@@ -431,6 +442,8 @@ import type {
|
|
|
431
442
|
ReactiveObject,
|
|
432
443
|
ReactiveWatch,
|
|
433
444
|
WatchOptions,
|
|
445
|
+
BridgeUser,
|
|
446
|
+
ColorScheme,
|
|
434
447
|
RoolObject,
|
|
435
448
|
RoolObjectStat,
|
|
436
449
|
SpaceSchema,
|
|
@@ -38,7 +38,7 @@ function roolExtensionBuildPlugin(root, tailwindCssPath) {
|
|
|
38
38
|
},
|
|
39
39
|
load(id) {
|
|
40
40
|
if (id === RESOLVED_CSS)
|
|
41
|
-
return `@import "${tailwindCssPath}";`;
|
|
41
|
+
return `@import "${tailwindCssPath}";\n@custom-variant dark (&:where(.dark, .dark *));`;
|
|
42
42
|
if (id !== RESOLVED_ENTRY)
|
|
43
43
|
return;
|
|
44
44
|
return [
|
package/dist/cli/dev.js
CHANGED
|
@@ -79,7 +79,7 @@ function roolExtensionPlugin(root, tailwindCssPath) {
|
|
|
79
79
|
},
|
|
80
80
|
load(id) {
|
|
81
81
|
if (id === RESOLVED_CSS)
|
|
82
|
-
return `@import "${tailwindCssPath}";`;
|
|
82
|
+
return `@import "${tailwindCssPath}";\n@custom-variant dark (&:where(.dark, .dark *));`;
|
|
83
83
|
if (id !== RESOLVED_ENTRY)
|
|
84
84
|
return;
|
|
85
85
|
return [
|
package/dist/cli/init.js
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { RoolClient } from '@rool-dev/sdk';
|
|
13
13
|
import type { RoolSpaceInfo, PublishedExtensionInfo } from '@rool-dev/sdk';
|
|
14
|
+
import type { ColorScheme } from '../protocol.js';
|
|
14
15
|
import type { Manifest, Environment } from '../manifest.js';
|
|
15
16
|
export interface ExtensionTab {
|
|
16
17
|
id: string;
|
|
@@ -34,6 +35,7 @@ export declare class DevHostController {
|
|
|
34
35
|
publishedExtensions: PublishedExtensionInfo[];
|
|
35
36
|
installedExtensionIds: string[];
|
|
36
37
|
sidebarCollapsed: boolean;
|
|
38
|
+
colorScheme: ColorScheme;
|
|
37
39
|
publishState: 'idle' | 'building' | 'uploading' | 'done' | 'error';
|
|
38
40
|
publishMessage: string | null;
|
|
39
41
|
publishUrl: string | null;
|
|
@@ -68,9 +70,11 @@ export declare class DevHostController {
|
|
|
68
70
|
publish(): Promise<void>;
|
|
69
71
|
switchEnv(newEnv: Environment): Promise<void>;
|
|
70
72
|
toggleSidebar(): void;
|
|
73
|
+
toggleColorScheme(): void;
|
|
71
74
|
registerIframe(tabId: string, el: HTMLIFrameElement): void;
|
|
72
75
|
unregisterIframe(tabId: string): void;
|
|
73
76
|
logout(): void;
|
|
77
|
+
private get _bridgeUser();
|
|
74
78
|
private _bindBridge;
|
|
75
79
|
private _bindAllBridges;
|
|
76
80
|
private _destroyTab;
|
|
@@ -81,5 +85,6 @@ export declare class DevHostController {
|
|
|
81
85
|
*/
|
|
82
86
|
private _syncManifest;
|
|
83
87
|
private _getSavedEnv;
|
|
88
|
+
private _getSavedColorScheme;
|
|
84
89
|
}
|
|
85
90
|
//# sourceMappingURL=DevHostController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevHostController.d.ts","sourceRoot":"","sources":["../../src/dev/DevHostController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAe,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAExF,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAO5D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,CAAC;AAqBnD,qBAAa,iBAAiB;IAE5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAGtC,MAAM,EAAG,UAAU,CAAC;IAGpB,MAAM,EAAE,aAAa,EAAE,CAAM;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IACrC,UAAU,EAAE,MAAM,CAAqB;IACvC,WAAW,EAAE,WAAW,CAAS;IACjC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAuB;IACrD,GAAG,EAAE,WAAW,CAAC;IACjB,mBAAmB,EAAE,sBAAsB,EAAE,CAAM;IACnD,qBAAqB,EAAE,MAAM,EAAE,CAAM;IACrC,gBAAgB,EAAE,OAAO,CAAS;IAClC,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAU;IAC5E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IACrC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGjC,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,WAAW,CAAkC;IAGrD,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,KAAK,CAAsB;IAGnC,OAAO,CAAC,SAAS,CAAS;gBAGxB,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;QAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,EACD,QAAQ,EAAE,MAAM,IAAI,EACpB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"DevHostController.d.ts","sourceRoot":"","sources":["../../src/dev/DevHostController.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,6 +53,7 @@ export class DevHostController {
|
|
|
53
53
|
publishedExtensions = [];
|
|
54
54
|
installedExtensionIds = [];
|
|
55
55
|
sidebarCollapsed = false;
|
|
56
|
+
colorScheme = 'light';
|
|
56
57
|
publishState = 'idle';
|
|
57
58
|
publishMessage = null;
|
|
58
59
|
publishUrl = null;
|
|
@@ -76,6 +77,7 @@ export class DevHostController {
|
|
|
76
77
|
// Restore persisted state
|
|
77
78
|
this.env = this._getSavedEnv();
|
|
78
79
|
this.sidebarCollapsed = storageGet('rool-devhost:collapsed') === 'true';
|
|
80
|
+
this.colorScheme = this._getSavedColorScheme();
|
|
79
81
|
}
|
|
80
82
|
// ---------------------------------------------------------------------------
|
|
81
83
|
// Derived
|
|
@@ -338,6 +340,14 @@ export class DevHostController {
|
|
|
338
340
|
storageSet('rool-devhost:collapsed', String(this.sidebarCollapsed));
|
|
339
341
|
this._onChange();
|
|
340
342
|
}
|
|
343
|
+
toggleColorScheme() {
|
|
344
|
+
this.colorScheme = this.colorScheme === 'light' ? 'dark' : 'light';
|
|
345
|
+
storageSet('rool-devhost:colorScheme', this.colorScheme);
|
|
346
|
+
for (const host of Object.values(this.bridgeHosts)) {
|
|
347
|
+
host.setColorScheme(this.colorScheme);
|
|
348
|
+
}
|
|
349
|
+
this._onChange();
|
|
350
|
+
}
|
|
341
351
|
// ---------------------------------------------------------------------------
|
|
342
352
|
// Iframe registration (called by Svelte action)
|
|
343
353
|
// ---------------------------------------------------------------------------
|
|
@@ -358,11 +368,15 @@ export class DevHostController {
|
|
|
358
368
|
// ---------------------------------------------------------------------------
|
|
359
369
|
// Private helpers
|
|
360
370
|
// ---------------------------------------------------------------------------
|
|
371
|
+
get _bridgeUser() {
|
|
372
|
+
const cu = this.client.currentUser; // Always available after boot() authenticates
|
|
373
|
+
return { id: cu.id, name: cu.name, email: cu.email };
|
|
374
|
+
}
|
|
361
375
|
_bindBridge(tabId) {
|
|
362
376
|
const el = this.iframeEls[tabId];
|
|
363
377
|
const ch = this.channels[tabId];
|
|
364
378
|
if (el && ch && !this.bridgeHosts[tabId]) {
|
|
365
|
-
this.bridgeHosts[tabId] = createBridgeHost({ channel: ch, iframe: el });
|
|
379
|
+
this.bridgeHosts[tabId] = createBridgeHost({ channel: ch, iframe: el, user: this._bridgeUser, colorScheme: this.colorScheme });
|
|
366
380
|
}
|
|
367
381
|
}
|
|
368
382
|
_bindAllBridges() {
|
|
@@ -426,4 +440,11 @@ export class DevHostController {
|
|
|
426
440
|
return saved;
|
|
427
441
|
return 'prod';
|
|
428
442
|
}
|
|
443
|
+
_getSavedColorScheme() {
|
|
444
|
+
const saved = storageGet('rool-devhost:colorScheme');
|
|
445
|
+
if (saved === 'light' || saved === 'dark')
|
|
446
|
+
return saved;
|
|
447
|
+
// Fall back to OS preference
|
|
448
|
+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
449
|
+
}
|
|
429
450
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { onMount, tick } from 'svelte';
|
|
2
|
+
import { getContext, onMount, tick } from 'svelte';
|
|
3
3
|
import { DevHostController } from './DevHostController.js';
|
|
4
4
|
import type { ExtensionTab } from './DevHostController.js';
|
|
5
5
|
import type { Manifest } from '../manifest.js';
|
|
@@ -8,15 +8,15 @@
|
|
|
8
8
|
import Sidebar from './Sidebar.svelte';
|
|
9
9
|
import AppGrid from './AppGrid.svelte';
|
|
10
10
|
|
|
11
|
-
//
|
|
12
|
-
interface
|
|
11
|
+
// Static config injected via mount() context — not reactive, never changes
|
|
12
|
+
interface HostConfig {
|
|
13
13
|
channelId: string;
|
|
14
14
|
extensionUrl: string;
|
|
15
15
|
manifest: Manifest | null;
|
|
16
16
|
manifestError: string | null;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
const
|
|
19
|
+
const { channelId, extensionUrl, manifest, manifestError } = getContext<HostConfig>('hostConfig');
|
|
20
20
|
|
|
21
21
|
// ---------------------------------------------------------------------------
|
|
22
22
|
// Controller + reactive state mirror
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
let publishedExtensions: PublishedExtensionInfo[] = $state([]);
|
|
33
33
|
let installedExtensionIds: string[] = $state([]);
|
|
34
34
|
let tabs: ExtensionTab[] = $state([]);
|
|
35
|
+
let colorScheme: 'light' | 'dark' = $state('light');
|
|
35
36
|
let publishState: 'idle' | 'building' | 'uploading' | 'done' | 'error' = $state('idle');
|
|
36
37
|
let publishMessage: string | null = $state(null);
|
|
37
38
|
let publishUrl: string | null = $state(null);
|
|
@@ -40,7 +41,7 @@
|
|
|
40
41
|
let dropdownOpen: boolean = $state(false);
|
|
41
42
|
|
|
42
43
|
const controller = new DevHostController(
|
|
43
|
-
|
|
44
|
+
{ channelId, extensionUrl, manifest, manifestError },
|
|
44
45
|
syncState,
|
|
45
46
|
tick,
|
|
46
47
|
);
|
|
@@ -52,6 +53,7 @@
|
|
|
52
53
|
statusState = controller.statusState;
|
|
53
54
|
placeholderText = controller.placeholderText;
|
|
54
55
|
sidebarCollapsed = controller.sidebarCollapsed;
|
|
56
|
+
colorScheme = controller.colorScheme;
|
|
55
57
|
env = controller.env;
|
|
56
58
|
publishedExtensions = controller.publishedExtensions;
|
|
57
59
|
installedExtensionIds = controller.installedExtensionIds;
|
|
@@ -63,7 +65,7 @@
|
|
|
63
65
|
|
|
64
66
|
// Derived: published apps not yet installed (excluding the local dev app)
|
|
65
67
|
let uninstalledExtensions = $derived(
|
|
66
|
-
publishedExtensions.filter((ext) => ext.extensionId !==
|
|
68
|
+
publishedExtensions.filter((ext) => ext.extensionId !== channelId && !installedExtensionIds.includes(ext.extensionId)),
|
|
67
69
|
);
|
|
68
70
|
|
|
69
71
|
// Initial sync
|
|
@@ -89,14 +91,15 @@
|
|
|
89
91
|
<!-- Sidebar -->
|
|
90
92
|
<Sidebar
|
|
91
93
|
{controller}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
+
{manifest}
|
|
95
|
+
{manifestError}
|
|
94
96
|
{spaces}
|
|
95
97
|
{currentSpaceId}
|
|
96
98
|
{env}
|
|
97
99
|
{statusText}
|
|
98
100
|
{statusState}
|
|
99
101
|
{sidebarCollapsed}
|
|
102
|
+
{colorScheme}
|
|
100
103
|
{publishState}
|
|
101
104
|
{publishMessage}
|
|
102
105
|
{publishUrl}
|
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
interface Props {
|
|
3
|
-
channelId: string;
|
|
4
|
-
extensionUrl: string;
|
|
5
|
-
manifest: Manifest | null;
|
|
6
|
-
manifestError: string | null;
|
|
7
|
-
}
|
|
8
|
-
declare const HostShell: import("svelte").Component<Props, {}, "">;
|
|
1
|
+
declare const HostShell: import("svelte").Component<Record<string, never>, {}, "">;
|
|
9
2
|
type HostShell = ReturnType<typeof HostShell>;
|
|
10
3
|
export default HostShell;
|
|
11
4
|
//# sourceMappingURL=HostShell.svelte.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HostShell.svelte.d.ts","sourceRoot":"","sources":["../../src/dev/HostShell.svelte.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HostShell.svelte.d.ts","sourceRoot":"","sources":["../../src/dev/HostShell.svelte.ts"],"names":[],"mappings":"AAoHA,QAAA,MAAM,SAAS,2DAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
|
package/dist/dev/Sidebar.svelte
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
statusText: string;
|
|
16
16
|
statusState: 'ok' | 'loading' | 'off';
|
|
17
17
|
sidebarCollapsed: boolean;
|
|
18
|
+
colorScheme: 'light' | 'dark';
|
|
18
19
|
publishState: 'idle' | 'building' | 'uploading' | 'done' | 'error';
|
|
19
20
|
publishMessage: string | null;
|
|
20
21
|
publishUrl: string | null;
|
|
@@ -31,6 +32,7 @@
|
|
|
31
32
|
statusText,
|
|
32
33
|
statusState,
|
|
33
34
|
sidebarCollapsed,
|
|
35
|
+
colorScheme,
|
|
34
36
|
publishState,
|
|
35
37
|
publishMessage,
|
|
36
38
|
publishUrl,
|
|
@@ -272,13 +274,24 @@
|
|
|
272
274
|
<!-- Footer -->
|
|
273
275
|
<div class="px-4 py-3 mt-auto flex items-center justify-between">
|
|
274
276
|
<a
|
|
275
|
-
href="https://docs.rool.dev/
|
|
277
|
+
href="https://docs.rool.dev/extension"
|
|
276
278
|
target="_blank"
|
|
277
279
|
rel="noopener noreferrer"
|
|
278
280
|
class="text-[11px] text-slate-400 hover:text-indigo-500 transition-colors"
|
|
279
281
|
>
|
|
280
282
|
Documentation
|
|
281
283
|
</a>
|
|
284
|
+
<button
|
|
285
|
+
class="p-1 text-slate-400 hover:text-indigo-500 transition-colors"
|
|
286
|
+
onclick={() => controller.toggleColorScheme()}
|
|
287
|
+
title={colorScheme === 'light' ? 'Switch to dark mode' : 'Switch to light mode'}
|
|
288
|
+
>
|
|
289
|
+
{#if colorScheme === 'light'}
|
|
290
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>
|
|
291
|
+
{:else}
|
|
292
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg>
|
|
293
|
+
{/if}
|
|
294
|
+
</button>
|
|
282
295
|
<button
|
|
283
296
|
class="text-[11px] text-slate-400 hover:text-red-500 transition-colors"
|
|
284
297
|
onclick={() => controller.logout()}
|
|
@@ -11,6 +11,7 @@ interface Props {
|
|
|
11
11
|
statusText: string;
|
|
12
12
|
statusState: 'ok' | 'loading' | 'off';
|
|
13
13
|
sidebarCollapsed: boolean;
|
|
14
|
+
colorScheme: 'light' | 'dark';
|
|
14
15
|
publishState: 'idle' | 'building' | 'uploading' | 'done' | 'error';
|
|
15
16
|
publishMessage: string | null;
|
|
16
17
|
publishUrl: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar.svelte.d.ts","sourceRoot":"","sources":["../../src/dev/Sidebar.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI1D,UAAU,KAAK;IACb,UAAU,EAAE,iBAAiB,CAAC;IAE9B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,GAAG,EAAE,WAAW,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,IAAI,GAAG,SAAS,GAAG,KAAK,CAAC;IACtC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;IACnE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"Sidebar.svelte.d.ts","sourceRoot":"","sources":["../../src/dev/Sidebar.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI1D,UAAU,KAAK;IACb,UAAU,EAAE,iBAAiB,CAAC;IAE9B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,GAAG,EAAE,WAAW,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,IAAI,GAAG,SAAS,GAAG,KAAK,CAAC;IACtC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;IACnE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;CACvB;AAsOH,QAAA,MAAM,OAAO,uDAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
|
package/dist/dev/app.css
CHANGED