Skip to content

Commit 2a363f1

Browse files
committed
deploy: cd657c3
1 parent 60bb60d commit 2a363f1

File tree

49 files changed

+360
-188
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+360
-188
lines changed

LiveDevelopment/BrowserScripts/RemoteFunctions.js

Lines changed: 73 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ function RemoteFunctions(config = {}) {
3535

3636
// this will store the element that was clicked previously (before the new click)
3737
// we need this so that we can remove click styling from the previous element when a new element is clicked
38-
let previouslyClickedElement = null;
38+
let previouslySelectedElement = null;
3939

4040
var req, timeout;
4141
function animateHighlight(time) {
@@ -709,7 +709,7 @@ function RemoteFunctions(config = {}) {
709709
_clickHighlight.clear();
710710
_clickHighlight.add(element, true);
711711

712-
previouslyClickedElement = element;
712+
previouslySelectedElement = element;
713713
}
714714

715715
function disableHoverListeners() {
@@ -835,37 +835,80 @@ function RemoteFunctions(config = {}) {
835835
}
836836
}
837837

838-
// highlight a rule
838+
/**
839+
* Find the best element to select from a list of matched nodes
840+
* Prefers: previously selected element > parent of selected > first valid element
841+
* @param {NodeList} nodes - The nodes matching the CSS rule
842+
* @param {string} rule - The CSS rule used to match nodes
843+
* @returns {{element: Element|null, skipSelection: boolean}} - The element to select and whether to skip selection
844+
*/
845+
function findBestElementToSelect(nodes, rule) {
846+
let firstValidElement = null;
847+
let elementToSelect = null;
848+
849+
for (let i = 0; i < nodes.length; i++) {
850+
if(!LivePreviewView.isElementInspectable(nodes[i], true) || nodes[i].tagName === "BR") {
851+
continue;
852+
}
853+
854+
// Store the first valid element as a fallback
855+
if (!firstValidElement) {
856+
firstValidElement = nodes[i];
857+
}
858+
859+
// if hover lock timer is active, skip selection as it's already handled by handleElementClick
860+
if (_hoverLockTimer && nodes[i] === previouslySelectedElement) {
861+
return { element: null, skipSelection: true };
862+
}
863+
864+
// Check if the currently selected element or any of its parents have a highlight
865+
if (previouslySelectedElement) {
866+
if (nodes[i] === previouslySelectedElement) {
867+
// Exact match - prefer this
868+
elementToSelect = previouslySelectedElement;
869+
break;
870+
} else if (!elementToSelect &&
871+
previouslySelectedElement.closest && nodes[i] === previouslySelectedElement.closest(rule)) {
872+
// The node is a parent of the currently selected element. we stop at the first parent, after that
873+
// we only scan for exact match
874+
elementToSelect = nodes[i];
875+
}
876+
}
877+
}
878+
879+
return {
880+
element: elementToSelect || firstValidElement,
881+
skipSelection: false
882+
};
883+
}
884+
885+
/**
886+
* Highlight all elements matching a CSS rule and select the best one
887+
* @param {string} rule - The CSS rule to highlight
888+
*/
839889
function highlightRule(rule) {
840890
hideHighlight();
841-
var i, nodes = window.document.querySelectorAll(rule);
891+
const nodes = window.document.querySelectorAll(rule);
842892

843-
for (i = 0; i < nodes.length; i++) {
893+
// Highlight all matching nodes
894+
for (let i = 0; i < nodes.length; i++) {
844895
highlight(nodes[i]);
845896
}
897+
846898
if (_clickHighlight) {
847899
_clickHighlight.selector = rule;
848900
}
849901

850-
// select the first valid highlighted element
851-
let foundValidElement = false;
852-
for (i = 0; i < nodes.length; i++) {
853-
if(LivePreviewView.isElementInspectable(nodes[i], true) && nodes[i].tagName !== "BR") {
854-
// if hover lock timer is active, we don't call selectElement as,
855-
// it means that its already called by handleElementClick function
856-
if (_hoverLockTimer && nodes[i] === previouslyClickedElement) {
857-
foundValidElement = true;
858-
break;
859-
}
860-
selectElement(nodes[i]);
861-
foundValidElement = true;
862-
break;
863-
}
864-
}
902+
// Find and select the best element
903+
const { element, skipSelection } = findBestElementToSelect(nodes, rule);
865904

866-
// if no valid element present we dismiss the boxes
867-
if (!foundValidElement) {
868-
dismissUIAndCleanupState();
905+
if (!skipSelection) {
906+
if (element) {
907+
selectElement(element);
908+
} else {
909+
// No valid element found, dismiss UI
910+
dismissUIAndCleanupState();
911+
}
869912
}
870913

871914
// In edit mode, create temporary highlights AFTER selection to avoid clearing
@@ -1195,7 +1238,7 @@ function RemoteFunctions(config = {}) {
11951238
this.rememberedNodes = {};
11961239

11971240
// this check makes sure that if the element is no more in the DOM then we remove it
1198-
if (previouslyClickedElement && !previouslyClickedElement.isConnected) {
1241+
if (previouslySelectedElement && !previouslySelectedElement.isConnected) {
11991242
dismissUIAndCleanupState();
12001243
} else {
12011244
redrawEverything();
@@ -1250,14 +1293,14 @@ function RemoteFunctions(config = {}) {
12501293
* Helper function to cleanup previously clicked element highlighting and state
12511294
*/
12521295
function cleanupPreviousElementState() {
1253-
if (previouslyClickedElement) {
1254-
if (previouslyClickedElement._originalOutline !== undefined) {
1255-
previouslyClickedElement.style.outline = previouslyClickedElement._originalOutline;
1296+
if (previouslySelectedElement) {
1297+
if (previouslySelectedElement._originalOutline !== undefined) {
1298+
previouslySelectedElement.style.outline = previouslySelectedElement._originalOutline;
12561299
} else {
1257-
previouslyClickedElement.style.outline = "";
1300+
previouslySelectedElement.style.outline = "";
12581301
}
1259-
delete previouslyClickedElement._originalOutline;
1260-
previouslyClickedElement = null;
1302+
delete previouslySelectedElement._originalOutline;
1303+
previouslySelectedElement = null;
12611304
}
12621305

12631306
if (config.mode === 'edit') {

appConfig.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ window.AppConfig = {
3535
"app_update_url": "https://updates.phcode.io/tauri/update-latest-pre-release.json",
3636
"extensionTakedownURL": "https://updates.phcode.io/extension_takedown.json",
3737
"linting.enabled_by_default": true,
38-
"build_timestamp": "2026-01-08T09:16:25.537Z",
38+
"build_timestamp": "2026-01-08T11:33:36.921Z",
3939
"googleAnalyticsID": "G-FP5S9BKDSJ",
4040
"googleAnalyticsIDDesktop": "G-D5R1Y6PTS8",
4141
"mixPanelID": "a7e08ffd43c37767c29b13df1d2e6c62",
@@ -47,7 +47,7 @@ window.AppConfig = {
4747
"bugsnagEnv": "staging"
4848
},
4949
"name": "Phoenix Code",
50-
"version": "5.0.0-21884",
50+
"version": "5.0.0-21885",
5151
"apiVersion": "5.0.0",
5252
"homepage": "https://core.ai",
5353
"issues": {

assets/default-project/en.zip

0 Bytes
Binary file not shown.

assets/sample-projects/HTML5.zip

0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.

assets/sample-projects/explore.zip

0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.

cacheManifest.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"appConfig.js": "57d5d89c9539d5cf39492bec08684f22504d14cd7dd6da50499b6ff99ff2cece",
3-
"assets/default-project/en.zip": "ce1abed57d3406c86b41294ef2f539a255da83fda873d11463d21748f985a371",
2+
"appConfig.js": "9426430b787ccfbd9dcf48ec1c71b7465a92e6f695f29a401e69e99e7a271017",
3+
"assets/default-project/en.zip": "cb32e40f5b203def5b1ceb1a1fca61b4cf480e76f6bcf81e6a0ae90673490d5c",
44
"assets/default-project/en/images/cloud1.svg": "527399dadfa3357c3ee1a63d6c1c7dda81ecebb832f7383db26f1aaeaf722a8d",
55
"assets/default-project/en/images/cloud2.svg": "8127c63c0987bc674e2d25f7d24ead017853326c1e43d07706fec46091904418",
66
"assets/default-project/en/images/cloud3.svg": "15de53aa41dea3b0f685292814563f97213a9736c3cec2f8e17b5d9d45b3ae3d",
@@ -126,7 +126,7 @@
126126
"assets/pwa/32x32.png": "4f8f75bfcdb6efbbed1732f49edab4e292274cdeb1841e285ccc8194f4c9d8ac",
127127
"assets/pwa/phoenix.png": "d292bf76d6d61fdece2f97fb4cd71b8b0060d1058e9c1d02c94bfb20da8b7f0d",
128128
"assets/pwa/Square284x284Logo.png": "9887c2967039b4fae1214817925f1fb4f9227cba12d37612457c1c8ee1110c67",
129-
"assets/sample-projects/bootstrap-blog.zip": "ebea1ef2cf0bd48e6ac30fd07e202f2f14275215f4775fe03c83f05fe164dc81",
129+
"assets/sample-projects/bootstrap-blog.zip": "5439a921de2f16c83e37753ea1cd547426934d3ac7f50f324894926540ee5a35",
130130
"assets/sample-projects/bootstrap-blog/assets/brand/bootstrap-logo-white.svg": "203d56e7e5e15d8203e596d4a711cec986f6380064591de21850f4563fb840bf",
131131
"assets/sample-projects/bootstrap-blog/assets/brand/bootstrap-logo.svg": "df11d37a123e36a768f2a6064973c4c6ab17d1e3c6501c8bf434ca5c0134c9a2",
132132
"assets/sample-projects/bootstrap-blog/assets/dist/css/bootstrap.min.css": "fb1763b59f9f5764294b5af9fa5250835ae608282fe6f2f2213a5952aacf1fbf",
@@ -136,7 +136,7 @@
136136
"assets/sample-projects/bootstrap-blog/blog.rtl.css": "33f49d02bbcb2e78f019b7582408fad2b5a76a2ecf79fe09d5b3c08c6ee3872b",
137137
"assets/sample-projects/bootstrap-blog/index-rtl.html": "c582278884060098ff51b9d350b0739e1a0396debdc76772c62b6ec375b6efcb",
138138
"assets/sample-projects/bootstrap-blog/index.html": "f4716c2affa299a27ab6f8c74c22fe67564f1b1d36ff2f0b322672bf0479d739",
139-
"assets/sample-projects/dashboard.zip": "232a912fdf91743a5b900429ae63c9e6b5eae40516a23898d19e3e71d95bebf2",
139+
"assets/sample-projects/dashboard.zip": "53bf425a5224538cd6650096068d7536988a24736fc4df718f775d644ed84964",
140140
"assets/sample-projects/dashboard/assets/brand/bootstrap-logo-white.svg": "203d56e7e5e15d8203e596d4a711cec986f6380064591de21850f4563fb840bf",
141141
"assets/sample-projects/dashboard/assets/brand/bootstrap-logo.svg": "df11d37a123e36a768f2a6064973c4c6ab17d1e3c6501c8bf434ca5c0134c9a2",
142142
"assets/sample-projects/dashboard/assets/dist/css/bootstrap.min.css": "fb1763b59f9f5764294b5af9fa5250835ae608282fe6f2f2213a5952aacf1fbf",
@@ -148,7 +148,7 @@
148148
"assets/sample-projects/dashboard/index.html": "1fb0c934f816d728cad85e180f78369679dc9edb1eca2d5c625b9360e6264235",
149149
"assets/sample-projects/dashboard/signin.css": "083bef710a6170a5112ce257c2ecf8580ca97ce19136d770f10460e5b85862de",
150150
"assets/sample-projects/dashboard/signin.html": "8c602e656631aeee624673397c0dc00c339498914ed930ab177478c4662a8d26",
151-
"assets/sample-projects/explore.zip": "9ed41c1754d9545b8e865c6da5fa286c12963176c50fcf7dceb5730af53d4ffe",
151+
"assets/sample-projects/explore.zip": "110fdd19bbb9b1607695676150fbc1bb2be556407002d6270fbc9efa367e2586",
152152
"assets/sample-projects/explore/A-tribute-page.html": "bd510c60f444058b7fcb71d83841f32b1cb5193c1a39421d7739bd6af9fef248",
153153
"assets/sample-projects/explore/adjustable-fireworks.html": "11e69bb2dd8708ed8fbf1acc62b0aaaf88c7ffec859ee958dc1ae51cd53ddac8",
154154
"assets/sample-projects/explore/ant_colony.html": "bc9435ed1b9868f2fbc7212d526f7532c533a5fdf45da988fa5e575bc5f363b7",
@@ -236,7 +236,7 @@
236236
"assets/sample-projects/explore/watermelon-pixel.html": "765a3fbffb5db97910512fbabaa7c55c0b52dc8eedfcc630811be39d0af98663",
237237
"assets/sample-projects/explore/webmine.html": "6b808f52812dc03db28483411500c04daf8ee0226f535c600a36999d6b7837c0",
238238
"assets/sample-projects/explore/whack-a-mole.html": "25be94a3640553b4801f80edd49998bae3a360988e8a26ff3bdfdc2a76b77191",
239-
"assets/sample-projects/home-pages.zip": "2694588ad1cc074df490ff0c2f6f6f70a8b799598e13302ac8e1ae17a07193f2",
239+
"assets/sample-projects/home-pages.zip": "586a7561664f3edd786794440da14f4633586680e9ccaf7f90c7f327f5712bfa",
240240
"assets/sample-projects/home-pages/album/index.html": "e29a1e96644bc17bab1a7e3724e822d65a479e10df182725ee1afa916efbfdc1",
241241
"assets/sample-projects/home-pages/assets/brand/bootstrap-logo-white.svg": "203d56e7e5e15d8203e596d4a711cec986f6380064591de21850f4563fb840bf",
242242
"assets/sample-projects/home-pages/assets/brand/bootstrap-logo.svg": "df11d37a123e36a768f2a6064973c4c6ab17d1e3c6501c8bf434ca5c0134c9a2",
@@ -248,7 +248,7 @@
248248
"assets/sample-projects/home-pages/carousel/index.html": "235d650043a09f2954f24e4659f64d99ef3988858567fb2221fb1cf34df057e6",
249249
"assets/sample-projects/home-pages/cover/cover.css": "2fbb596077c570cad7ee9e98fb88f5665e0ecfc11e7085c3e04639ad03f7bc10",
250250
"assets/sample-projects/home-pages/cover/index.html": "759214701ff759432711b3421d80aca692c7a2b4c978c516a0bcd0c81a43f381",
251-
"assets/sample-projects/HTML5.zip": "24245ea86d261b65860316edb7e57791c4a73af9451d00d1ea8b56106a9554a0",
251+
"assets/sample-projects/HTML5.zip": "7e649507ab191376810bd586147a3fa99dff6a113923ee1de7588782ffd67373",
252252
"assets/sample-projects/HTML5/index.html": "2dc94c7d3e33aeeb44ec4f75bc7df86a5fd19f3121f2fd3638636fbf7c476c6a",
253253
"assets/sample-projects/HTML5/script.js": "49db3eeed9bece4d724de51079bd04afb880de5c66b46d1924ba2cb61c20d714",
254254
"assets/sample-projects/HTML5/styles.css": "744b85a9c31affbb00976694c4b9c9149b31e575ed9efdec386231d062ae93f2",
@@ -259,7 +259,7 @@
259259
"brackets.config.dist.json": "37dcc4038da06c6ac78b161bac468779bc4b40ac49fc33463e93af9f3f1d1983",
260260
"brackets.config.staging.json": "248300855f2665f7a4dce236c9934bc89059290624d247a9cef0b7550052e2be",
261261
"brackets.js": "793f713b85508a9c211f183015d8eb998c69a7ea58618e29042f376056835558",
262-
"cacheManifest.json": "58e8e9cd94ac074729e2f582df0a633412da89fe56ee03df256ca862a9f27e2e",
262+
"cacheManifest.json": "05c2c95b76a573a6e7d45683e050341b3a2da43c3951d7aa0a24eb6ed90ac865",
263263
"command/ChangeShortcutTemplate.html": "345d682d8bde29380822824778cf09acc79affae6e82b9db00c6205b2b3dd2ee",
264264
"command/CommandManager.js": "14559877039cc355d1a248f12e0159598dc614c43c4532bdb9717d2d905dfa80",
265265
"command/Commands.js": "008f0397b5c6b088c430c0545721b26568f2f87846a8b18205451f34ad7f9ee8",
@@ -268,7 +268,7 @@
268268
"command/KeyboardOverlayMode.js": "80a5c1b686507f63c1c60e675f1e8c07446f05b69537102281a289cb22685665",
269269
"command/Keys.js": "0cd28be8a44902c0aef8a12507e6730225419dd44683963e3fc3c17a4e137793",
270270
"command/Menus.js": "b6d35352dd75b0b0225883ed523d2a3eb7f472d895513bbba942c0204d5401e7",
271-
"config.json": "6ba5b355dd961fefc02bf1da064b51bde5fe0c881c673f8850889da0929bd336",
271+
"config.json": "c907398dfc0d20c024748256c5c2dc109b22a901d369a9c17c6cd48163368aea",
272272
"desktop-metrics.html": "66f87550ddf04f284a6c1e81567b7dfbefb2b8007f48f0bad7d8f7aacdb11bac",
273273
"devEnable.html": "44aa1a496a8be413299f651e6b0c3e62ac50cd5d40126ad1bb6b70b9b2b818c4",
274274
"document/ChangedDocumentTracker.js": "92f1263ccc2d6cd4beed0bf9a060f06ad0df1846b86b8dcdde0d871291a6d550",
@@ -576,7 +576,7 @@
576576
"extensions/default/UrlCodeHints/requirejs-config.json": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
577577
"extensions/default/UrlCodeHints/unittests.js": "7c78b23dda9097bfab773798661e4729765a71722b22bab3f714d498f1ed14b3",
578578
"extensions/dev/README.md": "3fd897e55e0e05e503c898555cfa3b20e820b32946fc7c426ea9bb2afbed449f",
579-
"extensions/registry/popularity.json": "834f6059d41ded54cf65ebca9a4590169a3e1cae8b8c58661764ecbb87cb6ff7",
579+
"extensions/registry/popularity.json": "2ebd466ecb41be1c65a96560a91b4e2bb7bd5b27f29fb4b627c3487e4bc6508e",
580580
"extensions/registry/registry_version.json": "0c1f0b6131c2270abc9ec1253d356092e170aebddf706549e57113a5ec48cc06",
581581
"extensions/samples/BracketsConfigCentral/htmlContent/Config.html": "6ac3ce03e2fb8913ec5da3e8835c0646894f242600c64d95b77c7d7dc0a156f7",
582582
"extensions/samples/BracketsConfigCentral/htmlContent/logo-sm.png": "006f025fecd24c292e87a1eb0e123ee21178ec9c09517a1f16fe362fe2fbcbb5",
@@ -868,7 +868,7 @@
868868
"LiveDevelopment/BrowserScripts/LiveDevProtocolRemote.js": "0f97b7ddce3307f1ab941bdcba09f2ac6980c1bb1ed2dd377c14edf6d2dae01a",
869869
"LiveDevelopment/BrowserScripts/LivePreviewTransportRemote.js": "8e38da8346ec63a74aa19e7dc3df827587301b9688a2532c3a49d1bca9a299e5",
870870
"LiveDevelopment/BrowserScripts/pageLoaderWorker.js": "405d644f2d133453f3feaa5971b63f073729744cd813ac99f5b2175bc2c42b93",
871-
"LiveDevelopment/BrowserScripts/RemoteFunctions.js": "49092ef411c2e020b698022835b3f061baadf891d1b4acdd051b4be50cdc311c",
871+
"LiveDevelopment/BrowserScripts/RemoteFunctions.js": "370ae95f8412b3987cd0aab2a42fa08027c09b6c1c6ece46cf09d81e30b1f380",
872872
"LiveDevelopment/launch.html": "12a09bdf45f9438b0819b9befdc6cf63b772d0f189b4188efb2c5014f8c12d81",
873873
"LiveDevelopment/LiveDevelopmentUtils.js": "ec0f2f03762f98b5244bb08916de7b36c2ed4f2dde907e38d52b2305d88bbdb9",
874874
"LiveDevelopment/LiveDevMultiBrowser.js": "a4bf82592a28cc83f21254e0bd7a9a9a4723d725c40464d83bfba3133567cec6",

config.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
"app_update_url": "https://updates.phcode.io/tauri/update-latest-pre-release.json",
3535
"extensionTakedownURL": "https://updates.phcode.io/extension_takedown.json",
3636
"linting.enabled_by_default": true,
37-
"build_timestamp": "2026-01-08T09:16:25.537Z",
37+
"build_timestamp": "2026-01-08T11:33:36.921Z",
3838
"googleAnalyticsID": "G-FP5S9BKDSJ",
3939
"googleAnalyticsIDDesktop": "G-D5R1Y6PTS8",
4040
"mixPanelID": "a7e08ffd43c37767c29b13df1d2e6c62",
@@ -46,7 +46,7 @@
4646
"bugsnagEnv": "staging"
4747
},
4848
"name": "Phoenix Code",
49-
"version": "5.0.0-21884",
49+
"version": "5.0.0-21885",
5050
"apiVersion": "5.0.0",
5151
"homepage": "https://core.ai",
5252
"issues": {

0 commit comments

Comments
 (0)