Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
4ae9ee2
refactor(expert): resource handling and add dynamic component mapping…
cstns Nov 19, 2025
196222a
rename `responseTypeComponentMap` to `richContentComponentMap` for cl…
cstns Nov 19, 2025
2cb1010
remove redundant message kind display in rich content slot
cstns Nov 19, 2025
07d63a8
feature(expert): enhance resource handling with flows and nodePackage…
cstns Nov 19, 2025
ff50279
refactor(expert): modularize resource components and add flow guide s…
cstns Nov 19, 2025
b831d58
improve guide spacing
cstns Nov 19, 2025
603505e
refactor(expert): replace custom copy button with `TextCopier` in `Fl…
cstns Nov 19, 2025
6880d20
enhance(ui): add copy confirmation animation and replace "Copied" tex…
cstns Nov 19, 2025
c17cdd9
fix(global-search): prevent arrow key interception outside search con…
dimitrieh Nov 19, 2025
e0e26ed
feat(expert): add pin and close buttons with resizable drawer
dimitrieh Nov 19, 2025
5e13883
enhance(drawers): improve resize handle visibility and notifications …
dimitrieh Nov 19, 2025
feeee2e
fix(drawers): maintain drawer width when pinning
dimitrieh Nov 19, 2025
2c4ed60
fix(expert): fix hover state for expert button gradient border
dimitrieh Nov 20, 2025
8c6f6d4
fix(drawers): enable resizing in both overlay and pinned modes
dimitrieh Nov 20, 2025
70496d8
enhance(drawers): add transparent resize handle and persistent width
dimitrieh Nov 20, 2025
a0d93bc
fix(drawers): prevent height flash when unpinning
dimitrieh Nov 20, 2025
331778c
fix(drawers): prevent shadow from bleeding at top of drawer
dimitrieh Nov 20, 2025
49beb5c
fix(drawers): fix grey box when closing pinned drawer
dimitrieh Nov 20, 2025
784ea27
fix(drawers): remove setTimeout from closeRightDrawer action
dimitrieh Nov 20, 2025
a73e929
fix(drawers): attempt to fix pinned drawer close bug with closing flag
dimitrieh Nov 20, 2025
79de97e
qf lint import order
cstns Nov 20, 2025
d5d345c
feat(expert): auto-widen drawer when response contains flows
dimitrieh Nov 20, 2025
af80777
feat(expert): change flow dropdown button text from 'Flows' to 'Preview'
dimitrieh Nov 20, 2025
491b07e
feat(expert): remove border-radius from flow tile and viewer wrapper
dimitrieh Nov 20, 2025
87646a9
feat(expert): improve copy button and flow card interactions
dimitrieh Nov 20, 2025
5c91dda
feat(expert): add spacing between resources and flows sections
dimitrieh Nov 20, 2025
0d853ca
feat(expert): improve drawer auto-resize behavior
dimitrieh Nov 20, 2025
1645faf
fix(drawers): restore smooth animation for auto-widen in pinned mode
dimitrieh Nov 20, 2025
5372f6d
Added ellipsis overflow handling to flow card titles.
dimitrieh Nov 20, 2025
ec85a84
feat(home): add container query for responsive instance sections
dimitrieh Nov 20, 2025
55b8e3b
feat(expert): add section headers to resources response
dimitrieh Nov 20, 2025
de09387
feat(expert): fix node package URLs and improve resource cards
dimitrieh Nov 20, 2025
f1ff71e
feat(expert): align package icon positioning with resource cards
dimitrieh Nov 20, 2025
bbadd49
fix(expert): standardize spacing and height for resource cards
dimitrieh Nov 20, 2025
7078d00
fix(expert): correct badge colors to match website styling
dimitrieh Nov 20, 2025
6962876
feat(expert): hide expert button when drawer is open
dimitrieh Nov 20, 2025
50b0740
feat(expert): add animated gradient border to drawer header
dimitrieh Nov 20, 2025
144ceca
feat(expert): add responsive pinning behavior to drawer
dimitrieh Nov 20, 2025
fcd82ed
fix(expert): reset manual resize flag on small viewports
dimitrieh Nov 20, 2025
422bc6f
fix(expert): enforce 50% max width on all desktop viewports
dimitrieh Nov 20, 2025
31008f1
refactor(drawers): change responsive breakpoint from 400px to 480px
dimitrieh Nov 20, 2025
336b0b3
refactor(drawers): remove debug logging and clean up close logic
dimitrieh Nov 20, 2025
9417647
fix(drawer): comprehensive drawer UX improvements
dimitrieh Nov 20, 2025
02ba301
fix(drawer): enforce max width constraint on viewport resize
dimitrieh Nov 20, 2025
9831a6d
fix(expert): make togglePinWithWidth inject optional
dimitrieh Nov 20, 2025
c46bbfe
Merge branch 'main' into expert-api-v4-and-flow-examples-ui
cstns Nov 20, 2025
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 frontend/src/components/ExpertButton.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<template>
<div class="expert-button-wrapper flex items-center justify-center h-full px-3" style="height: 60px;">
<div v-if="!isExpertDrawerOpen" class="expert-button-wrapper flex items-center justify-center h-full px-3" style="height: 60px;">
<button
class="expert-button flex items-center gap-1.5 justify-center rounded-md px-[9px] py-[6px] font-bold text-[0.85rem] leading-[20px] text-gray-800 whitespace-nowrap transition-colors"
data-el="expert-button"
Expand All @@ -19,7 +19,10 @@ export default {
name: 'ExpertButton',
components: {},
computed: {
...mapState('ux/drawers', ['rightDrawer'])
...mapState('ux/drawers', ['rightDrawer']),
isExpertDrawerOpen () {
return this.rightDrawer.state && this.rightDrawer.component?.name === 'ExpertDrawer'
}
},
methods: {
...mapActions('ux/drawers', ['closeRightDrawer']),
Expand All @@ -45,8 +48,8 @@ export default {
animation: gradient-border-rotate 4s linear infinite;

&:hover {
background: linear-gradient(#f9fafb, #f9fafb) padding-box,
linear-gradient(135deg, $ff-red-700, #4038d5, $ff-red-700) border-box;
border: 2px solid transparent;
margin: -1px;
}
}

Expand Down
85 changes: 69 additions & 16 deletions frontend/src/components/TextCopier.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,21 @@
<span class="text">{{ text }}</span>
</slot>
</span>
<DuplicateIcon v-if="text.length" class="ff-icon" @click="copyPath" @click.prevent.stop />
<span ref="copied" class="ff-copied" :class="{ 'ff-copied-left': promptPosition === 'left'}">Copied!</span>
<button v-if="text.length" class="ff-icon-button" @click="copyPath">
<DuplicateIcon v-if="!copied" class="ff-icon" />
<CheckIcon v-else class="ff-icon ff-icon-check" />
</button>
</span>
</template>

<script>
import { DuplicateIcon } from '@heroicons/vue/outline'
import { CheckIcon, DuplicateIcon } from '@heroicons/vue/outline'

import Alert from '../services/alerts.js'

export default {
name: 'TextCopier',
components: { DuplicateIcon },
components: { DuplicateIcon, CheckIcon },
props: {
text: {
required: true,
Expand Down Expand Up @@ -46,20 +48,42 @@ export default {
}
},
emits: ['copied'],
data () {
return {
copied: false
}
},
methods: {
copyPath () {
navigator.clipboard.writeText(this.text)
async copyPath () {
try {
// Try modern clipboard API first
if (navigator.clipboard && navigator.clipboard.writeText) {
await navigator.clipboard.writeText(this.text)
} else {
// Fallback for non-secure contexts (HTTP, not HTTPS)
const textArea = document.createElement('textarea')
textArea.value = this.text
textArea.style.position = 'fixed'
textArea.style.left = '-999999px'
textArea.style.top = '-999999px'
document.body.appendChild(textArea)
textArea.focus()
textArea.select()
document.execCommand('copy')
document.body.removeChild(textArea)
}

if (this.confirmationType === 'alert') {
Alert.emit('Copied to Clipboard', 'confirmation')
} else {
// show "Copied" notification
this.$refs.copied.style.display = 'inline'
// hide after 500ms
setTimeout(() => {
this.$refs.copied.style.display = 'none'
}, 500)
this.$emit('copied')
if (this.confirmationType === 'alert') {
Alert.emit('Copied to Clipboard', 'confirmation')
} else {
this.copied = true
setTimeout(() => { this.copied = false }, 2000)
this.$emit('copied')
}
} catch (err) {
console.error('Failed to copy to clipboard:', err)
// Don't show alert to avoid inject() error
// Just keep the icon in copy state (don't show checkmark)
}
}
}
Expand All @@ -75,6 +99,35 @@ export default {
&:hover {
cursor: pointer;
}
.ff-icon-button {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 4px;
border: none;
background: transparent;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s ease;
color: $ff-grey-600;

&:hover {
color: $ff-indigo-600;
background-color: $ff-indigo-50;
}

&:active {
background-color: $ff-indigo-100;
}

.ff-icon {
pointer-events: none;
}

.ff-icon-check {
color: $ff-green-600;
}
}
.ff-copied {
background-color: black;
color: white;
Expand Down
Loading
Loading