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: 7 additions & 4 deletions src/nls/root/strings.js
Original file line number Diff line number Diff line change
Expand Up @@ -2174,6 +2174,9 @@ define({
"AI_CHAT_LOGIN_TITLE": "Sign In to Use AI",
"AI_CHAT_LOGIN_MESSAGE": "Sign in to your {APP_NAME} account to access AI features.",
"AI_CHAT_LOGIN_BTN": "Sign In",
"AI_CHAT_INTRO_GUEST_TITLE": "Design layouts, fix bugs, and build faster with AI",
"AI_CHAT_INTRO_CONFIGURE_TITLE": "Getting started with Claude Code",
"AI_CHAT_INTRO_CONFIGURE_DESC": "See this short video on how to set up AI",
"AI_CHAT_UPSELL_TITLE": "Phoenix Pro + AI",
"AI_CHAT_UPSELL_MESSAGE": "AI features are available with Phoenix Pro.",
"AI_CHAT_UPSELL_BTN": "Get Phoenix Pro",
Expand Down Expand Up @@ -2270,10 +2273,10 @@ define({
"AI_CHAT_MODE_PLAN": "Plan Mode",
"AI_CHAT_MODE_EDIT": "Edit Mode",
"AI_CHAT_MODE_FULL_AUTO": "Full Auto",
"AI_CHAT_MODE_INFO_PLAN": "AI will propose a plan before making changes",
"AI_CHAT_MODE_INFO_EDIT": "AI can edit files. Shell commands need approval",
"AI_CHAT_MODE_INFO_FULL_AUTO": "AI can edit files and run commands without approval",
"AI_CHAT_MODE_SWITCH_HINT": "(Shift+Tab to switch)",
"AI_CHAT_MODE_INFO_PLAN": "AI will propose a plan before making changes (Click to switch)",
"AI_CHAT_MODE_INFO_EDIT": "AI can edit files. Shell commands need approval (Click to switch)",
"AI_CHAT_MODE_INFO_FULL_AUTO": "AI can edit files and run commands without approval (Click to switch)",
"AI_CHAT_MODE_SWITCH_HINT": "[or Shift+Tab]",
"AI_CHAT_INPUT_HINT": "Press {0} to send · {1} for new line",
"AI_CHAT_BASH_CONFIRM_TITLE": "Allow command?",
"AI_CHAT_BASH_ALLOW": "Allow",
Expand Down
158 changes: 158 additions & 0 deletions src/styles/Extn-AIChatPanel.less
Original file line number Diff line number Diff line change
Expand Up @@ -2731,6 +2731,164 @@
}
}

/* ── Intro video card (login / unavailable / configure-claude states) ─
Renders inside the centered .ai-unavailable column. Vertical rhythm
uses a flex `gap` so spacing between the title, description (when
present), and the thumb stays consistent — no per-element bottom
margins to keep in sync. The slot itself adds bottom space before
the existing .ai-unavailable-message that follows it.

Width is capped at 320px so the block stays a tidy card even in a
wide sidebar, and the thumb keeps a 16:9 aspect so the YouTube
preview lands cleanly inside without cropping the play button.

Empty until ai_panel_config.json resolves — `.has-video` is added
when the populate function injects content. */
.ai-intro-video-slot {
display: none;
flex-direction: column;
align-items: stretch;
width: 100%;
max-width: 320px;
margin: 0 auto 1.25rem;
text-align: center;
gap: 14px;

&.has-video {
display: flex;
}
}

.ai-intro-video-title {
font-size: 17px;
font-weight: 600;
color: @project-panel-text-1;
line-height: 1.35;
letter-spacing: -0.005em;
margin: 0;
white-space: normal;
overflow-wrap: anywhere;
}

.ai-intro-video-desc {
font-size: 14px;
color: @project-panel-text-2;
opacity: 0.8;
line-height: 1.5;
margin: 0;
white-space: normal;
overflow-wrap: anywhere;
}

.ai-intro-video-thumb {
position: relative;
display: block;
width: 100%;
padding: 0;
margin: 0;
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
overflow: hidden;
cursor: pointer;
background: rgba(0, 0, 0, 0.25);
aspect-ratio: 16 / 9;

/* Hover-on-thumb scale only the YouTube play icon — keep the thumb
border/shadow stable since Phoenix doesn't generally do glow-on-hover
on cards/thumbs. */
&:hover .ai-intro-video-play {
transform: translate(-50%, -50%) scale(1.08);
opacity: 1;
}

.ai-intro-video-img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}

.ai-intro-video-play {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 64px;
height: auto;
pointer-events: none;
filter: drop-shadow(0 2px 6px rgba(0, 0, 0, 0.45));
opacity: 0.95;
transition: transform 0.15s ease, opacity 0.15s ease;
}
}

/* When the intro video card is showing, soften the existing icon and
give the surrounding column a touch more breathing room so the whole
block reads as a single composed card. */
.ai-unavailable:has(.ai-intro-video-slot.has-video) {
.ai-unavailable-icon,
.ai-install-icon {
margin-bottom: 1.25rem;
opacity: 0.5;
}

.ai-unavailable-message {
max-width: 320px;
font-size: 13.5px;
line-height: 1.5;
margin-bottom: 1rem;
}
}

/* Re-apply Phoenix's standard `.btn .btn-primary` look inside the
.ai-unavailable intro states. The blanket reset below (`.ai-chat-panel
.btn-primary`) blanks bootstrap's button styling so chat-area buttons
can use their own custom styles; here we want the regular primary
button so the Sign In CTA reads as the standard Phoenix action. The
selector is more specific than the reset, and `!important` belt-and-
braces against any later reset rule that might still apply. */
.ai-chat-panel .ai-unavailable .btn.btn-primary {
display: inline-block;
background-color: @bc-primary-btn-bg !important;
background-image: none !important;
color: #ffffff !important;
border: 1px solid darken(@bc-primary-btn-bg, 8%) !important;
box-shadow: none !important;
text-shadow: none !important;
font-weight: 600;
font-size: 13.5px;
padding: 6px 18px;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.15s ease;

&:hover {
background-color: lighten(@bc-primary-btn-bg, 6%) !important;
}

&:active {
background-color: darken(@bc-primary-btn-bg, 8%) !important;
}

&:focus-visible {
outline: 2px solid fadeout(@bc-primary-btn-bg, 50%);
outline-offset: 2px;
}
}

.dark .ai-chat-panel .ai-unavailable .btn.btn-primary {
background-color: @dark-bc-primary-btn-bg !important;
border-color: darken(@dark-bc-primary-btn-bg, 8%) !important;

&:hover {
background-color: lighten(@dark-bc-primary-btn-bg, 8%) !important;
}

&:active {
background-color: darken(@dark-bc-primary-btn-bg, 8%) !important;
}
}

/* ── Unavailable / placeholder state ────────────────────────────────── */
.ai-unavailable {
display: flex;
Expand Down
2 changes: 1 addition & 1 deletion tracking-repos.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"phoenixPro": {
"commitID": "335648a9525b6ba669b311af3f102b3a73de2664"
"commitID": "2bb59b167810e72dbc176412b26b7d83f8062234"
}
}
Loading