blob: 6493539ea346dcd39070dd8659b35bb96c7eb9e7 [file] [log] [blame]
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="CACHE-CONTROL" content="NO-CACHE"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Apache Royale Blog</title><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"><link rel="stylesheet" href="/css/styles.css"><link rel="shortcut icon" href="/img/favicon.ico"></head><body class="page post" id="main"><header class="docs-header"><div class="container"><div class="topbar"><div class="topbar-left"><a href="/"><span class="site-title">Apache Royale</span></a></div><div class="topbar-center"></div><div class="topbar-right"><button class="topMenu-dropbtn"><i class="fa fa-bars"></i>&nbsp;Menu</button><ul class="topMenu"><li><a href="/features">Features</a></li><li><a href="https://apache.github.io/royale-docs/get-started">Get Started</a></li><li><a href="/download">Download</a></li><li><a href="/docs">Docs</a></li><li><a href="/blog">Blog</a></li><li><a href="https://github.com/apache/royale-asjs/wiki/Apache-Royale-Source-Code-Repositories"><i class="fa fa-github"></i> GitHub</a></li></ul></div></div><div class="post-header"><h1>Apache Royale Blog</h1><div class="post-meta"></div></div></div></header><div class="page-content"><div class="container"><article><h2 class="post-title"><a href="/blog/using-external-javascript-libraries-in-apache-royale/">Using external JavaScript libraries in Apache Royale</a></h2><div class="post-meta">by Carlos Rovira on June 03, 2019</div><div><p>This example shows how to use external JavaScript libraries in your Apache Royale application. You can add quick functionality to your application by including code that is not part of Apache Royale itself or is even not written in ActionScript.</p><p>In this way, <em>you get lots of libraries available for free in the Internet to strengthen and extend your Apache Royale Application.</em></p><p>It also allows an IDE to provide code completion, type checking, etc.</p><p>The example shows a <strong>Jewel Card</strong> with a code text zone that loads an ActionScript code example. Click the <em>&quot;highlight block&quot;</em> button to show the code in a beautifully colored way, thanks to processing by a highlight library which is an external JavaScript library.</p><blockquote><p>The JavaScript library used to show this feature is <a href="https://highlightjs.org/">highlightjs</a>. In JavaScript this library creates the hljs object our code references.</p></blockquote><h2>How to use JavaScript external libraries</h2><p>We have two solutions available for using external JavaScript libraries in Apache Royale. We'll focus first on the better and recommended way, which is using the <strong>@externs</strong> compiler directive.</p><p>This method gives you robust access to JavaScript methods though ActionScript with dot access syntax (and lets you use code hinting in your IDE). But if you need to prototype something quickly, you can use dynamic syntax with <em>bracket access</em> notation.</p><h2>Dot access</h2><p>This is the recommended way. You get all advantages of an object-oriented language like ActionScript 3: type checking, compiler errors and warnings, and code hinting and code completion in your favorite IDEs.</p><p><img src="/img/blog/Captura-de-pantalla-2019-06-03-a-las-18.20.46.png" alt=""></p><p>The code for this <a href="https://github.com/apache/royale-asjs/blob/develop/examples/blog/BE0012_Using_external_javascript_libraries_in_Apache_Royale/src/main/royale/hljs.as">hljs as3 stub code</a> is located in this blog example project and is the <strong>@externs</strong> class definition for <strong>hljs</strong>:</p><pre><code class="language-as3">////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the &quot;License&quot;); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// //www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package
{
/**
* @externs
*/
COMPILE::JS
public class hljs
{
/**
* &lt;inject_script&gt;
* var script = document.createElement(&quot;script&quot;);
* script.setAttribute(&quot;src&quot;, &quot;https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js&quot;);
* document.head.appendChild(script);
* var link = document.createElement(&quot;link&quot;);
* link.setAttribute(&quot;rel&quot;, &quot;stylesheet&quot;);
* link.setAttribute(&quot;type&quot;, &quot;text/css&quot;);
* link.setAttribute(&quot;href&quot;, &quot;https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css&quot;);
* document.head.appendChild(link);
* &lt;/inject_script&gt;
*/
public function hljs(){}
public static function highlightBlock(block:Element):void {}
}
}
</code></pre><p>You can see two main things in this code:</p><ol><li>An inject_html directive declared in the constructor adds the following lines to the html template, so you do not need to add the lines manually. If you use this library, Royale adds these references automatically, and if you remove all references, Royale removes the dependencies to the JavaScript library and nothing is output in the html file.</li><li>Use the highlightBlock static function, which you can access as a normal method in the AS3 hljs class.</li></ol><h2>Bracket access</h2><p>If you need to prototype something quickly you can use this method but remember we don't recommend that you use this in your main Apache Royale project.</p><p>First, reference the JavaScript library (and/or css if it exists) in your html template. For <strong>hljs</strong> you can copy the following lines:</p><pre><code class="language-html">&lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js&quot;&gt;&lt;/script&gt;
&lt;link rel=&quot;stylesheet&quot; title=&quot;Atom One Dark&quot; href=&quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css&quot;&gt;
</code></pre><p>Then you can start using the library in your code. An example with the highlightjs hljs object is:</p><pre><code class="language-as3">var hljs:Object = window[&quot;hljs&quot;];
hljs[&quot;highlightBlock&quot;](block);
</code></pre><p>As you can see, this avoids using a more structured language like ActionScript 3. You lose type checking and the compiler will not help you if you write something wrong. Plus, if the API is changed, that code will not be able to warn you about the changes.</p><h2>The example</h2><p>The example uses <strong>HTTPService</strong> to retrieve sample code and display it in an <strong>html:Code</strong> component. When the application loads, it fires the <strong>initialize</strong> event. We use that to order HTTPService to load the text file. When the file finishes loading, HTTPService fires a complete event. We use that to add the text file content to the <strong>code_txt</strong> <em>String variable</em>.</p><blockquote><p>Note: Since the code_txt variable uses data binding (it's marked with the <strong>Bindable</strong> metadata and we prepared the application to handle data binding with the <strong>ApplicationDataBinding</strong> bead), the application fills the html:Code <strong>sourceCodeMXMLText</strong> with the loaded text.</p></blockquote><p>This is the code for this example:</p><pre><code class="language-mxml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the &quot;License&quot;); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--&gt;
&lt;j:Application xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
xmlns:j=&quot;library://ns.apache.org/royale/jewel&quot;
xmlns:js=&quot;library://ns.apache.org/royale/basic&quot;
xmlns:html=&quot;library://ns.apache.org/royale/html&quot;
initialize=&quot;codeTextLoader.send();&quot;&gt;
&lt;fx:Script&gt;
&lt;![CDATA[
[Bindable]
public var code_txt:String;
public function highLightContent():void
{
COMPILE::JS
{
hljs.highlightBlock(sourceCodeMXMLText.element);
}
}
]]&gt;
&lt;/fx:Script&gt;
&lt;j:beads&gt;
&lt;js:ApplicationDataBinding/&gt;
&lt;js:HTTPService id=&quot;codeTextLoader&quot; url=&quot;as3code.txt&quot; complete=&quot;code_txt = codeTextLoader.data;&quot;/&gt;
&lt;/j:beads&gt;
&lt;j:initialView&gt;
&lt;j:View&gt;
&lt;j:beads&gt;
&lt;j:HorizontalCenteredLayout/&gt;
&lt;/j:beads&gt;
&lt;j:Card width=&quot;90%&quot;&gt;
&lt;html:H3 text=&quot;Using external JavaScript Libraries&quot;/&gt;
&lt;j:Label html=&quot;This example uses hljs library to highligh a piece of code&quot;/&gt;
&lt;html:Pre height=&quot;300&quot; width=&quot;100%&quot; style=&quot;background-color: white&quot;&gt;
&lt;html:beads&gt;
&lt;j:ScrollingViewport/&gt;
&lt;/html:beads&gt;
&lt;html:Code id=&quot;sourceCodeMXMLText&quot; text=&quot;{code_txt}&quot;/&gt;
&lt;/html:Pre&gt;
&lt;j:Button text=&quot;highlight Block&quot; emphasis=&quot;primary&quot; click=&quot;highLightContent()&quot;/&gt;
&lt;/j:Card&gt;
&lt;/j:View&gt;
&lt;/j:initialView&gt;
&lt;/j:Application&gt;
</code></pre><p>In the example code you can see how we call the <em>hljs.highlightBlock</em> method with the recommended dot syntax as with any other ActionScript code, creating a seamless integration between your project code and the external JavaScript code.</p><h2>Conclusion</h2><p>You can see how simple and elegant it can be to use external JS code, while not compromising the safe syntax you have when using the MXML and AS3 languages, to give you more dynamic options for your application at no cost.</p><h2>Where to go from here</h2><ul><li><a href="https://github.com/apache/royale-asjs/blob/eaf2dbde05a3823e0c148ba806c025eb56388a7a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/Alert.as#L225">Other use of @externs in a Jewel Alert component</a></li><li><a href="https://royale.apache.org/loading-external-data-through-httpservice/">Loading external data through HTTPService</a></li><li><a href="https://royale.apache.org/binding-the-text-property-of-a-jewel-textinput-to-update-a-text-label/">Binding the text property of a Jewel TextInput to update a text Label</a></li></ul><p>The result of this code snippet is the following:</p><iframe width="100%" height="600" src="/blog-examples/BE0012_Using_external_javascript_libraries_in_Apache_Royale/index.html"></iframe><p>(We're using an iframe to host the actual results of this example compilation. To see the example in a separate window click <a href="/blog-examples/BE0012_Using_external_javascript_libraries_in_Apache_Royale/index.html" target="_blank">this link</a>.)</p><p>Full project with source code can be found <a href="https://github.com/apache/royale-asjs/tree/develop/examples/blog/BE0012_Using_external_javascript_libraries_in_Apache_Royale">here</a>:</p><p><a class="btn btn-download" href="https://github.com/apache/royale-asjs/tree/develop/examples/blog/BE0012_Using_external_javascript_libraries_in_Apache_Royale"><i class="fa fa-download"></i> Project Source Code</a></p></div><h2 class="post-title"><a href="/blog/apache-royale-v0-9-4-released/">Apache Royale v0.9.4 released!</a></h2><div class="post-meta">by Carlos Rovira on December 10, 2018</div><div><p>The Apache Royale community is pleased to announce the release of Apache Royale 0.9.4.</p><p><img src="/img/blog/release-0.9.4.png" alt=""></p><p>The Apache Royale project is a continuation of the previous effort called FlexJS to produce a next-generation of the Apache Flex SDK that enables developers to use MXML and ActionScript to generate HTML/JS/CSS applications which can run natively in browsers. The cross-compiled code can also be used in Apache Cordova (Adobe PhoneGap) mobile applications.</p><p>This release should be considered 'beta' quality. The purpose of this release is to gather feedback about the features and implementation strategies, and to recruit new contributors. We hope to grow the code base into an SDK and tool chain that deliver the highest productivity when developing applications that can run on many platforms. Beta releases may not handle production needs.</p><p>In 0.9.4 you can find important additions like a full new UI set called <strong>Jewel</strong> that's ready for production. This new set was designed with look and feel / themes in mind, so you can have a cool interface out of the box just using Jewel. Another great addition is bringing full <strong>AMF/RemoteObject</strong> support to Apache Royale so you can ease your migration from Apache Flex.</p><p>We are also working hard on MX and Spark <strong>emulation</strong> components that will help make your migration of an existing Apache Flex application a breeze. Many people are contributing to this effort, but more are welcome: please help us develop this powerful feature.</p><h2>Changes in 0.9.4:</h2><ul><li><a href="https://github.com/apache/royale-asjs/issues/205">Better way to style components: ClassSelectorList</a></li><li><a href="https://github.com/apache/royale-asjs/issues/204">Fixed AMF / RemoteObject support</a></li><li><a href="https://github.com/apache/royale-asjs/issues/154">Added New Jewel UI set And first 72 Jewel Themes, 12 Colors, Light and Dark (Initial work).</a></li><li><a href="https://github.com/apache/royale-asjs/issues/130">Renamed TextOverflow bead to EllipsisOverflow. It now supports Label elements as well.</a></li><li><a href="https://github.com/apache/royale-asjs/issues/131">Added IEEventAdapterBead.</a></li><li><a href="https://github.com/apache/royale-asjs/issues/132">Added Object getter/setter utility functions.</a></li><li><a href="https://github.com/apache/royale-asjs/issues/134">Added InfiniteVScroller Bead.</a></li><li>Initial release of the migration component sets (MXRoyale and SparkRoyale) that have a goal of reducing the effort for those moving existing Flex applications to Royale.</li><li>Initial release of the Tour de Flex example migrated to Royale via the migration component sets. This is a work in progress. You can see the latest version running on our <a href="http://apacheroyaleci.westus2.cloudapp.azure.com:8080/job/TourDeFlexMigration/lastSuccessfulBuild/artifact/examples/mxroyale/tourdeflexmodules/bin/js-debug/index.html">CI server.</a></li></ul><h3>Known Issues:</h3><ul><li>Users only using Basic components and not MXRoyale or SparkRoyale emulation components should delete <em>frameworks/libs/MXRoyale.swc</em>, <em>frameworks/libs/SparkRoyale.swc</em>, <em>frameworks/js/libs/MXRoyaleJS.swc</em>, and <em>frameworks/js/libs/SparkRoyaleJS.swc</em> from their library paths (or from the file system).</li></ul><p>Updates to the <em>RELEASE_NOTES</em> discovered after this file was packaged into the release artifacts can be found here:</p><p><a href="https://github.com/apache/royale-asjs/wiki/Release-Notes-0.9.4">https://github.com/apache/royale-asjs/wiki/Release-Notes-0.9.4</a></p><p>You can see more <a href="https://github.com/apache/royale-asjs/blob/develop/RELEASE_NOTES.md">here</a>.</p><p>You can download a <a href="https://royale.apache.org/download/">binary distribution</a>, the <a href="https://royale.apache.org/source-code/">source code</a> or browse our <a href="https://github.com/apache/royale-asjs/wiki/Apache-Royale-Source-Code-Repositories">GitHub repositories</a>. If you're a NPM user you can check <a href="https://www.npmjs.com/org/apache-royale">Apache Royale at NPM</a>.</p><p>As well, you can help us <a href="https://github.com/apache/royale-asjs/issues">filing bugs in the framework</a> or <a href="https://github.com/apache/royale-compiler/issues">compiler</a>.</p><p>For questions about how to use Royale, send email to <a href="users@royale.apache.org">mailto:users@royale.apache.org</a>. For questions and feedback on the development of the source code in the release, send email to <a href="mailto:dev@royale.apache.org">dev@royale.apache.org</a>.</p><p>Enjoy! 🙂</p></div><h2 class="post-title"><a href="/blog/hello-node-how-to-transpile-actionscript-for-node-js/">Hello Node: How to transpile ActionScript 3 for Node.js</a></h2><div class="post-meta">by Josh Tynjala on October 03, 2018</div><div><blockquote><p><strong>Note:</strong> This tutorial was originally published in <a href="https://twitter.com/joshtynjala">Josh Tynjala</a>'s NextGen ActionScript website, but is now donated to Apache Royale. The tutorial has been adapted to correct the things that changed in Apache Royale since it was published.</p></blockquote><p>Over the years, many developers have dreamed of using ActionScript on both the client and the server. Today, the Apache Royale™ SDK finally makes it possible.</p><p><img src="/img/blog/apache-royale-node-js.png" alt="Apache Royale and Node.js logos"></p><p>Let's learn to use <strong>asnodec</strong> to write <em>ActionScript</em> code that runs in the popular server-side JavaScript environment, <a href="http://nodejs.org/">Node.js</a>.</p><p><img src="/img/blog/nodejs-terminal@2x.jpg" alt="Screenshot of Node.js console output running in the terminal"></p><p>With <strong>asnodec</strong>, we'll get full access to all Node.js APIs, and it's even possible to require npm modules in ActionScript. We'll start with a simple example.</p><h2>Requirements</h2><p>For this tutorial, you should install <a href="https://nodejs.org/">Node.js</a>. The newest Long Term Support (LTS) release is recommended.</p><p>Additionally, you will need <a href="https://royale.apache.org/download">Apache Royale 0.9.4 or newer</a>. Use the <a href="https://royale.apache.org/download">downloads page</a>, or download it from Node Package Manager with</p><pre><code class="language-sh">npm install -g @apache-royale/royale-js
</code></pre><h2>Create a new project</h2><ol><li>Create a new, empty folder for your project, and name it <em>HelloNode</em>.</li><li>Inside the new project, create a new folder named <em>src</em>. This is where our ActionScript classes will go.</li><li>Inside the <em>src</em> folder, create a file named <em>HelloNode.as</em>, and add the following code:</li></ol><pre><code class="language-as3">package
{
public class HelloNode
{
public function HelloNode()
{
console.log(&quot;Hello&quot;, process.release.name, process.version);
dns.lookup(&quot;localhost&quot;, null, dnsLookupCallback);
}
private function dnsLookupCallback(error:Object, address:String):void
{
console.log(&quot;The address of localhost is:&quot;, address);
}
}
}
</code></pre><p>In this class, we're doing two things. First, we're printing the version of Node to the console. Then, we're using Node's built-in <a href="https://nodejs.org/api/dns.html"><strong>dns</strong></a> module to look up an IP address.</p><blockquote><p>It is not necessary to call <code>require()</code> for built-in Node modules in ActionScript. The compiler will detect when a module is used, and it will generate the appropriate call to <code>require()</code> automatically when generating the final JavaScript. (<code>require()</code> is necessary for custom modules)</p></blockquote><h2>Compile the project on the command line</h2><p>Inside the Apache Royale SDK, the <em>js/bin</em> folder contains several different exeuctables used to transpile ActionScript to JavaScript.</p><p>What do each of those executables in <em>js/bin</em> do?</p><ul><li><strong>asjsc</strong> compiles pure ActionScript to JavaScript with access to web browser APIs like the HTML DOM.</li><li><strong>asnodec</strong> compiles pure ActionScript to JavaScript with access to Node.js APIs to create server-side or command line projects. <em>We'll use this one.</em></li><li><strong>mxmlc</strong> compiles applications that use the Apache Royale framework components.</li></ul><p>Use the <strong>asnodec</strong> executable to transpile the <code>HelloNode</code> ActionScript class that you created above for Node.js.</p><pre><code class="language-sh">asnodec src/HelloNode.as
</code></pre><p>This will produce a folder named <em>bin</em> containing <em>js-debug</em> and <em>js-release</em> folders. The <em>js-debug</em> folder contains JavaScript that is easy to read, and each class is loaded at runtime from a separate file. The <em>js-release</em> folder contains JavaScript that has been concatenated and minified for production.</p><p>The project should now contain the following files and folders:</p><p><img src="/img/blog/node-project-files@2x.jpg" alt="Screenshot of project files, including bin/js-debug, bin/js-release, and src/HelloNode.as"></p><p>Finally, let's try running our code with Node.js.</p><h2>Run the project</h2><p>Inside the js-debug folder, a file named index.js will be created as the entry point for your Node.js project. You can run this script using the <code>node</code> executable:</p><pre><code class="language-sh">node bin/js-debug/index.js
</code></pre><p>You should see the following output in your console:</p><pre><code>Hello node v6.11.0
The address of localhost is: 127.0.0.1
</code></pre><p>(The Node version number might be different, obviously!)</p><h2>What's Next?</h2><p>This is just a simple example, but it gives you a glimpse of how developers can bring ActionScript server-side using Apache Royale and Node.js. By using an established ecosystem like Node.js, ActionScript developers can take advantage of all of the libraries published to NPM and join a large, vibrant community.</p></div><a class="btn btn-quiet" href="/blog/page/3/"><i class="fa fa-arrow-left"></i> Newer Posts</a> <a class="btn btn-quiet" href="/blog/page/5/">Older Posts <i class="fa fa-arrow-right"></i></a></article></div></div><footer class="footer"><div class="footer-row"><div class="footer-column"><ul class="footer-list"><li class="apacheroyale"><a href="/">Apache Royale</a></li><li><a href="/">Home</a></li><li><a href="/features">Features</a></li><li><a href="/download">Download</a></li><li><a href="/ides">IDEs and Editors</a></li><li><a href="/showcase">Showcase</a></li><li><a href="/blog">Blog</a></li><li><a href="/team">Team</a></li><li><a href="/thanks-to">Thanks To</a></li><li><a href="https://apache.org/logos/#royale"><i class="fa fa-external-link-square"></i> Logos</a></li><li><a href="https://www.apache.org/licenses/"><i class="fa fa-external-link-square"></i> Apache License v2.0</a></li></ul></div><div class="footer-column"><ul class="footer-list"><li class="documentation"><a href="/docs">Documentation</a></li><li><a href="https://apache.github.io/royale-docs/get-started">Get Started</a></li><li><a href="/docs">Docs</a></li><li><a href="/asdoc">API Reference</a></li><li><a href="https://github.com/apache/royale-asjs/wiki"><i class="fa fa-github"></i>Wiki</a></li><li><a href="https://stackoverflow.com/questions/tagged/apache-royale"><i class="fa fa-stack-overflow"></i> StackOverFlow Tag</a></li></ul><ul class="footer-list"><li class="community"><a href="/get-involved">Community</a></li><li><a href="/get-involved">Get Involved</a></li><li><a href="/mailing-lists">Mailing Lists</a></li><li><a href="/faq">FAQ</a></li></ul><ul class="footer-list"><li class="development"><a href="/source-code">Development</a></li><li><a href="https://github.com/apache/royale-asjs/wiki/Apache-Royale-Source-Code-Repositories"><i class="fa fa-github"></i> Github</a></li><li><a href="https://github.com/apache/royale-asjs/issues"><i class="fa fa-github"></i> Issues</a></li><li><a href="/source-code"><i class="fa fa-code"></i> Source Code</a></li></ul></div><div class="footer-column"><ul class="footer-list"><li class="social_t">Social</li><li><a href="https://twitter.com/apacheroyale"><i class="fa fa-twitter"></i> Twitter</a></li><li><a href="https://facebook.com/ApacheRoyaleSDK/"><i class="fa fa-facebook"></i> Facebook</a></li><li><a href="https://www.linkedin.com/groups/12118437"><i class="fa fa-linkedin"></i> LinkedIn</a></li><li><a href="/feed/index.xml"><i class="fa fa-rss"></i> RSS</a></li></ul><ul class="footer-list"><li class="apache"><a href="https://www.apache.org/">Apache</a></li><li><a href="https://www.apache.org/"><i class="fa fa-external-link-square"></i> Apache</a></li><li><a href="https://www.apache.org/foundation/contributing.html"><i class="fa fa-external-link-square"></i> Donations</a></li><li><a href="https://www.apache.org/events/current-event"><i class="fa fa-external-link-square"></i> Events</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html"><i class="fa fa-external-link-square"></i> Sponsorship</a></li><li><a href="https://www.apache.org/foundation/thanks.html"><i class="fa fa-external-link-square"></i> Thanks</a></li><li><a href="https://www.apache.org/security/"><i class="fa fa-external-link-square"></i>Security</a></li></ul></div><div class="aboutusdiv"><p class="aboutus">About Us</p><p class="aboutus_p"><img class="aboutus-logo" src="/img/apache-royale-logo-footer-circle-grey.svg"><a href="/" class="aboutus_a">Apache Royale™</a> is a highly productive open source application technology for building expressive frontend applications that outputs to different formats and deploy consistently on all major browsers, desktops and devices.</p><p><img class="aboutus-apache-logo" src="/img/Apache_PoweredBy.svg"> <a href="/" class="aboutus_a">Apache Royale™</a>, <a href="https://www.apache.org" class="aboutus_a">Apache™</a> and the <a href="https://www.apache.org/foundation/press/kit/" class="aboutus_a">Apache feather logo™</a> are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners. Read more about our privacy policy on our <a href="/privacy-policy">Privacy Policy page</a>.</p></div></div><div class="asf">Copyright &copy; 2017-2022 <a href="https://www.apache.org">The Apache Software Foundation</a>, Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a></div></footer></body></html>