├── .tool-versions
├── .prettierignore
├── .prettierrc.json
├── public
├── images
│ ├── icon-16.png
│ ├── icon-32.png
│ ├── icon-48.png
│ ├── icon-128.png
│ ├── icon-16-wo.png
│ ├── icon-32-wo.png
│ ├── icon-48-wo.png
│ └── icon-128-wo.png
├── fonts
│ ├── AirbnbCereal_W_Bd.otf
│ ├── AirbnbCereal_W_Bk.otf
│ ├── AirbnbCereal_W_Blk.otf
│ ├── AirbnbCereal_W_Lt.otf
│ ├── AirbnbCereal_W_Md.otf
│ └── AirbnbCereal_W_XBd.otf
├── register.html
├── icons
│ └── inspect.svg
├── panel.html
├── styles
│ ├── hotwire_dev_tools_content.css
│ ├── panel
│ │ ├── code_highlight.css
│ │ ├── utilities.css
│ │ └── main.css
│ ├── hotwire_dev_tools_popup.css
│ └── hotwire_dev_tools_detail_panel.css
└── popup.html
├── src
├── browser_panel
│ ├── panel
│ │ ├── register.js
│ │ ├── App.svelte
│ │ ├── panel.js
│ │ └── tabs
│ │ │ └── LogsTab.svelte
│ ├── HTMLRenderer.svelte
│ ├── theme.svelte.js
│ ├── proxy.js
│ ├── page
│ │ ├── turbo_cable_observer.js
│ │ ├── element_observer.js
│ │ ├── turbo_frame_observer.js
│ │ ├── turbo_attribute_elements_observer.js
│ │ └── stimulus_observer.js
│ ├── State.svelte.js
│ └── messaging.js
├── uikit
│ ├── IconButton.svelte
│ └── webawesome.svelte.js
├── components
│ ├── InspectButton.svelte
│ ├── Stimulus
│ │ ├── ClassTreeItem.svelte
│ │ ├── OutletTreeItem.svelte
│ │ ├── TargetTreeItem.svelte
│ │ ├── ValueEditor.svelte
│ │ ├── ActionTreeItem.svelte
│ │ ├── NestedValue.svelte
│ │ └── ValueTreeItem.svelte
│ ├── ScrollIntoViewButton.svelte
│ ├── StripedHtmlTag.svelte
│ └── CopyButton.svelte
├── utils
│ ├── turbo_utils.js
│ ├── dom_scanner.js
│ ├── highlight.js
│ ├── collapsible.js
│ ├── icons.js
│ └── utils.js
├── inject_script.js
├── lib
│ ├── constants.js
│ ├── diagnostics_checker.js
│ └── devtool.js
├── background.js
└── content.js
├── xcode
├── HotwireDevTools
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── AppIcon.appiconset
│ │ │ ├── mac-icon-16@1x.png
│ │ │ ├── mac-icon-16@2x.png
│ │ │ ├── mac-icon-32@1x.png
│ │ │ ├── mac-icon-32@2x.png
│ │ │ ├── mac-icon-128@1x.png
│ │ │ ├── mac-icon-128@2x.png
│ │ │ ├── mac-icon-256@1x.png
│ │ │ ├── mac-icon-256@2x.png
│ │ │ ├── mac-icon-512@1x.png
│ │ │ ├── mac-icon-512@2x.png
│ │ │ └── Contents.json
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ └── LargeIcon.imageset
│ │ │ └── Contents.json
│ ├── Resources
│ │ ├── Icon.png
│ │ ├── Style.css
│ │ └── Script.js
│ ├── Info.plist
│ ├── HotwireDevTools.entitlements
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── Main.html
│ │ └── Main.storyboard
│ └── ViewController.swift
├── HotwireDevTools.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── HotwireDevTools.xcscheme
└── HotwireDevTools Extension
│ ├── HotwireDevTools_Extension.entitlements
│ ├── Info.plist
│ └── SafariWebExtensionHandler.swift
├── privacy_policy.md
├── .gitignore
├── jsconfig.json
├── .vscode
└── settings.json
├── .github
├── workflows
│ └── lint.yml
└── copilot-instructions.md
├── package.json
├── MIT-LICENSE
├── manifest.template.json
├── ARCHITECTURE.md
└── README.md
/.tool-versions:
--------------------------------------------------------------------------------
1 | nodejs 24.2.0
2 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | manifest.template.json
2 | xcode/HotwireDevTools/*/**
3 |
--------------------------------------------------------------------------------
/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": false,
3 | "printWidth": 220,
4 | "semi": false
5 | }
6 |
--------------------------------------------------------------------------------
/public/images/icon-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/images/icon-16.png
--------------------------------------------------------------------------------
/public/images/icon-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/images/icon-32.png
--------------------------------------------------------------------------------
/public/images/icon-48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/images/icon-48.png
--------------------------------------------------------------------------------
/public/images/icon-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/images/icon-128.png
--------------------------------------------------------------------------------
/public/images/icon-16-wo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/images/icon-16-wo.png
--------------------------------------------------------------------------------
/public/images/icon-32-wo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/images/icon-32-wo.png
--------------------------------------------------------------------------------
/public/images/icon-48-wo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/images/icon-48-wo.png
--------------------------------------------------------------------------------
/src/browser_panel/panel/register.js:
--------------------------------------------------------------------------------
1 | chrome.devtools.panels.create("Hotwire", "/images/icon-128.png", "panel.html")
2 |
--------------------------------------------------------------------------------
/public/images/icon-128-wo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/images/icon-128-wo.png
--------------------------------------------------------------------------------
/public/fonts/AirbnbCereal_W_Bd.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/fonts/AirbnbCereal_W_Bd.otf
--------------------------------------------------------------------------------
/public/fonts/AirbnbCereal_W_Bk.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/fonts/AirbnbCereal_W_Bk.otf
--------------------------------------------------------------------------------
/public/fonts/AirbnbCereal_W_Blk.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/fonts/AirbnbCereal_W_Blk.otf
--------------------------------------------------------------------------------
/public/fonts/AirbnbCereal_W_Lt.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/fonts/AirbnbCereal_W_Lt.otf
--------------------------------------------------------------------------------
/public/fonts/AirbnbCereal_W_Md.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/fonts/AirbnbCereal_W_Md.otf
--------------------------------------------------------------------------------
/public/fonts/AirbnbCereal_W_XBd.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/public/fonts/AirbnbCereal_W_XBd.otf
--------------------------------------------------------------------------------
/xcode/HotwireDevTools/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/xcode/HotwireDevTools/Resources/Icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/xcode/HotwireDevTools/Resources/Icon.png
--------------------------------------------------------------------------------
/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-16@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-16@1x.png
--------------------------------------------------------------------------------
/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-16@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-16@2x.png
--------------------------------------------------------------------------------
/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-32@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-32@1x.png
--------------------------------------------------------------------------------
/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-32@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-32@2x.png
--------------------------------------------------------------------------------
/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-128@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-128@1x.png
--------------------------------------------------------------------------------
/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-128@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-128@2x.png
--------------------------------------------------------------------------------
/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-256@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-256@1x.png
--------------------------------------------------------------------------------
/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-256@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-256@2x.png
--------------------------------------------------------------------------------
/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-512@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-512@1x.png
--------------------------------------------------------------------------------
/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-512@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leonvogt/hotwire-dev-tools/HEAD/xcode/HotwireDevTools/Assets.xcassets/AppIcon.appiconset/mac-icon-512@2x.png
--------------------------------------------------------------------------------
/src/uikit/IconButton.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
You can turn on HotwireDevTools’s extension in Safari Extensions preferences.
15 |HotwireDevTools’s extension is currently on. You can turn it off in Safari Extensions preferences.
16 |HotwireDevTools’s extension is currently off. You can turn it on in Safari Extensions preferences.
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/browser_panel/theme.svelte.js: -------------------------------------------------------------------------------- 1 | import { writable } from "svelte/store" 2 | import { MediaQuery } from "svelte/reactivity" 3 | import { debounce } from "$utils/utils" 4 | 5 | const breakpoints = { 6 | md: 640, 7 | lg: 960, 8 | } 9 | const large = new MediaQuery(`(min-width: ${breakpoints.lg}px)`) 10 | const medium = new MediaQuery(`(min-width: ${breakpoints.md}px)`) 11 | 12 | const detectOrientation = () => { 13 | return medium.current ? "landscape" : "portrait" 14 | } 15 | 16 | const detectHorizontalPanes = () => { 17 | return detectOrientation() === "portrait" 18 | } 19 | 20 | const detectBreakpoint = () => { 21 | if (large.current) return "lg" 22 | if (medium.current) return "md" 23 | return "sm" 24 | } 25 | 26 | export const orientation = writable(detectOrientation()) 27 | export const breakpoint = writable(detectBreakpoint()) 28 | export const horizontalPanes = writable(detectHorizontalPanes()) 29 | 30 | export const handleResize = debounce(() => { 31 | orientation.set(detectOrientation()) 32 | breakpoint.set(detectBreakpoint()) 33 | horizontalPanes.set(detectHorizontalPanes()) 34 | }, 100) 35 | -------------------------------------------------------------------------------- /MIT-LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2024 Leon Vogt 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /src/components/Stimulus/TargetTreeItem.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 |
8 |
9 | [](https://addons.mozilla.org/en-US/firefox/addon/hotwire-dev-tools/)
10 | [](https://chromewebstore.google.com/detail/hotwire-dev-tools/phdobjkbablgffmmgnjbmfbbofnbkajc)
11 | [](https://apps.apple.com/ch/app/hotwire-dev-tools/id6503706225)
12 |
13 | 195 | {i}: {@render valueViewer(item)} 196 |
197 | {/each} 198 | {:else} 199 | {#each Object.entries(value) as [k, v]} 200 |201 | {k}: {@render valueViewer(v, k)} 202 |
203 | {/each} 204 | {/if} 205 | {:else if EVENT_TIMESTAMP_KEYS.includes(key)} 206 | {new Date(value).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", second: "2-digit" })} 207 | {:else} 208 | {String(value)} 209 | {/if} 210 | {/snippet} 211 | 212 |
228 | action |
236 | {selected.turboEvent.action} | 237 |
| Target | 243 |
244 |
245 |
250 |
247 |
249 | |
251 |
| Target | 255 ||
{key} |
263 | {@render valueViewer(value)} | 264 |