@elliemae/pui-app-bridge 2.18.1 → 2.19.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.
@@ -85,6 +85,11 @@
85
85
  "app.css"
86
86
  ]
87
87
  }
88
+ },
89
+ "ssfapp": {
90
+ "name": "SSF App",
91
+ "hostUrl": "./ssf-app",
92
+ "microappManager": "ssf"
88
93
  }
89
94
  },
90
95
  "serviceEndpoints": {
@@ -28,7 +28,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var app_exports = {};
30
30
  __export(app_exports, {
31
- CAppConfig: () => CAppConfig
31
+ CAppConfig: () => CAppConfig,
32
+ LaunchMode: () => LaunchMode,
33
+ MicroAppManager: () => MicroAppManager
32
34
  });
33
35
  module.exports = __toCommonJS(app_exports);
34
36
  var import_clone = __toESM(require("lodash/clone"), 1);
@@ -39,6 +41,16 @@ var import_merge = __toESM(require("lodash/merge"), 1);
39
41
  var import_app_config = __toESM(require("../app.config.json"), 1);
40
42
  var import_constant = require("../constant.js");
41
43
  var import_utils = require("../utils.js");
44
+ var LaunchMode = /* @__PURE__ */ ((LaunchMode2) => {
45
+ LaunchMode2["DEVELOPMENT"] = "development";
46
+ LaunchMode2["PRODUCTION"] = "production";
47
+ return LaunchMode2;
48
+ })(LaunchMode || {});
49
+ var MicroAppManager = /* @__PURE__ */ ((MicroAppManager2) => {
50
+ MicroAppManager2["SSF"] = "ssf";
51
+ MicroAppManager2["APPSDK"] = "appsdk";
52
+ return MicroAppManager2;
53
+ })(MicroAppManager || {});
42
54
  class CAppConfig {
43
55
  #gAppConfig = import_app_config.default;
44
56
  #version;
@@ -33,13 +33,14 @@ __export(microFE_exports, {
33
33
  module.exports = __toCommonJS(microFE_exports);
34
34
  var import_merge = __toESM(require("lodash/merge"), 1);
35
35
  var import_utils = require("../utils.js");
36
+ var import_app = require("./app.js");
36
37
  var import_constant = require("../constant.js");
37
38
  var import_common = require("../typings/common.js");
38
39
  const CONFIG_KEY = "microFrontendApps";
39
40
  const isCIBuild = () => process.env.CI === "true";
40
41
  const isProduction = (mode) => {
41
42
  if (isCIBuild()) return true;
42
- if (mode) return mode === "production";
43
+ return String(mode).toLowerCase() === import_app.LaunchMode.PRODUCTION.toLowerCase();
43
44
  return true;
44
45
  };
45
46
  const getPathName = (url) => url ? new URL(url).pathname : "";
@@ -60,28 +61,34 @@ const isFileListValid = (files) => {
60
61
  return files.every((file) => typeof file === "string");
61
62
  };
62
63
  const validate = (id, mfeConfig) => {
63
- const { mode = "production" } = mfeConfig;
64
- if (mode !== "production" && mode !== "development")
65
- throw new Error(`invalid mode '${mode}' for ${id}`);
66
- const { production, development } = mfeConfig;
67
- if (mode === "production") {
68
- if (!production) {
69
- throw new Error(
70
- `microFrontendApps.${id} is missing production section in app.config.json`
71
- );
72
- }
73
- if (!isFileListValid(production.files)) {
74
- throw new Error(`invalid value for production.files`);
75
- }
76
- }
77
- if (mode === "development") {
78
- if (!development) {
79
- throw new Error(
80
- `microFrontendApps.${id} is missing development section in app.config.json`
81
- );
64
+ const { mode = import_app.LaunchMode.PRODUCTION } = mfeConfig;
65
+ if (String(mode).toLowerCase() !== import_app.LaunchMode.PRODUCTION.toLowerCase() && String(mode).toLowerCase() !== import_app.LaunchMode.DEVELOPMENT.toLowerCase())
66
+ throw new Error(`invalid mode '${String(mode)}' for ${id}`);
67
+ const {
68
+ production,
69
+ development,
70
+ microappManager = import_app.MicroAppManager.APPSDK
71
+ } = mfeConfig;
72
+ if (String(microappManager).toLowerCase() === import_app.MicroAppManager.APPSDK.toLowerCase()) {
73
+ if (String(mode).toLowerCase() === import_app.LaunchMode.PRODUCTION.toLowerCase()) {
74
+ if (!production) {
75
+ throw new Error(
76
+ `microFrontendApps.${id} is missing production section in app.config.json`
77
+ );
78
+ }
79
+ if (!isFileListValid(production.files)) {
80
+ throw new Error(`invalid value for production.files`);
81
+ }
82
82
  }
83
- if (!isFileListValid(development.files)) {
84
- throw new Error(`invalid value for development.files`);
83
+ if (String(mode).toLowerCase() === import_app.LaunchMode.DEVELOPMENT.toLowerCase()) {
84
+ if (!development) {
85
+ throw new Error(
86
+ `microFrontendApps.${id} is missing development section in app.config.json`
87
+ );
88
+ }
89
+ if (!isFileListValid(development.files)) {
90
+ throw new Error(`invalid value for development.files`);
91
+ }
85
92
  }
86
93
  }
87
94
  };
@@ -90,7 +97,7 @@ const getConfig = ({
90
97
  config,
91
98
  version = "latest"
92
99
  }) => {
93
- const { mode = "production" } = config;
100
+ const { mode = import_app.LaunchMode.PRODUCTION } = config;
94
101
  const envConfig = isProduction(mode) ? config.production : config.development;
95
102
  if (config.production)
96
103
  delete config.production;
@@ -100,7 +107,7 @@ const getConfig = ({
100
107
  { id },
101
108
  {
102
109
  name: id,
103
- mode: "production",
110
+ mode: import_app.LaunchMode.PRODUCTION,
104
111
  manifestPath: "./{SYSTEM_VERSION}/",
105
112
  securityContext: import_common.SecurityContext.USER,
106
113
  isJsModule: true
@@ -85,6 +85,11 @@
85
85
  "app.css"
86
86
  ]
87
87
  }
88
+ },
89
+ "ssfapp": {
90
+ "name": "SSF App",
91
+ "hostUrl": "./ssf-app",
92
+ "microappManager": "ssf"
88
93
  }
89
94
  },
90
95
  "serviceEndpoints": {
@@ -6,6 +6,16 @@ import lodashMerge from "lodash/merge";
6
6
  import appConfig from "../app.config.json";
7
7
  import { LATEST_VERSION } from "../constant.js";
8
8
  import { appendTrailingSlash } from "../utils.js";
9
+ var LaunchMode = /* @__PURE__ */ ((LaunchMode2) => {
10
+ LaunchMode2["DEVELOPMENT"] = "development";
11
+ LaunchMode2["PRODUCTION"] = "production";
12
+ return LaunchMode2;
13
+ })(LaunchMode || {});
14
+ var MicroAppManager = /* @__PURE__ */ ((MicroAppManager2) => {
15
+ MicroAppManager2["SSF"] = "ssf";
16
+ MicroAppManager2["APPSDK"] = "appsdk";
17
+ return MicroAppManager2;
18
+ })(MicroAppManager || {});
9
19
  class CAppConfig {
10
20
  #gAppConfig = appConfig;
11
21
  #version;
@@ -84,5 +94,7 @@ class CAppConfig {
84
94
  };
85
95
  }
86
96
  export {
87
- CAppConfig
97
+ CAppConfig,
98
+ LaunchMode,
99
+ MicroAppManager
88
100
  };
@@ -1,12 +1,16 @@
1
1
  import merge from "lodash/merge";
2
2
  import { appendTrailingSlash } from "../utils.js";
3
+ import {
4
+ LaunchMode,
5
+ MicroAppManager
6
+ } from "./app.js";
3
7
  import { LATEST_VERSION } from "../constant.js";
4
8
  import { SecurityContext } from "../typings/common.js";
5
9
  const CONFIG_KEY = "microFrontendApps";
6
10
  const isCIBuild = () => process.env.CI === "true";
7
11
  const isProduction = (mode) => {
8
12
  if (isCIBuild()) return true;
9
- if (mode) return mode === "production";
13
+ return String(mode).toLowerCase() === LaunchMode.PRODUCTION.toLowerCase();
10
14
  return true;
11
15
  };
12
16
  const getPathName = (url) => url ? new URL(url).pathname : "";
@@ -27,28 +31,34 @@ const isFileListValid = (files) => {
27
31
  return files.every((file) => typeof file === "string");
28
32
  };
29
33
  const validate = (id, mfeConfig) => {
30
- const { mode = "production" } = mfeConfig;
31
- if (mode !== "production" && mode !== "development")
32
- throw new Error(`invalid mode '${mode}' for ${id}`);
33
- const { production, development } = mfeConfig;
34
- if (mode === "production") {
35
- if (!production) {
36
- throw new Error(
37
- `microFrontendApps.${id} is missing production section in app.config.json`
38
- );
39
- }
40
- if (!isFileListValid(production.files)) {
41
- throw new Error(`invalid value for production.files`);
42
- }
43
- }
44
- if (mode === "development") {
45
- if (!development) {
46
- throw new Error(
47
- `microFrontendApps.${id} is missing development section in app.config.json`
48
- );
34
+ const { mode = LaunchMode.PRODUCTION } = mfeConfig;
35
+ if (String(mode).toLowerCase() !== LaunchMode.PRODUCTION.toLowerCase() && String(mode).toLowerCase() !== LaunchMode.DEVELOPMENT.toLowerCase())
36
+ throw new Error(`invalid mode '${String(mode)}' for ${id}`);
37
+ const {
38
+ production,
39
+ development,
40
+ microappManager = MicroAppManager.APPSDK
41
+ } = mfeConfig;
42
+ if (String(microappManager).toLowerCase() === MicroAppManager.APPSDK.toLowerCase()) {
43
+ if (String(mode).toLowerCase() === LaunchMode.PRODUCTION.toLowerCase()) {
44
+ if (!production) {
45
+ throw new Error(
46
+ `microFrontendApps.${id} is missing production section in app.config.json`
47
+ );
48
+ }
49
+ if (!isFileListValid(production.files)) {
50
+ throw new Error(`invalid value for production.files`);
51
+ }
49
52
  }
50
- if (!isFileListValid(development.files)) {
51
- throw new Error(`invalid value for development.files`);
53
+ if (String(mode).toLowerCase() === LaunchMode.DEVELOPMENT.toLowerCase()) {
54
+ if (!development) {
55
+ throw new Error(
56
+ `microFrontendApps.${id} is missing development section in app.config.json`
57
+ );
58
+ }
59
+ if (!isFileListValid(development.files)) {
60
+ throw new Error(`invalid value for development.files`);
61
+ }
52
62
  }
53
63
  }
54
64
  };
@@ -57,7 +67,7 @@ const getConfig = ({
57
67
  config,
58
68
  version = "latest"
59
69
  }) => {
60
- const { mode = "production" } = config;
70
+ const { mode = LaunchMode.PRODUCTION } = config;
61
71
  const envConfig = isProduction(mode) ? config.production : config.development;
62
72
  if (config.production)
63
73
  delete config.production;
@@ -67,7 +77,7 @@ const getConfig = ({
67
77
  { id },
68
78
  {
69
79
  name: id,
70
- mode: "production",
80
+ mode: LaunchMode.PRODUCTION,
71
81
  manifestPath: "./{SYSTEM_VERSION}/",
72
82
  securityContext: SecurityContext.USER,
73
83
  isJsModule: true
@@ -85,6 +85,11 @@
85
85
  "app.css"
86
86
  ]
87
87
  }
88
+ },
89
+ "ssfapp": {
90
+ "name": "SSF App",
91
+ "hostUrl": "./ssf-app",
92
+ "microappManager": "ssf"
88
93
  }
89
94
  },
90
95
  "serviceEndpoints": {
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="mobile-web-app-capable" content="yes"/><link rel="icon" href="/favicon.ico"/><title>Application</title><script nonce="__CSP_NONCE__">!function(e,t,n,a,c,o,s){e.GoogleAnalyticsObject=c,e[c]=e[c]||function(){(e[c].q=e[c].q||[]).push(arguments)},e[c].l=1*new Date,o=t.createElement(n),s=t.getElementsByTagName(n)[0],o.async=1,o.src="https://www.google-analytics.com/analytics.js",s.parentNode.insertBefore(o,s)}(window,document,"script",0,"ga")</script><style nonce="__CSP_NONCE__">.full-width{width:100%}.full-height{height:100%}</style><script defer="defer" src="js/emuiAppBridge.15885c97dc211897b3a0.js"></script></head><body class="full-width full-height"><noscript>If you're seeing this message, that means <strong>JavaScript has been disabled on your browser</strong>, please <strong>enable JS</strong> to make this app work.</noscript><div id="pui-app-container-" class="full-width full-height"></div></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="mobile-web-app-capable" content="yes"/><link rel="icon" href="/favicon.ico"/><title>Application</title><script nonce="__CSP_NONCE__">!function(e,t,n,a,c,o,s){e.GoogleAnalyticsObject=c,e[c]=e[c]||function(){(e[c].q=e[c].q||[]).push(arguments)},e[c].l=1*new Date,o=t.createElement(n),s=t.getElementsByTagName(n)[0],o.async=1,o.src="https://www.google-analytics.com/analytics.js",s.parentNode.insertBefore(o,s)}(window,document,"script",0,"ga")</script><style nonce="__CSP_NONCE__">.full-width{width:100%}.full-height{height:100%}</style><script defer="defer" src="js/emuiAppBridge.023287a6115d74cc7707.js"></script></head><body class="full-width full-height"><noscript>If you're seeing this message, that means <strong>JavaScript has been disabled on your browser</strong>, please <strong>enable JS</strong> to make this app work.</noscript><div id="pui-app-container-" class="full-width full-height"></div></body></html>
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>Host</title><script src="https://cdn.tailwindcss.com?plugins=forms"></script><script src="https://cdn.qa1.ice.com/pui-diagnostics@3"></script><script defer="defer" src="js/emuiAppBridge.15885c97dc211897b3a0.js"></script></head><body><header class="bg-indigo-300 h-10 flex place-items-center"><div class="px-2">ICE Mortgage Product</div></header><main class="mx-auto max-w-7xl px-2 sm:px-6 lg:px-8"><div class="min-w-0 flex-1 mt-4"><h1 class="text-2xl font-bold leading-7 text-gray-900 sm:truncate sm:text-3xl sm:tracking-tight">Loan Application</h1></div><div id="successFeedback" class="hidden rounded-md bg-green-50 p-4"><div class="flex"><div class="flex-shrink-0"><svg class="h-5 w-5 text-green-400" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd"/></svg></div><div class="ml-3"><p class="text-sm font-medium text-green-800">Loan Saved Successfully</p></div></div></div><div id="errorFeedback" class="hidden rounded-md bg-red-50 p-4"><div class="flex"><div class="flex-shrink-0"><svg class="h-5 w-5 text-red-400" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z" clip-rule="evenodd"/></svg></div><div class="ml-3"><h3 class="text-sm font-medium text-red-800">Credit Score is not meeting the requirement</h3></div></div></div><div class="mt-2 sm:grid sm:grid-cols-2 sm:gap-2"><form class="px-2 py-2 space-y-8 divide-y divide-gray-200 bg-gray-50"><div class="space-y-8 divide-y divide-gray-200 sm:space-y-5"><div class="space-y-6 sm:space-y-5"><div><h3 class="text-lg font-medium leading-6 text-gray-900">Personal Information</h3></div><div class="space-y-6 sm:space-y-5"><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="firstName" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">First name</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input name="firstName" id="firstName" autocomplete="given-name" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="John" placeholder="John"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="lastName" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Last name</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input name="lastName" id="lastName" autocomplete="family-name" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="Doe" placeholder="Doe"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="ssn" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">SSN</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input type="number" name="ssn" id="ssn" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="123456789" placeholder="123456789"/></div></div></div><div><h3 class="text-lg font-medium leading-6 text-gray-900">Loan Information</h3></div><div class="space-y-6 sm:space-y-5"><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="amount" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Amount</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input type="number" name="amount" id="amount" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="500000" placeholder="500000"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="Term" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Term (years)</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input type="number" name="term" id="term" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="30" placeholder="30"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="downPayment" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Down Payment</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input type="number" name="downPayment" id="downPayment" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="50000" placeholder="50000"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="creditScore" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Credit Score</label><div class="mt-1 sm:mt-0"><output id="creditScore" class="block w-full max-w-lg pl-2 pt-2 sm:max-w-xs sm:text-sm">NA</output></div><div class="mt-1 sm:mt-0"><button id="getCreditScore" type="button" class="inline-flex items-center rounded-full border border-transparent bg-indigo-600 p-1 text-white shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"><path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"/></svg></button></div></div></div></div></div><button id="saveLoan" type="button" class="inline-flex items-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2">Save</button></form><div id="aside-container" class="flex flex-col gap-4 items-start mt-4 border-2 p-2 rounded-lg border-dashed border-cyan-300 sm:mt-0"></div></div><div id="bottom-container" class="flex flex-col gap-4 items-start mt-4 p-2 sm:mt-0"></div></main><script src="./init.js" type="module"></script></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>Host</title><script src="https://cdn.tailwindcss.com?plugins=forms"></script><script src="https://cdn.qa1.ice.com/pui-diagnostics@3"></script><script defer="defer" src="js/emuiAppBridge.023287a6115d74cc7707.js"></script></head><body><header class="bg-indigo-300 h-10 flex place-items-center"><div class="px-2">ICE Mortgage Product</div></header><main class="mx-auto max-w-7xl px-2 sm:px-6 lg:px-8"><div class="min-w-0 flex-1 mt-4"><h1 class="text-2xl font-bold leading-7 text-gray-900 sm:truncate sm:text-3xl sm:tracking-tight">Loan Application</h1></div><div id="successFeedback" class="hidden rounded-md bg-green-50 p-4"><div class="flex"><div class="flex-shrink-0"><svg class="h-5 w-5 text-green-400" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd"/></svg></div><div class="ml-3"><p class="text-sm font-medium text-green-800">Loan Saved Successfully</p></div></div></div><div id="errorFeedback" class="hidden rounded-md bg-red-50 p-4"><div class="flex"><div class="flex-shrink-0"><svg class="h-5 w-5 text-red-400" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z" clip-rule="evenodd"/></svg></div><div class="ml-3"><h3 class="text-sm font-medium text-red-800">Credit Score is not meeting the requirement</h3></div></div></div><div class="mt-2 sm:grid sm:grid-cols-2 sm:gap-2"><form class="px-2 py-2 space-y-8 divide-y divide-gray-200 bg-gray-50"><div class="space-y-8 divide-y divide-gray-200 sm:space-y-5"><div class="space-y-6 sm:space-y-5"><div><h3 class="text-lg font-medium leading-6 text-gray-900">Personal Information</h3></div><div class="space-y-6 sm:space-y-5"><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="firstName" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">First name</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input name="firstName" id="firstName" autocomplete="given-name" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="John" placeholder="John"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="lastName" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Last name</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input name="lastName" id="lastName" autocomplete="family-name" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="Doe" placeholder="Doe"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="ssn" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">SSN</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input type="number" name="ssn" id="ssn" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="123456789" placeholder="123456789"/></div></div></div><div><h3 class="text-lg font-medium leading-6 text-gray-900">Loan Information</h3></div><div class="space-y-6 sm:space-y-5"><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="amount" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Amount</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input type="number" name="amount" id="amount" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="500000" placeholder="500000"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="Term" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Term (years)</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input type="number" name="term" id="term" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="30" placeholder="30"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="downPayment" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Down Payment</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input type="number" name="downPayment" id="downPayment" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="50000" placeholder="50000"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="creditScore" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Credit Score</label><div class="mt-1 sm:mt-0"><output id="creditScore" class="block w-full max-w-lg pl-2 pt-2 sm:max-w-xs sm:text-sm">NA</output></div><div class="mt-1 sm:mt-0"><button id="getCreditScore" type="button" class="inline-flex items-center rounded-full border border-transparent bg-indigo-600 p-1 text-white shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"><path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"/></svg></button></div></div></div></div></div><button id="saveLoan" type="button" class="inline-flex items-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2">Save</button></form><div id="aside-container" class="flex flex-col gap-4 items-start mt-4 border-2 p-2 rounded-lg border-dashed border-cyan-300 sm:mt-0"></div></div><div id="bottom-container" class="flex flex-col gap-4 items-start mt-4 p-2 sm:mt-0"></div></main><script src="./init.js" type="module"></script></body></html>