diff --git a/CHANGES.md b/CHANGES.md index 483faaa4a..93c6eafcd 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -24,7 +24,6 @@ ## Version 1.25 - Add metadata title on shortcut search [feature 639](https://github.com/tprouvot/Salesforce-Inspector-reloaded/issues/639) request by [Tal-Fr](https://github.com/Tal-Fr) -- Fix `Use Favicon Color` option which was not working key [issue 634](https://github.com/tprouvot/Salesforce-Inspector-reloaded/issues/634) raised by [Gary Woodhouse](https://github.com/Garywoo) - Add `Clear` button in Event Monitor and REST Explorer - Fix `Field Creator` shortcut key [issue 608](https://github.com/tprouvot/Salesforce-Inspector-reloaded/issues/608) - Add `Flow Trigger Explorer` in shortcut links [feature 610](https://github.com/tprouvot/Salesforce-Inspector-reloaded/issues/610) request by [JeffKrakowski](https://github.com/JeffKrakowski) diff --git a/README.md b/README.md index acf8168a9..430f6d4f6 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,8 @@ We all know and love Salesforce Inspector: As the great Søren Krabbe did not ha - Control access to Salesforce Inspector reloaded with profiles / permissions (Implement OAuth2 flow to generate access token for connected App) [how to](https://github.com/tprouvot/Salesforce-Inspector-reloaded/wiki/How-to#use-sf-inspector-with-a-connected-app) - Update manifest version from [v2](https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/) to v3 (extensions using manifest v2 will be removed from the store) - New UI for Export / Import +- Pick preferred color scheme (light || dark mode) +- Pick preferred color theme (true-color || easy-eyes) ## Security and Privacy diff --git a/addon/button.css b/addon/button.css index 56e9263e0..c6189c95b 100644 --- a/addon/button.css +++ b/addon/button.css @@ -10,10 +10,10 @@ width: 280px; height: 450px; position:absolute; - background-color: #ffffff; + background-color: var(--inspector-background, #FFFFFF); border-radius: 4px; z-index: 1; - border: 1px solid #d8dde6; + border: 1px solid var(--inspector-button-border); display: none; } @@ -49,10 +49,10 @@ } #insext .insext-btn { box-sizing: border-box; - background-color: #226b86; + background-color: var(--inspector-insext-background, #226B86); border-width: 4px; border-style: solid; - border-color: #fff; + border-color: var(--inspector-shade, #FFFFFF); opacity: .4; } #insext .insext-btn-vertical { @@ -62,7 +62,7 @@ border-right-style: none; border-top-left-radius: 5px; border-bottom-left-radius: 5px; - box-shadow: -2px 0 2px #a0a6ab; + box-shadow: -2px 0 2px var(--inspector-neutral, #A0A6AB); } #insext .insext-btn-horizontal { height: 15px; @@ -71,7 +71,7 @@ border-bottom-style: none; border-top-left-radius: 5px; border-top-right-radius: 5px; - box-shadow: 0 -2px 2px #a0a6ab; + box-shadow: 0 -2px 2px var(--inspector-neutral, #A0A6AB); } #insext .insext-btn-vertical:hover, @@ -139,10 +139,25 @@ display: inline-block; vertical-align: middle; animation: fadeOut 2s forwards; - } - - @keyframes fadeOut { +} + +@keyframes fadeOut { to { opacity: 0; } - } \ No newline at end of file +} + +/* transitions */ +#insext { + & :is(.insext-popup-vertical, .insext-popup-horizontal) { + transition-property: box-shadow; + transition-duration: var(--inspector-transition-time-slow); + transition-timing-function: var(--inspector-transition-function); + } + + & :is(.insext-btn.insext-btn-vertical, .insext-btn.insext-btn-horizontal) { + transition-property: box-shadow, background-color, border-color; + transition-duration: var(--inspector-transition-time-slow); + transition-timing-function: var(--inspector-transition-function); + } +} diff --git a/addon/button.js b/addon/button.js index c764eafc5..f1ef17c9f 100644 --- a/addon/button.js +++ b/addon/button.js @@ -212,6 +212,21 @@ function initButton(sfHost, inInspector) { if (e.data.insextInitRequest) { // Set CSS classes for arrow button position iFrameLocalStorage = e.data.iFrameLocalStorage; + setupColorChange(); + popupEl.classList.add(iFrameLocalStorage.popupArrowOrientation == "horizontal" ? "insext-popup-horizontal" : "insext-popup-vertical"); + if (iFrameLocalStorage.popupArrowOrientation == "horizontal") { + if (iFrameLocalStorage.popupArrowPosition < 8) { + popupEl.classList.add("insext-popup-horizontal-left"); + } else if (iFrameLocalStorage.popupArrowPosition >= 90) { + popupEl.classList.add("insext-popup-horizontal-right"); + } else { + popupEl.classList.add("insext-popup-horizontal-centered"); + } + } else if (iFrameLocalStorage.popupArrowOrientation == "vertical") { + if (iFrameLocalStorage.popupArrowPosition >= 55) { + popupEl.classList.add("insext-popup-vertical-up"); + } + } const {popupArrowPosition: pos} = iFrameLocalStorage; const o = getOrientation("iframe"); const dir = calcDirection(pos, o); @@ -254,6 +269,16 @@ function initButton(sfHost, inInspector) { document.querySelectorAll("." + apiNamesClass).forEach(e => e.remove()); } } + if (e.data.category && e.data.value) { + const category = e.data.category; + const value = e.data.value; + //rootEl is #insext + const insextValue = rootEl.dataset[category]; + + if (insextValue == null || value != insextValue) { + rootEl.dataset[category] = value; + } + } }); rootEl.appendChild(popupEl); // Function to handle copy action @@ -319,4 +344,12 @@ function initButton(sfHost, inInspector) { } } } + + function setupColorChange() { + const themeValue = iFrameLocalStorage.enableDarkMode === true ? "dark" : "light"; + const accentValue = iFrameLocalStorage.enableAccentColors === true ? "accent" : "default"; + //rootEl is #insext + rootEl.dataset.theme = themeValue; + rootEl.dataset.accent = accentValue; + } } diff --git a/addon/data-export.css b/addon/data-export.css index fc98b8b11..6852205bf 100644 --- a/addon/data-export.css +++ b/addon/data-export.css @@ -47,7 +47,7 @@ body, [data-reactroot] { height: 100%; line-height: 1.5; - color: #16325c; + color: var(--inspector-text); } [data-reactroot] { @@ -60,7 +60,7 @@ body { font-size: .8125rem; overflow: hidden; margin: 0; - background-color: #B0C4DF; + background-color: var(--inspector-sand-background); background-image: url(images/lightning_blue_background.png); background-repeat: no-repeat; background-size: contain; @@ -68,7 +68,7 @@ body { } #user-info { - background: #f7f9fb; + background: var(--inspector-background); height: 48px; display: flex; align-items: center; @@ -82,31 +82,30 @@ body { #user-info span { font-size: 1em; + color: var(--inspector-text); } .sf-link { - background-color: rgb(6, 28, 63); + background-color: var(--inspector-svg-background); border-radius: 3px; line-height: 1.8em; text-decoration: none; display: inline-block; padding: 2px; - color: white; + color: var(--inspector-svg-text); padding-right: 1em; } .sf-link svg { width: 1.8em; - ; height: 1.8em; - ; display: block; margin-left: 1px; margin-right: 1em; float: left; - background-color: #ef7ead; + background-color: var(--inspector-svg-picture); border-radius: 2px; - fill: white; + fill: var(--inspector-svg-text); } textarea { @@ -117,7 +116,7 @@ textarea { font-size: 0.9rem; padding: 8px 10px; border-radius: 0.25rem; - border: 1px solid #DDDBDA; + border: 1px solid var(--inspector-subtle-neutral); } textarea[hidden] { @@ -125,8 +124,8 @@ textarea[hidden] { } .help-text { - background: #fff; - border: 1px solid #DDDBDA; + background: var(--inspector-background); + border: 1px solid var(--inspector-subtle-neutral); padding: 0 15px; border-radius: 0.25rem; margin-top: 10px; @@ -136,6 +135,8 @@ textarea[hidden] { #query { height: 5em; min-height: 7em; + color: var(--inspector-text); + background-color: var(--inspector-background); } #result-area { @@ -163,27 +164,29 @@ textarea[hidden] { flex: 1 1 0; resize: none; white-space: pre; + color: var(--inspector-text); + background-color: var(--inspector-background); } #result-table { overflow: auto; flex: 1 1 0; - background-color: #fff; - border-top: 1px solid #DDDBDA; + background-color: var(--inspector-background); + border-top: 1px solid var(--inspector-neutral); } .area { - background-color: #F8F8F8; + background-color: var(--inspector-shade); padding: 8px 12px; border-radius: 5px; - border: 1px solid #DDDBDA; + border: 1px solid var(--inspector-subtle-neutral); margin: 12px 12px 0 12px; } h1 { font-size: 1rem; display: inline; - color: #080707; + color: var(--inspector-text); font-weight: 700; line-height: 1.25; margin: revert; @@ -232,15 +235,16 @@ h1 { select, input[type=search], -input[type=save], input[type=default] { width: 8.5rem; font-family: inherit; padding: 5px 13px; - border: 1px solid #DDDBDA; + border: 1px solid var(--inspector-subtle-neutral); height: 32px; position: relative; border-radius: 0.25rem; + color: var(--inspector-text); + background-color: var(--inspector-background); } input[type=search] { @@ -253,7 +257,7 @@ input[type=search] { } input[type=save] { - background-image: url(images/save.svg); + /*background-image: url(images/save.svg); this is already an svg near this input*/ background-repeat: no-repeat; background-size: 1rem; background-position: 10px 7px; @@ -272,8 +276,8 @@ input:active, input:focus, select:active, select:focus { - border: 1px solid rgb(21, 137, 238); - box-shadow: rgb(6, 28, 63) 0px 0px 3px 0px; + border: 1px solid var(--inspector-primary); + box-shadow: var(--inspector-accent) 0px 0px 3px 0px; outline: none; z-index: 1; } @@ -285,25 +289,25 @@ select:focus { .button-group select:focus:not(:first-child), .button-group select:focus:not(:first-child) { margin-left: -1px; - border: 1px solid rgb(21, 137, 238); + border: 1px solid var(--inspector-primary); } button:active, button:focus { - background-color: rgb(238, 241, 246); - color: #005fb2; + background-color: var(--inspector-background); + color: var(--inspector-middle); } button:disabled, input:disabled { - color: #dddbda; + color: var(--inspector-subtle-neutral); cursor: default; } button:disabled:hover, input:disabled:hover { - background-color: #fff; - color: #dddbda; + background-color: var(--inspector-background); + color: var(--inspector-subtle-neutral); } button:disabled > svg.button-icon{ @@ -315,26 +319,26 @@ button > svg.disabled{ } .highlighted { - background-color: rgb(0, 112, 210); - border-color: rgb(0, 112, 210); - color: #fff; + background-color: var(--inspector-primary); + border-color: var(--inspector-primary); + color: var(--inspector-white); } .highlighted:hover, .highlighted:active { - background-color: rgb(0, 95, 178); - color: #fff; + background-color: var(--inspector-accent); + color: var(--inspector-white); } .highlighted:disabled { - background-color: #c9c7c5; - border-color: #c9c7c5; - color: #fff; + background-color: var(--inspector-neutral); + border-color: var(--inspector-neutral); + color: var(--inspector-inverted-text); } .highlighted:disabled:hover { - background-color: #c9c7c5; - color: #fff; + background-color: var(--inspector-neutral); + color: var(--inspector-inverted-text); } option[value="null"][disabled] { @@ -345,7 +349,7 @@ textarea[readonly] { outline: none; border-radius: 0; border: none; - border-top: 1px solid #DDDBDA; + border-top: 1px solid var(--inspector-neutral); } #help-btn { @@ -353,13 +357,13 @@ textarea[readonly] { text-decoration: none; font-size: 1.5rem; font-weight: 700; - color: #919191; + color: var(--inspector-neutral); display: flex; align-items: center; } #help-btn:hover .icon { - background-color: #818181; + background-color: var(--inspector-neutral); } #help-btn .icon { @@ -368,11 +372,14 @@ textarea[readonly] { height: 1.4rem; ; -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; -webkit-mask-size: 1.4rem; - ; + mask-size: 1.4rem; -webkit-mask-image: url(images/help.svg); + mask-image: url(images/help.svg); -webkit-mask-position: center; - background-color: #919191; + mask-position: center; + background-color: var(--inspector-neutral); } #spinner { @@ -392,45 +399,45 @@ textarea[readonly] { .cancel-btn { margin-left: 1em; - color: #c23934; + color: var(--inspector-error); } .cancel-btn:not(:disabled):hover, .cancel-btn:not(:disabled):active, .cancel-btn:not(:disabled):focus { - color: #a12b2b; + color: var(--inspector-strong-error); } .delete-btn { - background-color: #c23934; - border-color: #c23934; - color: white; + background-color: var(--inspector-error); + border-color: var(--inspector-error); + color: var(--inspector-text); /* Allows to still show the title even when disabled as it contains useful information */ pointer-events: auto; } .delete-btn:not(:disabled):hover, .delete-btn:not(:disabled):focus { - background-color: #a61a14; - border-color: #c23934; - color: white; + background-color: var(--inspector-strong-error); + border-color: var(--inspector-strong-error); + color: var(--inspector-text-neutral); } .delete-btn:not(:disabled):active { - background-color: #870500; - border-color: #870500; + background-color: var(--inspector-strong-error); + border-color: var(--inspector-strong-error); } .delete-btn:disabled, .delete-btn:disabled:hover { - background-color: #c9c7c5; - border-color: #c9c7c5; - color: white; + background-color: var(--inspector-shade); + border-color: var(--inspector-button-border); + color: var(--inspector-text-neutral); } .char-btn { - color: white; + color: var(--inspector-text); text-decoration: none; - background-color: gray; + background-color: var(--inspector-neutral); display: inline-block; width: 14px; height: 14px; @@ -474,13 +481,13 @@ button[hidden], button, .button { - border: 1px solid #DDDBDA; + border: 1px solid var(--inspector-button-border); height: 32px; display: inline-block; text-decoration: none; - background-color: white; + background-color: var(--inspector-background); padding: 0 16px; - color: #0070d2; + color: var(--inspector-middle); cursor: pointer; outline: none; position: relative; @@ -492,8 +499,8 @@ button, button:hover, .button:hover { - background-color: #F4F6F9; - color: #005fb2; + background-color: var(--inspector-hover); + color: var(--inspector-middle); } button.toggle { @@ -503,8 +510,10 @@ button.toggle { button.toggle .button-toggle-icon, button.toggle .button-icon { -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; -webkit-mask-size: 1rem; - background-color: #706E6B; + mask-size: 1rem; + background-color: var(--inspector-neutral); display: inline-block; width: 16px; height: 16px; @@ -512,7 +521,8 @@ button.toggle .button-icon { button.toggle:hover .button-icon, button.toggle:hover .button-toggle-icon { - background-color: #004487; + background-color: var(--inspector-primary); + color: var(--inspector-middle); } .flex-right button:last-child { @@ -521,14 +531,17 @@ button.toggle:hover .button-toggle-icon { button.expand .button-toggle-icon { -webkit-mask-image: url(images/down.svg); + mask-image: url(images/down.svg); } button.contract .button-toggle-icon { -webkit-mask-image: url(images/up.svg); + mask-image: url(images/up.svg); } button.toggle .button-icon { -webkit-mask-image: url(images/light_bulb.svg); + mask-image: url(images/light_bulb.svg); } ul > li > a > span { @@ -537,7 +550,9 @@ ul > li > a > span { svg.button-icon { -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; -webkit-mask-size: 1rem; + mask-size: 1rem; display: inline-block; width: 16px; height: 16px; @@ -567,17 +582,17 @@ svg.button-icon { } .autocomplete-results a { - border: 1px solid #DDDBDA; + border: 1px solid var(--inspector-subtle-neutral); border-radius: 0.25rem; padding: 0px 4px; text-decoration: none; - color: #006dcc; + color: var(--inspector-link); } .autocomplete-results a:hover, .autocomplete-results a:active { - background-color: #eff1f5; - color: #005fb2; + background-color: var(--inspector-hover); + color: var(--inspector-middle); } .autocomplete-result, @@ -590,8 +605,10 @@ svg.button-icon { display: inline-block; margin: -1px 2px 0 1px; -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; -webkit-mask-size: 0.95rem; - background-color: #706E6B; + mask-size: 0.95rem; + background-color: var(--inspector-neutral); width: 16px; height: 16px; } @@ -602,111 +619,137 @@ svg.button-icon { .relationshipName .autocomplete-icon { -webkit-mask-image: url(images/relate.svg); - background-color: #0070d2; + mask-image: url(images/relate.svg); + background-color: var(--inspector-accent); } .object .autocomplete-icon { -webkit-mask-image: url(images/sobject.svg); - background-color: #04844B; + mask-image: url(images/sobject.svg); + background-color: var(--inspector-success-background); } .variable .autocomplete-icon { -webkit-mask-image: url(images/variable.svg); + mask-image: url(images/variable.svg); } .autocomplete-icon { -webkit-mask-image: url(images/quotation_marks.svg); + mask-image: url(images/quotation_marks.svg); } .null .autocomplete-icon { -webkit-mask-image: url(images/steps.svg); + mask-image: url(images/steps.svg); } .fieldName .autocomplete-icon { /* default icon */ -webkit-mask-image: url(images/question_mark.svg); + mask-image: url(images/question_mark.svg); } .fieldName.reference .autocomplete-icon { -webkit-mask-image: url(images/record_lookup.svg); + mask-image: url(images/record_lookup.svg); } .fieldName.string .autocomplete-icon { -webkit-mask-image: url(images/string.svg); + mask-image: url(images/string.svg); } .fieldName.id .autocomplete-icon { -webkit-mask-image: url(images/anchor.svg); + mask-image: url(images/anchor.svg); } .fieldName.picklist .autocomplete-icon { -webkit-mask-image: url(images/picklist.svg); + mask-image: url(images/picklist.svg); } .fieldName.multipicklist .autocomplete-icon { -webkit-mask-image: url(images/multi-picklist.svg); + mask-image: url(images/multi-picklist.svg); } .fieldName.boolean .autocomplete-icon { -webkit-mask-image: url(images/boolean.svg); + mask-image: url(images/boolean.svg); } .fieldName.phone .autocomplete-icon { -webkit-mask-image: url(images/call.svg); + mask-image: url(images/call.svg); } .fieldName.textarea .autocomplete-icon { -webkit-mask-image: url(images/textarea.svg); + mask-image: url(images/textarea.svg); } .fieldName.url .autocomplete-icon { -webkit-mask-image: url(images/link.svg); + mask-image: url(images/link.svg); } .fieldName.int .autocomplete-icon, .fieldName.double .autocomplete-icon, .fieldName.long .autocomplete-icon { -webkit-mask-image: url(images/number.svg); + mask-image: url(images/number.svg); } .fieldName.address .autocomplete-icon { -webkit-mask-image: url(images/home.svg); + mask-image: url(images/home.svg); } .fieldName.datetime .autocomplete-icon { -webkit-mask-image: url(images/date-time.svg); + mask-image: url(images/date-time.svg); } .fieldName.date .autocomplete-icon { -webkit-mask-image: url(images/date.svg); + mask-image: url(images/date.svg); } .fieldName.currency .autocomplete-icon { -webkit-mask-image: url(images/currency.svg); + mask-image: url(images/currency.svg); } .fieldName.email .autocomplete-icon { -webkit-mask-image: url(images/email.svg); + mask-image: url(images/email.svg); } .fieldName.location .autocomplete-icon { -webkit-mask-image: url(images/checkin.svg); + mask-image: url(images/checkin.svg); } .fieldName.percent .autocomplete-icon { -webkit-mask-image: url(images/percent.svg); + mask-image: url(images/percent.svg); } .fieldName.encryptedstring .autocomplete-icon { -webkit-mask-image: url(images/lock.svg); + mask-image: url(images/lock.svg); } .fieldName.time .autocomplete-icon { -webkit-mask-image: url(images/clock.svg); + mask-image: url(images/clock.svg); } .fieldName.complexvalue .autocomplete-icon { -webkit-mask-image: url(images/advanced_function.svg); + mask-image: url(images/advanced_function.svg); } .header { @@ -715,7 +758,79 @@ svg.button-icon { top: 0; z-index: 2; } + +.query-options { + align-self: center; +} + +#save-wrapper { + border: 1px solid var(--inspector-subtle-neutral); + background-color: var(--inspector-background); + padding: 5px 13px; + width: 8.5rem; + display: inline-block; + overflow: hidden; + + &:has(:active, :focus) { + border: 1px solid var(--inspector-primary); + box-shadow: var(--inspector-accent) 0px 0px 3px 0px; + outline: none; + z-index: 1; + } + + & > svg { + width: 1rem; + fill: var(--inspector-text); + } + + & > input { + color: var(--inspector-text); + background-color: transparent; + border: none; + padding-left: 15px; + + &:active, &:focus { + border: none; + box-shadow: none; + } + } +} + .expanded{ overflow: auto; height: 200px; -} \ No newline at end of file +} + +select.query-history { + height: auto; +} + +/* transitions */ +#save-wrapper { + transition-property: background-color; + transition-duration: var(--inspector-transition-time-slow); + transition-timing-function: var(--inspector-transition-function); + + & > input { + transition-property: color; + transition-duration: var(--inspector-transition-time-slow); + transition-timing-function: var(--inspector-transition-function); + } + + & svg { + transition-property: fill, background-color; + transition-duration: inherit; + transition-timing-function: inherit; + } +} + +div#result-area > div.result-bar input, +button.cancel-btn, +div.autocomplete-header > div.flex-right > button, +div.autocomplete-results > div.autocomplete-result > a, +div.button-group > :is(button, input), +select.query-history { + transition-property: color, background-color; + transition-duration: var(--inspector-transition-time-slow); + transition-timing-function: var(--inspector-transition-function); +} diff --git a/addon/data-export.html b/addon/data-export.html index edf3cf33b..399978425 100644 --- a/addon/data-export.html +++ b/addon/data-export.html @@ -1,21 +1,20 @@ - -
- -