| | |
| | | selected_cards = [card for column in columns for card in column.get("cards", []) if card.get("isSelected") is True] |
| | | require(len(selected_cards) == 1, "Waterfall must expose exactly one selected card after keyboard navigation") |
| | | require(selected_cards[0].get("windowID") == expected_selected_window_id, "selected Waterfall card must match selectedWindowID") |
| | | require("selectedVisualSuppressed" in selected_cards[0].get("visualStates", []), "non-hovered keyboard-selected Waterfall card must suppress selected visual state") |
| | | require(selected_cards[0].get("shineVisible") is False, "non-hovered keyboard-selected Waterfall card must not expose shine") |
| | | require(selected_cards[0].get("zPosition", 0) == 0, "non-hovered keyboard-selected Waterfall card must not float above normal cards") |
| | | require(selected_cards[0].get("isKeyboardFocused") is True, "keyboard-selected Waterfall card must expose keyboard focus") |
| | | require("selected" in selected_cards[0].get("visualStates", []), "keyboard-selected Waterfall card must expose selected visual state") |
| | | require("keyboardFocused" in selected_cards[0].get("visualStates", []), "keyboard-selected Waterfall card must expose keyboardFocused visual state") |
| | | require("selectedVisualSuppressed" not in selected_cards[0].get("visualStates", []), "keyboard-selected Waterfall card must not suppress selected visual state") |
| | | require(selected_cards[0].get("shineVisible") is True, "keyboard-selected Waterfall card must expose shine") |
| | | require(selected_cards[0].get("zPosition", 0) > 0, "keyboard-selected Waterfall card must float above normal cards") |
| | | require("appLinked" in selected_column.get("cards", [])[0].get("visualStates", []), "App-focused vertical column must keep its first card linked to App hover") |
| | | |
| | | selected_items = [item for item in items if item.get("isSelected") is True] |
| | |
| | | require(selected_column.get("verticalScrollOffset", 0) > 0, "down-arrow navigation must auto-scroll the selected window into view") |
| | | |
| | | frame = selected_cards[0].get("visibleFrame", {}) |
| | | column_frame = selected_column.get("visibleFrame", {}) |
| | | header_frame = selected_column.get("headerFrame", {}) |
| | | cards_clip_frame = selected_column.get("cardsClipFrame", {}) |
| | | visibility_tolerance = 1 |
| | | require(frame.get("x", -1) >= 0, "selected Waterfall card must be horizontally visible") |
| | | require(frame.get("x", 0) + frame.get("width", 0) <= root.get("waterfallVisibleWidth", 0) + 1, "selected Waterfall card must fit in visible Waterfall width") |
| | | require(frame.get("y", -1) >= 0, "selected Waterfall card must be vertically visible") |
| | | require(frame.get("y", -1) >= -visibility_tolerance, "selected Waterfall card must be vertically visible") |
| | | require(frame.get("y", 0) + frame.get("height", 0) <= root.get("waterfallFrame", {}).get("height", 0) + 1, "selected Waterfall card must fit in visible Waterfall height") |
| | | require(selected_column.get("cardsClipMasksToBounds") is True, "vertical Waterfall column must clip cards below the pinned header") |
| | | require(cards_clip_frame.get("y", -1) == 0, "cards clip layer must start below the column bottom edge") |
| | | require(cards_clip_frame.get("height", 0) <= header_frame.get("y", 0) + 1, "cards clip layer must stop before the pinned header") |
| | | header_min_y = column_frame.get("y", 0) + header_frame.get("y", 0) |
| | | require(frame.get("y", 0) + frame.get("height", 0) <= header_min_y + 1, "selected Waterfall card must not overlap the pinned column header") |
| | | |
| | | print(json.dumps({ |
| | | "selectedAppGroupIndex": root.get("selectedAppGroupIndex"), |