Commit Graph

728 Commits

Author SHA1 Message Date
toasted-nutbread
3e68af8666
Shadow DOM container for popup iframes (#623)
* Add support for injecting stylesheets into a custom parent node

* Add api.getStylesheetContent

* Add support for injecting a CSS file's content

* Add usePopupShadowDom option

* Use a per-parentNode cache

* Add support for using a shadow DOM wrapper around popup iframes

* Ignore the popup container instead of the frame
2020-06-24 21:46:13 -04:00
toasted-nutbread
96932119f8
Remove window. from visualViewport, use local variable instead (#621) 2020-06-22 19:27:40 -04:00
toasted-nutbread
65c41975a6
Secure popup frame url changes (#622)
* Throw error if options is not ready

* Remove id

* Change unsecurePopupFrameUrl to useSecurePopupFrameUrl
2020-06-22 19:26:59 -04:00
toasted-nutbread
f2991fb9ee
Frontend initialization refactor (#610)
* Create member functions for ignoreElements and ignorePoint

* Create addFullscreenChangeEventListener utility

* Move popup creation management into Frontend

* Move getUrl implementation

* Remove old setup

* Remove try/catch block

* Error wrap

* Add prepare call to TextScanner

* Update depth when popup changes

* Refactor how Frontend gets PopupFactory and frameId

* Update popup preview to work

* Update popup preview frame to use the frontend's popup

* Update how nested popups are set up

* Error wrap

* Update how popups are set up on the search page

* Error wrap

* Error unwrap

* Add missing prepare

* Remove use of frontendInitializationData

* Catch and log errors
2020-06-21 16:14:05 -04:00
toasted-nutbread
e23504613f
Use DOMTextScanner (#536)
* Use DOMTextScanner instead of TextSourceRange.seek*

* Move getNodesInRange to dom.js

* Move anyNodeMatchesSelector to dom.js

* Remove unused functions

* Update tests

* Add layoutAwareScan option

* Use layoutAwareScan for source and sentence scanning

* Remove unused IGNORE_TEXT_PATTERN
2020-06-21 16:07:51 -04:00
toasted-nutbread
3db7b3a925
Add option to use the unsecure frame URL (#618) 2020-06-21 15:52:43 -04:00
toasted-nutbread
b4a617cac3
Ignore getZoom errors (#604) 2020-06-14 15:14:47 -04:00
toasted-nutbread
b612bd8b8d
PopupProxy refactor (#609)
* Remove setDisabled member; replace with an event

* Pass frameOffsetForwarder directly to PopupProxy

* Replace .start with .prepare

* Make onMessage private

* Make message safer and handle unexpected inputs
2020-06-14 14:06:52 -04:00
toasted-nutbread
9767b76553
Use cross frame API (#553)
* Use new CrossFrameAPI for popup proxy communication

* Remove use of old cross-frame communication classes

* Remove use of old cross-frame communication files

* Make the crossFrame object a member of the api object
2020-06-07 21:40:11 -04:00
toasted-nutbread
3c4c82dcfc
Ensure single popup factory (#554)
* Add createPopupFactory

* Ensure only a single PopupFactory is generated
2020-05-24 14:00:32 -04:00
toasted-nutbread
c61a87b152
API refactor (#532)
* Convert api.js into a class instance

* Use new api.* functions

* Fix missing binds

* Group functions with progress callbacks together

* Change style

* Fix API override not working
2020-05-24 13:30:40 -04:00
toasted-nutbread
dd673f0b26
Dynamic loader load style (#521)
* Remove unnecessary load of /fg/css/client.css

* Replace dynamicLoader.loadStyles with dynamicLoader.loadStyle

* Replace Popup._injectStylesheet with dynamicLoader.loadStyle

* Remove unused global
2020-05-19 20:33:06 -04:00
toasted-nutbread
dd6c3015c4
Use both shadowRoot and openOrClosedShadowRoot (#534) 2020-05-10 14:10:02 -04:00
toasted-nutbread
c38cd70e91
Load frame content using contentDocument.location.href instead of src attribute (#529) 2020-05-10 14:08:18 -04:00
toasted-nutbread
5752b23a8e
Text source refactor (#527)
* Update TextSourceElement API to have parity with TextSourceRange

* Make fields private

* Update equality check

* Fix "this.element" being used instead of just "element"
2020-05-10 14:06:25 -04:00
toasted-nutbread
6eafdac362
Fix setStartOffset not appending (#526) 2020-05-09 21:09:23 -04:00
toasted-nutbread
69c783f861
Frontend/popup proxy message refactoring (#520)
* Use direct message handler functions

* Remove unused targetPopupId

* Make target a member of FrontendApiSender

* Rename frameId to parentFrameId for clarity

* Remove _parentFrameId

* Rename _parentId to _parentPopupId for clarity
2020-05-09 12:27:56 -04:00
toasted-nutbread
48cf646973
Popup refactor (#518)
* Add default

* Convert function to non-static

* Remove static for private functions

* Replace .call

* Move functions with side effects into a synchronous prepare function

* Rename variables with "container" to "frame" in _initializeFrame

* Rename variables with "container" to "frame"

* Rename getContainer to getFrame

* Rename getContainerRect to getFrameRect

* Organize and simplify

* Fix incorrect change of "popup" => "this"

* Move initial _updateVisibility into prepare()
2020-05-08 19:10:06 -04:00
toasted-nutbread
3949db26d7
Text scanner refactor (#517)
* Fix return type

* Pass search function as a constructor argument

* Pass constructor as a details object

For consistency with other complex constructors and improved semantics.

* Convert _ignorePoints to a single optional function

* Organize functions

* Rename ignorePoints to ignorePoint
2020-05-08 19:05:50 -04:00
toasted-nutbread
b936c3e4b1
Popup proxy host refactor (#516)
* Rename PopupProxyHost to PopupFactory

* Update FrontendApiReceiver to support non-async handlers

* Make some functions non-async

* Make setCustomCss non-async

* Make setContentScale non-async

* Remove static

* Rename variables

* Pass frameId into PopupFactory's constructor

* Change FrontendApiReceiver source from popup-proxy-host to popup-factor

* Rename _invokeHostApi to _invoke

* Rename PopupProxy.getHostUrl to getUrl
2020-05-08 19:04:53 -04:00
toasted-nutbread
edb86d9ec3
Organize frontend functions (#513) 2020-05-07 19:38:09 -04:00
toasted-nutbread
38d6f58fac
Frontend refactor (#508)
* Use this.popup instead of this.frontend.popup

* Rename Frontend.popup to _popup

* Make Frontend functions private

* Clean up Frontend constructor
2020-05-06 19:35:36 -04:00
toasted-nutbread
d6ae322961
Text scanning update (#507)
* Fix unity test missing a parameter

* Update docSentenceExtract to not rescan content
2020-05-06 19:34:32 -04:00
toasted-nutbread
f7df6254d6
Dom text scanner fixes (#505)
* Fix test case

* Add test-dom-text-scanner

* Ensure that DOMTextScanner._node never becomes null

* Add remainder
2020-05-06 19:33:17 -04:00
toasted-nutbread
501281e887
Popup init update (#497)
* Add API function to send a message to a specific frameId in a tab

* Update _windowMessageHandlers to support additional info per handler

* Remove message token

* Add new authorization check

* Set up new initialization handler

* Update initialization

* Remove message token

* Replace 'prepare' with 'configure'

* Create new prepare function

* Change configure guard

* Log errors in onMessage

* Improve popup initialize function

* Clear secret/token in _resetFrame

* Remove backend message token

* Clear src and srcdoc attributes before loading

* Don't treat about:blank unloads as load events
2020-05-06 19:27:21 -04:00
siikamiika
a88501ff10
Text selection fixes (#511)
* select matched text in Frontend.findKanji

* blur search query input when setting content
2020-05-07 01:49:42 +03:00
siikamiika
7d7ff165ce
Extract textSource text inside TextScanner (#500)
* extract text inside TextScanner

* clone textSource before text extraction
2020-05-05 00:13:43 +03:00
siikamiika
77b744e675
Modifier key profile condition (#487)
* update Frontend options on modifier change

* add modifier key profile condition

* use select element for modifier condition value

* support "is" and "is not" modifier key conditions

* use plural

* remove dead null check

it's never null in that function

* pass element on rather than assigning to this

* rename event

* remove Firefox OS key to Meta detection

* hide Meta from dropdown on Firefox

* move input type
2020-05-03 04:39:24 +03:00
toasted-nutbread
d4ae9aa501
DOMTextScanner (#458)
* Create new class for scanning text in a document

* Update test styles

* Add tests
2020-05-02 13:05:43 -04:00
toasted-nutbread
d581bffa15
Style fixes (#494)
* Place multi-line expression parentheses on the correct line

* Add function-paren-newline eslint rule

* Add some additional eslint rules
2020-05-02 13:04:17 -04:00
toasted-nutbread
c4ea9321dc
Validate document nodes before use (#493)
* Validate document.body before use in loadScripts

This also fixes an issue where reject wasn't being passed to loadScriptSentinel.

* Validate document nodes before use in _getSiteColor

* Validate document.body before use in _getViewport

* Validate document.body before use in setContentScale

* Validate document.body before use in docImposterCreate
2020-05-02 13:00:46 -04:00
toasted-nutbread
51032d1eca
Catch WrongDocumentError thrown by compareBoundaryPoints (#491)
* Catch WrongDocumentError thrown by compareBoundaryPoints

* Filter error based on name
2020-05-02 12:59:59 -04:00
toasted-nutbread
efa7a5ecc3
Remove and unload the popup frame if an unexpected load occurs (#490)
* Remove and unload the popup frame if an unexpected load occurs

* Remove unused fields

* Only update _injectPromiseComplete if the promise is the most recent one

* Remove redundant this._injectPromise !== null check
2020-05-02 12:59:13 -04:00
toasted-nutbread
8a368aaddc
Don't parent the popup frame to elements which cause unload (#488) 2020-05-02 12:58:24 -04:00
toasted-nutbread
6c341a13d8
Refactor frontend API classes (#482)
* Mark functions as private

* Remove constructor side effects

* Use safer handler invocation

* Mark functions as private

* Mark fields as private

* Update BackendApiForwarder public API
2020-05-02 12:50:44 -04:00
toasted-nutbread
08ada6844a
Remove Frontend inheritance (#486)
* Make Frontend use composition instead of inheritance for TextScanner

* Use push instead of concat

* Update setOptions and setEnabled APIs

* Update how onWindowMessage event listener is added/removed

* Rename options to _options

* Use bind instead of arrow function

* Fix selection being cleared due to settings changes
2020-05-02 12:47:15 -04:00
toasted-nutbread
48c7010f4e
Frontend refactor (part 1) (#484)
* Remove _getVisualViewportScale

* Use super's mouse event listener definitions

* Remove redundant override

* Remove getTouchEventListeners override

* Rename Display.onSearchClear to onEscape

* Change onSearchClear to clearSelection and use an event

* Update how text is marked for selection and deselection

* Replace onError with yomichan.logError

* Update setEnabled to refresh all event listeners
2020-04-27 18:10:37 -04:00
toasted-nutbread
887d769786
Use dynamicLoader for main (#481)
* Update style of search-main and float-main to have better parity

* Use dynamicLoader to inject scripts and CSS
2020-04-26 16:56:34 -04:00
toasted-nutbread
5b96559df8
Error logging refactoring (#454)
* Create new logging methods on yomichan object

* Use new yomichan.logError instead of global logError

* Remove old logError

* Handle unhandledrejection events

* Add addEventListener stub

* Update log function

* Update error conversion to support more types

* Add log event

* Add API log function

* Log errors to the backend

* Make error/warning logs update the badge

* Clear log error indicator on extension button click

* Log correct URL on the background page

* Fix incorrect error conversion

* Remove unhandledrejection handling

Firefox doesn't support it properly.

* Remove unused argument type from log function

* Improve function name

* Change console.warn to yomichan.logWarning

* Move log forwarding initialization into main scripts
2020-04-26 16:55:25 -04:00
siikamiika
ca033a87a0
Update Popup and DisplayFloat optionsContext from Frontend (#464)
* set optionsContext from Frontend

* update Popup+Display options on Frontend change

* remove popup setOptions

* only update DisplayFloat options from Frontend

* fix optionsContext usage

* fix preview frame arguments

* keep Frontend URL up to date

* cache url

* fix preview frame

* trigger modifyingProfileChange in correct places

* remove async from function not using await

* refactor optionsContext in Frontend
2020-04-26 22:33:50 +03:00
toasted-nutbread
d8276a9d5d Use IIFE for entry points 2020-04-22 21:42:20 -04:00
toasted-nutbread
d106c638ed Move popup-nested content into float-main 2020-04-21 18:38:55 -04:00
toasted-nutbread
9ca906ef90 Create float-main.js 2020-04-19 14:29:43 -04:00
toasted-nutbread
6c93d1984f Change frontend-initialize.js to content-script-main.js 2020-04-19 14:26:20 -04:00
siikamiika
d66ca93ce4 cache invalidation 2020-04-18 23:28:00 +03:00
siikamiika
a81c33b60a simplify element source lazy load 2020-04-18 23:28:00 +03:00
siikamiika
691b739849 cache closed shadow dom content windows 2020-04-18 23:28:00 +03:00
siikamiika
66354f1f9e lazy load element sources 2020-04-18 23:28:00 +03:00
siikamiika
bb3ad78e37 optimize source frame finding 2020-04-18 23:28:00 +03:00
siikamiika
350a113996 use getFullscreenElement to check fullscreen 2020-04-18 23:28:00 +03:00
siikamiika
b786e2da19 move open shadow root iframe finder to a function 2020-04-18 23:28:00 +03:00
siikamiika
85706c421b show popup inside iframe for closed shadow dom 2020-04-18 23:28:00 +03:00
siikamiika
fbaf50def1 support iframes inside open shadow dom 2020-04-18 23:28:00 +03:00
siikamiika
4fdc300b61 disable root frame popup when iframe is fullscreen 2020-04-18 23:28:00 +03:00
toasted-nutbread
106172e2c1
Merge pull request #447 from toasted-nutbread/util-conversions
Util conversions
2020-04-18 14:12:41 -04:00
siikamiika
e6053eefa5
Merge pull request #439 from siikamiika/popup-live-toggle
Popup live toggle
2020-04-17 01:31:25 +03:00
siikamiika
b6f7f8c026 fix _canEnable being used before setting options 2020-04-14 20:59:42 +03:00
siikamiika
950f50ef94 don't focus tab when changing settings 2020-04-14 20:35:52 +03:00
siikamiika
362ac84e6c prevent spawning multiple FrameOffsetForwarders 2020-04-12 19:17:50 +03:00
siikamiika
e627ab2537 fix optionsContext URL for root popup 2020-04-12 19:11:18 +03:00
toasted-nutbread
bf4c1aef6a Fix default value of _orphaned 2020-04-11 22:27:31 -04:00
toasted-nutbread
3c48290cd8 Add isExtensionUrl utility function to yomichan object 2020-04-11 15:17:25 -04:00
siikamiika
e6078ce8f6 remove redundant call guard 2020-04-11 21:04:30 +03:00
siikamiika
5c3641eadb simplify frontend disable override 2020-04-11 21:04:30 +03:00
siikamiika
d93e3e1a67 use setters instead of EventDispatcher 2020-04-11 21:04:30 +03:00
siikamiika
275f455e73 fix preview frame error 2020-04-11 21:04:30 +03:00
siikamiika
565e3a8c6a change iframe popup live 2020-04-11 21:04:30 +03:00
siikamiika
b9035854b2 cache created popups 2020-04-11 21:03:22 +03:00
siikamiika
7dd2610ce8 extract different popup creation functions 2020-04-11 21:03:22 +03:00
siikamiika
92109bb5d2 allow disabling scan on search page live 2020-04-11 21:01:27 +03:00
siikamiika
1df59d57b5 limit popup depth live 2020-04-11 21:01:27 +03:00
siikamiika
61a96e327a prevent injecting frontend multiple times 2020-04-11 21:01:27 +03:00
siikamiika
9adbc80a70 listen to optionsUpdated in popup-nested.js 2020-04-11 21:01:27 +03:00
toasted-nutbread
a864cf094f
Merge pull request #437 from toasted-nutbread/backend-api-handler-changes
Backend api handler changes
2020-04-11 11:32:52 -04:00
toasted-nutbread
a296c758b9 apiBroadcast => apiBroadcastTab 2020-04-10 20:00:18 -04:00
4e5029f7ec Update license author field to broader to explicitly reflect that
Yomichan is an ongoing community project. It really does take a village,
and everyone who contributes code owns a part of it :)
2020-04-10 11:10:21 -07:00
toasted-nutbread
a2b66dc6cc Rename apiForward to apiBroadcast 2020-04-07 19:51:39 -04:00
toasted-nutbread
696897f6fa Add support for getting the document title 2020-04-06 18:55:36 -04:00
siikamiika
aea7c590d1 refactor _updateFrameOffset 2020-04-05 20:03:45 +03:00
siikamiika
abd056e563 reduce code duplication 2020-04-05 20:03:45 +03:00
siikamiika
31a326fe63 add option for iframe popups 2020-04-05 20:03:42 +03:00
siikamiika
0d76cef434 give a name to a timeout 2020-04-05 19:57:37 +03:00
siikamiika
e4fc53480f move broadcastRootPopupInformation to Frontend 2020-04-05 19:57:37 +03:00
siikamiika
559033f0a6 default to [0, 0] when sourceFrame is not found 2020-04-05 19:57:37 +03:00
siikamiika
c171503d77 use getTemporaryListenerResult in other places 2020-04-05 19:57:37 +03:00
siikamiika
7928c5d713 error handling 2020-04-05 19:57:37 +03:00
siikamiika
9f9ea1d5fb throttle frame offset getting 2020-04-05 19:57:37 +03:00
siikamiika
fa65ab3512 refactor getTemporaryListenerResult timeout 2020-04-05 19:57:37 +03:00
siikamiika
d88635cbb2 temporary listener abstraction 2020-04-05 19:57:37 +03:00
siikamiika
9fe1e38afb refactor 2020-04-05 19:57:37 +03:00
siikamiika
d20ece9f07 move frame offset forwarding code to a class 2020-04-05 19:57:37 +03:00
siikamiika
09151a1a86 simplify popup proxy prepare 2020-04-05 19:57:37 +03:00
siikamiika
b996d0b1e0 fix and simplify 2020-04-05 19:57:37 +03:00
siikamiika
4814db8df1 adjust iframe popup position to root page 2020-04-05 19:57:37 +03:00
siikamiika
b6c4914b79 simplify popup prepare 2020-04-05 19:57:37 +03:00
siikamiika
6806e7055f show iframe popups in root frame 2020-04-05 19:57:37 +03:00
siikamiika
b616bac66e remove targetPopupId 'all'
Make unset targetPopupId mean the same thing instead
2020-03-21 22:13:07 +02:00
siikamiika
17934cce4b use random ID as popup ID 2020-03-21 22:13:07 +02:00
siikamiika
962c2a381f apply all options on profile change 2020-03-21 22:13:07 +02:00
toasted-nutbread
64fc0349a1 Update global declarations 2020-03-10 22:40:35 -04:00
siikamiika
2ca88b9b9f strict check if popup depth has been set 2020-03-09 11:56:06 +02:00
siikamiika
e2bf22831a start popup depth from 1 on search page 2020-03-09 02:10:28 +02:00
siikamiika
4b0dfa92aa
Merge pull request #393 from siikamiika/reconnect-frontend-api-sender
reconnect FrontendApiSender after disconnecting
2020-03-08 00:50:24 +02:00
siikamiika
9fef0751f3 replace spread with destructuring 2020-03-07 04:11:18 +02:00
siikamiika
86be737508 fix popup containsPoint offset 2020-03-07 03:52:36 +02:00
siikamiika
8b76761744 reconnect FrontendApiSender after disconnecting 2020-03-07 00:32:45 +02:00
siikamiika
a05a05c4f4 fix content script entry point Yomichan prepare
Covers Popup stuff in addition to Frontend
2020-03-02 12:01:53 +02:00
siikamiika
967e99b7f6 ensure Backend prepare in other places 2020-03-02 04:51:45 +02:00
siikamiika
314c567a47 fix hotkeys in popup 2020-03-01 19:02:43 +02:00
toasted-nutbread
8bc1a40914 Use .bind instead of () => {} 2020-02-26 21:01:40 -05:00
toasted-nutbread
fc08cd74fe Use .bind instead of () => {} 2020-02-26 20:35:37 -05:00
toasted-nutbread
03ba1b633e Move event handler definitions 2020-02-26 20:03:21 -05:00
toasted-nutbread
d08ac02c6a Move event handler definitions 2020-02-26 19:52:12 -05:00
toasted-nutbread
0c4aa2eeb9 Fix trailing newlines not actually generating a new line in the imposter
This was causing vertical scroll offset issues
2020-02-23 13:04:55 -05:00
toasted-nutbread
5a5c18371c Use textContent instead of innerText 2020-02-23 11:58:17 -05:00
toasted-nutbread
53220af68e Don't use innerHTML 2020-02-23 11:49:52 -05:00
toasted-nutbread
6d75637ace Fix brace style issues 2020-02-22 14:52:08 -05:00
toasted-nutbread
0f46e3a093 Use a token to ensure that messages are coming from Yomichan 2020-02-17 11:02:21 -05:00
toasted-nutbread
aee16c4431 Check origin on window messages 2020-02-16 23:41:17 -05:00
toasted-nutbread
ae4ee9ddee Fix error handling on style injection 2020-02-16 21:49:28 -05:00
toasted-nutbread
3d27e80ae6 Delay CSS injection until a popup is created 2020-02-16 21:46:13 -05:00
toasted-nutbread
9fd6ee382d Create more generic function for injecting stylesheets 2020-02-16 21:46:13 -05:00
toasted-nutbread
b6a50e234c Change parameter name 2020-02-16 21:44:45 -05:00
toasted-nutbread
2c3f510010 Allow apiInjectStylesheet to inject a URL 2020-02-16 21:43:35 -05:00
toasted-nutbread
1c6ed1d286 Set URL before adding to the document 2020-02-16 21:41:31 -05:00
toasted-nutbread
c6efa65626 Fix missing argument 2020-02-16 19:09:33 -05:00
toasted-nutbread
dcd243c9e9 Update how popups are created 2020-02-16 18:59:08 -05:00
toasted-nutbread
5d3c13ee98 Tweak how fullscreen changes are observed 2020-02-16 18:52:04 -05:00
toasted-nutbread
36605f74c3 Undo "Obscure the iframe's URL from the host page"
There are some additional issues which cause the frame to be reset to
about:blank on certain occasions which must be fixed before this can be
used.
2020-02-16 18:47:46 -05:00
toasted-nutbread
6df5220e02 Prevent multiple prepare calls 2020-02-16 12:23:40 -05:00
toasted-nutbread
b5d32c73e6 Simplify process to wait for iframe prepare completion 2020-02-16 12:23:20 -05:00
toasted-nutbread
42f1c2463c Move generateId function 2020-02-16 12:00:56 -05:00
toasted-nutbread
912d59d3df Obscure the iframe's URL from the host page 2020-02-15 22:39:09 -05:00
toasted-nutbread
10ec165f14 Check type of other for equals functions
Fixes #361
2020-02-15 20:52:21 -05:00
toasted-nutbread
faf15c08aa Rename optionsUpdate event to optionsUpdated
Past tense better indicates that the options were changed, but no data
is being included as part of the event. It is also more consistent with
the other event names the yomichan object currently provides.
2020-02-14 22:34:44 -05:00
toasted-nutbread
89cb98e4d1 Add global apiForward 2020-02-14 21:50:17 -05:00
siikamiika
c09a3ded1d
Merge pull request #357 from siikamiika/simplify-display-prepare
Simplify display prepare
2020-02-14 11:00:36 +02:00
siikamiika
810a7e7d92 use sendMessage to notify about initialization 2020-02-14 02:33:54 +02:00
siikamiika
38a6433a46 remove isInjected checks from Popup 2020-02-13 15:04:10 +02:00
siikamiika
c0225f1f84 notify popup about initialization 2020-02-13 13:18:54 +02:00
siikamiika
df37acd17f rename display initialize methods to prepare 2020-02-13 01:59:26 +02:00
toasted-nutbread
e2ac478cb7 Define more globals 2020-02-11 22:22:16 -05:00
toasted-nutbread
65dfb855fb Fix undefined id 2020-02-11 22:21:55 -05:00
toasted-nutbread
1f3ff6fad0 Fix equals function on TextSourceRange when imposter elements are used 2020-01-26 10:31:17 -05:00
toasted-nutbread
04727a8cd7 Fix viewport issues when popupScaleRelativeToVisualViewport is disabled 2020-01-22 20:38:21 -05:00
toasted-nutbread
8e15c20311 Remove window.onscroll handler since it causes a warning 2020-01-22 20:38:21 -05:00
toasted-nutbread
74d9b0e857 Update full-width popup to stay on screen 2020-01-22 20:38:21 -05:00
toasted-nutbread
d59f2022b9 Allow viewport to be used for constraining popup position 2020-01-22 20:38:21 -05:00
toasted-nutbread
21dbb19565 Update popup position on scroll 2020-01-22 20:38:21 -05:00
toasted-nutbread
e73e4c032c Implement scale relative to visual viewport 2020-01-22 20:38:21 -05:00