Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ agent's option picker without summoning it). Holding `CTRL` opens **KEY
COMMANDS**, a two-tab TALLY popover on the shortcut panel's grammar:
COMMANDS is a hairline grid of keycap chords (⇧↩ · ⌃C ×2 · ⌥⌫, and the user's
own, in custom ink), CUSTOM SETUP is the agent editor's numbered list with an
inline composer — bake-off record in `local-plan/key-commands-bakeoff/`. The
inline composer. The
speech-bubble key beside `RET` (`RET · talk · keyboard`, latched while open)
opens **Talkback**, the chat-style message box: on visionOS a rounded card in
its own slab hanging below the console row, on iPad and iPhone the same card
Expand All @@ -178,7 +178,14 @@ text field, and a filled ↑ that sends the message as one paste — attached
files upload on pick and show as 46 pt previews (28 pt thumbs and compact
document chips on the phone), their paths typed first. Chat grammar on the
chassis: rounded, hairlined, chassis-grounded, so it still belongs to the
window — bake-off record in `local-plan/talkback-bakeoff/` (Candidate B).
window (bake-off Candidate B).
A confirmed path or web link first opens in a **side panel** beside the live
terminal, never resizing it: a shadowed card in front of the pane on iPad, one
slab beside the glass on visionOS (bake-off candidate A, "Sidecar"). Its
single action row — a header on iPad, a
bottom bar on visionOS where the eye works the lower edge — leads with the
panel's own controls, `✕` and `↗ TAB` (moves it into a tab), then the viewer's
identity and its local controls (expanding as the width allows).
The iPad toolbar keeps the
full chip set: `DECK`,
source label, lamp, then
Expand Down
33 changes: 33 additions & 0 deletions Multiplex/Design/Chassis.swift
Original file line number Diff line number Diff line change
Expand Up @@ -890,3 +890,36 @@ extension UIViewController {
scrollView.verticalScrollIndicatorInsets.bottom = inset
}
}

extension UIKitChassisChip {
/// A chip in a rail: hugs its caption and never compresses, so a row
/// decides what fits by measuring the chips themselves.
static func rail(
_ caption: String,
systemImage: String? = nil,
prominent: Bool = false,
accessibilityLabel: String,
action: @escaping () -> Void
) -> UIKitChassisChip {
let chip = UIKitChassisChip(
caption,
systemImage: systemImage,
prominent: prominent,
accessibilityLabel: accessibilityLabel,
action: action
)
chip.setContentHuggingPriority(.required, for: .horizontal)
chip.setContentCompressionResistancePriority(.required, for: .horizontal)
return chip
}

/// Dimmed and inert — the way a rail disables a chip.
var isEnabled: Bool {
get { isUserInteractionEnabled }
set {
isUserInteractionEnabled = newValue
alpha = newValue ? 1 : 0.45
accessibilityTraits = newValue ? .button : [.button, .notEnabled]
}
}
}
26 changes: 26 additions & 0 deletions Multiplex/InfoPlist.xcstrings
Original file line number Diff line number Diff line change
@@ -1,6 +1,32 @@
{
"sourceLanguage" : "en",
"strings" : {
"CFBundleDisplayName" : {
"comment" : "Bundle display name",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Multiplex"
}
}
},
"shouldTranslate" : false
},
"CFBundleName" : {
"comment" : "Bundle name",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Multiplex"
}
}
},
"shouldTranslate" : false
},
"NSCameraUsageDescription" : {
"extractionState" : "manual",
"localizations" : {
Expand Down
Loading
Loading