@jsenv/plugin-toolbar 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/css/toolbar_main.css +784 -0
  2. package/dist/html/toolbar.html +305 -0
  3. package/dist/js/toolbar_injector.js +300 -0
  4. package/dist/js/toolbar_main.js +900 -0
  5. package/dist/jsenv_plugin_toolbar.js +51 -0
  6. package/dist/other/jsenv_logo.svg +140 -0
  7. package/package.json +30 -0
  8. package/scripts/build.mjs +20 -0
  9. package/src/client/animation/toolbar_animation_core.js +30 -0
  10. package/src/client/animation/toolbar_animation_ui.js +21 -0
  11. package/src/client/communication/parent_window_communication.js +33 -0
  12. package/src/client/eventsource/eventsource.css +83 -0
  13. package/src/client/eventsource/toolbar_eventsource.js +57 -0
  14. package/src/client/execution/execution.css +79 -0
  15. package/src/client/execution/toolbar_execution.js +88 -0
  16. package/src/client/focus/focus.css +61 -0
  17. package/src/client/focus/toolbar_focus.js +19 -0
  18. package/src/client/jsenv_logo.svg +140 -0
  19. package/src/client/notification/toolbar_notification.js +181 -0
  20. package/src/client/responsive/overflow_menu.css +61 -0
  21. package/src/client/responsive/toolbar_responsive.js +103 -0
  22. package/src/client/settings/settings.css +201 -0
  23. package/src/client/settings/toolbar_settings.js +47 -0
  24. package/src/client/theme/jsenv_theme.css +77 -0
  25. package/src/client/theme/light_theme.css +106 -0
  26. package/src/client/theme/toolbar_theme.js +34 -0
  27. package/src/client/toolbar.html +452 -0
  28. package/src/client/toolbar_injector.js +230 -0
  29. package/src/client/toolbar_main.css +173 -0
  30. package/src/client/toolbar_main.js +174 -0
  31. package/src/client/toolbar_state.js +16 -0
  32. package/src/client/tooltip/tooltip.css +61 -0
  33. package/src/client/tooltip/tooltip.js +39 -0
  34. package/src/client/util/animation.js +305 -0
  35. package/src/client/util/dom.js +108 -0
  36. package/src/client/util/fetch_using_xhr.js +400 -0
  37. package/src/client/util/fetching.js +14 -0
  38. package/src/client/util/iframe_to_parent_href.js +10 -0
  39. package/src/client/util/jsenv_logger.js +28 -0
  40. package/src/client/util/preferences.js +10 -0
  41. package/src/client/util/responsive.js +112 -0
  42. package/src/client/util/util.js +19 -0
  43. package/src/client/variant/variant.js +74 -0
  44. package/src/jsenv_plugin_toolbar.js +63 -0
  45. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/ast/src/html/html_src_set.js +18 -0
  46. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/animation/toolbar_animation.js +45 -0
  47. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/animation/toolbar_animation.js.map +12 -0
  48. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/animation/toolbar_animation_core.js +32 -0
  49. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/animation/toolbar_animation_core.js.map +12 -0
  50. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/animation/toolbar_animation_ui.js +23 -0
  51. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/animation/toolbar_animation_ui.js.map +12 -0
  52. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/communication/parent_window_communication.js +33 -0
  53. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/eventsource/eventsource.css +87 -0
  54. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/eventsource/toolbar_eventsource.js +59 -0
  55. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/eventsource/toolbar_eventsource.js.map +12 -0
  56. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/execution/execution.css +88 -0
  57. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/execution/toolbar_execution.js +90 -0
  58. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/execution/toolbar_execution.js.map +12 -0
  59. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/focus/focus.css +28 -0
  60. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/focus/toolbar_focus.js +19 -0
  61. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/jsenv_logo.svg +140 -0
  62. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/notification/toolbar_notification.js +183 -0
  63. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/notification/toolbar_notification.js.map +12 -0
  64. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/responsive/overflow_menu.css +60 -0
  65. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/responsive/toolbar_responsive.js +105 -0
  66. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/responsive/toolbar_responsive.js.map +12 -0
  67. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/settings/settings.css +200 -0
  68. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/settings/toolbar_settings.js +49 -0
  69. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/settings/toolbar_settings.js.map +12 -0
  70. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/theme/light_theme.css +110 -0
  71. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/theme/toolbar_theme.js +36 -0
  72. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/theme/toolbar_theme.js.map +12 -0
  73. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/toolbar.html +319 -0
  74. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/toolbar_injector.js +232 -0
  75. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/toolbar_injector.js.map +12 -0
  76. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/toolbar_main.css +161 -0
  77. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/toolbar_main.css.map +12 -0
  78. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/toolbar_main.js +176 -0
  79. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/toolbar_main.js.map +12 -0
  80. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/toolbar_state.js +18 -0
  81. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/toolbar_state.js.map +12 -0
  82. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/tooltip/tooltip.css +60 -0
  83. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/tooltip/tooltip.js +41 -0
  84. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/tooltip/tooltip.js.map +12 -0
  85. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/util/animation.js +307 -0
  86. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/util/animation.js.map +12 -0
  87. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/util/dom.js +108 -0
  88. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/util/iframe_to_parent_href.js +10 -0
  89. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/util/preferences.js +10 -0
  90. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/util/responsive.js +112 -0
  91. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-toolbar/src/client/variant/variant.js +74 -0
  92. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/client/autoreload.js +201 -0
  93. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/client/autoreload.js.map +12 -0
  94. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/client/autoreload_preference.js +11 -0
  95. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/client/reload.js +138 -0
  96. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/client/reload.js.map +12 -0
  97. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/client/url_helpers.js +20 -0
  98. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/explorer/client/explorer.html +590 -0
  99. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/explorer/client/explorer.html@L15C5-L20C12.js +7 -0
  100. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/explorer/client/explorer.html@L15C5-L20C12.js.map +12 -0
  101. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/explorer/client/explorer.html@L368C5-L481C14.js +114 -0
  102. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/explorer/client/explorer.html@L482C5-L605C14.js +124 -0
  103. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/explorer/client/explorer.html@L69C5-L299C13.css +227 -0
  104. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/explorer/client/explorer.html@L8C5-L68C13.css +28 -0
  105. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/import_meta_hot/client/import_meta_hot.js +82 -0
  106. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/ribbon/client/ribbon.js +51 -0
  107. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/server_events/client/connection_manager.js +165 -0
  108. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/server_events/client/events_manager.js +75 -0
  109. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/server_events/client/server_events_client.js +20 -0
  110. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/server_events/client/server_events_client.js.map +12 -0
  111. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/server_events/client/web_socket_connection.js +83 -0
  112. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/server_events/client/web_socket_connection.js.map +12 -0
  113. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/supervisor/client/script_type_module_supervisor.js +98 -0
  114. package/tests/toolbar_basic/.jsenv/chrome@107.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/supervisor/client/supervisor.js +966 -0
  115. package/tests/toolbar_basic/main.html +18 -0
  116. package/tests/toolbar_basic/start_dev_server.mjs +7 -0
  117. package/todo.txt +0 -0
@@ -0,0 +1,114 @@
1
+
2
+ // eslint-disable-next-line no-undef
3
+ const { rootDirectoryUrl, groups, files } = SERVER_PARAMS
4
+
5
+ const groupPreference = {
6
+ has: () => localStorage.hasOwnProperty("explorer_active_group"),
7
+ get: () =>
8
+ localStorage.hasOwnProperty("explorer_active_group")
9
+ ? JSON.parse(localStorage.getItem("explorer_active_group"))
10
+ : undefined,
11
+ set: (value) =>
12
+ localStorage.setItem("explorer_active_group", JSON.stringify(value)),
13
+ }
14
+ const directoryNameFromUrl = (directoryUrl) => {
15
+ const slashLastIndex = directoryUrl.lastIndexOf(
16
+ "/",
17
+ // ignore last slash
18
+ directoryUrl.length - 2,
19
+ )
20
+ if (slashLastIndex === -1) return ""
21
+ return directoryUrl.slice(slashLastIndex + 1)
22
+ }
23
+ const urlToVisitFromRelativeUrl = (relativeUrl) => {
24
+ return `${window.origin}/${relativeUrl}`
25
+ }
26
+
27
+ const fileListElement = document
28
+ .querySelector(`[data-page="file-list"]`)
29
+ .cloneNode(true)
30
+ const directoryName = directoryNameFromUrl(rootDirectoryUrl)
31
+ const span = fileListElement.querySelector("#directory_relative_url")
32
+ span.title = rootDirectoryUrl
33
+ span.textContent = directoryName
34
+
35
+ const h4 = fileListElement.querySelector("h4")
36
+ const ul = fileListElement.querySelector("ul")
37
+ ul.innerHTML = files
38
+ .map(
39
+ (file) =>
40
+ `<li>
41
+ <a
42
+ class="execution-link"
43
+ data-relative-url=${file.relativeUrl}
44
+ href=${urlToVisitFromRelativeUrl(file.relativeUrl)}
45
+ >
46
+ ${file.relativeUrl}
47
+ </a>
48
+ </li>`,
49
+ )
50
+ .join("")
51
+
52
+ const groupFieldset = fileListElement.querySelector("#filter-group-set")
53
+ const groupNames = Object.keys(groups)
54
+ groupFieldset.innerHTML = groupNames
55
+ .map(
56
+ (key) => `<label data-contains-hidden-input class="item">
57
+ <input type="radio" name="filter-group" value="${key}"/>
58
+ <span>${key}</span>
59
+ </label>`,
60
+ )
61
+ .join("")
62
+
63
+ const groupFromLocalStorage = groupPreference.get()
64
+ const currentGroup =
65
+ groupFromLocalStorage && groupNames.includes(groupFromLocalStorage)
66
+ ? groupFromLocalStorage
67
+ : groupNames[0]
68
+ Array.from(groupFieldset.querySelectorAll("input")).forEach(
69
+ (inputRadio) => {
70
+ inputRadio.checked = inputRadio.value === currentGroup
71
+ inputRadio.onchange = () => {
72
+ if (inputRadio.checked) {
73
+ groupPreference.set(inputRadio.value)
74
+ enableGroup(inputRadio.value)
75
+ }
76
+ }
77
+ },
78
+ )
79
+
80
+ const enableGroup = (groupName) => {
81
+ const arrayOfElementToShow = []
82
+ const arrayOfElementToHide = []
83
+ files.forEach((file) => {
84
+ const fileLink = fileListElement.querySelector(
85
+ `a[data-relative-url="${file.relativeUrl}"]`,
86
+ )
87
+ const fileLi = fileLink.parentNode
88
+ if (file.meta[groupName]) {
89
+ arrayOfElementToShow.push(fileLi)
90
+ } else {
91
+ arrayOfElementToHide.push(fileLi)
92
+ }
93
+ })
94
+ arrayOfElementToShow.forEach((element) => {
95
+ element.removeAttribute("data-force-hide")
96
+ })
97
+ arrayOfElementToHide.forEach((element) => {
98
+ element.setAttribute("data-force-hide", "")
99
+ })
100
+
101
+ h4.innerHTML =
102
+ arrayOfElementToShow.length === 0
103
+ ? `No file found.
104
+ Config for this section: <pre>${JSON.stringify(
105
+ groups[groupName],
106
+ null,
107
+ " ",
108
+ )}</pre>`
109
+ : `${arrayOfElementToShow.length} files found. Click on the one you want to execute`
110
+ }
111
+ enableGroup(currentGroup)
112
+
113
+ document.querySelector("main").appendChild(fileListElement)
114
+
@@ -0,0 +1,124 @@
1
+
2
+ // make menu scrollable
3
+ const getMenuWrapperSize = () => {
4
+ return document.querySelector(".menu-wrapper").getBoundingClientRect()
5
+ .width
6
+ }
7
+ const getMenuSize = () => {
8
+ return document.querySelector(".menu").getBoundingClientRect().width
9
+ }
10
+ const getMenuPosition = () => {
11
+ return document.querySelector(".menu-wrapper").scrollLeft
12
+ }
13
+
14
+ let menuWrapperSize = getMenuWrapperSize()
15
+ let menuSize = getMenuSize()
16
+ const menuVisibleSize = menuWrapperSize
17
+ let menuInvisibleSize = menuSize - menuVisibleSize
18
+ const scrollDuration = 300
19
+ const leftPaddle = document.querySelector(".left-paddle")
20
+ const rightPaddle = document.querySelector(".right-paddle")
21
+
22
+ const handleMenuScroll = () => {
23
+ menuInvisibleSize = menuSize - menuWrapperSize
24
+ const menuPosition = getMenuPosition()
25
+ const menuEndOffset = menuInvisibleSize
26
+ // show & hide the paddles, depending on scroll position
27
+ if (menuPosition <= 0 && menuEndOffset <= 0) {
28
+ // hide both paddles if the window is large enough to display all tabs
29
+ leftPaddle.classList.add("hidden")
30
+ rightPaddle.classList.add("hidden")
31
+ } else if (menuPosition <= 0) {
32
+ leftPaddle.classList.add("hidden")
33
+ rightPaddle.classList.remove("hidden")
34
+ } else if (menuPosition < Math.floor(menuEndOffset)) {
35
+ // show both paddles in the middle
36
+ leftPaddle.classList.remove("hidden")
37
+ rightPaddle.classList.remove("hidden")
38
+ } else if (menuPosition >= Math.floor(menuEndOffset)) {
39
+ leftPaddle.classList.remove("hidden")
40
+ rightPaddle.classList.add("hidden")
41
+ }
42
+ }
43
+ handleMenuScroll()
44
+
45
+ window.onresize = () => {
46
+ menuWrapperSize = getMenuWrapperSize()
47
+ menuSize = getMenuSize()
48
+ handleMenuScroll()
49
+ }
50
+ // finally, what happens when we are actually scrolling the menu
51
+ document.querySelector(".menu-wrapper").onscroll = () => {
52
+ handleMenuScroll()
53
+ }
54
+
55
+ const startJavaScriptAnimation = ({
56
+ duration = 300,
57
+ timingFunction = (t) => t,
58
+ onProgress = () => {},
59
+ onCancel = () => {},
60
+ onComplete = () => {},
61
+ }) => {
62
+ duration = parseInt(duration, 10)
63
+ const startMs = performance.now()
64
+ let currentRequestAnimationFrameId
65
+ let done = false
66
+ let rawProgress = 0
67
+ let progress = 0
68
+ const handler = () => {
69
+ currentRequestAnimationFrameId = null
70
+ const nowMs = performance.now()
71
+ rawProgress = Math.min((nowMs - startMs) / duration, 1)
72
+ progress = timingFunction(rawProgress)
73
+ done = rawProgress === 1
74
+ onProgress({
75
+ done,
76
+ rawProgress,
77
+ progress,
78
+ })
79
+ if (done) {
80
+ onComplete()
81
+ } else {
82
+ currentRequestAnimationFrameId =
83
+ window.requestAnimationFrame(handler)
84
+ }
85
+ }
86
+ handler()
87
+ const stop = () => {
88
+ if (currentRequestAnimationFrameId) {
89
+ window.cancelAnimationFrame(currentRequestAnimationFrameId)
90
+ currentRequestAnimationFrameId = null
91
+ }
92
+ if (!done) {
93
+ done = true
94
+ onCancel({
95
+ rawProgress,
96
+ progress,
97
+ })
98
+ }
99
+ }
100
+ return stop
101
+ }
102
+ rightPaddle.onclick = () => {
103
+ const scrollStart = document.querySelector(".menu-wrapper").scrollLeft
104
+ const scrollEnd = scrollStart + menuWrapperSize
105
+ startJavaScriptAnimation({
106
+ duration: scrollDuration,
107
+ onProgress: ({ progress }) => {
108
+ document.querySelector(".menu-wrapper").scrollLeft =
109
+ scrollStart + (scrollEnd - scrollStart) * progress
110
+ },
111
+ })
112
+ }
113
+ leftPaddle.onclick = () => {
114
+ const scrollStart = document.querySelector(".menu-wrapper").scrollLeft
115
+ const scrollEnd = scrollStart - menuWrapperSize
116
+ startJavaScriptAnimation({
117
+ duration: scrollDuration,
118
+ onProgress: ({ progress }) => {
119
+ document.querySelector(".menu-wrapper").scrollLeft =
120
+ scrollStart + (scrollEnd - scrollStart) * progress
121
+ },
122
+ })
123
+ }
124
+
@@ -0,0 +1,227 @@
1
+ * {
2
+ box-sizing: border-box;
3
+ }
4
+
5
+ [data-force-hide] {
6
+ display: none !important;
7
+ }
8
+
9
+ html, body {
10
+ flex-direction: column;
11
+ flex: 1;
12
+ margin: 0;
13
+ padding: 0;
14
+ display: flex;
15
+ }
16
+
17
+ html {
18
+ height: 100%;
19
+ font-family: arial, sans;
20
+ }
21
+
22
+ main {
23
+ flex-direction: column;
24
+ flex: 1;
25
+ display: flex;
26
+ }
27
+
28
+ main > * {
29
+ min-width: 100%;
30
+ flex: 1;
31
+ }
32
+
33
+ hr {
34
+ color: #000;
35
+ background-color: #000;
36
+ border-color: #000;
37
+ margin: 15px 0;
38
+ }
39
+
40
+ article[data-page="file-list"] {
41
+ color: #97a0a0;
42
+ background-color: #204143;
43
+ }
44
+
45
+ nav, #explorables-message {
46
+ background: #1f262c;
47
+ }
48
+
49
+ #explorables nav {
50
+ overflow: hidden;
51
+ }
52
+
53
+ #explorables-message {
54
+ overflow: auto;
55
+ }
56
+
57
+ article h2 {
58
+ margin: 0;
59
+ display: flex;
60
+ }
61
+
62
+ article h2 svg {
63
+ margin-right: 15px;
64
+ }
65
+
66
+ #main_html_file {
67
+ padding: 25px 25px 0;
68
+ }
69
+
70
+ #main_file_link {
71
+ color: #e7f2f3;
72
+ }
73
+
74
+ h2 {
75
+ color: #24b1b0;
76
+ margin: 20px 0;
77
+ display: inline-block;
78
+ }
79
+
80
+ h4 {
81
+ color: #97a0a0;
82
+ padding: 0 25px;
83
+ font-size: 15px;
84
+ font-weight: normal;
85
+ }
86
+
87
+ #explorables {
88
+ word-break: break-word;
89
+ }
90
+
91
+ #explorables-header {
92
+ width: 100%;
93
+ position: -webkit-sticky;
94
+ position: sticky;
95
+ top: 0;
96
+ }
97
+
98
+ #explorables_header_and_menu {
99
+ background-color: #204143;
100
+ padding-top: 25px;
101
+ padding-left: 25px;
102
+ padding-right: 25px;
103
+ }
104
+
105
+ #explorables_header_bottom_spacing {
106
+ height: 20px;
107
+ background: #1f262c;
108
+ }
109
+
110
+ #directory_relative_url {
111
+ color: orange;
112
+ }
113
+
114
+ #explorables ul {
115
+ margin: 0;
116
+ padding: 0 25px 25px;
117
+ }
118
+
119
+ #explorables li {
120
+ margin: 10px 0;
121
+ list-style-type: none;
122
+ }
123
+
124
+ #explorables li:first-child {
125
+ margin-top: 0;
126
+ }
127
+
128
+ #explorables li .execution-link {
129
+ width: 100%;
130
+ word-break: break-all;
131
+ }
132
+
133
+ .execution-link {
134
+ color: #e7f2f3;
135
+ -webkit-text-decoration: unset;
136
+ text-decoration: unset;
137
+ background: #204143;
138
+ padding: 6px 12px;
139
+ font-family: monospace;
140
+ font-size: 14px;
141
+ display: inline-block;
142
+ }
143
+
144
+ #main_file_icon {
145
+ fill: #24b1b0;
146
+ }
147
+
148
+ #fileIconSvgConfig {
149
+ width: 25px;
150
+ height: 25px;
151
+ stroke: none;
152
+ fill: #24b1b0;
153
+ }
154
+
155
+ #explorables fieldset {
156
+ border: none;
157
+ margin: 0;
158
+ padding: 0;
159
+ }
160
+
161
+ #explorables fieldset label {
162
+ padding: 0;
163
+ display: inline-block;
164
+ }
165
+
166
+ #explorables fieldset input {
167
+ opacity: 0;
168
+ position: absolute;
169
+ }
170
+
171
+ #explorables fieldset label input + * {
172
+ min-width: 8em;
173
+ text-align: center;
174
+ background-color: #204143;
175
+ border-radius: .1em;
176
+ padding: .7em 1em;
177
+ display: block;
178
+ }
179
+
180
+ #explorables fieldset input:checked + * {
181
+ color: orange;
182
+ background: #1f262c;
183
+ }
184
+
185
+ .menu-wrapper {
186
+ max-width: 100%;
187
+ margin-top: 25px;
188
+ transition: all .3s;
189
+ position: relative;
190
+ overflow: hidden;
191
+ }
192
+
193
+ .menu {
194
+ box-sizing: border-box;
195
+ white-space: nowrap;
196
+ -webkit-overflow-scrolling: touch;
197
+ overflow-x: auto;
198
+ overflow-y: hidden;
199
+ }
200
+
201
+ .menu .item {
202
+ height: 100%;
203
+ box-sizing: border-box;
204
+ padding: 1em;
205
+ display: inline-block;
206
+ }
207
+
208
+ .paddle {
209
+ height: 36px;
210
+ color: #1f262c;
211
+ background: #24b1b0;
212
+ border: none;
213
+ position: absolute;
214
+ bottom: 0;
215
+ }
216
+
217
+ .left-paddle {
218
+ left: 0;
219
+ }
220
+
221
+ .right-paddle {
222
+ right: 0;
223
+ }
224
+
225
+ .hidden {
226
+ display: none;
227
+ }
@@ -0,0 +1,28 @@
1
+ button:focus, a:focus, input:focus, [data-contains-hidden-input] input:focus + * {
2
+ outline-offset: -2px;
3
+ outline-style: none;
4
+ }
5
+
6
+ [data-contains-hidden-input] input:focus + * {
7
+ outline-offset: -2px;
8
+ outline-width: 4px;
9
+ }
10
+
11
+ html[data-last-interaction="keyboard"] button:focus, html[data-last-interaction="keyboard"] a:focus, html[data-last-interaction="keyboard"] input:focus, html[data-last-interaction="keyboard"] [data-contains-hidden-input] input:focus + * {
12
+ outline-style: auto;
13
+ }
14
+
15
+ html[data-last-interaction="keyboard"] [data-contains-hidden-input] input:focus + * {
16
+ outline-color: #0096ff;
17
+ }
18
+
19
+ @-moz-document url-prefix() {
20
+ html[data-last-interaction="keyboard"] button:focus, html[data-last-interaction="keyboard"] a:focus, html[data-last-interaction="keyboard"] input:focus, html[data-last-interaction="keyboard"] [data-input-customized] input:focus + * {
21
+ outline-offset: 0;
22
+ outline: 2px solid #0096ff;
23
+ }
24
+ }
25
+
26
+ ::-moz-focus-inner {
27
+ border: 0;
28
+ }
@@ -0,0 +1,82 @@
1
+ /*
2
+ * https://vitejs.dev/guide/api-hmr.html#hot-accept-deps-cb
3
+ * https://modern-web.dev/docs/dev-server/plugins/hmr/
4
+ */
5
+
6
+ export const urlHotMetas = {}
7
+
8
+ export const createImportMetaHot = (importMetaUrl) => {
9
+ const data = {}
10
+ const url = asUrlWithoutHmrQuery(importMetaUrl)
11
+
12
+ return {
13
+ data,
14
+ accept: (firstArg, secondArg) => {
15
+ if (!firstArg) {
16
+ addUrlMeta(url, {
17
+ dependencies: [url],
18
+ acceptCallback: () => {},
19
+ })
20
+ return
21
+ }
22
+ if (typeof firstArg === "function") {
23
+ addUrlMeta(url, {
24
+ dependencies: [url],
25
+ acceptCallback: firstArg,
26
+ })
27
+ return
28
+ }
29
+ if (typeof firstArg === "string") {
30
+ addUrlMeta(url, {
31
+ dependencies: [firstArg],
32
+ acceptCallback: secondArg,
33
+ })
34
+ return
35
+ }
36
+ if (Array.isArray(firstArg)) {
37
+ addUrlMeta(url, {
38
+ dependencies: firstArg,
39
+ acceptCallback: secondArg,
40
+ })
41
+ return
42
+ }
43
+ throw new Error(
44
+ `invalid call to import.meta.hot.accept(), received ${firstArg}`,
45
+ )
46
+ },
47
+ dispose: (callback) => {
48
+ addUrlMeta(url, {
49
+ disposeCallback: () => {
50
+ return callback(data)
51
+ },
52
+ })
53
+ },
54
+ decline: () => {
55
+ addUrlMeta(url, {
56
+ declined: true,
57
+ })
58
+ },
59
+ invalidate: () => {
60
+ addUrlMeta(url, {
61
+ invalidated: true,
62
+ })
63
+ },
64
+ }
65
+ }
66
+
67
+ const addUrlMeta = (url, meta) => {
68
+ urlHotMetas[url] = {
69
+ ...urlHotMetas[url],
70
+ ...meta,
71
+ }
72
+ }
73
+
74
+ const asUrlWithoutHmrQuery = (url) => {
75
+ const urlObject = new URL(url)
76
+ if (urlObject.searchParams.has("hmr")) {
77
+ urlObject.searchParams.delete("hmr")
78
+ urlObject.searchParams.delete("v")
79
+ return urlObject.href
80
+ }
81
+ return url
82
+ }
@@ -0,0 +1,51 @@
1
+ export const injectRibbon = ({ text }) => {
2
+ const css = /* css */ `
3
+ #jsenv_ribbon_container {
4
+ position: absolute;
5
+ z-index: 1001;
6
+ top: 0;
7
+ right: 0;
8
+ width: 100px;
9
+ height: 100px;
10
+ overflow: hidden;
11
+ opacity: 0.5;
12
+ pointer-events: none;
13
+ }
14
+ #jsenv_ribbon {
15
+ position: absolute;
16
+ top: -10px;
17
+ right: -10px;
18
+ width: 100%;
19
+ height: 100%;
20
+ }
21
+ #jsenv_ribbon_text {
22
+ position: absolute;
23
+ left: 0px;
24
+ top: 20px;
25
+ transform: rotate(45deg);
26
+ display: block;
27
+ width: 125px;
28
+ line-height: 36px;
29
+ background-color: orange;
30
+ color: rgb(55, 7, 7);
31
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1);
32
+ font-weight: 700;
33
+ font-size: 16px;
34
+ font-family: "Lato", sans-serif;
35
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
36
+ text-align: center;
37
+ user-select: none;
38
+ }
39
+ `
40
+
41
+ const html = /* html */ `<div id="jsenv_ribbon_container">
42
+ <style>${css}</style>
43
+ <div id="jsenv_ribbon">
44
+ <div id="jsenv_ribbon_text">${text}</div>
45
+ </div>
46
+ </div>`
47
+
48
+ const node = document.createElement("div")
49
+ node.innerHTML = html
50
+ document.body.appendChild(node.firstChild)
51
+ }