fix: sticky searchbar hidden in codemirror (#3351)

* fix: sticky search bar in codemirror

* chore: use tailwind classes

* chore: improve consistency across editor instances

---------

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
This commit is contained in:
Nivedin
2023-09-18 12:45:14 +05:30
committed by GitHub
parent 8b0ba3a45e
commit 3684d25848
22 changed files with 172 additions and 23 deletions

View File

@@ -497,6 +497,22 @@ pre.ace_editor {
} }
} }
.cm-panel.cm-search [name="close"] {
@apply flex;
@apply items-center;
@apply justify-center;
@apply min-h-5;
@apply min-w-5;
@apply bg-primaryDark #{!important};
@apply sticky #{!important};
@apply right-0 #{!important};
@apply ml-auto #{!important};
@apply my-auto #{!important};
@apply rounded #{!important};
@apply outline #{!important};
@apply outline-divider #{!important};
}
.shortcut-key { .shortcut-key {
@apply inline-flex; @apply inline-flex;
@apply font-sans; @apply font-sans;

View File

@@ -8,6 +8,7 @@
--upper-primary-sticky-fold: 4.125rem; --upper-primary-sticky-fold: 4.125rem;
--upper-secondary-sticky-fold: 6.188rem; --upper-secondary-sticky-fold: 6.188rem;
--upper-tertiary-sticky-fold: 8.25rem; --upper-tertiary-sticky-fold: 8.25rem;
--upper-fourth-sticky-fold: 10.2rem;
--upper-mobile-primary-sticky-fold: 6.625rem; --upper-mobile-primary-sticky-fold: 6.625rem;
--upper-mobile-secondary-sticky-fold: 8.688rem; --upper-mobile-secondary-sticky-fold: 8.688rem;
--upper-mobile-sticky-fold: 10.75rem; --upper-mobile-sticky-fold: 10.75rem;
@@ -15,6 +16,7 @@
--lower-primary-sticky-fold: 3rem; --lower-primary-sticky-fold: 3rem;
--lower-secondary-sticky-fold: 5.063rem; --lower-secondary-sticky-fold: 5.063rem;
--lower-tertiary-sticky-fold: 7.125rem; --lower-tertiary-sticky-fold: 7.125rem;
--lower-fourth-sticky-fold: 9.188rem;
--sidebar-primary-sticky-fold: 2rem; --sidebar-primary-sticky-fold: 2rem;
} }

View File

@@ -144,6 +144,7 @@ declare module 'vue' {
IconLucideAlertTriangle: typeof import('~icons/lucide/alert-triangle')['default'] IconLucideAlertTriangle: typeof import('~icons/lucide/alert-triangle')['default']
IconLucideArrowLeft: typeof import('~icons/lucide/arrow-left')['default'] IconLucideArrowLeft: typeof import('~icons/lucide/arrow-left')['default']
IconLucideArrowUpRight: typeof import('~icons/lucide/arrow-up-right')['default'] IconLucideArrowUpRight: typeof import('~icons/lucide/arrow-up-right')['default']
IconLucideBrush: typeof import('~icons/lucide/brush')['default']
IconLucideCheckCircle: typeof import('~icons/lucide/check-circle')['default'] IconLucideCheckCircle: typeof import('~icons/lucide/check-circle')['default']
IconLucideChevronRight: typeof import('~icons/lucide/chevron-right')['default'] IconLucideChevronRight: typeof import('~icons/lucide/chevron-right')['default']
IconLucideGlobe: typeof import('~icons/lucide/globe')['default'] IconLucideGlobe: typeof import('~icons/lucide/globe')['default']

View File

@@ -211,3 +211,9 @@ defineActionHandler("request.open-tab", ({ tab }) => {
selectedOptionTab.value = tab as GQLOptionTabs selectedOptionTab.value = tab as GQLOptionTabs
}) })
</script> </script>
<style lang="scss" scoped>
:deep(.cm-panels) {
@apply top-upperPrimaryStickyFold #{!important};
}
</style>

View File

@@ -139,3 +139,9 @@ defineActionHandler(
computed(() => !!props.response && props.response.length > 0) computed(() => !!props.response && props.response.length > 0)
) )
</script> </script>
<style lang="scss" scoped>
:deep(.cm-panels) {
@apply top-sidebarPrimaryStickyFold #{!important};
}
</style>

View File

@@ -396,3 +396,9 @@ const copySchema = () => {
copySchemaIcon.value = IconCheck copySchemaIcon.value = IconCheck
} }
</script> </script>
<style lang="scss" scoped>
:deep(.cm-panels) {
@apply top-sidebarPrimaryStickyFold #{!important};
}
</style>

View File

@@ -528,3 +528,9 @@ const getInspectorResult = (results: InspectorResult[], index: number) => {
}) })
} }
</script> </script>
<style lang="scss" scoped>
:deep(.cm-panels) {
@apply top-upperTertiaryStickyFold #{!important};
}
</style>

View File

@@ -430,3 +430,9 @@ const getInspectorResult = (results: InspectorResult[], index: number) => {
}) })
} }
</script> </script>
<style lang="scss" scoped>
:deep(.cm-panels) {
@apply top-upperTertiaryStickyFold #{!important};
}
</style>

View File

@@ -110,3 +110,9 @@ const clearContent = () => {
preRequestScript.value = "" preRequestScript.value = ""
} }
</script> </script>
<style lang="scss" scoped>
:deep(.cm-panels) {
@apply top-upperTertiaryStickyFold #{!important};
}
</style>

View File

@@ -205,3 +205,9 @@ const prettifyXML = (xml: string) => {
}) })
} }
</script> </script>
<style lang="scss" scoped>
:deep(.cm-panels) {
@apply top-upperFourthStickyFold #{!important};
}
</style>

View File

@@ -106,3 +106,9 @@ const clearContent = () => {
testScript.value = "" testScript.value = ""
} }
</script> </script>
<style lang="scss" scoped>
:deep(.cm-panels) {
@apply top-upperTertiaryStickyFold #{!important};
}
</style>

View File

@@ -424,3 +424,9 @@ const clearContent = () => {
bulkUrlEncodedParams.value = "" bulkUrlEncodedParams.value = ""
} }
</script> </script>
<style lang="scss" scoped>
:deep(.cm-panels) {
@apply top-upperFourthStickyFold #{!important};
}
</style>

View File

@@ -86,7 +86,11 @@
/> />
</div> </div>
</div> </div>
<div ref="jsonResponse" class="flex flex-col flex-1 h-auto h-full"></div> <div
ref="jsonResponse"
class="flex flex-col flex-1 h-auto h-full"
:class="toggleFilter ? 'responseToggleOn' : 'responseToggleOff'"
></div>
<div <div
v-if="outlinePath" v-if="outlinePath"
class="sticky bottom-0 z-10 flex flex-shrink-0 px-2 overflow-auto overflow-x-auto border-t bg-primaryLight border-dividerLight flex-nowrap" class="sticky bottom-0 z-10 flex flex-shrink-0 px-2 overflow-auto overflow-x-auto border-t bg-primaryLight border-dividerLight flex-nowrap"
@@ -381,4 +385,12 @@ defineActionHandler("response.copy", () => copyResponse())
@apply transition; @apply transition;
@apply hover: text-secondary; @apply hover: text-secondary;
} }
:deep(.responseToggleOff .cm-panels) {
@apply top-lowerTertiaryStickyFold #{!important};
}
:deep(.responseToggleOn .cm-panels) {
@apply top-lowerFourthStickyFold #{!important};
}
</style> </style>

View File

@@ -117,3 +117,9 @@ useCodemirror(
defineActionHandler("response.file.download", () => downloadResponse()) defineActionHandler("response.file.download", () => downloadResponse())
defineActionHandler("response.copy", () => copyResponse()) defineActionHandler("response.copy", () => copyResponse())
</script> </script>
<style lang="scss" scoped>
:deep(.cm-panels) {
@apply top-lowerTertiaryStickyFold #{!important};
}
</style>

View File

@@ -1,5 +1,8 @@
<template> <template>
<div class="flex flex-col flex-1"> <div
class="flex flex-col flex-1"
:class="{ eventFeildShown: showEventField }"
>
<div <div
v-if="showEventField" v-if="showEventField"
class="sticky z-10 flex items-center justify-center flex-shrink-0 overflow-x-auto border-b bg-primary border-dividerLight" class="sticky z-10 flex items-center justify-center flex-shrink-0 overflow-x-auto border-b bg-primary border-dividerLight"
@@ -271,3 +274,17 @@ const prettifyRequestBody = () => {
defineActionHandler("request.send-cancel", sendMessage) defineActionHandler("request.send-cancel", sendMessage)
</script> </script>
<style lang="scss" scoped>
:deep(.cm-panels) {
@apply top-upperSecondaryStickyFold #{!important};
}
.eventFeildShown :deep(.cm-panels),
.cmResponsePrimaryStickyFold :deep(.cm-panels) {
@apply top-upperTertiaryStickyFold #{!important};
}
.cmResponseSecondaryStickyFold :deep(.cm-panels) {
@apply top-upperFourthStickyFold #{!important};
}
</style>

View File

@@ -152,6 +152,22 @@ const updateModelValue = (value: string) => {
}) })
} }
// close the context menu when the input is empty
watch(
() => props.modelValue,
(newVal) => {
if (!newVal) {
invokeAction("contextmenu.open", {
position: {
top: 0,
left: 0,
},
text: null,
})
}
}
)
const handleKeystroke = (ev: KeyboardEvent) => { const handleKeystroke = (ev: KeyboardEvent) => {
if (["ArrowDown", "ArrowUp", "Enter", "Tab", "Escape"].includes(ev.key)) { if (["ArrowDown", "ArrowUp", "Enter", "Tab", "Escape"].includes(ev.key)) {
ev.preventDefault() ev.preventDefault()
@@ -314,8 +330,7 @@ const envTooltipPlugin = new HoppReactiveEnvPlugin(envVars, view)
function handleTextSelection() { function handleTextSelection() {
const selection = view.value?.state.selection.main const selection = view.value?.state.selection.main
if (selection) { if (selection) {
const from = selection.from const { from, to } = selection
const to = selection.to
if (from === to) return if (from === to) return
const text = view.value?.state.doc.sliceString(from, to) const text = view.value?.state.doc.sliceString(from, to)
const { top, left } = view.value?.coordsAtPos(from) const { top, left } = view.value?.coordsAtPos(from)

View File

@@ -219,8 +219,8 @@ export function useCodemirror(
function handleTextSelection() { function handleTextSelection() {
const selection = view.value?.state.selection.main const selection = view.value?.state.selection.main
if (selection) { if (selection) {
const from = selection.from const { from, to } = selection
const to = selection.to if (from === to) return
const text = view.value?.state.doc.sliceString(from, to) const text = view.value?.state.doc.sliceString(from, to)
const { top, left } = view.value?.coordsAtPos(from) const { top, left } = view.value?.coordsAtPos(from)
if (text) { if (text) {

View File

@@ -63,6 +63,7 @@ export const baseTheme = EditorView.theme({
".cm-panels": { ".cm-panels": {
backgroundColor: "var(--primary-light-color)", backgroundColor: "var(--primary-light-color)",
color: "var(--secondary-light-color)", color: "var(--secondary-light-color)",
zIndex: "1",
}, },
".cm-panels.cm-panels-top": { ".cm-panels.cm-panels-top": {
borderBottom: "1px solid var(--divider-light-color)", borderBottom: "1px solid var(--divider-light-color)",
@@ -74,25 +75,34 @@ export const baseTheme = EditorView.theme({
display: "flex", display: "flex",
alignItems: "center", alignItems: "center",
flexWrap: "nowrap", flexWrap: "nowrap",
flexShrink: 0, flexShrink: "0",
overflow: "auto", overflow: "auto",
padding: "0.25rem 0.5rem !important",
}, },
".cm-search label": { ".cm-search label": {
display: "inline-flex", display: "inline-flex",
alignItems: "center", alignItems: "center",
}, },
".cm-textfield": { ".cm-textfield": {
backgroundColor: "var(--primary-dark-color)", backgroundColor: "var(--primary-color)",
color: "var(--secondary-dark-color)", color: "var(--secondary-dark-color)",
borderColor: "var(--divider-light-color)", borderColor: "var(--divider-light-color)",
borderRadius: "4px", borderRadius: "4px",
fontSize: "var(--font-size-tiny)",
fontWeight: "600",
flexShrink: "0",
border: "1px solid var(--divider-color)",
}, },
".cm-button": { ".cm-button": {
backgroundColor: "var(--primary-dark-color)", backgroundColor: "var(--primary-color)",
color: "var(--secondary-dark-color)", color: "var(--secondary-light-color)",
backgroundImage: "none", backgroundImage: "none",
border: "none",
borderRadius: "4px", borderRadius: "4px",
fontSize: "var(--font-size-tiny)",
fontWeight: "600",
textTransform: "capitalize",
flexShrink: "0",
border: "1px solid var(--divider-color)",
}, },
".cm-completionLabel": { ".cm-completionLabel": {
color: "var(--secondary-color)", color: "var(--secondary-color)",
@@ -107,10 +117,10 @@ export const baseTheme = EditorView.theme({
color: "var(--tooltip-color)", color: "var(--tooltip-color)",
}, },
".cm-tooltip-arrow:after": { ".cm-tooltip-arrow:after": {
borderTopColor: "inherit !important", borderTopColor: "currentColor !important",
}, },
".cm-tooltip-arrow:before": { ".cm-tooltip-arrow:before": {
borderTopColor: "inherit !important", borderTopColor: "currentColor !important",
}, },
".cm-tooltip.cm-tooltip-autocomplete > ul": { ".cm-tooltip.cm-tooltip-autocomplete > ul": {
fontFamily: "var(--font-mono)", fontFamily: "var(--font-mono)",
@@ -155,8 +165,8 @@ export const baseTheme = EditorView.theme({
textAlign: "center", textAlign: "center",
}, },
".cm-line": { ".cm-line": {
paddingLeft: "0.5em", paddingLeft: "0.5rem",
paddingRight: "0.5em", paddingRight: "0.5rem",
}, },
".cm-activeLineGutter": { ".cm-activeLineGutter": {
backgroundColor: "transparent", backgroundColor: "transparent",
@@ -183,6 +193,7 @@ export const inputTheme = EditorView.theme({
fontFamily: "var(--font-sans)", fontFamily: "var(--font-sans)",
color: "var(--secondary-dark-color)", color: "var(--secondary-dark-color)",
backgroundColor: "transparent", backgroundColor: "transparent",
height: "100%",
}, },
".cm-cursor": { ".cm-cursor": {
borderColor: "var(--secondary-color)", borderColor: "var(--secondary-color)",
@@ -198,6 +209,7 @@ export const inputTheme = EditorView.theme({
".cm-panels": { ".cm-panels": {
backgroundColor: "var(--primary-light-color)", backgroundColor: "var(--primary-light-color)",
color: "var(--secondary-light-color)", color: "var(--secondary-light-color)",
zIndex: "1",
}, },
".cm-panels.cm-panels-top": { ".cm-panels.cm-panels-top": {
borderBottom: "1px solid var(--divider-light-color)", borderBottom: "1px solid var(--divider-light-color)",
@@ -209,25 +221,34 @@ export const inputTheme = EditorView.theme({
display: "flex", display: "flex",
alignItems: "center", alignItems: "center",
flexWrap: "nowrap", flexWrap: "nowrap",
flexShrink: 0, flexShrink: "0",
overflow: "auto", overflow: "auto",
padding: "0.25rem 0.5rem !important",
}, },
".cm-search label": { ".cm-search label": {
display: "inline-flex", display: "inline-flex",
alignItems: "center", alignItems: "center",
}, },
".cm-textfield": { ".cm-textfield": {
backgroundColor: "var(--primary-dark-color)", backgroundColor: "var(--primary-color)",
color: "var(--secondary-dark-color)", color: "var(--secondary-dark-color)",
borderColor: "var(--divider-light-color)", borderColor: "var(--divider-light-color)",
borderRadius: "4px", borderRadius: "4px",
fontSize: "var(--font-size-tiny)",
fontWeight: "600",
flexShrink: "0",
border: "1px solid var(--divider-color)",
}, },
".cm-button": { ".cm-button": {
backgroundColor: "var(--primary-dark-color)", backgroundColor: "var(--primary-color)",
color: "var(--secondary-dark-color)", color: "var(--secondary-light-color)",
backgroundImage: "none", backgroundImage: "none",
border: "none",
borderRadius: "4px", borderRadius: "4px",
fontSize: "var(--font-size-tiny)",
fontWeight: "600",
textTransform: "capitalize",
flexShrink: "0",
border: "1px solid var(--divider-color)",
}, },
".cm-completionLabel": { ".cm-completionLabel": {
color: "var(--secondary-color)", color: "var(--secondary-color)",
@@ -290,10 +311,11 @@ export const inputTheme = EditorView.theme({
textAlign: "center", textAlign: "center",
}, },
".cm-line": { ".cm-line": {
lineHeight: "1rem",
paddingLeft: "1rem", paddingLeft: "1rem",
paddingRight: "1rem", paddingRight: "1rem",
paddingTop: "0.2rem", paddingTop: "0.25rem",
paddingBottom: "0.2rem", paddingBottom: "0.25rem",
}, },
".cm-activeLineGutter": { ".cm-activeLineGutter": {
backgroundColor: "transparent", backgroundColor: "transparent",

View File

@@ -106,6 +106,7 @@
<RealtimeCommunication <RealtimeCommunication
:show-event-field="true" :show-event-field="true"
:is-connected="connectionState === 'CONNECTED'" :is-connected="connectionState === 'CONNECTED'"
class="cmResponseSecondaryStickyFold"
event-field-styles="top-upperSecondaryStickyFold" event-field-styles="top-upperSecondaryStickyFold"
sticky-header-styles="top-upperTertiaryStickyFold" sticky-header-styles="top-upperTertiaryStickyFold"
@send-message="sendMessage($event)" @send-message="sendMessage($event)"

View File

@@ -46,6 +46,7 @@
> >
<RealtimeCommunication <RealtimeCommunication
:is-connected="connectionState === 'CONNECTED'" :is-connected="connectionState === 'CONNECTED'"
class="cmResponsePrimaryStickyFold"
sticky-header-styles="top-upperSecondaryStickyFold" sticky-header-styles="top-upperSecondaryStickyFold"
@send-message="sendMessage($event)" @send-message="sendMessage($event)"
/> />

View File

@@ -13,6 +13,7 @@ export default defineConfig({
upperPrimaryStickyFold: "var(--upper-primary-sticky-fold)", upperPrimaryStickyFold: "var(--upper-primary-sticky-fold)",
upperSecondaryStickyFold: "var(--upper-secondary-sticky-fold)", upperSecondaryStickyFold: "var(--upper-secondary-sticky-fold)",
upperTertiaryStickyFold: "var(--upper-tertiary-sticky-fold)", upperTertiaryStickyFold: "var(--upper-tertiary-sticky-fold)",
upperFourthStickyFold: "var(--upper-fourth-sticky-fold)",
upperMobilePrimaryStickyFold: "var(--upper-mobile-primary-sticky-fold)", upperMobilePrimaryStickyFold: "var(--upper-mobile-primary-sticky-fold)",
upperMobileSecondaryStickyFold: upperMobileSecondaryStickyFold:
"var(--upper-mobile-secondary-sticky-fold)", "var(--upper-mobile-secondary-sticky-fold)",
@@ -22,6 +23,7 @@ export default defineConfig({
lowerPrimaryStickyFold: "var(--lower-primary-sticky-fold)", lowerPrimaryStickyFold: "var(--lower-primary-sticky-fold)",
lowerSecondaryStickyFold: "var(--lower-secondary-sticky-fold)", lowerSecondaryStickyFold: "var(--lower-secondary-sticky-fold)",
lowerTertiaryStickyFold: "var(--lower-tertiary-sticky-fold)", lowerTertiaryStickyFold: "var(--lower-tertiary-sticky-fold)",
lowerFourthStickyFold: "var(--lower-fourth-sticky-fold)",
sidebarPrimaryStickyFold: "var(--sidebar-primary-sticky-fold)", sidebarPrimaryStickyFold: "var(--sidebar-primary-sticky-fold)",
sidebarSecondaryStickyFold: "var(--line-height-body)", sidebarSecondaryStickyFold: "var(--line-height-body)",
}, },

View File

@@ -10,7 +10,7 @@
<div class="flex flex-col relaive"> <div class="flex flex-col relaive">
<label for="teamName" class="py-2"> {{ t('teams.email') }} </label> <label for="teamName" class="py-2"> {{ t('teams.email') }} </label>
<HoppSmartAutoComplete <HoppSmartAutoComplete
styles="w-full p-2 bg-transparent border border-divider rounded-md " styles="w-full p-2 bg-transparent border border-divider rounded-md"
class="flex-1 !flex" class="flex-1 !flex"
:source="allUsersEmail" :source="allUsersEmail"
:spellcheck="true" :spellcheck="true"