@webship.co/workspace 0.0.0-stage → 1.0.0-alpha1
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/PLUGINS.md +249 -0
- package/README.md +379 -2
- package/WORKSPACES.md +69 -0
- package/actions/ai-items.js +293 -0
- package/actions/audio.js +48 -0
- package/actions/build-order.js +79 -0
- package/actions/checks.js +95 -0
- package/actions/claude-session.js +104 -0
- package/actions/commands-center.js +258 -0
- package/actions/composer.js +267 -0
- package/actions/ddev-addons.js +90 -0
- package/actions/ddev-mail.js +80 -0
- package/actions/ddev.js +237 -0
- package/actions/folders.js +165 -0
- package/actions/graphs.js +107 -0
- package/actions/images-svg.js +33 -0
- package/actions/images.js +145 -0
- package/actions/navigation.js +190 -0
- package/actions/node.js +222 -0
- package/actions/notes.js +55 -0
- package/actions/obsidian.js +59 -0
- package/actions/plugins.js +36 -0
- package/actions/project-make.js +28 -0
- package/actions/rag.js +202 -0
- package/actions/row-actions.js +262 -0
- package/actions/screens.js +270 -0
- package/actions/testing.js +121 -0
- package/actions/video-edit.js +54 -0
- package/ai-inventory.js +182 -0
- package/ai-items.js +202 -0
- package/assistant-cast.js +176 -0
- package/assistant-suggestions.js +91 -0
- package/assistant.js +484 -0
- package/audio-voice.js +528 -0
- package/auth-google.js +260 -0
- package/build-ai.js +52 -0
- package/build-order-page.js +191 -0
- package/build-order.js +313 -0
- package/builder-args.js +117 -0
- package/changelog.js +302 -0
- package/chat-threads.js +134 -0
- package/checks.js +105 -0
- package/claude-args.js +282 -0
- package/claude-sessions.js +129 -0
- package/command-author.js +117 -0
- package/command-block.js +20 -0
- package/commands/defaults.yml +159 -0
- package/commands-page.js +460 -0
- package/commands.js +568 -0
- package/cucumber.js +43 -0
- package/ddev-addons-page.js +124 -0
- package/ddev-addons.js +154 -0
- package/ddev-custom-commands.js +96 -0
- package/ddev-domains.js +84 -0
- package/ddev-import.js +93 -0
- package/ddev-mail-page.js +167 -0
- package/ddev-mail.js +110 -0
- package/ddev-options.js +145 -0
- package/ddev-snapshots.js +126 -0
- package/ddev.js +145 -0
- package/docs/DEVELOPER-GUIDE.md +224 -0
- package/docs/README.md +252 -0
- package/docs/REFERENCE.md +684 -0
- package/docs/USER-GUIDE.md +697 -0
- package/docs/screenshots/assistant/avatar-board.png +0 -0
- package/docs/screenshots/assistant/avatar-coffee.png +0 -0
- package/docs/screenshots/assistant/avatar-colours.png +0 -0
- package/docs/screenshots/assistant/avatar-icons.png +0 -0
- package/docs/screenshots/assistant/avatar-moves.png +0 -0
- package/docs/screenshots/assistant/avatar-pick-cookieman.png +0 -0
- package/docs/screenshots/assistant/avatar-settings-voices.png +0 -0
- package/docs/screenshots/assistant/avatar-status.png +0 -0
- package/docs/screenshots/create-card/create-card.png +0 -0
- package/docs/screenshots/create-card/start-ai.png +0 -0
- package/docs/screenshots/guide-clone-address.png +0 -0
- package/docs/screenshots/guide-clone-worktree-off.png +0 -0
- package/docs/screenshots/guide-clone-worktree-on.png +0 -0
- package/docs/screenshots/guide-ddev-menu.png +0 -0
- package/docs/screenshots/guide-domains.png +0 -0
- package/docs/screenshots/guide-home.png +0 -0
- package/docs/screenshots/guide-ide-menu.png +0 -0
- package/docs/screenshots/guide-remove-refusal.png +0 -0
- package/docs/screenshots/guide-rows-worktree.png +0 -0
- package/docs/screenshots/guide-screens.png +0 -0
- package/docs/screenshots/guide-settings.png +0 -0
- package/docs/screenshots/guide-workspace-page.png +0 -0
- package/docs/screenshots/home/card-settings.png +0 -0
- package/docs/screenshots/home/drag-reorder.png +0 -0
- package/docs/screenshots/home/edit-card.png +0 -0
- package/docs/screenshots/images/claude-code-image.png +0 -0
- package/docs/screenshots/images/edit-with-ai.png +0 -0
- package/docs/screenshots/images/gallery.png +0 -0
- package/docs/screenshots/images/generate-description.png +0 -0
- package/docs/screenshots/images/generate-plan.png +0 -0
- package/docs/screenshots/images/providers.png +0 -0
- package/docs/screenshots/images/svg-form.png +0 -0
- package/docs/screenshots/images/svg-result.png +0 -0
- package/docs/screenshots/images/upload.png +0 -0
- package/docs/screenshots/new-folder/2-form.png +0 -0
- package/docs/screenshots/new-folder/8-ddev-options.png +0 -0
- package/docs/screenshots/new-folder/files-folder.png +0 -0
- package/docs/screenshots/projects/ddev-custom-commands.png +0 -0
- package/docs/screenshots/projects/state-chip-stop.png +0 -0
- package/docs/screenshots/readme/dashboard-dark.png +0 -0
- package/docs/screenshots/readme/dashboard-light.png +0 -0
- package/docs/screenshots/readme/dev-dark.png +0 -0
- package/docs/screenshots/readme/dev-light.png +0 -0
- package/docs/screenshots/readme/docs-dark.png +0 -0
- package/docs/screenshots/readme/docs-light.png +0 -0
- package/docs/screenshots/readme/icons/ai.svg +4 -0
- package/docs/screenshots/readme/icons/code.svg +4 -0
- package/docs/screenshots/readme/icons/docs.svg +4 -0
- package/docs/screenshots/readme/icons/services.svg +4 -0
- package/docs/screenshots/readme/icons/sites.svg +4 -0
- package/docs/screenshots/readme/test-report-dark.png +0 -0
- package/docs/screenshots/readme/test-report-light.png +0 -0
- package/docs/screenshots/readme/test-scenarios.png +0 -0
- package/docs/screenshots/readme/test-steps.png +0 -0
- package/docs/screenshots/readme/videos-dark.png +0 -0
- package/docs/screenshots/readme/videos-light.png +0 -0
- package/docs/screenshots/screens-menu.png +0 -0
- package/docs/screenshots/screens-new.png +0 -0
- package/docs/screenshots/settings/auth-google-lists.png +0 -0
- package/docs/screenshots/settings/delete-1-row.png +0 -0
- package/docs/screenshots/settings/delete-2-confirm.png +0 -0
- package/docs/screenshots/settings/delete-3-type-name.png +0 -0
- package/docs/screenshots/settings/delete-4-type-yes.png +0 -0
- package/event-log.js +59 -0
- package/files-browser.js +247 -0
- package/folders.js +121 -0
- package/format.js +73 -0
- package/git-info.js +81 -0
- package/github-auth.js +62 -0
- package/graphs.js +104 -0
- package/html.js +10 -0
- package/icons.js +83 -0
- package/images-ai.js +447 -0
- package/images-create.js +226 -0
- package/images-page.js +417 -0
- package/images-records.js +39 -0
- package/images-render.js +36 -0
- package/images-svg-core.js +214 -0
- package/images-svg-sanitize.js +188 -0
- package/images-svg.js +241 -0
- package/images.js +270 -0
- package/jobs.js +430 -0
- package/linger.js +21 -0
- package/lists.js +292 -0
- package/media-info.js +136 -0
- package/navigation-page.js +264 -0
- package/navigation.js +394 -0
- package/notes.js +0 -0
- package/obsidian.js +405 -0
- package/package.json +47 -4
- package/palette-index.js +46 -0
- package/playwright.config.js +23 -0
- package/plugin-install.js +239 -0
- package/plugin-loader.js +448 -0
- package/plugin-manifest.js +83 -0
- package/plugin-settings.js +44 -0
- package/plugins/workspace-notes/index.js +59 -0
- package/plugins-page.js +103 -0
- package/project-make.js +241 -0
- package/project-name.js +210 -0
- package/public/assistant-avatar-moves.js +646 -0
- package/public/assistant-avatar-ui.js +1223 -0
- package/public/assistant-avatar.js +530 -0
- package/public/avatar/druplicon.vrm +0 -0
- package/public/css/base.css +260 -0
- package/public/css/components/ai-assistant.css +263 -0
- package/public/css/components/assistant-avatar.css +279 -0
- package/public/css/components/assistant-views.css +198 -0
- package/public/css/components/build-order.css +74 -0
- package/public/css/components/clone-as-a-git-worktree.css +30 -0
- package/public/css/components/command-palette.css +61 -0
- package/public/css/components/commands-center.css +139 -0
- package/public/css/components/confirm-dialog.css +40 -0
- package/public/css/components/create-card.css +8 -0
- package/public/css/components/ddev-menu.css +23 -0
- package/public/css/components/deep-chat.css +17 -0
- package/public/css/components/density.css +11 -0
- package/public/css/components/floating-assistant-workspace-pages.css +55 -0
- package/public/css/components/folders.css +5 -0
- package/public/css/components/full-height-left-assistant-sidebar-all-pages.css +39 -0
- package/public/css/components/full-height-right-actions-rail-pages-that-have-actions.css +267 -0
- package/public/css/components/grid-and-list.css +203 -0
- package/public/css/components/help-page.css +36 -0
- package/public/css/components/hero.css +16 -0
- package/public/css/components/images.css +70 -0
- package/public/css/components/layout-rhythm-and-spacing-polish.css +139 -0
- package/public/css/components/mic-on-any-field-that-wants-typing.css +416 -0
- package/public/css/components/modal-fit.css +113 -0
- package/public/css/components/page-width.css +23 -0
- package/public/css/components/plugins-page.css +9 -0
- package/public/css/components/project-cards.css +256 -0
- package/public/css/components/project-rows.css +390 -0
- package/public/css/components/reordering-the-workspace-cards.css +85 -0
- package/public/css/components/responsive-home-and-the-workspace-pages.css +457 -0
- package/public/css/components/running-commands-as-toasts.css +327 -0
- package/public/css/components/settings-editor-core-config-yml.css +828 -0
- package/public/css/components/short-results-as-a-toast-at-the-top.css +203 -0
- package/public/css/components/sound-player.css +84 -0
- package/public/css/components/suggest-agents-skills-commands.css +112 -0
- package/public/css/components/tab-modal.css +142 -0
- package/public/css/components/terminals.css +244 -0
- package/public/css/components/test-report-media-one-file-per-row-paged.css +144 -0
- package/public/css/components/top-toolbar-logo-breadcrumb.css +107 -0
- package/public/css/components/video-edit.css +6 -0
- package/public/css/components/web-ide-open-with.css +23 -0
- package/public/css/components/working-indicators.css +158 -0
- package/public/css/components/workspace-cards.css +79 -0
- package/public/favicon.ico +0 -0
- package/public/favicon.png +0 -0
- package/public/htmx.min.js +1 -0
- package/public/logo.png +0 -0
- package/public/media-player.js +215 -0
- package/public/mic.js +255 -0
- package/public/narration.js +110 -0
- package/public/palette.js +278 -0
- package/public/sortable.js +251 -0
- package/public/suggest.js +337 -0
- package/public/terminal.js +903 -0
- package/public/themes/default/theme.css +267 -0
- package/public/themes/ember/theme.css +180 -0
- package/public/themes/press/theme.css +290 -0
- package/public/themes/slate/theme.css +182 -0
- package/public/touch-icon.png +0 -0
- package/public/ui.js +2721 -0
- package/public/vendor/ace/LICENSE.txt +24 -0
- package/public/vendor/ace/ace.js +23 -0
- package/public/vendor/ace/ext-language_tools.js +8 -0
- package/public/vendor/ace/ext-searchbox.js +8 -0
- package/public/vendor/ace/mode-css.js +8 -0
- package/public/vendor/ace/mode-html.js +8 -0
- package/public/vendor/ace/mode-javascript.js +8 -0
- package/public/vendor/ace/mode-markdown.js +8 -0
- package/public/vendor/ace/mode-sh.js +8 -0
- package/public/vendor/ace/mode-yaml.js +8 -0
- package/public/vendor/ace/theme-textmate.js +8 -0
- package/public/vendor/ace/theme-tomorrow_night.js +8 -0
- package/public/vendor/ace/worker-yaml.js +1 -0
- package/public/vendor/deep-chat.LICENSE +21 -0
- package/public/vendor/deep-chat.bundle.js +1 -0
- package/public/vendor/fonts/dm-serif-text-LICENSE.txt +93 -0
- package/public/vendor/fonts/dm-serif-text-latin-400-italic.woff2 +0 -0
- package/public/vendor/fonts/dm-serif-text-latin-400-normal.woff2 +0 -0
- package/public/vendor/fonts/figtree-LICENSE.txt +93 -0
- package/public/vendor/fonts/figtree-latin-400-italic.woff2 +0 -0
- package/public/vendor/fonts/figtree-latin-400-normal.woff2 +0 -0
- package/public/vendor/fonts/figtree-latin-600-italic.woff2 +0 -0
- package/public/vendor/fonts/figtree-latin-600-normal.woff2 +0 -0
- package/public/vendor/fonts/jetbrains-mono-LICENSE.txt +93 -0
- package/public/vendor/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
- package/public/vendor/fonts/ubuntu-mono-LICENSE.txt +98 -0
- package/public/vendor/fonts/ubuntu-mono-latin-wght-normal.woff2 +0 -0
- package/public/vendor/tabler-LICENSE.txt +21 -0
- package/public/vendor/tabler-sprite.svg +1 -0
- package/public/vendor/three/LICENSE +21 -0
- package/public/vendor/three/addons/loaders/GLTFLoader.js +4860 -0
- package/public/vendor/three/addons/utils/BufferGeometryUtils.js +1501 -0
- package/public/vendor/three/addons/utils/SkeletonUtils.js +496 -0
- package/public/vendor/three/three.core.min.js +6 -0
- package/public/vendor/three/three.module.min.js +6 -0
- package/public/vendor/three-vrm/LICENSE +22 -0
- package/public/vendor/three-vrm/three-vrm.module.min.js +983 -0
- package/public/vendor/uikit-icons.min.js +1 -0
- package/public/vendor/uikit.min.css +1 -0
- package/public/vendor/uikit.min.js +1 -0
- package/public/vendor/webship-icons/ui/bookmark-outlined.svg +1 -0
- package/public/vendor/webship-icons/ui/headset.svg +1 -0
- package/public/vendor/webship-icons/ui/menu.svg +1 -0
- package/public/vendor/webship-icons/ui/pause.svg +1 -0
- package/public/vendor/webship-icons/ui/play.svg +1 -0
- package/public/vendor/webship-icons/ui/share.svg +1 -0
- package/public/vendor/webship-icons/ui/sound-off.svg +1 -0
- package/public/vendor/webship-icons/ui/sound-on.svg +1 -0
- package/public/vendor/webship-icons/ui/stop.svg +1 -0
- package/public/vendor/xterm/addon-fit.js +2 -0
- package/public/vendor/xterm/addon-unicode11.js +2 -0
- package/public/vendor/xterm/addon-web-links.js +2 -0
- package/public/vendor/xterm/xterm.css +218 -0
- package/public/vendor/xterm/xterm.js +2 -0
- package/rag.js +169 -0
- package/reader.js +132 -0
- package/repo-blobs.js +66 -0
- package/report-pdf.js +337 -0
- package/row-layout.js +1440 -0
- package/screenrc +37 -0
- package/screens.js +1063 -0
- package/scripts/code-server-start.sh +190 -0
- package/scripts/images-claude-finish.js +107 -0
- package/scripts/screen-host.sh +114 -0
- package/scripts/screen-runner.js +362 -0
- package/scripts/screen-then.js +47 -0
- package/scripts/update.sh +350 -0
- package/server.js +8140 -0
- package/settings-file.js +423 -0
- package/speech.js +297 -0
- package/tab-modal.js +75 -0
- package/test-reports.js +260 -0
- package/themes.js +381 -0
- package/transcripts.js +168 -0
- package/urls.js +13 -0
- package/validate.js +18 -0
- package/version-check.js +94 -0
- package/video-edit.js +588 -0
- package/waiting.js +85 -0
- package/workspace-card-tools.js +41 -0
- package/workspace-delete.js +139 -0
- package/workspace-types.js +85 -0
- package/workspaces.js +557 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* ---------- Reordering the workspace cards ---------- */
|
|
2
|
+
|
|
3
|
+
/* The handle, not the card: the card is a link, so dragging it would fight navigation. Shown on
|
|
4
|
+
hover or focus only — a permanent grip on twenty cards is twenty pieces of furniture.
|
|
5
|
+
It sits INSIDE the card, because UIKit's grid puts a 15px padding-left on every grid child and
|
|
6
|
+
absolute positioning resolves against that padding box — anchored to the wrapper the grip drew
|
|
7
|
+
7px to the LEFT of the card it belongs to, out in the gutter. The card is the containing block
|
|
8
|
+
(.workspace-card is position: relative), so `left` here means the card's own edge. */
|
|
9
|
+
.ws-card-handle {
|
|
10
|
+
position: absolute;
|
|
11
|
+
top: 0.5rem;
|
|
12
|
+
left: 0.5rem;
|
|
13
|
+
z-index: 2;
|
|
14
|
+
display: flex;
|
|
15
|
+
align-items: center;
|
|
16
|
+
justify-content: center;
|
|
17
|
+
width: 1.75rem;
|
|
18
|
+
height: 1.75rem;
|
|
19
|
+
border-radius: 0.5rem;
|
|
20
|
+
color: var(--text-subtle);
|
|
21
|
+
background: var(--subtle-light);
|
|
22
|
+
opacity: 0;
|
|
23
|
+
cursor: grab;
|
|
24
|
+
transition: opacity .12s ease, color .12s ease;
|
|
25
|
+
touch-action: none;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.workspace-card { position: relative; }
|
|
29
|
+
|
|
30
|
+
.ws-card-wrap:hover .ws-card-handle,
|
|
31
|
+
.ws-card-handle:focus-visible { opacity: 1; }
|
|
32
|
+
.ws-card-handle:hover { color: var(--brand-primary); }
|
|
33
|
+
.ws-card-handle:active { cursor: grabbing; }
|
|
34
|
+
|
|
35
|
+
/* The UIkit sortables still in use (the button layouts) show no floating clone: UIkit positions it in document
|
|
36
|
+
coordinates, which inside a scrolled container lands it far from the pointer. */
|
|
37
|
+
.uk-sortable-drag { display: none !important; }
|
|
38
|
+
|
|
39
|
+
/* Dragging with sortable.js: the item follows the pointer as a lifted copy, and its own place stays open as a
|
|
40
|
+
tinted, outlined slot that the others slide around. */
|
|
41
|
+
.ws-list[data-sortable] > .ws-item { cursor: grab; }
|
|
42
|
+
[data-sortable] :is(button, input, select, textarea, .ws-card-tool, .ws-backups, .ws-move) { cursor: auto; }
|
|
43
|
+
[data-sortable] .workspace-card { -webkit-user-drag: none; }
|
|
44
|
+
body.is-sorting, body.is-sorting * { cursor: grabbing !important; user-select: none; }
|
|
45
|
+
|
|
46
|
+
.sort-placeholder { position: relative; }
|
|
47
|
+
.sort-placeholder > * { visibility: hidden; }
|
|
48
|
+
.sort-placeholder::after {
|
|
49
|
+
content: "";
|
|
50
|
+
position: absolute;
|
|
51
|
+
inset: 0 0 0 var(--sort-inset-left, 0);
|
|
52
|
+
border: 2px dashed var(--brand-primary);
|
|
53
|
+
border-radius: 0.5rem;
|
|
54
|
+
background: var(--subtle-brand);
|
|
55
|
+
opacity: .8;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.sort-ghost {
|
|
59
|
+
position: fixed;
|
|
60
|
+
z-index: 10000;
|
|
61
|
+
margin: 0;
|
|
62
|
+
padding: 0;
|
|
63
|
+
list-style: none;
|
|
64
|
+
pointer-events: none;
|
|
65
|
+
border-radius: 0.5rem;
|
|
66
|
+
transition: transform 160ms cubic-bezier(.2,.8,.2,1), box-shadow 160ms ease;
|
|
67
|
+
will-change: translate, transform;
|
|
68
|
+
}
|
|
69
|
+
.sort-ghost.ws-card-wrap { display: flex; flex-direction: column; }
|
|
70
|
+
.sort-ghost > .workspace-card { flex: 1; }
|
|
71
|
+
.sort-ghost.ws-item { background: var(--surface-card); border: 1px solid var(--line); }
|
|
72
|
+
.sort-ghost.ws-item.is-lifted { transform: scale(1.01); }
|
|
73
|
+
.sort-ghost .ws-order { visibility: hidden; }
|
|
74
|
+
.sort-ghost.is-lifted { transform: scale(1.03) rotate(-1.2deg); box-shadow: 0 1.25rem 2.5rem -0.5rem rgb(0 0 0 / .28); }
|
|
75
|
+
.sort-ghost.is-landing { transition: translate 200ms cubic-bezier(.2,.8,.2,1), transform 200ms ease, box-shadow 200ms ease; }
|
|
76
|
+
.sort-ghost .ws-card-handle { opacity: 1; }
|
|
77
|
+
@media (prefers-reduced-motion: reduce) {
|
|
78
|
+
.sort-ghost, .sort-ghost.is-landing { transition: none; }
|
|
79
|
+
.sort-ghost.is-lifted { transform: none; }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Touch: no hover to reveal the handle, so it stays visible. */
|
|
83
|
+
@media (hover: none) {
|
|
84
|
+
.ws-card-handle { opacity: .7; }
|
|
85
|
+
}
|
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
/* ---------- Responsive: home and the workspace pages ---------- */
|
|
2
|
+
|
|
3
|
+
/* UIKit's .uk-label is white-space: nowrap, so a status like "0 site templates ·
|
|
4
|
+
buildable" cannot wrap and drags its card wider than its grid column — a
|
|
5
|
+
horizontal scrollbar at 360px, and cards of unequal width at every size. A grid
|
|
6
|
+
child also needs min-width: 0, or its min-content width beats the column. */
|
|
7
|
+
.workspace-card { min-width: 0; }
|
|
8
|
+
.workspace-card .uk-label {
|
|
9
|
+
white-space: normal;
|
|
10
|
+
line-height: 1.35;
|
|
11
|
+
padding: 0.25rem 0.4rem;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
/* A project name is one unbroken token — amd-website_starter-1-0-x-site-template-manager —
|
|
16
|
+
and at 360px it pushed the whole page sideways. Nothing else was overflowing. */
|
|
17
|
+
.project-row .uk-text-bold,
|
|
18
|
+
.ws-name,
|
|
19
|
+
.settings-key { overflow-wrap: anywhere; }
|
|
20
|
+
|
|
21
|
+
@media (max-width: 47.9375em) { /* < 767px: phones and small tablets */
|
|
22
|
+
/* The cards are icon tiles, so they get tighter rather than narrower. */
|
|
23
|
+
.workspace-card { padding: 0.875rem 0.5rem; }
|
|
24
|
+
.workspace-card .icon {
|
|
25
|
+
width: 2.5rem;
|
|
26
|
+
height: 2.5rem;
|
|
27
|
+
margin-bottom: 0.375rem;
|
|
28
|
+
font-size: 1.25rem;
|
|
29
|
+
}
|
|
30
|
+
.workspace-card .uk-card-title { font-size: 0.9375rem; }
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
/* Name over actions, each on its own line: side by side, the actions were
|
|
34
|
+
squeezed into a 211px column and every row grew to 285px. */
|
|
35
|
+
.project-row .uk-flex-between { flex-direction: column; align-items: stretch; gap: 0.5rem; }
|
|
36
|
+
.project-actions { width: 100%; }
|
|
37
|
+
|
|
38
|
+
/* Touch targets. These buttons were 26px tall, which is below any usable
|
|
39
|
+
minimum on a phone. */
|
|
40
|
+
.project-actions .uk-button-small,
|
|
41
|
+
.settings-tab { min-height: 2.25rem; line-height: 2.25rem; }
|
|
42
|
+
|
|
43
|
+
.page-body { padding-left: 0.75rem; padding-right: 0.75rem; }
|
|
44
|
+
.page-heading h1 { font-size: var(--size-h4); }
|
|
45
|
+
.uk-card-body { padding: 1rem; }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@media (max-width: 30em) { /* < 480px: the narrowest phones */
|
|
49
|
+
.workspace-card .uk-card-title { font-size: 0.875rem; }
|
|
50
|
+
.project-row { padding: 0.875rem; }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* Video player in the editor modal. Capped by viewport height so a tall recording
|
|
54
|
+
still leaves the controls and the Close button reachable. */
|
|
55
|
+
.video-player {
|
|
56
|
+
display: block;
|
|
57
|
+
width: 100%;
|
|
58
|
+
/* UIKit's media reset puts `aspect-ratio: attr(width type(<number>))/attr(height
|
|
59
|
+
type(<number>))` on every canvas/img/svg/video. A <video> only learns its size when
|
|
60
|
+
the metadata loads, so it has no width/height ATTRIBUTES for attr() to read: both
|
|
61
|
+
calls fail and `height: auto` resolves to 0. The player drew as a 2px line — its own
|
|
62
|
+
two borders — with the file fully loaded, readyState 4 and no media error, which is
|
|
63
|
+
why this read as a broken video rather than a broken box.
|
|
64
|
+
`aspect-ratio: auto` does NOT fix it (measured: still 2px), so state a real ratio:
|
|
65
|
+
the box is then never zero, before metadata, with JS off, or for a format the browser
|
|
66
|
+
will not decode. `sizeVideoPlayers` in ui.js replaces it with the true ratio on
|
|
67
|
+
loadedmetadata — the browser is the only thing here that knows the real dimensions,
|
|
68
|
+
since the container has no ffprobe. `contain` letterboxes against the black
|
|
69
|
+
background instead of cropping the recording, which UIKit's `cover` would do. */
|
|
70
|
+
aspect-ratio: 16 / 9;
|
|
71
|
+
height: auto;
|
|
72
|
+
object-fit: contain;
|
|
73
|
+
max-height: min(64vh, 34rem);
|
|
74
|
+
background: var(--media-bg);
|
|
75
|
+
border: 1px solid var(--line);
|
|
76
|
+
border-radius: 0.5rem;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* The modal in dark mode. UIKit hardcodes .uk-modal-dialog to white, and the dark
|
|
80
|
+
rules only ever covered .uk-card-default — so the dialog stayed white behind a dark
|
|
81
|
+
card, with near-white text on it. Uses the same surface as a card so the modal reads
|
|
82
|
+
as part of the page rather than a light panel dropped on it. */
|
|
83
|
+
#editor-modal .uk-modal-dialog {
|
|
84
|
+
background: var(--surface-card);
|
|
85
|
+
color: var(--text-subtle-2);
|
|
86
|
+
border: 1px solid var(--line);
|
|
87
|
+
box-shadow: var(--shadow-float);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* The bare × sits on the dialog itself, so it needs its own colour here. */
|
|
91
|
+
#editor-modal .uk-modal-close-default { color: var(--text-subtle); }
|
|
92
|
+
#editor-modal .uk-modal-close-default:hover { color: var(--text-default); }
|
|
93
|
+
|
|
94
|
+
/* Inside the dialog the card is already dark, so drop its own frame and shadow —
|
|
95
|
+
two nested dark panels with two borders looks like a mistake. */
|
|
96
|
+
html.dark #editor-modal .editor-card {
|
|
97
|
+
background: transparent;
|
|
98
|
+
border: 0;
|
|
99
|
+
box-shadow: none;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* Search + sort above a list. Stacks on a phone, where a row of three controls would
|
|
103
|
+
squeeze the search box to nothing. */
|
|
104
|
+
.list-controls {
|
|
105
|
+
display: flex;
|
|
106
|
+
align-items: center;
|
|
107
|
+
gap: 0.5rem;
|
|
108
|
+
flex-wrap: wrap;
|
|
109
|
+
margin: 0.5rem 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.list-controls .list-search {
|
|
113
|
+
/* The field takes every pixel the row's buttons do not: a 127px search box inside an 818px
|
|
114
|
+
bar was the widest thing on the page competing with the narrowest input on it. */
|
|
115
|
+
flex: 1 1 auto;
|
|
116
|
+
min-width: 6rem;
|
|
117
|
+
max-width: none;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.list-controls label {
|
|
121
|
+
display: inline-flex;
|
|
122
|
+
align-items: center;
|
|
123
|
+
gap: 0.375rem;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.list-controls .uk-select {
|
|
127
|
+
width: auto;
|
|
128
|
+
min-width: 9rem;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* The timestamp is context, not the row's subject: it must not compete with the name,
|
|
132
|
+
and it must not wrap mid-date. */
|
|
133
|
+
.item-time {
|
|
134
|
+
white-space: nowrap;
|
|
135
|
+
font-weight: 400;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
@media (max-width: 47.9375em) {
|
|
139
|
+
/* On a phone the two buttons are what wrap, not the field. */
|
|
140
|
+
.lc-find { flex-wrap: wrap; row-gap: 0.375rem; }
|
|
141
|
+
.list-controls .list-search { flex-basis: 100%; }
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* Review: a framed document inside the modal. Tall enough to read a page of a PDF,
|
|
145
|
+
capped so the modal's own buttons stay visible. */
|
|
146
|
+
.review-frame {
|
|
147
|
+
display: block;
|
|
148
|
+
width: 100%;
|
|
149
|
+
height: min(70vh, 44rem);
|
|
150
|
+
border: 1px solid var(--line);
|
|
151
|
+
border-radius: 0.5rem;
|
|
152
|
+
background: var(--paper);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.review-image {
|
|
156
|
+
display: block;
|
|
157
|
+
width: 100%;
|
|
158
|
+
height: auto;
|
|
159
|
+
max-height: min(70vh, 44rem);
|
|
160
|
+
object-fit: contain;
|
|
161
|
+
border: 1px solid var(--line);
|
|
162
|
+
border-radius: 0.5rem;
|
|
163
|
+
background: var(--subtle-light);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/* A framed document is white whatever the page theme is, so keep its border readable
|
|
167
|
+
rather than letting it float on the dark dialog. */
|
|
168
|
+
/* Shown only when the browser cannot display a PDF itself. */
|
|
169
|
+
.review-fallback {
|
|
170
|
+
padding: 1.5rem;
|
|
171
|
+
text-align: center;
|
|
172
|
+
color: var(--text-subtle);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* One format = the extension button that opens it, joined to the arrow that saves it.
|
|
176
|
+
Joined rather than spaced so three formats read as three things, not six. */
|
|
177
|
+
.format-group {
|
|
178
|
+
display: inline-flex;
|
|
179
|
+
align-items: stretch;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.format-group > .uk-button:first-child {
|
|
183
|
+
border-top-right-radius: 0;
|
|
184
|
+
border-bottom-right-radius: 0;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.format-group > .format-dl {
|
|
188
|
+
border-top-left-radius: 0;
|
|
189
|
+
border-bottom-left-radius: 0;
|
|
190
|
+
margin-left: -1px;
|
|
191
|
+
padding: 0 0.5rem;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* Test report modal. */
|
|
195
|
+
.test-none { background: transparent; border: 1px dashed var(--line); color: var(--text-subtle); }
|
|
196
|
+
|
|
197
|
+
.test-features { list-style: none; padding-left: 0; }
|
|
198
|
+
.test-features > li { margin-bottom: 0.75rem; }
|
|
199
|
+
|
|
200
|
+
.test-scenarios {
|
|
201
|
+
list-style: none;
|
|
202
|
+
padding-left: 0.75rem;
|
|
203
|
+
margin: 0.25rem 0 0;
|
|
204
|
+
border-left: 2px solid var(--line);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.test-scenarios > li {
|
|
208
|
+
padding: 0.125rem 0 0.125rem 0.5rem;
|
|
209
|
+
font-size: 0.875rem;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* Failure shots: a grid of thumbnails, because 21 full-width screenshots is not a report,
|
|
213
|
+
it is a scroll. Each links to the full image. */
|
|
214
|
+
.test-shots {
|
|
215
|
+
display: grid;
|
|
216
|
+
grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr));
|
|
217
|
+
gap: 0.75rem;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.test-shot { margin: 0; }
|
|
221
|
+
|
|
222
|
+
.test-shot img {
|
|
223
|
+
width: 100%;
|
|
224
|
+
height: 7rem;
|
|
225
|
+
object-fit: cover;
|
|
226
|
+
object-position: top;
|
|
227
|
+
border: 1px solid var(--line);
|
|
228
|
+
border-radius: 0.375rem;
|
|
229
|
+
background: var(--subtle-light);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.test-shot figcaption {
|
|
233
|
+
word-break: break-all;
|
|
234
|
+
line-height: 1.3;
|
|
235
|
+
margin-top: 0.25rem;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.test-videos { list-style: none; padding-left: 0; columns: 2; }
|
|
239
|
+
.test-videos > li { font-size: 0.875rem; break-inside: avoid; }
|
|
240
|
+
|
|
241
|
+
@media (max-width: 47.9375em) { .test-videos { columns: 1; } }
|
|
242
|
+
|
|
243
|
+
/* An action dropdown on a project row. The row's buttons are 26px, so its trigger has to
|
|
244
|
+
sit on the same baseline as them rather than growing the row. */
|
|
245
|
+
.act-menu > .uk-button { white-space: nowrap; }
|
|
246
|
+
.act-menu .uk-dropdown { min-width: 15rem; padding: 0.5rem 0; }
|
|
247
|
+
.act-menu .uk-dropdown-nav > li > a { padding: 0.25rem 1rem; display: flex; align-items: center; gap: 0.5rem; }
|
|
248
|
+
.act-menu .uk-nav-header { padding: 0.25rem 1rem; font-size: 0.7rem; }
|
|
249
|
+
.act-menu .uk-nav-divider { margin: 0.25rem 0; }
|
|
250
|
+
/* COMPOSER: the package field and its buttons sit inside the dropdown, so it needs room for them. */
|
|
251
|
+
.act-menu-composer .uk-dropdown { min-width: 19rem; max-height: 80vh; overflow-y: auto; }
|
|
252
|
+
/* The full menu in two columns: commands left, a package and the composer.json scripts right.
|
|
253
|
+
Stacked again on a narrow screen, where two columns of command names would not fit. */
|
|
254
|
+
.act-menu-composer .composer-dropdown-wide { width: min(40rem, calc(100vw - 2rem)); }
|
|
255
|
+
.act-menu-composer .composer-columns { display: grid; grid-template-columns: 1fr 1fr; align-items: start; }
|
|
256
|
+
.act-menu-composer .composer-columns > ul + ul { border-left: 1px solid var(--line, rgba(0, 0, 0, 0.1)); }
|
|
257
|
+
@media (max-width: 40em) {
|
|
258
|
+
.act-menu-composer .composer-columns { grid-template-columns: 1fr; }
|
|
259
|
+
.act-menu-composer .composer-columns > ul + ul { border-left: 0; border-top: 1px solid var(--line, rgba(0, 0, 0, 0.1)); }
|
|
260
|
+
}
|
|
261
|
+
/* A menu laid out in columns (Settings → Row actions): one list per column, side by side. */
|
|
262
|
+
.menu-columns { display: grid; align-items: start; }
|
|
263
|
+
.menu-columns-2 { grid-template-columns: repeat(2, minmax(11rem, 1fr)); width: min(30rem, calc(100vw - 2rem)); }
|
|
264
|
+
.menu-columns-3 { grid-template-columns: repeat(3, minmax(11rem, 1fr)); width: min(45rem, calc(100vw - 2rem)); }
|
|
265
|
+
.menu-columns-4 { grid-template-columns: repeat(4, minmax(11rem, 1fr)); width: min(60rem, calc(100vw - 2rem)); }
|
|
266
|
+
.menu-columns > ul + ul { border-left: 1px solid var(--line, rgba(0, 0, 0, 0.1)); }
|
|
267
|
+
@media (max-width: 40em) {
|
|
268
|
+
.menu-columns[class] { grid-template-columns: 1fr; width: auto; }
|
|
269
|
+
.menu-columns > ul + ul { border-left: 0; border-top: 1px solid var(--line, rgba(0, 0, 0, 0.1)); }
|
|
270
|
+
}
|
|
271
|
+
/* NODE: COMPOSER's two-column shape, under a yarn / npm tab. */
|
|
272
|
+
.act-menu-node .uk-dropdown { min-width: 19rem; max-height: 80vh; overflow-y: auto; }
|
|
273
|
+
.act-menu-node .node-dropdown { width: min(40rem, calc(100vw - 2rem)); }
|
|
274
|
+
.act-menu-node .node-tabs { margin: 0.25rem 1rem 0; }
|
|
275
|
+
.act-menu-node .node-columns { display: grid; grid-template-columns: 1fr 1fr; align-items: start; }
|
|
276
|
+
.act-menu-node .node-columns > ul + ul { border-left: 1px solid var(--line, rgba(0, 0, 0, 0.1)); }
|
|
277
|
+
.act-menu-node .node-package { padding: 0.25rem 1rem; }
|
|
278
|
+
.act-menu-node .node-package-buttons { display: flex; flex-wrap: wrap; gap: 0.25rem; margin-top: 0.375rem; }
|
|
279
|
+
.act-menu-node .uk-dropdown-nav > li > .uk-text-meta { display: block; padding: 0.25rem 1rem; }
|
|
280
|
+
.act-menu-node .node-warn { color: var(--brand-secondary, inherit); }
|
|
281
|
+
@media (max-width: 40em) {
|
|
282
|
+
.act-menu-node .node-columns { grid-template-columns: 1fr; }
|
|
283
|
+
.act-menu-node .node-columns > ul + ul { border-left: 0; border-top: 1px solid var(--line, rgba(0, 0, 0, 0.1)); }
|
|
284
|
+
}
|
|
285
|
+
.act-menu-composer .composer-package { padding: 0.25rem 1rem; }
|
|
286
|
+
/* A line of text in the menu (not a link) lines up with the headers and entries instead of the edge. */
|
|
287
|
+
.act-menu-composer .uk-dropdown-nav > li > .uk-text-meta { display: block; padding: 0.25rem 1rem; }
|
|
288
|
+
.act-menu-composer .composer-package-buttons { display: flex; flex-wrap: wrap; gap: 0.25rem; margin-top: 0.375rem; }
|
|
289
|
+
|
|
290
|
+
/* Upsun link. Not brand blue: this says "deployed elsewhere", which is a different fact
|
|
291
|
+
from anything else on the row. UIKit uppercases .uk-label, but an Upsun project id is
|
|
292
|
+
lowercase and case-sensitive — shown uppercase it cannot be read off the screen and
|
|
293
|
+
used, so these two opt out. */
|
|
294
|
+
/* A project row is two lines: what it IS on the first, what you can DO on the second. With
|
|
295
|
+
eight controls (Start/Stop, Launch, DDEV, Backup, Graph, Tests, Remove) a single line
|
|
296
|
+
wrapped raggedly and pushed Remove under the name of the row above. */
|
|
297
|
+
.project-head {
|
|
298
|
+
display: block;
|
|
299
|
+
margin-bottom: 0.625rem;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.project-head .uk-text-bold { margin-right: 0.25rem; }
|
|
303
|
+
|
|
304
|
+
/* The state strip above the name: running/stopped and the test tally, on their own line so they
|
|
305
|
+
start at the same x on every row and a long list can be scanned down rather than read across. */
|
|
306
|
+
.project-state {
|
|
307
|
+
display: flex;
|
|
308
|
+
align-items: center;
|
|
309
|
+
flex-wrap: wrap;
|
|
310
|
+
gap: 0.375rem;
|
|
311
|
+
margin-bottom: 0.375rem;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/* Separated from the identity line, so the eye finds the same place on every row. */
|
|
315
|
+
.project-row .project-actions {
|
|
316
|
+
padding-top: 0.5rem;
|
|
317
|
+
border-top: 1px solid var(--line);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/* The link command carries a project name, so it is long. Left on one line it sets the width of
|
|
321
|
+
the whole dropdown, which then opens across the page instead of under its button — so it wraps,
|
|
322
|
+
and the menu keeps a sane width of its own. */
|
|
323
|
+
.act-menu .uk-dropdown { max-width: min(26rem, 90vw); }
|
|
324
|
+
/* A nested settings block reads as one thing. The heading carries the path, so each field
|
|
325
|
+
only needs its leaf name. */
|
|
326
|
+
.settings-group {
|
|
327
|
+
border: 1px solid var(--line);
|
|
328
|
+
border-radius: 0.5rem;
|
|
329
|
+
padding: 0.75rem 1rem 0.25rem;
|
|
330
|
+
margin: 0 0 1rem;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
.settings-group-name {
|
|
334
|
+
padding: 0 0.375rem;
|
|
335
|
+
font-family: var(--font-code);
|
|
336
|
+
font-size: 0.78rem;
|
|
337
|
+
color: var(--text-subtle);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/* The commit identity a forge block produces. Derived, not editable — it reads as a
|
|
341
|
+
consequence of the fields above it, not another field. */
|
|
342
|
+
.settings-author {
|
|
343
|
+
margin: 0.25rem 0 0.5rem;
|
|
344
|
+
padding: 0.5rem 0.625rem;
|
|
345
|
+
background: var(--subtle-brand);
|
|
346
|
+
border-radius: 0.375rem;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.settings-author code { background: transparent; }
|
|
350
|
+
|
|
351
|
+
/* Whether each credential in a forge block is present. Never the value: a secret reads
|
|
352
|
+
"set", so the line is safe to leave on screen or in a screenshot. */
|
|
353
|
+
.cred-states { display: flex; flex-wrap: wrap; gap: 0.375rem; margin-top: 0.375rem; }
|
|
354
|
+
|
|
355
|
+
.cred-state {
|
|
356
|
+
font-family: var(--font-code);
|
|
357
|
+
font-size: 0.72rem;
|
|
358
|
+
padding: 0.0625rem 0.375rem;
|
|
359
|
+
border-radius: 0.25rem;
|
|
360
|
+
background: var(--surface);
|
|
361
|
+
border: 1px solid var(--line);
|
|
362
|
+
color: var(--text-subtle);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.cred-state.is-set { background: var(--ok-soft); border-color: var(--ok); color: var(--ok-ink); }
|
|
366
|
+
|
|
367
|
+
/* A settings value that names an image: what is set, and a way to choose another. */
|
|
368
|
+
.image-field { display: flex; align-items: center; gap: 0.5rem; }
|
|
369
|
+
.image-field .uk-input { flex: 1; }
|
|
370
|
+
|
|
371
|
+
.image-preview {
|
|
372
|
+
width: 2.5rem;
|
|
373
|
+
height: 2.5rem;
|
|
374
|
+
flex: 0 0 2.5rem;
|
|
375
|
+
display: flex;
|
|
376
|
+
align-items: center;
|
|
377
|
+
justify-content: center;
|
|
378
|
+
border: 1px solid var(--line);
|
|
379
|
+
border-radius: 0.375rem;
|
|
380
|
+
background: var(--surface);
|
|
381
|
+
overflow: hidden;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
.image-preview img { max-width: 100%; max-height: 100%; }
|
|
385
|
+
.image-preview {
|
|
386
|
+
background-image:
|
|
387
|
+
linear-gradient(45deg, var(--checker-a) 25%, transparent 25%, transparent 75%, var(--checker-a) 75%),
|
|
388
|
+
linear-gradient(45deg, var(--checker-a) 25%, transparent 25%, transparent 75%, var(--checker-a) 75%);
|
|
389
|
+
background-size: 10px 10px;
|
|
390
|
+
background-position: 0 0, 5px 5px;
|
|
391
|
+
}
|
|
392
|
+
.image-missing { color: var(--danger); font-weight: 600; }
|
|
393
|
+
|
|
394
|
+
.image-choices {
|
|
395
|
+
display: grid;
|
|
396
|
+
grid-template-columns: repeat(auto-fill, minmax(7rem, 1fr));
|
|
397
|
+
gap: 0.5rem;
|
|
398
|
+
margin-top: 0.5rem;
|
|
399
|
+
padding: 0.625rem;
|
|
400
|
+
border: 1px solid var(--line);
|
|
401
|
+
border-radius: 0.5rem;
|
|
402
|
+
background: var(--surface);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
.image-choice {
|
|
406
|
+
background: var(--surface-card);
|
|
407
|
+
border: 1px solid var(--line);
|
|
408
|
+
border-radius: 0.375rem;
|
|
409
|
+
padding: 0.375rem;
|
|
410
|
+
cursor: pointer;
|
|
411
|
+
display: flex;
|
|
412
|
+
flex-direction: column;
|
|
413
|
+
align-items: center;
|
|
414
|
+
gap: 0.25rem;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
.image-choice:hover { border-color: var(--brand-primary); }
|
|
418
|
+
/* A checkerboard behind the artwork: half these files are white-ink logos for dark mode, and
|
|
419
|
+
on a white tile they are invisible — the tile reads as a failed load. */
|
|
420
|
+
.image-choice img {
|
|
421
|
+
width: 100%;
|
|
422
|
+
height: 3rem;
|
|
423
|
+
object-fit: contain;
|
|
424
|
+
background-image:
|
|
425
|
+
linear-gradient(45deg, var(--checker-b) 25%, transparent 25%, transparent 75%, var(--checker-b) 75%),
|
|
426
|
+
linear-gradient(45deg, var(--checker-b) 25%, transparent 25%, transparent 75%, var(--checker-b) 75%);
|
|
427
|
+
background-size: 12px 12px;
|
|
428
|
+
background-position: 0 0, 6px 6px;
|
|
429
|
+
background-color: var(--checker-bg);
|
|
430
|
+
border-radius: 0.25rem;
|
|
431
|
+
}
|
|
432
|
+
.image-choice span { word-break: break-all; line-height: 1.2; text-align: center; }
|
|
433
|
+
.image-choices-close { align-self: end; }
|
|
434
|
+
|
|
435
|
+
/* A yes/no setting. The word beside the box says the state, so it reads without inspecting
|
|
436
|
+
the control — and matches how the value is stored: a real YAML boolean. */
|
|
437
|
+
.settings-toggle { display: inline-flex; align-items: center; gap: 0.5rem; }
|
|
438
|
+
|
|
439
|
+
/* What a field is for. Under the key, not beside the input: the inputs are already a column
|
|
440
|
+
and a second column of prose would squeeze them. */
|
|
441
|
+
.settings-hint {
|
|
442
|
+
overflow-wrap: normal;
|
|
443
|
+
word-break: normal;
|
|
444
|
+
hyphens: none;
|
|
445
|
+
display: block;
|
|
446
|
+
font-size: 0.72rem;
|
|
447
|
+
font-weight: 400;
|
|
448
|
+
font-family: var(--font-primary);
|
|
449
|
+
color: var(--text-subtle);
|
|
450
|
+
line-height: 1.35;
|
|
451
|
+
margin-top: 0.125rem;
|
|
452
|
+
max-width: 22rem;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/* An Upsun control on a project that is not linked yet. Present, because the workspace ships the
|
|
456
|
+
* command — but quieter than a linked one, so a row of thirty unlinked projects does not read as
|
|
457
|
+
* thirty cloud deployments. */
|