diff --git a/app/assets/stylesheets/conversation.css b/app/assets/stylesheets/conversation.css index a5ff33955..1fec0b4b8 100644 --- a/app/assets/stylesheets/conversation.css +++ b/app/assets/stylesheets/conversation.css @@ -1,43 +1,28 @@ @layer components { - .conversation { - font-family: var(--font-sans); - padding-block-end: 6em; - } + .conversation__composer-input { + --focus-ring-size: 0; + --input-border-radius: 0; + --input-border-size: 0; + --input-padding: 0 0.5em; - .conversation__composer { - backdrop-filter: blur(24px); - display: flex; - gap: var(--inline-space); - inset: auto 0 0 0; - padding: var(--block-space); - position: absolute; + &::-webkit-search-cancel-button { + --clear-icon-size: 0.75rem; - .conversation__submit { - display: flex; - flex-direction: column; - } - } + -webkit-appearance: none; + appearance: none; + background-image: url('data:image/svg+xml;utf8,'); + background-repeat: no-repeat; + background-size: var(--clear-icon-size); + block-size: var(--clear-icon-size); + cursor: pointer; + inline-size: var(--clear-icon-size); + inset: 50% 1ch auto auto; + position: absolute; + translate: 0 -50%; - .conversation__header { - align-items: center; - display: flex; - inset: 0 0 auto 0; - justify-content: flex-end; - padding: var(--block-space-half); - position: absolute; - } - - .conversation__input { - align-items: center; - flex-grow: 1; - - .input--textarea { - --input-padding: 0.5em !important; - } - - .conversation:has(.conversation__thinking-indicator--thinking) & { - animation: pulse 1.5s infinite; - pointer-events: none; + @media (prefers-color-scheme: dark) { + background-image: url('data:image/svg+xml;utf8,'); + } } } @@ -45,7 +30,6 @@ display: flex; .action-text-content { - border-radius: 0.5rem; inline-size: fit-content; } diff --git a/app/javascript/controllers/bar_controller.js b/app/javascript/controllers/bar_controller.js index d44737694..429280748 100644 --- a/app/javascript/controllers/bar_controller.js +++ b/app/javascript/controllers/bar_controller.js @@ -1,15 +1,12 @@ import { Controller } from "@hotwired/stimulus" import { post } from "@rails/request.js" -import { isInput } from "helpers/html_helpers" export default class extends Controller { - static targets = [ "turboFrame" ] + static targets = [ "turboFrame", "searchInput", "askInput", "buttonsContainer" ] static outlets = [ "dialog" ] static values = { searchUrl: String, - searchTurboFrameName: String, askUrl: String, - askTurboFrameName: String } dialogOutletConnected(outlet, element) { @@ -17,36 +14,34 @@ export default class extends Controller { this.#clearTurboFrame() } - closeModal() { + reset() { this.dialogOutlet.close() this.#clearTurboFrame() + + this.#showItem(this.buttonsContainerTarget) + this.#hideItem(this.askInputTarget) + this.#hideItem(this.searchInputTarget) + } + + showModal() { + this.dialogOutlet.open() } search(event) { - if (this.#shouldExecuteHotkey) { - event.preventDefault() - this.#openInTurboFrame(this.searchTurboFrameNameValue, this.searchUrlValue) - this.dialogOutlet.open() - } + this.#openInTurboFrame("search", this.searchUrlValue) + + this.#showItem(this.searchInputTarget) + this.#hideItem(this.askInputTarget) + this.#hideItem(this.buttonsContainerTarget) } ask(event) { - if (this.#shouldExecuteHotkey) { - event.preventDefault() - this.#initializeConversation() - this.#openInTurboFrame(this.askTurboFrameNameValue, this.askUrlValue) - this.dialogOutlet.open() - } - } + this.#initializeConversation() + this.#openInTurboFrame("conversation", this.askUrlValue) - get #shouldExecuteHotkey() { - const activeElement = document.activeElement - - if (activeElement) { - return !isInput(activeElement) - } else { - return true - } + this.#showItem(this.askInputTarget) + this.#hideItem(this.searchInputTarget) + this.#hideItem(this.buttonsContainerTarget) } #clearTurboFrame() { @@ -64,11 +59,11 @@ export default class extends Controller { post(this.askUrlValue) } - #closeModalIfAlreadyOpen() { - if (this.hasDialogOutlet) { - try { - this.closeModal() - } catch {} - } + #showItem(element) { + element.removeAttribute("hidden") + } + + #hideItem(element) { + element.setAttribute("hidden", "hidden") } } diff --git a/app/javascript/controllers/hotkey_controller.js b/app/javascript/controllers/hotkey_controller.js index 6abfc45c0..1c85d69e8 100644 --- a/app/javascript/controllers/hotkey_controller.js +++ b/app/javascript/controllers/hotkey_controller.js @@ -1,5 +1,4 @@ import { Controller } from "@hotwired/stimulus" -import { isInput } from "helpers/html_helpers" export default class extends Controller { click(event) { @@ -10,7 +9,7 @@ export default class extends Controller { } #shouldIgnore(event) { - return event.defaultPrevented || isInput(event.target) + return event.defaultPrevented || event.target.closest("input, textarea, lexical-editor") } get #isClickable() { diff --git a/app/javascript/helpers/html_helpers.js b/app/javascript/helpers/html_helpers.js deleted file mode 100644 index 5b4a4185b..000000000 --- a/app/javascript/helpers/html_helpers.js +++ /dev/null @@ -1,3 +0,0 @@ -export function isInput(element) { - return !!element.closest("input, textarea, lexical-editor") -} diff --git a/app/views/bar/_bar.html.erb b/app/views/bar/_bar.html.erb index c0a26a59b..aeadf3d02 100644 --- a/app/views/bar/_bar.html.erb +++ b/app/views/bar/_bar.html.erb @@ -4,9 +4,9 @@ controller: "bar", bar_dialog_outlet: "#bar-modal", bar_search_url_value: search_path, - bar_ask_url_value: conversation_path, + bar_ask_url_value: conversation_path } do %> -
+
<%= tag.button \ class: "btn btn--plain", data: { @@ -28,9 +28,11 @@ <% end %>
-