From 45e5d689b61cbba140fa0794527c1c08558351d2 Mon Sep 17 00:00:00 2001
From: ahasnawi <70672687+ahasnawi@users.noreply.github.com>
Date: Mon, 15 Dec 2025 18:20:04 +0300
Subject: [PATCH 1/4] support ai custom content
---
plugin.json | 6 +-
src/control/content/app.js | 386 +++++++--
src/control/content/assets/css/cpIcons.css | 104 +++
src/control/content/assets/css/dialogs.css | 160 ++++
src/control/content/assets/css/style.css | 298 +++++++
src/control/content/assets/fonts/icomoon.eot | Bin 0 -> 7268 bytes
src/control/content/assets/fonts/icomoon.svg | 36 +
src/control/content/assets/fonts/icomoon.ttf | Bin 0 -> 7104 bytes
src/control/content/assets/fonts/icomoon.woff | Bin 0 -> 7180 bytes
src/control/content/assets/images/ai_icon.svg | 3 +
src/control/content/index.html | 234 +++--
src/control/content/js/ai/ai.js | 46 +
src/control/content/js/dialogs/dialogs.js | 169 ++++
.../browser/ui/codicons/codicon/codicon.ttf | Bin 0 -> 80340 bytes
.../min/vs/base/worker/workerMain.js | 31 +
.../min/vs/basic-languages/css/css.js | 12 +
.../min/vs/basic-languages/html/html.js | 10 +
.../basic-languages/javascript/javascript.js | 10 +
.../min/vs/editor/editor.main.css | 8 +
.../min/vs/editor/editor.main.js | 798 ++++++++++++++++++
.../min/vs/language/html/htmlMode.js | 13 +
.../min/vs/language/html/htmlWorker.js | 454 ++++++++++
.../content/js/monaco-editor/min/vs/loader.js | 11 +
src/control/settings/app.js | 99 +++
src/control/settings/assets/css/style.css | 18 +
src/control/settings/index.html | 82 +-
src/widget/index.html | 4 +-
src/widget/widget.js | 48 +-
28 files changed, 2826 insertions(+), 214 deletions(-)
create mode 100644 src/control/content/assets/css/cpIcons.css
create mode 100644 src/control/content/assets/css/dialogs.css
create mode 100644 src/control/content/assets/css/style.css
create mode 100644 src/control/content/assets/fonts/icomoon.eot
create mode 100644 src/control/content/assets/fonts/icomoon.svg
create mode 100644 src/control/content/assets/fonts/icomoon.ttf
create mode 100644 src/control/content/assets/fonts/icomoon.woff
create mode 100644 src/control/content/assets/images/ai_icon.svg
create mode 100644 src/control/content/js/ai/ai.js
create mode 100644 src/control/content/js/dialogs/dialogs.js
create mode 100644 src/control/content/js/monaco-editor/min/vs/base/browser/ui/codicons/codicon/codicon.ttf
create mode 100644 src/control/content/js/monaco-editor/min/vs/base/worker/workerMain.js
create mode 100644 src/control/content/js/monaco-editor/min/vs/basic-languages/css/css.js
create mode 100644 src/control/content/js/monaco-editor/min/vs/basic-languages/html/html.js
create mode 100644 src/control/content/js/monaco-editor/min/vs/basic-languages/javascript/javascript.js
create mode 100644 src/control/content/js/monaco-editor/min/vs/editor/editor.main.css
create mode 100644 src/control/content/js/monaco-editor/min/vs/editor/editor.main.js
create mode 100644 src/control/content/js/monaco-editor/min/vs/language/html/htmlMode.js
create mode 100644 src/control/content/js/monaco-editor/min/vs/language/html/htmlWorker.js
create mode 100644 src/control/content/js/monaco-editor/min/vs/loader.js
create mode 100644 src/control/settings/app.js
create mode 100644 src/control/settings/assets/css/style.css
diff --git a/plugin.json b/plugin.json
index 14fa72d..e3a2fcb 100644
--- a/plugin.json
+++ b/plugin.json
@@ -1,7 +1,7 @@
{
"author":"Buildfire"
- ,"pluginName":"WebView"
- ,"pluginDescription":"Seamlessly embed web content into your mobile app with the WebView plugin, enabling smooth integration of external websites, pages, and interactive elements."
+ ,"pluginName":"Web Content"
+ ,"pluginDescription":"Seamlessly embed web content into your mobile app with the Web Content plugin, enabling smooth integration of external websites, pages, and interactive elements."
,"pluginKeywords":"document,page,iframe,instagram,website"
,"supportEmail":"support@buildfire.com"
,"supportSite":"https://learn.appdocumentation.com/en/articles/1691379-webview-tutorial"
@@ -15,7 +15,7 @@
"enabled":false
}
, "settings":{
- "enabled":false
+ "enabled": true
}
}
,"widget":{
diff --git a/src/control/content/app.js b/src/control/content/app.js
index eecf156..8468572 100644
--- a/src/control/content/app.js
+++ b/src/control/content/app.js
@@ -1,10 +1,14 @@
(function(angular, buildfire) {
- var webviewPluginApp = angular.module('webviewPlugin', []);
+ var webContentPluginApp = angular.module('webContentPlugin', []);
- webviewPluginApp.controller('webviewPluginCtrl', ['$scope', '$log', '$timeout', controller]);
+ webContentPluginApp.controller('webContentPluginCtrl', ['$scope', '$log', '$timeout', controller]);
function controller($scope, $log, $timeout) {
var dataChanged = false;
+ var modeChanged = false;
+ var disclaimerAcknowledged = null;
+ var savedHtml = '';
+ var conversationId = null;
$scope.datastoreInitialized = false;
$scope.urlValid = false;
$scope.urlInValid = false;
@@ -19,6 +23,74 @@
NATIVE_WEBVIEW: 'Native webview'
};
+ function initializeMonaco() {
+ const editorElement = document.getElementById('monacoEditor');
+ const baseUrl = window.location.origin + window.location.pathname.replace(/\\/g, '/').replace(/\/[^/]*$/, '/');
+
+ if (typeof monaco === 'undefined') {
+ const script = document.createElement('script');
+ script.src = `${baseUrl}js/monaco-editor/min/vs/loader.js`;
+ script.onload = () => setupMonaco();
+ document.head.appendChild(script);
+ } else {
+ setupMonaco();
+ }
+
+ function setupMonaco() {
+ require.config({ paths: { 'vs': `${baseUrl}js/monaco-editor/min/vs` } });
+ require(['vs/editor/editor.main'], function () {
+ window.monacoEditorInstance = monaco.editor.create(editorElement, {
+ value: $scope.data.content.html || '',
+ language: 'html',
+ theme: 'vs-dark',
+ automaticLayout: true
+ });
+ // check for disclaimer acknowledgment
+ disclaimerAcknowledged = $scope.data?.content?.disclaimerAcknowledged;
+ conversationId = $scope.data?.content?.conversationId || null;
+ toggleAssistantSectionVisibility(!!conversationId);
+ if (!disclaimerAcknowledged) {
+ window.dialogs.showDisclaimerDialog(() => {
+ dataChanged = true;
+ disclaimerAcknowledged = true;
+ $scope.saveData();
+ });
+ }
+ registerAutoSave(window.monacoEditorInstance);
+ });
+ }
+ }
+ // Always auto-save on editor change
+ function registerAutoSave(editor, delay = 500) {
+ let timer = null;
+ function onChange() {
+ if (timer) clearTimeout(timer);
+ timer = setTimeout(function () {
+ $scope.data.content.html = editor.getValue();
+ dataChanged = true;
+ $scope.saveData();
+ $scope.$apply();
+ }, delay);
+ }
+ editor.onDidChangeModelContent(onChange);
+ }
+
+ // toggle assistant section visibility
+ function toggleAssistantSectionVisibility(visible) {
+ const assistantContainer = document.querySelector('.assistant-container');
+ if (assistantContainer) {
+ if (visible) {
+ assistantContainer.style.display = 'block';
+ assistantContainer.classList.add('visible');
+ } else {
+ assistantContainer.classList.remove('visible');
+ setTimeout(() => {
+ assistantContainer.style.display = 'none';
+ }, 300);
+ }
+ }
+ }
+
buildfire.datastore.get(function(err, result) {
if (err) return console.error('Error: ', err);
@@ -26,30 +98,46 @@
if (isValidResult(result)) {
$scope.data = result.data;
- $scope.id = result.id;
-
- var type = typeof result.data.content.openInApp;
-
- if (type != 'undefined' && type != 'object') {
- if (result.data.content.openInApp) {
- $scope.data.content.view = $scope.viewType.NATIVE_IN_APP;
- } else {
- $scope.data.content.view = $scope.viewType.IN_APP_POPUP;
- }
- }
-
- // Backward compatibility: If viewType.NATIVE_IN_APP was selected before, default to viewSubtype.IFRAME
- if ($scope.data.content.view === $scope.viewType.NATIVE_IN_APP && !$scope.data.content.viewSubtype) {
- $scope.data.content.viewSubtype = $scope.viewSubtype.IFRAME;
- }
+ // Ensure default for autoReload if it doesn't exist
+ if (typeof $scope.data.content.autoReload === 'undefined') {
+ $scope.data.content.autoReload = true;
+ }
+ // Ensure isCustomContent is boolean
+ $scope.data.content.isCustomContent = !!$scope.data.content.isCustomContent;
+ var autoReloadSwitch = document.getElementById('autoReloadSwitch');
+ autoReloadSwitch.checked = $scope.data.content.autoReload;
} else {
+ var defaultHTML = [
+ '',
+ '',
+ '\t
',
+ '\t\t ',
+ '\t\t ',
+ '\t\t',
+ '\t',
+ '\t',
+ '\t\tAdd your content here
',
+ '\t\t',
+ '\t',
+ ''
+ ].join('\n');
+
$scope.data = {
content: {
url: '',
- view: $scope.viewType.IN_APP_POPUP,
- viewSubtype: null // Initialize viewSubtype
- }
- };
+ html: defaultHTML,
+ isCustomContent: false, // Default to URL mode
+ autoReload: true // Default auto-reload to true
+ },
+ };
+ var autoReloadSwitch = document.getElementById('autoReloadSwitch');
+ autoReloadSwitch.checked = true;
}
$scope.$watch('data', watchFn, true);
@@ -59,12 +147,17 @@
} else {
dataChanged = true;
}
- }
+ }
if (!$scope.$$phase && !$scope.$root.$$phase) {
$scope.$apply();
}
+ // Only initialize Monaco if already in custom content mode
+ if ($scope.data.content.isCustomContent) {
+ initializeMonaco();
+ }
+
function isValidResult(res) {
return res && res.data && !angular.equals({}, res.data) && res.id;
}
@@ -83,30 +176,40 @@
return console.warn("data didn't change");
}
- if ($scope.frmMain.$invalid) return setDataInvalid();
+ // set url data invalid, when url is invalid and the mode is not custom content
+ if ($scope.data.content.url && !$scope.isUrlValid($scope.data.content.url) && !$scope.data.content.isCustomContent) return setUrlDataInvalid();
var data = $scope.data;
dataChanged = false;
- setDataValid();
+ // only set url data valid and prepend http when the mode is not custom content and the mode didn't change
+ if (!data.content.isCustomContent && !modeChanged) {
+ setUrlDataValid();
- if (!/^https?\:\/\//.test(data.content.url)) {
- data.content.url = 'http://' + data.content.url;
+ if (!/^https?\:\/\//.test(data.content.url)) {
+ data.content.url = 'http://' + data.content.url;
+ }
}
- if (data.content.openInApp != undefined) {
- data.content.openInApp = null;
+ if (data.content.isCustomContent) {
+ if (typeof disclaimerAcknowledged == 'boolean') {
+ data.content.disclaimerAcknowledged = disclaimerAcknowledged;
+ }
+ if (conversationId) {
+ data.content.conversationId = conversationId;
+ }
}
buildfire.datastore.save(data, function(err, result) {
if (err || !result) {
return $log.error('Error saving the widget details: ', err);
}
-
+ if ($scope.data.content.isCustomContent && $scope.data.content.autoReload) buildfire.messaging.sendMessageToWidget({ tag: 'reloadWebContent' });
+ modeChanged = false;
$log.info('Widget details saved');
});
- function setDataInvalid() {
+ function setUrlDataInvalid() {
$log.warn('invalid data, details will not be saved');
$scope.urlValid = false;
$scope.urlInValid = true;
@@ -115,7 +218,7 @@
}, 3000);
}
- function setDataValid() {
+ function setUrlDataValid() {
$scope.urlValid = true;
$scope.urlInValid = false;
$timeout(function() {
@@ -128,42 +231,211 @@
$scope.saveData();
};
- $scope.changeViewType = function() {
- dataChanged = true;
+ $scope.isUrlValid = function(url) {
+ return /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,6}\b(\/[-a-zA-Z0-9@:%_\+.~#?!?\/?\w\/?&//=]*)?/.test(url);
+ };
+
+ $scope.onModeChange = function() {
+ if (!$scope.datastoreInitialized) return;
- if ($scope.frmMain.$invalid) return;
+ // Initialize Monaco if switching to custom content mode
+ if ($scope.data.content.isCustomContent && !window.monacoEditorInstance) {
+ initializeMonaco();
+ }
+
+ // Check if switching to custom content with iFrame view
+ if ($scope.data.content.isCustomContent &&
+ $scope.data.content.view === $scope.viewType.NATIVE_IN_APP &&
+ ($scope.data.content.viewSubtype === $scope.viewSubtype.IFRAME
+ || !$scope.data.content.viewSubtype
+ )) {
+
+ buildfire.dialog.show({
+ title: 'Warning',
+ message: "Some websites may not load or function properly in an iframe due to Apple security policies or site-level restrictions from platforms like Google or Amazon. If the page doesn't display as expected, try a different viewing option in the Settings tab.",
+ isMessageHTML: false,
+ showCancelButton: true,
+ actionButtons: [
+ {
+ text: 'Go to Settings',
+ type: 'success',
+ action: () => {
+ buildfire.navigation.navigateToTab({ tabTitle: 'Settings' });
+ }
+ }
+ ]
+ });
+ }
+
+ dataChanged = true;
+ modeChanged = true;
+ $scope.saveData();
+ };
- if ($scope.data.content.view === $scope.viewType.NATIVE_IN_APP && !$scope.data.content.viewSubtype) {
- $scope.data.content.viewSubtype = $scope.viewSubtype.IFRAME;
+ // switch "undo" button visibility
+ function toggleUndoButtonVisibility(savedHtml) {
+ const undoBtn = document.getElementById('undoBtn');
+ if (undoBtn) {
+ undoBtn.style.display = savedHtml ? 'block' : 'none';
}
+ }
- var data = $scope.data;
+ // continue AI conversation
+ function continueAIConversation(prompt) {
+ const limit = 50000;
+ const html = window.monacoEditorInstance.getValue().trim();
+ if (prompt) {
+ const userMessage = html + '\n\n' + prompt;
+ if (userMessage.length > limit) {
+ buildfire.dialog.alert({
+ message: 'The combined content and prompt exceed the character limit for AI generation. Please reduce size and try again.',
+ });
+ return;
+ }
+ buildfire.analytics.trackAction('webcontent-plugin-ai-update');
+ window.ai.generateAiCode({ message: userMessage, conversationId: conversationId }, (err, result) => {
+ if (err) {
+ buildfire.dialog.alert({
+ message: 'Error generating AI response.',
+ });
+ return;
+ }
+ savedHtml = html;
+ setEditorContent(window.monacoEditorInstance, result.response);
+ toggleUndoButtonVisibility(savedHtml);
+ toggleAssistantToastVisibility(true);
+ });
+ }
+ }
- if (data.content.openInApp != undefined) {
- data.content.openInApp = null;
+ // toggle assistant section visibility
+ function toggleAssistantSectionVisibility(visible) {
+ const assistantContainer = document.querySelector('.assistant-container');
+ if (assistantContainer) {
+ if (visible) {
+ assistantContainer.style.display = 'block';
+ assistantContainer.classList.add('visible');
+ } else {
+ assistantContainer.classList.remove('visible');
+ setTimeout(() => {
+ assistantContainer.style.display = 'none';
+ }, 300);
+ }
}
- buildfire.datastore.save(data, function(err, result) {
- if (err || !result) {
- $log.error('Error saving the widget details: ', err);
+ }
+
+ // toggle assistant toast visibility
+ function toggleAssistantToastVisibility(visible) {
+ const assistantToast = document.querySelector('.assistant-toast');
+ if (assistantToast) {
+ if (visible) {
+ assistantToast.style.display = 'block';
+ assistantToast.classList.add('visible');
+ setTimeout(() => {
+ assistantToast.classList.remove('visible');
+ setTimeout(() => {
+ assistantToast.style.display = 'none';
+ }, 300);
+ }, 3000);
} else {
- $log.info('Widget details saved');
+ assistantToast.classList.remove('visible');
+ setTimeout(() => {
+ assistantToast.style.display = 'none';
+ }, 300);
}
+ }
+ }
+
+ // set editor content while maintaining undo behavior (command + z)
+ function setEditorContent(editor, content) {
+ const fullRange = editor.getModel().getFullModelRange();
+ const edit = {
+ range: fullRange,
+ text: content
+ };
+
+ editor.executeEdits('source-of-change', [edit]);
+ editor.pushUndoStop();
+ }
+ (function() {
+ const assistantPromptEl = document.getElementById('assistantPrompt');
+ const undoBtnEl = document.getElementById('undoBtn');
+ const createWithAiBtnEl = document.getElementById('createWithAiBtn');
+ const reloadBtnEl = document.getElementById('reloadEditorBtn');
+ const autoReloadSwitchEl = document.getElementById('autoReloadSwitch');
+ const assistantToastDismissEl = document.querySelector('.dismiss-toast-icon');
+
+ reloadBtnEl.addEventListener('click', function () {
+ // send reload message to widget on button click
+ buildfire.messaging.sendMessageToWidget({ tag: 'reloadWebContent' });
});
- };
- $scope.openMethodChanged = function() {
- dataChanged = true;
- buildfire.datastore.save($scope.data, function(err, result) {
- if (err || !result) {
- $log.error('Error saving the widget details: ', err);
- } else {
- $log.info('Widget details saved');
+ // Send message to widget and save when autoReloadSwitch value changes
+ autoReloadSwitchEl.addEventListener('change', function () {
+ $scope.data.content.autoReload = autoReloadSwitchEl.checked;
+ dataChanged = true;
+ $scope.saveData();
+ });
+
+ createWithAiBtnEl.addEventListener('click', function () {
+ const html = window.monacoEditorInstance.getValue().trim();
+ window.dialogs.showAiDialog({conversationId}, (err, result) => {
+ if (err) {
+ buildfire.dialog.toast({
+ message: err,
+ });
+ } else {
+ savedHtml = html;
+ if (result) {
+ setEditorContent(window.monacoEditorInstance, result.response);
+ toggleUndoButtonVisibility(savedHtml);
+ toggleAssistantSectionVisibility(true);
+ if (result.conversationId) {
+ conversationId = result.conversationId;
+ }
+ }
+ }
+ });
+ });
+
+ undoBtnEl.addEventListener('click', function () {
+ if (savedHtml && window.monacoEditorInstance) {
+ window.monacoEditorInstance.setValue(savedHtml);
+ savedHtml = '';
}
+ toggleUndoButtonVisibility(savedHtml);
});
- };
- $scope.isUrlValid = function(url) {
- return /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,6}\b(\/[-a-zA-Z0-9@:%_\+.~#?!?\/?\w\/?&//=]*)?/.test(url);
- };
- }
+ if (assistantToastDismissEl) {
+ assistantToastDismissEl.addEventListener('click', function () {
+ toggleAssistantToastVisibility(false);
+ });
+ }
+
+ assistantPromptEl.addEventListener('keydown', function(event) {
+ // Check if the pressed key is Enter
+ if (event.key === 'Enter') {
+
+ // Check for SHIFT + ENTER
+ if (event.shiftKey) {
+ console.log('Shift + Enter pressed: Adding a new line (default action)');
+ } else {
+ // ENTER ONLY: used to submit
+ event.preventDefault();
+ console.log('Enter pressed: Submitting the message');
+ if (assistantPromptEl.value.trim()) {
+ continueAIConversation(assistantPromptEl.value.trim());
+ this.value = '';
+ this.style.height = '40px';
+ }
+ }
+ }
+ });
+ assistantPromptEl.oninput = function () {
+ this.style.height = '40px';
+ const newHeight = Math.min(this.scrollHeight, 120);
+ this.style.height = `${newHeight}px`;
+ };
+ })();
+ }
})(window.angular, window.buildfire);
diff --git a/src/control/content/assets/css/cpIcons.css b/src/control/content/assets/css/cpIcons.css
new file mode 100644
index 0000000..f37d0c5
--- /dev/null
+++ b/src/control/content/assets/css/cpIcons.css
@@ -0,0 +1,104 @@
+@font-face {
+ font-family: 'icomoon';
+ src: url('../fonts/icomoon.eot?pmhnzd');
+ src: url('../fonts/icomoon.eot?pmhnzd#iefix') format('embedded-opentype'),
+ url('../fonts/icomoon.ttf?pmhnzd') format('truetype'),
+ url('../fonts/icomoon.woff?pmhnzd') format('woff'),
+ url('../fonts/icomoon.svg?pmhnzd#icomoon') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+ /* use !important to prevent issues with browser extensions that change fonts */
+ font-family: 'icomoon' !important;
+ speak: none;
+ font-style: normal;
+ font-weight: normal;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+
+ /* Better Font Rendering =========== */
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-magnifier:before {
+ content: "\e923";
+}
+.icon-funnel:before {
+ content: "\e925";
+}
+.icon-pencil:before {
+ content: "\eb619";
+}
+.icon-pencil3:before {
+ content: "\e618";
+}
+.icon-cog:before {
+ content: "\e602";
+}
+.icon-wrench:before {
+ content: "\eb900";
+}
+.icon-file-empty:before {
+ content: "\e905";
+}
+.icon-folder:before {
+ content: "\eb901";
+}
+.icon-picture:before {
+ content: "\e70e";
+}
+.icon-user:before {
+ content: "\e71e";
+}
+.icon-users2:before {
+ content: "\e723";
+}
+.icon-download2:before {
+ content: "\eb902";
+}
+.icon-upload2:before {
+ content: "\eb903";
+}
+.icon-cross:before {
+ content: "\e60e1";
+}
+.icon-menu:before {
+ content: "\e60c";
+}
+.icon-check:before {
+ content: "\e60d";
+}
+.icon-cross2:before {
+ content: "\e60e";
+}
+.icon-plus:before {
+ content: "\e907";
+}
+.icon-minus:before {
+ content: "\eb907";
+}
+.icon-chevron-up:before {
+ content: "\e60f1";
+}
+.icon-chevron-down:before {
+ content: "\e60f";
+}
+.icon-chevron-left:before {
+ content: "\e610";
+}
+.icon-chevron-right:before {
+ content: "\e625";
+}
+.icon-sort-amount-asc:before {
+ content: "\eb912";
+}
+.icon-sort-amount-desc:before {
+ content: "\eb913";
+}
+.icon-ellipsis:before {
+ content: "\e620";
+}
\ No newline at end of file
diff --git a/src/control/content/assets/css/dialogs.css b/src/control/content/assets/css/dialogs.css
new file mode 100644
index 0000000..bcb73ec
--- /dev/null
+++ b/src/control/content/assets/css/dialogs.css
@@ -0,0 +1,160 @@
+.dialog-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(16, 16, 16, 0.20);
+ z-index: 34;
+}
+
+.dialog-container {
+ left: 50%;
+ position: fixed;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ width: 100%;
+ z-index: 35;
+ max-width: 600px;
+ opacity: 0;
+}
+
+.dialog {
+ background: #fff;
+ border-radius: 15px;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ box-shadow: 0 0 18.574px 0 rgba(0, 0, 0, 0.05);
+}
+
+.dialog-header {
+ align-items: center;
+ border-bottom: 1px solid rgba(16,16,16,0.15);
+ display: flex;
+ justify-content: space-between;
+ padding: 14px 20px;
+}
+
+.dialog-title {
+ color: #101010;
+ font-size: 15px;
+ font-style: normal;
+ font-weight: 500;
+ letter-spacing: -0.15px;
+ line-height: normal;
+}
+
+.dialog-body {
+ padding: 20px;
+}
+
+.dialog-body p {
+ color: #101010;
+ font-size: 15px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 150%;
+ letter-spacing: -0.15px;
+}
+
+.dialog-body .italic {
+ font-style: italic;
+}
+
+.dialog-footer {
+ display: flex;
+ justify-content: flex-end;
+ align-items: center;
+ padding: 16px;
+ border-top: 1px solid rgba(16, 16, 16, 0.15);
+}
+
+.dialog-action {
+ background: #101010;
+ border-radius: 8px;
+ color: #FFFFFF;
+ font-size: 15px;
+ font-style: normal;
+ font-weight: 500;
+ letter-spacing: -0.3px;
+ line-height: 100%;
+ padding: 11px 40px;
+}
+
+.dialog-action:disabled {
+ cursor: default;
+ opacity: 0.2;
+ pointer-events: none;
+ user-select: none;
+}
+
+.checkbox label {
+ color: #000;
+ font-size: 15px !important;
+ font-style: normal;
+ font-weight: 400;
+ line-height: normal;
+}
+
+.ai-dialog .dialog-header {
+ border-bottom: none;
+}
+
+.ai-prompt {
+ border-radius: 5px;
+ border: 1px solid rgba(16, 16, 16, 0.15);
+ display: block;
+ margin-bottom: 20px;
+ padding: 17px;
+ resize: none;
+ width: 100%;
+}
+
+.ai-prompt::placeholder {
+ color: rgba(16, 16, 16, 0.30);
+ font-size: 15px;
+ font-style: normal;
+ font-weight: 500;
+ letter-spacing: -0.3px;
+ line-height: 100%;
+}
+
+.ai-dialog .ai-examples li {
+ background: #F5F5F5;
+ border-radius: 100px;
+ color: #101010;
+ font-size: 15px;
+ font-style: normal;
+ font-weight: 400;
+ letter-spacing: -0.3px;
+ line-height: 130%;
+ margin-bottom: 13px;
+ padding: 12px 20px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ cursor: pointer;
+ transition: all 0.3s ease-in-out;
+}
+
+.ai-dialog .ai-examples li:hover {
+ background: #E0E0E0;
+}
+
+.ai-dialog .ai-examples-title {
+ color: #101010;
+ font-size: 15px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 100%;
+ letter-spacing: -0.3px;
+ margin: 20px 0;
+}
+
+.ai-dialog .create-assistant-container {
+ align-items: center;
+ display: flex;
+ justify-content: flex-end;
+}
\ No newline at end of file
diff --git a/src/control/content/assets/css/style.css b/src/control/content/assets/css/style.css
new file mode 100644
index 0000000..55e1c5d
--- /dev/null
+++ b/src/control/content/assets/css/style.css
@@ -0,0 +1,298 @@
+body .main-form {
+ font-family: 'Inter_Medium','Helvetica','Sans-Serif','Arial';
+ font-size: 13px;
+ font-weight: 500;
+ color: #101010;
+}
+.button-switch {
+ margin-bottom: 30px;
+}
+.button-switch .radio {
+ margin-top: 0;
+}
+.button-switch .radio label, .note {
+ font-family: 'Inter_Regular','Helvetica','Sans-Serif','Arial';
+ font-size: 13px;
+ font-weight: 400;
+ color: #5F5F5F;
+}
+p.note {
+ background: #F5F5F5;
+ color: #101010;
+ font-style: normal;
+ letter-spacing: -0.12px;
+ line-height: 150%;
+ margin-bottom: 20px;
+ padding: 10px 15px;
+ border-radius: 5px;
+}
+#urlContent .item input {
+ margin-left: 100px;
+}
+.alerts-wrapper {
+ width: calc(100% - 125px)
+}
+#customContent {
+ margin-bottom: 70px;
+}
+#customContent .button-switch {
+ margin: 30px 10px 0 0;
+}
+#customContent .button-switch .text {
+ color: #000;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: normal;
+}
+#customContent .button-switch > label {
+ cursor: pointer;
+ height: 0;
+ position: relative;
+ width: 40px;
+ text-align: left;
+}
+#customContent .button-switch > label::before {
+ background: #909090;
+ border-radius: 18px;
+ content: "";
+ height: 27px;
+ margin-top: -13.5px;
+ position: absolute;
+ opacity: 0.3;
+ transition: all 0.4s ease-in-out;
+ width: 46px;
+}
+#customContent .button-switch > label::after {
+ background: #fff;
+ border-radius: 16px;
+ box-shadow: 0 0 5px rgb(0 0 0 / 30%);
+ content: "";
+ height: 24px;
+ left: 0;
+ margin-top: -9px;
+ position: absolute;
+ top: -3px;
+ transition: all 0.3s ease-in-out;
+ width: 24px;
+}
+#customContent .button-switch > input[type="checkbox"]:checked + label::before {
+ background: inherit;
+ opacity: 0.5;
+}
+#customContent .button-switch > input[type="checkbox"] {
+ display: none;
+ margin: 4px 0 0;
+}
+#customContent .button-switch > input[type="checkbox"]:checked + label::after {
+ background: inherit;
+ left: 23px;
+}
+#customContent .button-switch label.label-success {
+ background-color: #47c3ff;
+}
+.radio label {
+ padding-left: 12px;
+}
+.flex-between {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+.flex-end {
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+}
+.radio-block:first-child {
+ margin-right: 42px;
+}
+.btn.btn-success {
+ padding: 6px 24px;
+ margin-left: 15px;
+ background-color: #101010;
+}
+.btn.btn-success:hover, .btn.btn-success:focus {
+ background-color: #343434;
+}
+.editor {
+ background: #1f1f1f;
+ border-radius: 10px;
+ height: 75vh;
+ min-height: 465px;
+ position: relative;
+ margin-bottom: 20px;
+}
+.assistant-container {
+ bottom: 15px;
+ left: 12px;
+ position: absolute;
+ right: 12px;
+ z-index: -1;
+ opacity: 0;
+ visibility: hidden;
+ transition: opacity 0.3s ease, visibility 0s 0.3s;
+ display: none;
+}
+.assistant-toast {
+ backdrop-filter: blur(10px);
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 5px;
+ color: rgba(255, 255, 255, 0.70);
+ margin-bottom: 10px;
+ opacity: 0;
+ padding: 14px;
+ position: relative;
+ transition: opacity 0.3s ease, visibility 0s 0.3s;
+ visibility: hidden;
+ z-index: -1;
+ width: 100%;
+ display: none;
+}
+.dismiss-toast-icon {
+ cursor: pointer;
+ color: #fff;
+ font-size: 16px;
+ position: absolute;
+ top: 14px;
+ right: 14px;
+}
+.assistant-textarea {
+ -ms-overflow-style: none;
+ background: #535353;
+ border-radius: 5px;
+ border: 1px solid rgba(16, 16, 16, 0.15);
+ box-sizing: border-box;
+ color: rgba(255, 255, 255, 0.70);
+ height: 40px;
+ line-height: 20px;
+ max-height: 120px;
+ padding: 10px 14px;
+ resize: none;
+ scrollbar-width: none;
+ width: 100%;
+}
+.assistant-textarea::placeholder {
+ padding-top: 3px;
+}
+.assistant-textarea::-webkit-scrollbar {
+ display: none;
+}
+.assistant-textarea::placeholder {
+ color: rgba(255, 255, 255, 0.5);
+ font-style: italic;
+ font-weight: 500;
+ line-height: 12px;
+ letter-spacing: -0.24px;
+}
+#monacoEditor {
+ height: 100%;
+}
+.bold {
+ font-weight: 600 !important;
+}
+.monaco-editor,
+.monaco-editor .overflow-guard {
+ border-radius: 10px;
+}
+.btns-container {
+ max-height: 33px;
+}
+#customContent hr {
+ margin-top: 16px;
+ margin-bottom: 23px;
+}
+.btn {
+ border-radius: 7px;
+ border: none;
+ color: #101010;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 500;
+ height: 100%;
+ padding: 12px 20px;
+ transition: all 0.3s ease-in-out;
+}
+.create-ai-btn {
+ background: linear-gradient(256deg, #f5f5f5 -19.73%, #47c3ff 286.39%);
+ letter-spacing: -0.24px;
+ position: relative;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 7px 20px !important;
+}
+.create-ai-btn::before {
+ background: linear-gradient(256deg, #e0e0e0 -19.73%, #1aa1ff 286.39%);
+ border-radius: 7px;
+ content: "";
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ transition: opacity 0.3s ease-in-out;
+ width: 100%;
+ z-index: -1;
+}
+.link-btn {
+ background-color: #ffffff;
+ border-radius: 5px;
+ color: #101010;
+ letter-spacing: -0.12px;
+ line-height: 150%;
+ margin-right: 10px;
+}
+.link-btn:hover {
+ background: #f5f5f5;
+ color: #101010;
+ cursor: pointer;
+}
+.run-code-btn {
+ background: #343434;
+ border-radius: 5px;
+ color: #ffffff;
+ letter-spacing: -0.24px;
+ line-height: normal;
+}
+.run-code-btn:hover {
+ background: #101010;
+}
+.hide-scrollbar {
+ -ms-overflow-style: none; /* IE and Edge */
+ scrollbar-width: none; /* Firefox */
+}
+.hide-scrollbar::-webkit-scrollbar {
+ display: none; /* Chrome, Safari, Opera */
+}
+.editor-toast {
+ align-items: center;
+ backdrop-filter: blur(10px);
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 5px;
+ color: rgba(255, 255, 255, 0.5);
+ display: flex;
+ justify-content: space-between;
+ max-width: 100%;
+ padding: 14px;
+}
+.close-icon {
+ color: #101010;
+ cursor: pointer;
+ font-size: 18px;
+}
+.margin-left-ten {
+ margin-left: 10px !important;
+}
+.visibility-hidden {
+ visibility: hidden;
+}
+#undoBtn {
+ display: none;
+}
+.visible {
+ opacity: 1 !important;
+ transition-delay: 0s;
+ visibility: visible !important;
+ z-index: 5 !important;
+}
\ No newline at end of file
diff --git a/src/control/content/assets/fonts/icomoon.eot b/src/control/content/assets/fonts/icomoon.eot
new file mode 100644
index 0000000000000000000000000000000000000000..5f2daf9cea2cbf829d1560b629ca6a57fdacfbb7
GIT binary patch
literal 7268
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
literal 0
HcmV?d00001
diff --git a/src/control/content/assets/fonts/icomoon.svg b/src/control/content/assets/fonts/icomoon.svg
new file mode 100644
index 0000000..e5fb59c
--- /dev/null
+++ b/src/control/content/assets/fonts/icomoon.svg
@@ -0,0 +1,36 @@
+
+
+
+Generated by IcoMoon
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/control/content/assets/fonts/icomoon.ttf b/src/control/content/assets/fonts/icomoon.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..05858de2ea2a3674d535880e333daf251e79b699
GIT binary patch
literal 7104
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
V{2G^HQ&NCwR{-phYO;qu{{w~{dX)eG
literal 0
HcmV?d00001
diff --git a/src/control/content/assets/images/ai_icon.svg b/src/control/content/assets/images/ai_icon.svg
new file mode 100644
index 0000000..8379af1
--- /dev/null
+++ b/src/control/content/assets/images/ai_icon.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/control/content/index.html b/src/control/content/index.html
index 715c5c8..ef76743 100644
--- a/src/control/content/index.html
+++ b/src/control/content/index.html
@@ -1,146 +1,110 @@

-
-
-
- content
-
-
-
-
+
+
+
+ content
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
- URL
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
- Validate
-
+
+
+
You can customize how this webpage opens in the app from the Settings tab
+
+ URL
+
+
+ Validate
+
+
+
+
+
+
URL
+ successfully validated
+
+
+ Invalid Url
+
+
+
-
-
-
-
-
Seems like
- your url is not valid ! But if you
- want,
- you can
- still
- add it
- to your plugin.
-
-
+
+
+
+
+ Note:
+
+ Always save your code externally as we don't keep versions.
+
+
-
-
-
URL
- successfully validated
-
-
- Invalid Url
-
-
-
-
-
-
-
-
-
- In Popup Window
-
-
-
- In Feature
-
-
-
-
-
iFrame
+
+
+
+
+ Create with AI
+
+
Undo
+
+
Run Code
-
-
-
Native Webview (Beta)
+
+
-
- Some websites may not work correctly when opened inside the app, especially in the built-in browser view. This is often due to Apple’s security rules or website settings from companies like Google and Amazon that block their pages from being shown in this way. If your webpage doesn’t load or work as expected, we recommend trying one of the other viewing options available.
-
-
- Native Webview is a new feature that works around iFrame issues. If the iFrame option isn’t working, try using Native Webview instead.
-
Note: This feature will only work for apps with builds submitted to Apple App Store and Google Play Store after 5, August 2025. For older builds the app will default to "In Popup Window" option.
-
-
-
- Device's default external browser
-
-
-
For the best experience, link to mobile-optimized and secure (HTTPS) content. If your webpage includes payment processing, it must open outside of the app—otherwise, Apple may reject your app during review. Also, be aware that some websites only display their mobile layout on actual mobile devices.
-
Note: If you’re accepting payments, use a Deep Link to redirect users back into your app after the transaction is complete.
-
-
-
-
-
+
diff --git a/src/control/content/js/ai/ai.js b/src/control/content/js/ai/ai.js
new file mode 100644
index 0000000..77aa3b6
--- /dev/null
+++ b/src/control/content/js/ai/ai.js
@@ -0,0 +1,46 @@
+const PROMPT_ID = 'pmpt_6938b78842888194b3b1401fee724f360e7139e8dfaae44f';
+window.ai = {
+ persistentConversation: null,
+ init: function() {
+ window.ai.persistentConversation = new buildfire.ai.persistentConversation();
+ },
+ generateAiCode: function(options, callback) {
+ window.ai.persistentConversation.fetchTextResponse({
+ message: options.message,
+ promptId: PROMPT_ID,
+ conversationId: options.conversationId || null,
+ loadingMessage: 'Your code is being generated. This may take a couple minutes',
+ }, (err, res) => {
+ if (err) return callback(err);
+
+ if (!res || !res.data || !res.data.response || !res.data.response.length ||
+ !window.ai._extractHtmlContent(res.data.response)
+ ) {
+ return callback('No response from AI');
+ }
+ const aiResponse = window.ai._extractHtmlContent(res.data.response);
+ callback(null, {response: aiResponse, conversationId: res.data.conversationId});
+ });
+ },
+ deleteConversation: function(conversationId, callback) {
+ window.ai.persistentConversation.deleteConversation({conversationId}, (err, res) => {
+ if (err) {
+ if (callback) callback(err);
+ return;
+ }
+ if (callback) callback(null, res);
+ });
+ },
+
+ _extractHtmlContent: function(htmlString) {
+ // Remove everything before or
+ let result = htmlString.replace(/^[\s\S]*?(|)/i, '$1');
+
+ // Remove everything after
+ result = result.replace(/(<\/html>)[\s\S]*$/i, '$1');
+
+ return result;
+ }
+};
+
+window.ai.init();
diff --git a/src/control/content/js/dialogs/dialogs.js b/src/control/content/js/dialogs/dialogs.js
new file mode 100644
index 0000000..24066de
--- /dev/null
+++ b/src/control/content/js/dialogs/dialogs.js
@@ -0,0 +1,169 @@
+window.dialogs = {
+ showDisclaimerDialog: function (callback) {
+ function closeDialog() {
+ if (callback) callback();
+ if (backdrop) {
+ document.body.removeChild(backdrop);
+ }
+ if (dialogContainer) {
+ document.body.removeChild(dialogContainer);
+ }
+ }
+
+ const backdrop = document.createElement('div');
+ backdrop.classList.add('dialog-backdrop');
+
+ const dialogContainer = document.createElement('div');
+ dialogContainer.classList.add('dialog-container');
+ dialogContainer.innerHTML = `
+
+
+
+
⚠️ Warning
+
+ We don't review, test, or guarantee the performance or security of custom code. By using this plugin, you're taking ownership of how your custom code behaves in your app.
+
+
+ Any technical issues that may arise from custom code will not be covered by our support team.
+
+
+
+
+
+ `;
+
+ document.body.appendChild(backdrop);
+ document.body.appendChild(dialogContainer);
+
+ const checkbox = dialogContainer.querySelector('#disclaimerCheckbox');
+ const startBtn = dialogContainer.querySelector('#startCodingBtn');
+
+ document.fonts.ready.then(() => {
+ dialogContainer.style.opacity = '1';
+ });
+ if (checkbox && startBtn) {
+ checkbox.addEventListener('change', function () {
+ startBtn.disabled = !checkbox.checked;
+ });
+ startBtn.addEventListener('click', function () {
+ closeDialog();
+ });
+ }
+ },
+ showAiDialog: function (options, callback) {
+ const limit = 10000;
+ showDialog();
+
+ function closeDialog(result) {
+ const backdrop = document.getElementById('aiDialogBackdrop');
+ const dialogContainer = document.getElementById('aiDialogContainer');
+ if (callback) callback(null, result);
+ if (backdrop) {
+ document.body.removeChild(backdrop);
+ }
+ if (dialogContainer) {
+ document.body.removeChild(dialogContainer);
+ }
+ }
+
+ function showDialog() {
+ const backdrop = document.createElement('div');
+ backdrop.classList.add('dialog-backdrop');
+ backdrop.id = 'aiDialogBackdrop';
+
+ const dialogContainer = document.createElement('div');
+ dialogContainer.classList.add('dialog-container');
+ dialogContainer.id = 'aiDialogContainer';
+ dialogContainer.innerHTML = `
+
+
+
+
+
+
+
+ Create with AI
+
+
+
Examples of Prompts
+
+
+
+ `;
+
+ document.body.appendChild(backdrop);
+ document.body.appendChild(dialogContainer);
+
+ const generateAiBtn = dialogContainer.querySelector('#generateAiBtn');
+ const aiPrompt = dialogContainer.querySelector('.ai-prompt');
+ aiPrompt.focus();
+
+ generateAiBtn.addEventListener('click', function () {
+ if (!aiPrompt || !aiPrompt.value || !aiPrompt.value.trim().length) {
+ buildfire.dialog.toast({
+ message: 'Please enter a prompt for AI generation.',
+ });
+ return;
+ }
+ if (aiPrompt.value.length >= limit) {
+ buildfire.dialog.alert({
+ message: 'Prompt exceeds the character limit for AI generation. Please reduce size and try again.',
+ });
+ return;
+ }
+ buildfire.analytics.trackAction('webcontent-plugin-ai-generate');
+ window.ai.generateAiCode({ message: aiPrompt.value }, (err, res) => {
+ if (err || !res) {
+ buildfire.dialog.alert({
+ message: 'Error generating AI response.',
+ });
+ return;
+ }
+ if (options.conversationId) {
+ window.ai.deleteConversation(options.conversationId);
+ }
+ closeDialog(res);
+ });
+ });
+
+ document.fonts.ready.then(() => {
+ dialogContainer.style.opacity = '1';
+ });
+ const closeIcon = dialogContainer.querySelector('.close-icon');
+ if (closeIcon) {
+ closeIcon.addEventListener('click', function () {
+ closeDialog();
+ });
+ }
+
+ // Add click listeners to all example
items
+ const exampleItems = dialogContainer.querySelectorAll('.ai-examples li');
+ exampleItems.forEach(function (item) {
+ item.style.cursor = 'pointer';
+ item.addEventListener('click', function () {
+ aiPrompt.value = item.textContent;
+ aiPrompt.focus();
+ });
+ });
+ }
+ }
+};
\ No newline at end of file
diff --git a/src/control/content/js/monaco-editor/min/vs/base/browser/ui/codicons/codicon/codicon.ttf b/src/control/content/js/monaco-editor/min/vs/base/browser/ui/codicons/codicon/codicon.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..27ee4c68caef1cd22342f481420d6dbda1648012
GIT binary patch
literal 80340
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%0DOF`LEiy*`&i@0
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