@lapis-notes/workspace 0.1.0

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.
Files changed (28) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE.md +4 -0
  3. package/README.md +36 -0
  4. package/dist/WorkspaceShell.svelte +59 -0
  5. package/dist/WorkspaceShell.svelte.d.ts +14 -0
  6. package/dist/index.d.ts +6 -0
  7. package/dist/index.js +5 -0
  8. package/dist/plugin-management/CommunityPluginsSettingsPage.svelte +182 -0
  9. package/dist/plugin-management/CommunityPluginsSettingsPage.svelte.d.ts +5 -0
  10. package/dist/plugin-management/CorePluginsSettingsPage.svelte +111 -0
  11. package/dist/plugin-management/CorePluginsSettingsPage.svelte.d.ts +5 -0
  12. package/dist/plugin-management/PluginReadmeRenderer.svelte +47 -0
  13. package/dist/plugin-management/PluginReadmeRenderer.svelte.d.ts +9 -0
  14. package/dist/plugin-management/PluginRegistrySettingsPage.svelte +751 -0
  15. package/dist/plugin-management/PluginRegistrySettingsPage.svelte.d.ts +5 -0
  16. package/dist/plugin-management/PluginSettingsRow.svelte +152 -0
  17. package/dist/plugin-management/PluginSettingsRow.svelte.d.ts +24 -0
  18. package/dist/plugin-management/plugin-management-context.svelte.d.ts +15 -0
  19. package/dist/plugin-management/plugin-management-context.svelte.js +24 -0
  20. package/dist/plugin-management/plugin-management.css +477 -0
  21. package/dist/plugin-management/plugin-readme.d.ts +26 -0
  22. package/dist/plugin-management/plugin-readme.js +34 -0
  23. package/dist/plugin-management/plugin-settings-navigation.d.ts +8 -0
  24. package/dist/plugin-management/plugin-settings-navigation.js +37 -0
  25. package/dist/plugin-management/register-plugin-management-settings.d.ts +3 -0
  26. package/dist/plugin-management/register-plugin-management-settings.js +95 -0
  27. package/dist/workspace-shell.css +18 -0
  28. package/package.json +69 -0
@@ -0,0 +1,5 @@
1
+ import type { WorkspaceSettingsPageProps } from "@lapismd/design-core/workspace/settings";
2
+ import "./plugin-management.css";
3
+ declare const PluginRegistrySettingsPage: import("svelte").Component<WorkspaceSettingsPageProps, {}, "">;
4
+ type PluginRegistrySettingsPage = ReturnType<typeof PluginRegistrySettingsPage>;
5
+ export default PluginRegistrySettingsPage;
@@ -0,0 +1,152 @@
1
+ <script lang="ts">
2
+ import ChevronRight from "@lucide/svelte/icons/chevron-right";
3
+ import RotateCw from "@lucide/svelte/icons/rotate-cw";
4
+ import Settings from "@lucide/svelte/icons/settings";
5
+ import * as Badge from "@lapismd/design-core/shadcn/badge";
6
+ import * as Button from "@lapismd/design-core/shadcn/button";
7
+ import * as Collapsible from "@lapismd/design-core/shadcn/collapsible";
8
+ import * as Switch from "@lapismd/design-core/shadcn/switch";
9
+
10
+ let {
11
+ pluginId,
12
+ name,
13
+ description,
14
+ version,
15
+ provenance,
16
+ status,
17
+ error,
18
+ enabled,
19
+ required = false,
20
+ restartRequired = false,
21
+ expanded = $bindable(false),
22
+ hasOptions = false,
23
+ diagnostics = [],
24
+ onOptions,
25
+ onRestart,
26
+ onToggle,
27
+ }: {
28
+ pluginId: string;
29
+ name: string;
30
+ description?: string;
31
+ version?: string;
32
+ provenance?: string;
33
+ status?: string;
34
+ error?: string;
35
+ enabled: boolean;
36
+ required?: boolean;
37
+ restartRequired?: boolean;
38
+ expanded?: boolean;
39
+ hasOptions?: boolean;
40
+ diagnostics?: readonly { label: string; value: string }[];
41
+ onOptions?(): void;
42
+ onRestart?(): void | Promise<void>;
43
+ onToggle?(enabled: boolean): void | Promise<void>;
44
+ } = $props();
45
+
46
+ let busy = $state(false);
47
+
48
+ async function toggle(next: boolean): Promise<void> {
49
+ if (!onToggle || busy || required) return;
50
+ busy = true;
51
+ try {
52
+ await onToggle(next);
53
+ } finally {
54
+ busy = false;
55
+ }
56
+ }
57
+
58
+ async function restart(): Promise<void> {
59
+ if (!onRestart || busy) return;
60
+ busy = true;
61
+ try {
62
+ await onRestart();
63
+ } finally {
64
+ busy = false;
65
+ }
66
+ }
67
+ </script>
68
+
69
+ <Collapsible.Root bind:open={expanded}>
70
+ <article
71
+ class="lapis-plugin-settings-row"
72
+ data-ui-component="lapis-plugin-settings-row"
73
+ data-settings-plugin-id={pluginId}
74
+ data-settings-search-target="plugin-row"
75
+ >
76
+ <Collapsible.Trigger
77
+ class="lapis-plugin-settings-row__disclosure"
78
+ aria-label={`${expanded ? "Collapse" : "Expand"} ${name} details`}
79
+ >
80
+ <ChevronRight class="lapis-plugin-management__icon" aria-hidden="true" />
81
+ </Collapsible.Trigger>
82
+
83
+ <div class="lapis-plugin-settings-row__content">
84
+ <div class="lapis-plugin-settings-row__title-line">
85
+ <h2>{name}</h2>
86
+ {#if required}<Badge.Badge variant="outline">Required</Badge.Badge>{/if}
87
+ {#if restartRequired}
88
+ <Badge.Badge variant="outline">Restart required</Badge.Badge>
89
+ {/if}
90
+ </div>
91
+ {#if description}
92
+ <p class="lapis-plugin-settings-row__description">{description}</p>
93
+ {/if}
94
+ <div class="lapis-plugin-settings-row__summary">
95
+ <span>ID {pluginId}</span>
96
+ {#if version}<span>Version {version}</span>{/if}
97
+ {#if provenance}<span>{provenance}</span>{/if}
98
+ {#if status}<span>{status}</span>{/if}
99
+ </div>
100
+ </div>
101
+
102
+ <div class="lapis-plugin-settings-row__actions">
103
+ {#if hasOptions && onOptions}
104
+ <Button.Root
105
+ variant="ghost"
106
+ size="icon"
107
+ aria-label={`Options for ${name}`}
108
+ title="Options"
109
+ onclick={onOptions}
110
+ >
111
+ <Settings class="lapis-plugin-management__icon" />
112
+ </Button.Root>
113
+ {/if}
114
+ {#if onRestart}
115
+ <Button.Root
116
+ variant="ghost"
117
+ size="icon"
118
+ aria-label={`Restart ${name}`}
119
+ title="Restart"
120
+ disabled={busy}
121
+ onclick={() => void restart()}
122
+ >
123
+ <RotateCw class="lapis-plugin-management__icon" />
124
+ </Button.Root>
125
+ {/if}
126
+ <Switch.Root
127
+ checked={enabled}
128
+ disabled={required || busy || !onToggle}
129
+ aria-label={`${enabled ? "Disable" : "Enable"} ${name}`}
130
+ onCheckedChange={(checked) => void toggle(checked)}
131
+ />
132
+ </div>
133
+
134
+ <Collapsible.Content class="lapis-plugin-settings-row__details">
135
+ {#if error}
136
+ <p class="lapis-plugin-settings-row__error">{error}</p>
137
+ {/if}
138
+ {#if diagnostics.length}
139
+ <dl>
140
+ {#each diagnostics as diagnostic}
141
+ <div>
142
+ <dt>{diagnostic.label}</dt>
143
+ <dd>{diagnostic.value}</dd>
144
+ </div>
145
+ {/each}
146
+ </dl>
147
+ {:else if !error}
148
+ <p>No additional diagnostics reported.</p>
149
+ {/if}
150
+ </Collapsible.Content>
151
+ </article>
152
+ </Collapsible.Root>
@@ -0,0 +1,24 @@
1
+ type $$ComponentProps = {
2
+ pluginId: string;
3
+ name: string;
4
+ description?: string;
5
+ version?: string;
6
+ provenance?: string;
7
+ status?: string;
8
+ error?: string;
9
+ enabled: boolean;
10
+ required?: boolean;
11
+ restartRequired?: boolean;
12
+ expanded?: boolean;
13
+ hasOptions?: boolean;
14
+ diagnostics?: readonly {
15
+ label: string;
16
+ value: string;
17
+ }[];
18
+ onOptions?(): void;
19
+ onRestart?(): void | Promise<void>;
20
+ onToggle?(enabled: boolean): void | Promise<void>;
21
+ };
22
+ declare const PluginSettingsRow: import("svelte").Component<$$ComponentProps, {}, "expanded">;
23
+ type PluginSettingsRow = ReturnType<typeof PluginSettingsRow>;
24
+ export default PluginSettingsRow;
@@ -0,0 +1,15 @@
1
+ import type { App } from "@lapis-notes/api";
2
+ import type { WorkspaceSettingsController } from "@lapismd/design-core/workspace/settings";
3
+ export declare class PluginManagementRevealState {
4
+ sectionId: string;
5
+ entryId: string;
6
+ revision: number;
7
+ request(sectionId: string, entryId: string): void;
8
+ }
9
+ export interface PluginManagementContext {
10
+ app: App;
11
+ reveal: PluginManagementRevealState;
12
+ }
13
+ export declare function setPluginManagementContext(controller: WorkspaceSettingsController, context: PluginManagementContext): void;
14
+ export declare function clearPluginManagementContext(controller: WorkspaceSettingsController): void;
15
+ export declare function getPluginManagementContext(controller: WorkspaceSettingsController): PluginManagementContext;
@@ -0,0 +1,24 @@
1
+ export class PluginManagementRevealState {
2
+ sectionId = $state("");
3
+ entryId = $state("");
4
+ revision = $state(0);
5
+ request(sectionId, entryId) {
6
+ this.sectionId = sectionId;
7
+ this.entryId = entryId;
8
+ this.revision += 1;
9
+ }
10
+ }
11
+ const contexts = new WeakMap();
12
+ export function setPluginManagementContext(controller, context) {
13
+ contexts.set(controller, context);
14
+ }
15
+ export function clearPluginManagementContext(controller) {
16
+ contexts.delete(controller);
17
+ }
18
+ export function getPluginManagementContext(controller) {
19
+ const context = contexts.get(controller);
20
+ if (!context) {
21
+ throw new Error("Plugin management settings are not bound to this app.");
22
+ }
23
+ return context;
24
+ }
@@ -0,0 +1,477 @@
1
+ [data-ui-component="lapis-plugin-management"] {
2
+ --ui-lapis-plugin-surface: var(
3
+ --ui-workspace-panel,
4
+ var(--ui-workspace-background, var(--background))
5
+ );
6
+ --ui-lapis-plugin-muted-surface: var(
7
+ --ui-workspace-muted,
8
+ var(--muted)
9
+ );
10
+ --ui-lapis-plugin-foreground: var(
11
+ --ui-workspace-foreground,
12
+ var(--foreground)
13
+ );
14
+ --ui-lapis-plugin-muted-foreground: var(
15
+ --ui-workspace-muted-foreground,
16
+ var(--muted-foreground)
17
+ );
18
+ --ui-lapis-plugin-border: var(--ui-workspace-border, var(--border));
19
+ --ui-lapis-plugin-accent: var(
20
+ --ui-workspace-accent,
21
+ var(--interactive-accent, var(--primary))
22
+ );
23
+ --ui-lapis-plugin-hover: var(
24
+ --ui-workspace-panel-action-hover-background,
25
+ var(--background-modifier-hover, var(--accent))
26
+ );
27
+ --ui-lapis-plugin-radius: var(--ui-workspace-radius-medium, var(--radius));
28
+ box-sizing: border-box;
29
+ display: flex;
30
+ min-width: 0;
31
+ flex-direction: column;
32
+ gap: 1rem;
33
+ padding: 0.75rem 0.5rem;
34
+ color: var(--ui-lapis-plugin-foreground);
35
+ }
36
+
37
+ .lapis-plugin-management__header,
38
+ .lapis-plugin-management__trust {
39
+ display: flex;
40
+ flex-wrap: wrap;
41
+ align-items: flex-start;
42
+ justify-content: space-between;
43
+ gap: 0.75rem;
44
+ }
45
+
46
+ .lapis-plugin-management__header h1,
47
+ .lapis-plugin-management__trust h1,
48
+ .lapis-plugin-card h2,
49
+ .lapis-plugin-registry-card h2,
50
+ .lapis-plugin-settings-row h2,
51
+ .lapis-plugin-detail-dialog h2 {
52
+ margin: 0;
53
+ color: var(--ui-lapis-plugin-foreground);
54
+ font-size: 0.95rem;
55
+ font-weight: 650;
56
+ line-height: 1.35;
57
+ }
58
+
59
+ .lapis-plugin-management__header p,
60
+ .lapis-plugin-management__trust p,
61
+ .lapis-plugin-card p,
62
+ .lapis-plugin-registry-card p,
63
+ .lapis-plugin-settings-row p,
64
+ .lapis-plugin-detail-dialog p {
65
+ margin: 0.25rem 0 0;
66
+ color: var(--ui-lapis-plugin-muted-foreground);
67
+ font-size: 0.8125rem;
68
+ line-height: 1.5;
69
+ }
70
+
71
+ .lapis-plugin-management__actions,
72
+ .lapis-plugin-card__actions,
73
+ .lapis-plugin-card__badges,
74
+ .lapis-plugin-settings-row__actions,
75
+ .lapis-plugin-settings-row__title-line,
76
+ .lapis-plugin-settings-row__summary,
77
+ .lapis-plugin-registry-card__metadata,
78
+ .lapis-plugin-detail-dialog__metadata > div {
79
+ display: flex;
80
+ flex-wrap: wrap;
81
+ align-items: center;
82
+ gap: 0.5rem;
83
+ }
84
+
85
+ .lapis-plugin-management__icon {
86
+ width: 1rem;
87
+ height: 1rem;
88
+ }
89
+
90
+ .lapis-plugin-management__small-icon {
91
+ width: 0.875rem;
92
+ height: 0.875rem;
93
+ }
94
+
95
+ .lapis-plugin-management__icon[data-spinning="true"] {
96
+ animation: lapis-plugin-spin 1s linear infinite;
97
+ }
98
+
99
+ @keyframes lapis-plugin-spin {
100
+ to {
101
+ transform: rotate(360deg);
102
+ }
103
+ }
104
+
105
+ .lapis-plugin-management__rows,
106
+ .lapis-plugin-registry__tabs,
107
+ .lapis-plugin-registry__browse {
108
+ display: flex;
109
+ min-width: 0;
110
+ flex-direction: column;
111
+ gap: 0.625rem;
112
+ }
113
+
114
+ .lapis-plugin-management__empty {
115
+ padding: 1rem 0.5rem;
116
+ color: var(--ui-lapis-plugin-muted-foreground);
117
+ font-size: 0.8125rem;
118
+ }
119
+
120
+ .lapis-plugin-management__trust {
121
+ border: 1px solid var(--ui-lapis-plugin-border);
122
+ border-radius: var(--ui-lapis-plugin-radius);
123
+ padding: 0.875rem;
124
+ background: var(--ui-lapis-plugin-muted-surface);
125
+ }
126
+
127
+ .lapis-plugin-settings-row,
128
+ .lapis-plugin-card {
129
+ display: grid;
130
+ min-width: 0;
131
+ grid-template-columns: auto minmax(0, 1fr) auto;
132
+ align-items: start;
133
+ gap: 0.75rem;
134
+ border: 1px solid var(--ui-lapis-plugin-border);
135
+ border-radius: var(--ui-lapis-plugin-radius);
136
+ padding: 0.75rem;
137
+ background: var(--ui-lapis-plugin-surface);
138
+ }
139
+
140
+ .lapis-plugin-settings-row__disclosure {
141
+ display: inline-grid;
142
+ width: 1.75rem;
143
+ height: 1.75rem;
144
+ place-items: center;
145
+ border: 0;
146
+ border-radius: var(--ui-workspace-radius-small, 0.25rem);
147
+ color: var(--ui-lapis-plugin-muted-foreground);
148
+ background: transparent;
149
+ cursor: pointer;
150
+ }
151
+
152
+ .lapis-plugin-settings-row__disclosure:hover,
153
+ .lapis-plugin-settings-row__disclosure:focus-visible {
154
+ color: var(--ui-lapis-plugin-foreground);
155
+ background: var(--ui-lapis-plugin-hover);
156
+ }
157
+
158
+ [data-ui-component="collapsible"][data-state="open"]
159
+ .lapis-plugin-settings-row__disclosure
160
+ svg {
161
+ transform: rotate(90deg);
162
+ }
163
+
164
+ .lapis-plugin-settings-row__disclosure svg {
165
+ transition: transform 140ms ease;
166
+ }
167
+
168
+ .lapis-plugin-settings-row__content,
169
+ .lapis-plugin-card__content,
170
+ .lapis-plugin-registry-card__content {
171
+ min-width: 0;
172
+ }
173
+
174
+ .lapis-plugin-settings-row__description,
175
+ .lapis-plugin-card p,
176
+ .lapis-plugin-registry-card > div > p {
177
+ overflow: hidden;
178
+ display: -webkit-box;
179
+ -webkit-box-orient: vertical;
180
+ -webkit-line-clamp: 2;
181
+ }
182
+
183
+ .lapis-plugin-settings-row__summary,
184
+ .lapis-plugin-registry-card__metadata {
185
+ margin-top: 0.5rem;
186
+ color: var(--ui-lapis-plugin-muted-foreground);
187
+ font-size: 0.75rem;
188
+ }
189
+
190
+ .lapis-plugin-settings-row__details {
191
+ grid-column: 2 / -1;
192
+ border-top: 1px solid var(--ui-lapis-plugin-border);
193
+ padding-top: 0.75rem;
194
+ color: var(--ui-lapis-plugin-muted-foreground);
195
+ font-size: 0.75rem;
196
+ }
197
+
198
+ .lapis-plugin-settings-row__details dl {
199
+ display: grid;
200
+ gap: 0.375rem;
201
+ margin: 0;
202
+ }
203
+
204
+ .lapis-plugin-settings-row__details dl > div {
205
+ display: grid;
206
+ grid-template-columns: minmax(7rem, 0.3fr) minmax(0, 1fr);
207
+ gap: 0.75rem;
208
+ }
209
+
210
+ .lapis-plugin-settings-row__details dt {
211
+ font-weight: 600;
212
+ color: var(--ui-lapis-plugin-foreground);
213
+ }
214
+
215
+ .lapis-plugin-settings-row__details dd {
216
+ min-width: 0;
217
+ margin: 0;
218
+ overflow-wrap: anywhere;
219
+ }
220
+
221
+ .lapis-plugin-settings-row__error {
222
+ color: var(--ui-workspace-destructive, var(--destructive));
223
+ }
224
+
225
+ .lapis-plugin-card {
226
+ grid-template-columns: minmax(0, 1fr) auto;
227
+ }
228
+
229
+ .lapis-plugin-card__badges {
230
+ margin-top: 0.5rem;
231
+ gap: 0.375rem;
232
+ }
233
+
234
+ .lapis-plugin-registry__tab-list {
235
+ display: flex;
236
+ width: 100%;
237
+ justify-content: flex-start;
238
+ gap: 0;
239
+ border: 0;
240
+ border-bottom: 1px solid var(--ui-lapis-plugin-border);
241
+ border-radius: 0;
242
+ padding: 0;
243
+ background: transparent;
244
+ }
245
+
246
+ .lapis-plugin-registry__tab-list.lapis-plugin-registry__tab-list
247
+ .lapis-plugin-registry__tab {
248
+ border: 0;
249
+ border-bottom: 2px solid transparent;
250
+ border-radius: 0;
251
+ padding: 0.5rem 1rem;
252
+ background: transparent;
253
+ box-shadow: none;
254
+ font-size: 0.6875rem;
255
+ font-weight: 650;
256
+ letter-spacing: 0.06em;
257
+ text-transform: uppercase;
258
+ color: var(--ui-lapis-plugin-foreground) !important;
259
+ }
260
+
261
+ .lapis-plugin-registry__tab-list
262
+ [data-ui-component="tabs-trigger"][data-state="active"] {
263
+ border-bottom-color: var(--ui-lapis-plugin-accent);
264
+ }
265
+
266
+ .lapis-plugin-registry__grid {
267
+ display: grid;
268
+ min-width: 0;
269
+ grid-template-columns: repeat(auto-fit, minmax(min(18rem, 100%), 1fr));
270
+ gap: 0.625rem;
271
+ }
272
+
273
+ .lapis-plugin-registry-card {
274
+ display: grid;
275
+ min-width: 0;
276
+ min-height: 8rem;
277
+ grid-template-columns: 2.25rem minmax(0, 1fr);
278
+ gap: 0.75rem;
279
+ border: 1px solid var(--ui-lapis-plugin-border);
280
+ border-radius: var(--ui-lapis-plugin-radius);
281
+ padding: 0.75rem;
282
+ background: var(--ui-lapis-plugin-surface);
283
+ }
284
+
285
+ .lapis-plugin-registry-card__icon {
286
+ display: grid;
287
+ width: 2.25rem;
288
+ height: 2.25rem;
289
+ place-items: center;
290
+ border: 1px solid var(--ui-lapis-plugin-border);
291
+ border-radius: var(--ui-workspace-radius-small, 0.25rem);
292
+ color: var(--ui-lapis-plugin-muted-foreground);
293
+ background: var(--ui-lapis-plugin-muted-surface);
294
+ }
295
+
296
+ .lapis-plugin-registry-card__title {
297
+ display: flex;
298
+ min-width: 0;
299
+ align-items: flex-start;
300
+ justify-content: space-between;
301
+ gap: 0.5rem;
302
+ }
303
+
304
+ .lapis-plugin-registry-card__title h2 {
305
+ overflow: hidden;
306
+ text-overflow: ellipsis;
307
+ white-space: nowrap;
308
+ }
309
+
310
+ .lapis-plugin-registry-card__metadata span {
311
+ display: inline-flex;
312
+ align-items: center;
313
+ gap: 0.25rem;
314
+ }
315
+
316
+ .lapis-plugin-registry-card .lapis-plugin-card__actions {
317
+ justify-content: flex-end;
318
+ margin-top: 0.75rem;
319
+ }
320
+
321
+ .lapis-plugin-detail-dialog {
322
+ width: min(90vw, 68.75rem);
323
+ max-width: min(90vw, 68.75rem);
324
+ height: min(85vh, 62.5rem);
325
+ max-height: min(85vh, 62.5rem);
326
+ overflow: hidden;
327
+ padding: 0;
328
+ }
329
+
330
+ .lapis-plugin-detail-dialog__layout,
331
+ .lapis-plugin-detail-dialog__detail,
332
+ .lapis-plugin-detail-dialog__results {
333
+ display: flex;
334
+ width: 100%;
335
+ height: 100%;
336
+ min-width: 0;
337
+ min-height: 0;
338
+ flex-direction: column;
339
+ }
340
+
341
+ .lapis-plugin-detail-dialog__header,
342
+ .lapis-plugin-detail-dialog__metadata,
343
+ .lapis-plugin-detail-dialog__results > header {
344
+ flex: 0 0 auto;
345
+ border-bottom: 1px solid var(--ui-lapis-plugin-border);
346
+ padding: 1rem 1.5rem;
347
+ }
348
+
349
+ .lapis-plugin-detail-dialog__header {
350
+ display: flex;
351
+ align-items: flex-start;
352
+ justify-content: space-between;
353
+ gap: 1rem;
354
+ padding-right: 3rem;
355
+ }
356
+
357
+ .lapis-plugin-detail-dialog__panes {
358
+ min-height: 0;
359
+ flex: 1 1 auto;
360
+ }
361
+
362
+ .lapis-plugin-detail-dialog__results {
363
+ border-right: 1px solid var(--ui-lapis-plugin-border);
364
+ }
365
+
366
+ .lapis-plugin-detail-dialog__results > header {
367
+ display: flex;
368
+ flex-direction: column;
369
+ gap: 0.25rem;
370
+ padding: 0.75rem 1rem;
371
+ font-size: 0.75rem;
372
+ }
373
+
374
+ .lapis-plugin-detail-dialog__results > header span {
375
+ color: var(--ui-lapis-plugin-muted-foreground);
376
+ }
377
+
378
+ .lapis-plugin-detail-dialog__result-list,
379
+ .lapis-plugin-detail-dialog__readme {
380
+ min-height: 0;
381
+ flex: 1 1 auto;
382
+ overflow: auto;
383
+ padding: 0.5rem;
384
+ }
385
+
386
+ .lapis-plugin-detail-dialog__result-list {
387
+ display: flex;
388
+ flex-direction: column;
389
+ gap: 0.25rem;
390
+ }
391
+
392
+ .lapis-plugin-detail-dialog__result-list button {
393
+ display: flex;
394
+ min-width: 0;
395
+ flex-direction: column;
396
+ gap: 0.25rem;
397
+ border: 1px solid transparent;
398
+ border-radius: var(--ui-workspace-radius-small, 0.25rem);
399
+ padding: 0.5rem 0.75rem;
400
+ color: var(--ui-lapis-plugin-muted-foreground);
401
+ background: transparent;
402
+ text-align: left;
403
+ cursor: pointer;
404
+ }
405
+
406
+ .lapis-plugin-detail-dialog__result-list button:hover,
407
+ .lapis-plugin-detail-dialog__result-list button[data-active="true"] {
408
+ color: var(--ui-lapis-plugin-foreground);
409
+ background: var(--ui-lapis-plugin-hover);
410
+ }
411
+
412
+ .lapis-plugin-detail-dialog__result-list button[data-active="true"] {
413
+ border-color: var(--ui-lapis-plugin-accent);
414
+ }
415
+
416
+ .lapis-plugin-detail-dialog__result-list button span {
417
+ overflow: hidden;
418
+ text-overflow: ellipsis;
419
+ white-space: nowrap;
420
+ font-size: 0.75rem;
421
+ }
422
+
423
+ .lapis-plugin-detail-dialog__result-list button small {
424
+ font-size: 0.6875rem;
425
+ }
426
+
427
+ .lapis-plugin-detail-dialog__metadata {
428
+ display: flex;
429
+ flex-direction: column;
430
+ gap: 0.75rem;
431
+ }
432
+
433
+ .lapis-plugin-detail-dialog__metadata > div:first-child {
434
+ color: var(--ui-lapis-plugin-muted-foreground);
435
+ font-size: 0.75rem;
436
+ }
437
+
438
+ .lapis-plugin-detail-dialog__readme {
439
+ padding: 1.5rem;
440
+ }
441
+
442
+ .lapis-plugin-readme {
443
+ min-height: 100%;
444
+ color: var(--ui-lapis-plugin-foreground);
445
+ font-size: 0.8125rem;
446
+ line-height: 1.6;
447
+ }
448
+
449
+ .lapis-plugin-readme img,
450
+ .lapis-plugin-readme pre,
451
+ .lapis-plugin-readme table {
452
+ max-width: 100%;
453
+ }
454
+
455
+ @media (max-width: 48rem) {
456
+ .lapis-plugin-settings-row,
457
+ .lapis-plugin-card {
458
+ grid-template-columns: auto minmax(0, 1fr);
459
+ }
460
+
461
+ .lapis-plugin-settings-row__actions,
462
+ .lapis-plugin-card__actions {
463
+ grid-column: 2;
464
+ justify-content: flex-start;
465
+ }
466
+
467
+ .lapis-plugin-detail-dialog {
468
+ width: calc(100vw - 1rem);
469
+ max-width: calc(100vw - 1rem);
470
+ }
471
+ }
472
+
473
+ @media (prefers-reduced-motion: reduce) {
474
+ .lapis-plugin-management__icon[data-spinning="true"] {
475
+ animation: none;
476
+ }
477
+ }