diff --git a/src/lib/components/ConfigEditor.svelte b/src/lib/components/ConfigEditor.svelte index d6e5bc4..e3bb6bb 100644 --- a/src/lib/components/ConfigEditor.svelte +++ b/src/lib/components/ConfigEditor.svelte @@ -17,6 +17,7 @@ let initialPayload: any = null; let rawMode = $state(false); let rawJson = $state(''); + let scriptTextarea = $state(null); let formData = $state({ name: '', @@ -432,19 +433,26 @@

> SCRIPT

-
+
- post-install.sh — runs after packages - editable + +
+

Edit the script above, then click Save changes. Runs after packages, shell, dotfiles, and macOS preferences.

{/if} @@ -858,13 +866,34 @@ display: inline-flex; align-items: center; gap: 5px; - font-size: 0.68rem; + padding: 5px 8px; + border: 1px solid var(--border-hover); + border-radius: 6px; + background: var(--bg-tertiary); + font-family: inherit; + font-size: 0.72rem; color: var(--accent); + cursor: pointer; + } + + .term-edit:hover { + border-color: var(--accent); + } + + .term-edit:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + } + + .script-term:focus-within { + border-color: var(--accent); + box-shadow: 0 0 0 1px var(--accent); } .script-textarea { + display: block; width: 100%; - min-height: 148px; + min-height: 220px; padding: 18px 20px; background: transparent; border: none; @@ -872,7 +901,7 @@ resize: vertical; font-family: inherit; font-size: 0.8rem; - line-height: 1.9; + line-height: 1.7; color: var(--text-secondary); } @@ -931,4 +960,10 @@ grid-template-columns: 1fr; } } + + @media (max-width: 480px) { + .script-term .dot { + display: none; + } + } diff --git a/src/lib/components/MacOSPreferencesEditor.svelte b/src/lib/components/MacOSPreferencesEditor.svelte index 44fa262..e39c0cd 100644 --- a/src/lib/components/MacOSPreferencesEditor.svelte +++ b/src/lib/components/MacOSPreferencesEditor.svelte @@ -54,39 +54,52 @@
+

{macosPrefs.length} configured. Expand a category to manage settings.

{#each byCategory as group (group.cat)} -
-
{group.cat}
- {#each group.items as item (item.id)} - {@const on = isOn(item)} -
-
-
{item.label}
-
{item.description}
+
+ + {group.cat} + {group.items.filter(isOn).length} / {group.items.length} included + + +
+ {#each group.items as item (item.id)} + {@const on = isOn(item)} +
+
+
{item.label}
+
{item.description}
+
+
- -
- {/each} -
+ {/each} +
+ {/each} {#if customPrefs.length > 0} -
-
Custom
- {#each customPrefs as pref (pref.domain + ':' + pref.key)} -
-
-
{pref.desc || pref.key}
-
{pref.domain} {pref.key} = {pref.value}
+
+ + Custom + {customPrefs.length} included + + +
+ {#each customPrefs as pref (pref.domain + ':' + pref.key)} +
+
+
{pref.desc || pref.key}
+
{pref.domain} {pref.key} = {pref.value}
+
+
- -
- {/each} -
+ {/each} +
+ {/if}
@@ -96,17 +109,68 @@ flex-direction: column; } - .group + .group { - margin-top: 14px; + .prefs-hint { + font-size: 0.72rem; + color: var(--text-muted); + line-height: 1.5; + margin: 0 0 10px; + } + + .group { + border-bottom: 1px solid var(--border); + } + + summary { + display: flex; + align-items: center; + gap: 12px; + padding: 13px 4px; + cursor: pointer; + list-style: none; + border-radius: 5px; + } + + summary::-webkit-details-marker { + display: none; + } + + summary:hover { + background: var(--bg-tertiary); + } + + summary:focus-visible, + .knob:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; } .group-label { - font-size: 0.66rem; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.1em; + font-size: 0.8rem; + color: var(--text-primary); + } + + .group-count { + margin-left: auto; + font-size: 0.68rem; color: var(--text-muted); - padding: 8px 0 2px; + white-space: nowrap; + } + + .chevron { + flex-shrink: 0; + color: var(--text-muted); + } + + .group[open] .chevron { + transform: rotate(90deg); + } + + .group-items { + max-height: 340px; + overflow-y: auto; + overscroll-behavior: contain; + scrollbar-gutter: stable; + padding: 0 4px 8px; } .row { @@ -120,6 +184,7 @@ .row-text { min-width: 0; + overflow-wrap: anywhere; } .row-name {