CINXE.COM
Application — RoaringApps
<!DOCTYPE html> <html lang="en" ng-app="RoaringApps"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content="Crowd-sourced application compatibility for macOS, iOS and Windows."> <meta name="keywords" content="mac,macos,mac os x,mojave,catalina,big sur,monterey,apple silicon,arm macs,m1 macs,catalyst apps,32-bit apps,app,application,application compatibility,apple,roaringapps,mac app store,table,windows,ios,ios 14,ios 15"> <title> Application — RoaringApps </title> <!-- Stylesheets --> <link rel="stylesheet" href="/assets/css/site-2-7-1.css"> <!-- Webfonts --> <link href='https://fonts.googleapis.com/css?family=Lato:100,400,700,100italic,400italic,700italic|Rancho|Merriweather+Sans:400,300,300italic,400italic,700,700italic|Cookie' rel='stylesheet' type='text/css'> <!--[if lt IE 9]> <script src="/assets/js/ie8-responsive-file-warning.js"></script> <![endif]--> <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> <![endif]--> <!-- Favicons --> <link rel="shortcut icon" href="/assets/ico/favicon.png"> <link rel="shortcut icon" href="/favicon.ico"> <!-- Angular $location.html5Mode = true requires this --> <base href="/"> <script async src="https://www.googletagmanager.com/gtag/js?id=G-3G6DX7LY1W"></script> <script> window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'G-3G6DX7LY1W'); </script> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script type="text/javascript"> (adsbygoogle = window.adsbygoogle || []).push({ google_ad_client: "ca-pub-4932023458712014", enable_page_level_ads: true }); </script> <script src="/assets/js/vendor/modernizr.js" data-cfasync='true'></script> <!-- First input delay polyfill - used by Firebase Performance Monitoring. Ref: https://firebase.google.com/docs/perf-mon/get-started-web Ref2: https://github.com/GoogleChromeLabs/first-input-delay --> <script type="text/javascript"> ! function(n, e) { var t, o, i, c = [], f = { passive: !0, capture: !0 }, r = new Date, a = "pointerup", u = "pointercancel"; function p(n, c) { t || (t = c, o = n, i = new Date, w(e), s()) } function s() { o >= 0 && o < i - r && (c.forEach(function(n) { n(o, t) }), c = []) } function l(t) { if (t.cancelable) { var o = (t.timeStamp > 1e12 ? new Date : performance.now()) - t.timeStamp; "pointerdown" == t.type ? function(t, o) { function i() { p(t, o), r() } function c() { r() } function r() { e(a, i, f), e(u, c, f) } n(a, i, f), n(u, c, f) }(o, t) : p(o, t) } } function w(n) { ["click", "mousedown", "keydown", "touchstart", "pointerdown"].forEach(function(e) { n(e, l, f) }) } w(n), self.perfMetrics = self.perfMetrics || {}, self.perfMetrics.onFirstInputDelay = function(n) { c.push(n), s() } }(addEventListener, removeEventListener); </script> <!-- Sentry.io error monitoring --> <script src="https://js.sentry-cdn.com/9bccfd17b53521da4d6c21b201931d8c.min.js" crossorigin="anonymous"></script> <script> window.ENVIRONMENT = 'production'; </script> </head> <body class="{{bodyClass}}" ng-cloak> <a class="sr-only" href="#content">Skip to main content</a> <div class="wrapper"> <!-- Navigation component --> <header class="navbar navbar-fixed-top " role="banner" ng-controller="HeaderCtrl"> <div class="container"> <div class="navbar-header"> <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse"> <span class="sr-only">Toggle navigation</span> <svg class="icon"> <use xlink:href="/assets/svg/icons.svg#shape-chevron-down" /> </svg> </button> <a href="/" class="navbar-brand">RoaringApps</a> </div> <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation"> <ul class="nav navbar-nav navbar-centre"> <li> <a href="/apps">Apps</a> </li> <li class="dropdown main-dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Collections</a> <ul class="dropdown-menu" role="menu"> <li> <a href="/collections/list-of-apple-silicon-native-apps">Apps ready for Apple Silicon</a> </li> <li> <a href="/collections/list-of-native-windows-arm-apps">Apps native on Windows ARM</a> </li> <li> <a href="/collections/list-of-32-bit-macos-apps">macOS 32-bit apps</a> </li> <li> <a href="/collections/discontinued-macos-ios-apps">Discontinued apps</a> </li> <li> <a href="/app-collection/ios-carplay-apps">iOS CarPlay apps</a> </li> <li> <a href="/app-collections">More collections...</a> </li> </ul> </li> <li> <a href="/mac-app">Download</a> </li> <!--<li> <a href="/blog">Blog</a> </li>--> <li> <a href="/about">About</a> </li> <li> <a href="/app/+">Add App</a> </li> </ul> <ul class="nav navbar-nav navbar-right"> <li> <a href="#" data-toggle="modal" data-target="#modal-search" class="with-icon"> <span class="sr-only">Search applications</span> <svg class="icon fav-icon-outline"> <use xlink:href="/assets/svg/icons.svg#shape-magnifying-glass" /> </svg> </a> </li> <li class="hidden-sm"> <a href="#" data-toggle="modal" data-target="#modal-feedback">Feedback</a> </li> <li class="dropdown account-dropdown" ng-if="user"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{user.username}}</a> <ul class="dropdown-menu pull-right" role="menu"> <li> <a href="/account">Account</a> </li> <li> <a href="/account/watching">Notifications</a> </li> <li ng-if="user.role == 'admin'" class="divider"></li> <li ng-if="user.role == 'admin'"> <a href="/admin/dashboard">Admin dashboard</a> </li> <li ng-if="user.role == 'admin'"> <a href="/admin/comments">Comments review</a> </li> <li ng-if="user.role == 'admin'"> <a href="/admin/screenshots">Screenshot review</a> </li> <li ng-if="user.role == 'admin'"> <a href="/admin/tags">Tag manager</a> </li> <li ng-if="user.role == 'admin'"> <a href="/admin/itunes-importer">iTunes Importer</a> </li> <li ng-if="user.role == 'admin'" class="divider"></li> <li> <a href="/logout" ng-click="logout($event)">Log out</a> </li> </ul> </li> <li ng-if="!user"> <a href="#" data-toggle="modal" data-target="#modal-register" class="account-register">Register</a> </li> <li ng-if="!user"> <a href="#" data-toggle="modal" data-target="#modal-signin" class="account-signin">Sign in</a> </li> </ul> </nav> </div> </header> <section id="main" ng-controller="AppCtrl" ng-class="{'overlay-in': state.overlayIn }"> <!-- loading animation --> <div class="ra-loader" ng-show="state.loading"> <div class="spinner spinner-three-dots"> <div class="bounce1"></div> <div class="bounce2"></div> <div class="bounce3"></div> </div> <p class="loading-msg">{{state.loadingMsg}}</p> </div> <div class="ng-wrapper loaded-{{!state.loading}}" ng-cloak> <!--<div class="ad-placeholder wide-ad"></div>--> <div class="outside-wrapper {{ state.overlayIn ? 'overlay-in' : '' }}"> <div class="container"> <div class="page-header"> <img ng-src="{{app.icon}}" alt="" class="app-icon" ng-if="app.icon" /> <h1 id="Application">{{app.name}}</h1> <div class="action-items"> <button class="btn btn-subscribe {{(state.isSubscribed ? 'subscribed' : '')}}" ng-click="toggleSubscription()" data-toggle="tooltip" data-placement="bottom" title="{{state.isSubscribed ? 'Stop watching' : 'Watch for updates'}}" ng-show="user"> <svg class="icon sub-watch"> <use xlink:href="/assets/svg/icons.svg#shape-eye" /> </svg> <svg class="icon sub-watching"> <use xlink:href="/assets/svg/icons.svg#shape-mail" /> </svg> <svg class="icon sub-remove"> <use xlink:href="/assets/svg/icons.svg#shape-cross" /> </svg> </button> <button class="btn btn-fav {{(state.isFavourite ? 'faved' : '')}}" ng-click="toggleFavourite()" data-toggle="tooltip" data-placement="bottom" title="{{state.isFavourite ? 'Remove from favourites' : 'Add to favourites'}}" ng-show="user"> <svg class="icon fav-icon-outline"> <use xlink:href="/assets/svg/icons.svg#shape-heart-outlined" /> </svg> <svg class="icon fav-icon-fill"> <use xlink:href="/assets/svg/icons.svg#shape-heart" /> </svg> <svg class="icon fav-remove"> <use xlink:href="/assets/svg/icons.svg#shape-cross" /> </svg> </button> <button class="btn {{state.editing == true ? 'active' : ''}}" ng-click="!state.editing ? edit.open() : edit.cancel()">Edit</button> <div class="dropdown app-more-dropdown"> <a href="" class="dropdown-toggle" data-toggle="dropdown"> <svg class="icon"> <use xlink:href="/assets/svg/icons.svg#shape-chevron-small-down" /> </svg> </a> <ul class="dropdown-menu pull-right"> <li ng-show="user"> <a href="#" ng-click="state.editTags = !state.editTags">Edit tags</a> </li> <li> <a href="#" ng-click="flagApp('inappropriate')">Flag as inappropriate</a> </li> <li> <a href="#" ng-click="flagApp('duplicate')">Mark as duplicate</a> </li> <li ng-show="user && user.role == 'admin'"> </li> <li ng-show="user && user.role == 'admin'"> <a href="#" ng-click="state.editEditorsNote = !state.editEditorsNote">Editor's Note</a> </li> </ul> </div> </div> </div> <div class="app-header-meta"> <p class="meta-left"> <a href="/apps?developer={{app.developer}}" class="app-meta-developer">{{app.developer}}</a> <span class="app-meta-separator" ng-if="app.developer && app.url">・</span> <a href="{{app.url}}" class="app-meta-url">{{app.url}}</a> <span class="app-meta-separator" ng-if="app.tags">・</span> </p> <div class="tags-wrapper meta-left"> <ul class="tags-view" ng-hide="state.editTags"> <li ng-repeat="tag in app.tags"> <a href="/tag/{{slugify(tag)}}">#{{tag}}</a> </li> </ul> <ul class="tags-edit" ng-show="state.editTags"> <li ng-repeat="tag in app.tags">{{tag}} <a href="" ng-click="tags.remove(tag)"> <svg class="icon icon-inline-remove"> <use xlink:href="/assets/svg/icons.svg#shape-cross" /> </svg> </a> </li> </ul> <input type="text" placeholder="Search tags" class="tags-input" ng-model="tags.selection" ng-show="state.editTags" uib-typeahead="tag for tag in tags.available | filter:$viewValue" typeahead-append-to-body="false" typeahead-on-select="tags.add($item, $model, $label)" /> <a href="" ng-show="state.editTags" ng-click="state.editTags = false">Done</a> </div> <div class="meta-right"> <span style="margin-left: 5px;" ng-show="appMeta.updated_by">Last updated {{ formatDateFromNow(appMeta.updated_at, true) }} by <a href="/u/{{ appMeta.updated_by }}" title="{{ userRepLookup[appMeta.updated_by] }} reputation">{{ appMeta.updated_by }} ({{ userRepLookup[appMeta.updated_by] }})</a> </span> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-xs-12 eol-box-wrapper" ng-if="app.eol"> <div class="border-box error"> <svg class="icon error-icon"> <use xlink:href="/assets/svg/icons.svg#shape-circle-with-cross" /> </svg> <h3>This app has been discontinued</h3> <p><strong>{{app.name}}</strong> has been flagged as <em>end-of-life</em> . It is no longer supported by the developer.</p> <ul> <li ng-if="app.eol_date"><strong>Discontinued date:</strong> {{app.eol_date}}</li> <li ng-if="app.eol_last_version"><strong>Last version:</strong> {{app.eol_last_version}}</li> <li ng-if="app.eol_last_supported_os"><strong>Last supported OS release:</strong> <ul> <li ng-repeat="(os,rl) in app.eol_last_supported_os"><strong>{{context.platforms[os].name}}:</strong> {{context.platforms[os].versions[rl].id}} – {{context.platforms[os].versions[rl].name}}</li> </ul> </li> </ul> </div> </div> <h5 class="row-header col-xs-12"> <span>Compatibility</span> </h5> <div class="col-xs-12 text-centre compatibility-action-buttons"> <button class="btn btn-outline btn-primary btn-bold {{state.newDevStatus == true ? 'active' : ''}}" ng-click="!state.newDevStatus ? devStatus.open() : devStatus.close()">Report developer status</button> <button class="btn btn-outline btn-primary btn-bold {{state.newStatus == true ? 'active' : ''}}" ng-click="!state.newStatus ? newStatus.open() : newStatus.close()">Share your experience</button> </div> <div class="col-xs-12" ng-if="statusReports.length"> <div class="border-box compatibility-box"> <!--<h3>Compatibility</h3>--> <compatibility-info compatibility="compatibility" context="context" state="state"></compatibility-info> </div> </div> <div class="col-xs-12" ng-if="statusReports.length == 0"> <div class="border-box text-centre"> <p>No compatibility information currently available. Click <em>Share your experience</em> above to get started.</p> </div> </div> <div class="col-xs-12" ng-if="appMeta.editors_note"> <div class="border-box warning"> <h3>Editor's Note</h3> <div ng-bind-html="renderMarkdown(appMeta.editors_note)"></div> </div> </div> <div class="col-xs-12" ng-if="state.editEditorsNote"> <div class="border-box"> <h3>Editor's Note</h3> <textarea class="bordered-textarea" ng-model="appMeta.editors_note"></textarea> <p class="control-hint">Editor's note content supports Markdown.</p> <p> <button class="btn btn-outline btn-small" ng-click="editorsNote.cancel()">Cancel</button> <button class="btn btn-outline btn-small" ng-click="editorsNote.save()">Save</button> </p> </div> </div> <div class="col-xs-12" ng-if="app.macos_architecture == 32"> <div class="border-box warning"> <svg class="icon warning-icon"> <use xlink:href="/assets/svg/icons.svg#shape-warning" /> </svg> <h3>32-bit app warning</h3> <p><strong>{{app.name}}</strong> is 32-bit. It will not be supported in <strong>macOS 10.15 Catalina (2019 release)</strong> unless it is updated by the developer.</p> </div> </div> </div> <div class="row" ng-if="appMeta.description"> <h5 class="row-header col-xs-12"> <span>About the app</span> </h5> <div class="col-xs-12 col-md-5 col-lg-6 app-description-box {{appMeta.description.length < 301 ? 'col-lg-4' : ''}} {{appMeta.description.length > 600 ? 'col-lg-8' : ''}}" ng-if="appMeta.description"> <div class="border-box info text-centre" ng-if="app.macos_catalyst"> <p><strong>macOS version built with <a href="https://developer.apple.com/mac-catalyst/">Catalyst</a> </strong> </p> </div> <div class="border-box border-box-flex has-icon success" ng-if="app.developer_status.osx.arm.macosBinary == 'universal' && app.developer_status.osx.arm.status == 'supported'"> <svg class="icon"> <use xlink:href="/assets/svg/icons.svg#shape-apple-cpu-2" /> </svg> <div class="border-box-content"> <p><strong>Ready for Apple Silicon</strong> </p> <p>macOS version has a universal binary & runs natively on Apple Silicon Macs.</p> </div> </div> <div class="border-box border-box-flex has-icon success" ng-if="app.developer_status.windows.windowsarm.windowsArmBinary == 'native' && app.developer_status.windows.windowsarm.status == 'supported'"> <svg class="icon"> <use xlink:href="/assets/svg/icons.svg#shape-windows-cpu-5" /> </svg> <div class="border-box-content"> <p><strong>Ready for Windows on ARM</strong> </p> <p>Windows version has a native ARM64 binary & runs natively on Windows ARM devices.</p> </div> </div> <div class="border-box"> <h3>Description</h3> <div ng-bind-html="renderMarkdown(appMeta.description)"></div> </div> <div class="border-box"> <h3>Similar apps</h3> <button class="btn btn-outline btn-small btn-header-right" ng-click="state.editSimilarApps = !state.editSimilarApps" ng-show="user"><span ng-show="!state.editSimilarApps">Edit</span> <span ng-show="state.editSimilarApps">Done</span> </button> <div ng-show="!state.editSimilarApps"> <ul class="app-watching-list"> <li ng-if="similarApps.list === undefined">Loading...</li> <li ng-if="similarApps.list === null">No similar apps to display.</li> <li ng-repeat="(slug, simApp) in similarApps.list | orderBy:'simApp.name'"> <a href="/app/{{::simApp.slug}}"> <img ng-src="{{::simApp.icon}}" class="app-list-icon" alt="{{::simApp.name}} icon" /> <strong>{{::simApp.name}}</strong> </a> </li> </ul> </div> <!-- edit sim apps section --> <div ng-show="state.editSimilarApps"> <ul class="app-watching-list"> <li ng-if="similarApps.list === undefined">Loading...</li> <li ng-if="similarApps.list === null">No similar apps to display.</li> <li ng-repeat="(slug, simApp) in similarApps.list | orderBy:'simApp.name'"> <a href="/app/{{::simApp.slug}}"> <img ng-src="{{::simApp.icon}}" class="app-list-icon" alt="{{::simApp.name}} icon" /> <strong>{{::simApp.name}}</strong> </a> <button class="btn btn-outline btn-right btn-danger btn-small" ng-click="similarApps.removeApp(slug)">Remove</button> </li> <li> <input type="text" class="bordered-text-input" placeholder="Search apps" ng-model="similarApps.newAppName" uib-typeahead="app.name for app in similarApps.search($viewValue)" typeahead-append-to-body="false" typeahead-wait-ms="250" typeahead-on-select="similarApps.newApp = $item" autocomplete="off" /> <button class="btn btn-success btn-outline btn-right btn-small " ng-click="similarApps.addApp()">Add</button> </li> </ul> </div> </div> <!-- <div class="border-box"> <h3>Collections</h3> <p>This app is included in the following collections:</p> <div> <ul class="app-watching-list"> <li ng-if="appCollections.list === undefined">Loading...</li> <li ng-if="appCollections.list === null">No collections to display.</li> <li ng-repeat="(slug, collection) in appCollections.list | orderBy:'collection.name'"> <a href="/collection/{{::collection.slug}}"> <img ng-src="{{::simApp.icon}}" class="app-list-icon" alt="{{::simApp.name}} icon" /> <strong>{{::collection.name}}</strong> </a> </li> </ul> </div> </div> --> </div> <div class="col-xs-12 col-md-4 col-lg-6 app-ad-box {{appMeta.description.length < 301 ? 'col-lg-8' : ''}} {{appMeta.description.length > 600 ? 'col-lg-4 col-lg-offset-2' : ''}}"> <div ng-show="appMeta.description.length > 600" ng-if="!user._noAds"> <div class="adunit border-box"> <!-- RoaringApps_AppPage_Square_ATF --> <ins class="adsbygoogle" style="display:inline-block;width:250px;height:250px" data-ad-client="ca-pub-4932023458712014" data-ad-slot="3388209387"></ins> </div> </div> <div ng-hide="appMeta.description.length > 600" ng-if="!user._noAds"> <div class="adunit border-box"> <!-- RoaringApps_AppPage_ATF_Banner --> <ins class="adsbygoogle" style="display:inline-block;width:468px;height:60px" data-ad-client="ca-pub-4932023458712014" data-ad-slot="9490583305"></ins> </div> </div> </div> </div><!-- /.row - about the app --> <!-- Screenshots row --> <div class="row"> <h5 class="row-header col-xs-12"> <span>Screenshots</span> </h5> <image-gallery page-type="app" image-type="screenshot" db-ref="screenshots"></image-gallery> </div><!-- /.row (screenshots) --> <!-- Admin row --> <div class="row" ng-if="admin.enabled"> <h5 class="row-header col-xs-12"> <span>Administration</span> </h5> <div class="col-xs-12 col-md-6 col-lg-8"> <div class="border-box stat-box"> <h3>Stats</h3> <div class="row"> <div class="col-xs-6"> <p><strong>{{::getFirebaseObjectSize(admin.watchers)}} watching</strong> </p> <ul> <li ng-repeat="(u, w) in admin.watchers">{{u}}</li> </ul> </div> <div class="col-xs-6"> <p><strong>{{::getObjectSize(appMeta.favourites)}} favourited</strong> </p> <ul> <li ng-repeat="(u, w) in appMeta.favourites">{{u}}</li> </ul> </div> </div> </div> </div> </div> <div class="row" ng-if="macAppStore || iosAppStore || app.windows_store_id"> <h5 class="row-header col-xs-12"> <span>Get the app</span> </h5> <div class="col-xs-12 col-sm-6 col-md-4 {{ numberOfStores() == 1 ? 'col-md-offset-2' : '' }} app-store-infobox" ng-if="macAppStore"> <div class="border-box"> <h3>Mac App Store</h3> <img ng-src="{{macAppStore.artworkUrl60}}" alt="" class="pull-right" style="margin-top: -10px; margin-right: -10px;" /> <p><strong>{{macAppStore.trackName}}</strong> </p> <p> <a href="{{generateiTunesAffiliateLink(macAppStore.trackViewUrl)}}" class="app-store-price">{{formatStorePrice('mac')}}</a> </p> <ul> <li>Category: {{macAppStore.primaryGenreName}}</li> <li>Version: {{macAppStore.version}}</li> <li>Size: {{formatFilesize(macAppStore.fileSizeBytes)}}</li> <li ng-if="macAppStore.kind == 'mac-software'">Compatibility: OS X {{macAppStore.minimumOsVersion}} or later</li> </ul> <a href="{{generateiTunesAffiliateLink(macAppStore.trackViewUrl)}}" style="display:inline-block;overflow:hidden;background:url(/assets/svg/mac-app-store-badge.svg) no-repeat;width:185px;height:50px;background-size: 185px;margin: 10px 0 0;"></a> </div> </div> <div class="col-xs-12 col-sm-6 col-md-4 {{ numberOfStores() == 1 ? 'col-md-offset-2' : '' }} app-store-infobox" ng-if="iosAppStore"> <div class="border-box"> <h3 style="text-transform: none;">iOS APP STORE</h3> <img ng-src="{{iosAppStore.artworkUrl60}}" alt="" class="pull-right ios-app-store-icon" style="margin-top: -10px; margin-right: -10px;" /> <p><strong>{{iosAppStore.trackName}}</strong> </p> <p> <a href="{{generateiTunesAffiliateLink(iosAppStore.trackViewUrl)}}" class="app-store-price">{{formatStorePrice('ios')}}</a> </p> <ul> <li>Category: {{iosAppStore.primaryGenreName}}</li> <li>Version: {{iosAppStore.version}}</li> <li>Size: {{formatFilesize(iosAppStore.fileSizeBytes)}}</li> <li ng-if="iosAppStore.kind == 'software'">Compatibility: iOS {{iosAppStore.minimumOsVersion}} or later</li> </ul> <a href="{{generateiTunesAffiliateLink(iosAppStore.trackViewUrl)}}" style="display:inline-block;overflow:hidden;background:url(/assets/svg/ios-app-store-badge.svg) no-repeat;width:165px;height:50px;background-size: 150px;margin: 10px 0 0;"></a> </div> </div> <div class="col-xs-12 col-sm-6 col-md-4 {{ numberOfStores() == 1 ? 'col-md-offset-2' : '' }} app-store-infobox" ng-if="app.windows_store_id"> <div class="border-box"> <h3>Windows store</h3> <p><strong>{{ app.name }}</strong> </p> <a href="https://www.microsoft.com/store/apps/{{app.slug}}/{{app.windows_store_id}}" class="btn btn-outline btn-windows-store"> <svg class="icon"> <use xlink:href="/assets/svg/icons.svg#shape-status-platform-windows" /> </svg> <span>Download from</span> <br/> <strong>Windows Store</strong> </a> </div> </div> <div class="hidden-xs hidden-sm col-md-4" ng-if="!user._noAds && (numberOfStores() == 1 || numberOfStores() == 2)"> <div class="adunit border-box"> <!-- RoaringApps_AppPage_Square_GetTheApp --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-4932023458712014" data-ad-slot="7602786563" data-ad-format="auto" data-full-width-responsive="true"></ins> </div> </div> </div><!-- /.row - get the app --> <div class="row" ng-if="info.hasDevStatus"> <h5 class="row-header col-xs-12"> <span>Developer status</span> </h5> <div class="col-xs-12 app-recent-status-reports-box app-dev-status-reports-box"> <div class="border-box"> <table class="table table-barebones"> <thead> <tr> <th>OS Release</th> <th>Supported by developer?</th> <th>App version</th> <th>Reference</th> <th class="hidden-sm hidden-xs"></th> </tr> </thead> <tbody ng-repeat="(thePlatform, platform) in app.developer_status"> <tr ng-repeat="pv in platform"> <td> <a class="anchor-offset" id="dev-status-{{thePlatform}}-{{pv.platformVersion}}"></a> <span>{{context.platforms[thePlatform].versions[pv.platformVersion].fullname}}</span> </td> <td> <svg class="icon inline-status-report-icon"> <use xlink:href="" ng-attr-xlink:href="{{'/assets/svg/icons.svg#shape-status-' + pv.status}}" /> </svg> <span class="meta">{{ pv.status.replace("-", " ") }}</span> <span class="meta ex-meta" ng-show="pv.platformVersion == 'arm' && pv.macosBinary == 'universal'">Runs natively on Apple Silicon</span> <span class="meta ex-meta" ng-show="pv.platformVersion == 'arm' && pv.macosBinary == 'rosetta'">Runs under Rosetta translation on Apple Silicon</span> <span class="meta ex-meta" ng-show="pv.platformVersion == 'windowsarm' && pv.windowsArmBinary == 'native'">Runs natively on Windows ARM devices</span> <span class="meta ex-meta" ng-show="pv.platformVersion == 'windowsarm' && pv.windowsArmBinary == 'emulation'">Runs in x86/x64 emulation on Windows ARM devices</span> </td> <td>{{ pv.appVersion }}</td> <td class="url left-align"> <a href="{{ pv.reference }}"> <span class="hidden-xs hidden-sm">{{ pv.reference }}</span> <svg class="icon hidden-md hidden-lg"> <use xlink:href="/assets/svg/icons.svg#shape-link" /> </svg> </a> </td> <td class="hidden-sm hidden-xs"> <span class="meta">{{ formatDateFromNow(pv.updated_at, true) }} by {{ pv.updated_by }}</span> <span ng-if="user && user.role == 'admin'" ng-click="devStatus.remove(thePlatform, pv.platformVersion)"> <svg class="icon"> <use xlink:href="/assets/svg/icons.svg#shape-circle-with-cross" /> </svg> </span> </td> </tr> </tbody> </table> </div> </div> </div><!-- /.row - dev status --> <div class="row" ng-if="userStatusReports.length > 0 || statusReports.length > 0"> <h5 class="row-header col-xs-12"> <span>User status reports</span> </h5> <div class="col-xs-12 {{ userStatusReports.length === 0 ? 'col-md-8 col-lg-7' : 'col-md-6 col-lg-6' }} app-recent-status-reports-box" ng-if="statusReports.length > 0"> <div class="border-box"> <h3>Recent status reports</h3> <table class="table table-barebones"> <thead> <tr> <th>User</th> <th>Platform</th> <th>App version</th> <th>Status</th> <th></th> </tr> </thead> <tbody> <tr ng-repeat="s in statusReports | orderBy:'-$id' | limitTo:5 track by s.$id"> <td>{{s.user}}</td> <td>{{context.platforms[s.platform].versions[s.platformVersion].fullname}} <span class="meta">{{context.platforms[s.platform].versions[s.platformVersion].id}}</span> </td> <td>{{s.appVersion}}</td> <td> <svg class="icon inline-status-report-icon"> <use xlink:href="" ng-attr-xlink:href="{{'/assets/svg/icons.svg#shape-status-' + (slugify(s.status) || 'unknown')}}" /> </svg> </td> <td><span class="meta">{{ formatDateFromNow(s.$priority) }}</span> </td> </tr> </tbody> </table> </div> </div> <div class="col-xs-12 col-md-6 app-user-status-reports-box" ng-if="userStatusReports.length > 0"> <div class="border-box"> <h3>Your status reports</h3> <table class="table table-barebones"> <thead> <tr> <th>Platform</th> <th>App version</th> <th>Status</th> <th></th> </tr> </thead> <tbody> <tr ng-repeat="s in userStatusReports track by s.$id"> <td>{{context.platforms[s.platform].versions[s.platformVersion].fullname}}<span class="meta">{{context.platforms[s.platform].versions[s.platformVersion].id}}</span> </td> <td>{{s.appVersion}}</td> <td> <svg class="icon inline-status-report-icon"> <use xlink:href="" ng-attr-xlink:href="{{'/assets/svg/icons.svg#shape-status-' + (slugify(s.status) || 'unknown')}}" /> </svg> </td> <td> <a href="#" class="icon-btn" ng-click="editStatusReport(s)"> <svg class="icon inline-icon"> <use xlink:href="/assets/svg/icons.svg#shape-edit" /> </svg> </a> <a href="#" class="icon-btn" ng-click="removeStatusReport(s)"> <svg class="icon inline-icon"> <use xlink:href="/assets/svg/icons.svg#shape-circle-with-cross" /> </svg> </a> </td> </tr> </tbody> </table> </div> </div> <div class="hidden-xs col-md-3 col-lg-4 col-lg-offset-1" ng-if="!user._noAds && userStatusReports.length === 0"> <div class="adunit border-box"> <!-- RoaringApps_AppPage_Square_BTF --> <ins class="adsbygoogle" style="display:inline-block;width:250px;height:250px" data-ad-client="ca-pub-4932023458712014" data-ad-slot="5076889096"></ins> </div> </div> </div><!-- /.row - status reports --> <div class="row"> <h5 class="row-header col-xs-12"> <span>Discuss the app</span> </h5> <div class="col-xs-12 col-md-6 col-lg-5 app-compatibility-notes-box" ng-if="compatibility.notes.length > 0"> <div class="border-box"> <h3>Compatibility Notes</h3> <ul class="compatibility-notes"> <li ng-repeat="note in compatibility.notes | orderBy:'-$id' track by $index" class="status-{{slugify(note.status)}}"> <p class="meta"><strong>{{note.user}}</strong> on why version {{note.appVersion}} <span ng-if="note.status == 'Some problems'">has</span> {{note.status.toLowerCase()}} on {{context.platforms[note.platform].versions[note.platformVersion].fullname}}:</p> <p class="note">{{note.note}}</p> </li> </ul> </div> </div> <div class="col-xs-12 {{ compatibility.notes.length === 0 ? 'col-md-12' : 'col-md-6 col-lg-7' }} app-comments-box"> <div ng-if="!user._noAds"> <div class="adunit border-box"> <!-- RoaringApps_AppPage_BTF_Banner --> <ins class="adsbygoogle" style="display:inline-block;width:468px;height:60px" data-ad-client="ca-pub-4932023458712014" data-ad-slot="1628598674"></ins> </div> </div> <div class="border-box"> <h3>Comments</h3> <comment-system page-type="app"></comment-system> </div> </div> </div><!-- /.row - discuss --> </div><!-- /.container --> </div><!-- /.outside-wrapper --> <div class="overlay-wrapper"> <div class="overlay overlay-1 {{state.editing ? 'show' : '' }}"> <div class="overlay-inner"> <form name="edit-app-form" ng-submit="edit.save()"> <div class="overlay-controls"> <button type="button" class="btn btn-outline" ng-click="edit.cancel()">Cancel</button> <button type="submit" class="btn btn-outline btn-primary-filled pull-right" ng-hide="state.uploadingIcon">Save</button> <div class="btn btn-outline btn-primary-filled edit-pane-button-loader pull-right" ng-show="state.uploadingIcon"> <div class="spinner spinner-three-dots faster"> <div class="bounce1"></div> <div class="bounce2"></div> <div class="bounce3"></div> </div> </div> </div> <div class="overlay-header"> <div class="container"> <div class="row"> <div class="col-xs-12"> <h2>Edit application</h2> </div> </div> </div> </div> <div class="overlay-content"> <div class="edit-screen"> <div class="container"> <div class="row"> <div class="col-xs-12 col-md-4"> <div class="segment-container slide-in"> <a class="segment {{state.editXref ? 'inactive' : 'active'}}" href="" ng-click="state.editXref = false"> App details </a> <a class="segment {{state.editXref ? 'active' : 'inactive'}}" href="" ng-click="state.editXref = true"> Cross references </a> </div> <article class="form-edit-app edit-column column-app-info slide-in" ng-show="!state.editXref"> <div class="form-group"> <label for="name">Name</label> <input type="text" name="name" value="" ng-model="app.name" ng-model-options="{updateOn:'submit'}" required /> </div> <div class="form-group ui-typeahead"> <label for="developer">Developer</label> <input type="text" name="developer" value="" ng-model="extra.developer" uib-typeahead="dev.name for dev in developerSearch($viewValue)" typeahead-min-length="2" autocomplete="off" /> </div> <div class="form-group"> <label for="url">Website</label> <input type="url" name="url" value="" ng-model="app.url" ng-model-options="{updateOn:'submit'}" /> </div> <div class="form-group"> <label for="description">Description</label> <textarea name="description" ng-model="appMeta.description" ng-model-options="{updateOn:'submit'}"></textarea> </div> </article> <article class="form-edit-app edit-column column-app-xref slide-in" ng-show="state.editXref"> <div class="form-group" ng-show="app.platforms.indexOf('osx') > -1"> <label for="bundle_id_osx">macOS Bundle ID</label> <input type="text" name="bundle_id_osx" id="bundle_id_osx" ng-model="app.bundle_id_osx" ng-model-options="{updateOn:'submit'}" ng-list /> </div> <div class="form-group" ng-show="app.platforms.indexOf('osx') > -1"> <label for="itunes_track_id_osx">macOS iTunes ID</label> <input type="text" name="itunes_track_id_osx" id="itunes_track_id_osx" ng-model="app.itunes_track_id_osx" ng-model-options="{updateOn:'submit'}" /> </div> <div class="form-group" ng-show="app.platforms.indexOf('ios') > -1"> <label for="bundle_id_ios">iOS Bundle ID</label> <input type="text" name="bundle_id_ios" id="bundle_id_ios" ng-model="app.bundle_id_ios" ng-model-options="{updateOn:'submit'}" ng-list /> </div> <div class="form-group" ng-show="app.platforms.indexOf('ios') > -1"> <label for="itunes_track_id_ios">iOS iTunes ID</label> <input type="text" name="itunes_track_id_ios" id="itunes_track_id_ios" ng-model="app.itunes_track_id_ios" ng-model-options="{updateOn:'submit'}" /> </div> <div class="form-group" ng-show="app.platforms.indexOf('windows') > -1"> <label for="windows_store_id">Windows Store ID</label> <input type="text" name="windows_store_id" id="windows_store_id" ng-model="app.windows_store_id" ng-model-options="{updateOn:'submit'}" /> </div> </article> </div> <div class="col-xs-12 col-md-4"> <article class="form-edit-app slide-in"> <h3>App features</h3> <div class="form-group"> <label>Supported platforms</label> <label for="form-edit-app-support-{{platformRef}}" class="checkbox-label" ng-repeat="(platformRef, platform) in context.platforms"> <input type="checkbox" name="supportedPlatforms[]" id="form-edit-app-support-{{platformRef}}" ng-checked="app.platforms.indexOf(platformRef) > -1" ng-click="edit.toggleSupportedPlatform(platformRef)" ng-model-options="{updateOn:'submit'}" />{{platform.name}} </label> </div> <div class="form-group" ng-show="app.platforms.indexOf('osx') > -1"> <label>macOS architecture</label> <div class="segment-container edit-inline-segment architecture-segment slide-in"> <a class="segment {{app.macos_architecture == 32 ? 'active' : 'inactive'}}" href="" ng-click="app.macos_architecture = 32"> 32-bit </a> <a class="segment {{app.macos_architecture == 64 ? 'active' : 'inactive'}}" href="" ng-click="app.macos_architecture = 64"> 64-bit </a> </div> </div> <div class="form-group" ng-show="app.platforms.indexOf('osx') > -1"> <label>macOS development</label> <label for="form-edit-app-catalyst" class="checkbox-label"> <input type="checkbox" id="form-edit-app-catalyst" ng-model="app.macos_catalyst" />Built with <em>Catalyst</em> </label> </div> <div class="form-group"> <label>Development status</label> <label for="form-edit-app-eol" class="checkbox-label"> <input type="checkbox" id="form-edit-app-eol" ng-model="app.eol" />Discontinued / End-of-life </label> </div> <!-- eol deets --> <div ng-show="app.eol"> <h4 class="text-upper">End-of-life details</h4> <div class="form-group"> <label for="">Date discontinued</label> <input type="text" name="eol_date" id="edit-app-eol-date" ng-model="app.eol_date" ng-model-options="{updateOn:'submit'}" /> </div> <div class="form-group"> <label for="">Last version released</label> <input type="text" name="" id="edit-app-eol-last-version" ng-model="app.eol_last_version" ng-model-options="{updateOn:'submit'}" /> </div> <div class="form-group"> <label for="">Last supported OS</label> <table class="table"> <tbody> <tr ng-repeat="eolLspPlatform in context.platforms | toArray" ng-show="app.platforms.indexOf(eolLspPlatform.reference) > -1"> <td>{{ eolLspPlatform.name }}</td> <td> <select ng-model="app.eol_last_supported_os[eolLspPlatform.reference]" ng-options="eolLspV.reference as (eolLspV.id + ' – ' + eolLspV.name) for eolLspV in eolLspPlatform.versions | toArray" ng-show="app.platforms.indexOf(eolLspPlatform.reference) > -1"></select> </td> </tr> </tbody> </table> </div> </div><!-- /eol deets --> </article> </div> <div class="col-xs-12 col-md-4"> <article class="form-edit-app slide-in"> <h3>App icon</h3> <div class="form-group"> <div class="icon-preview-wrapper"> <img ng-src="{{iconUpload.previewURL}}" class="app-icon-upload-preview" alt="App icon" ng-if="iconUpload.previewURL" /><span class="icon-button remove" ng-click="iconUpload.removeCurrentIcon()" ng-if="iconUpload.previewURL && !state.uploadingIcon"> <svg class="icon"> <use xlink:href="/assets/svg/icons.svg#shape-circle-with-cross" /> </svg> </span> </div> <div id="icon-upload-dragbox" class="icon-upload-dropzone" ng-show="!iconUpload.previewURL && !state.uploadingIcon"> <div class="icon-upload-clone" ng-click="iconUpload.fakeClick()"> <svg class="icon"> <use xlink:href="/assets/svg/icons.svg#shape-chevron-with-circle-up" /> </svg> <p>Drop icon here or click to upload.</p> </div> <input type="file" name="icon" id="edit-app-icon" class="icon-upload-input" onchange="angular.element(this).scope().iconUpload.inputChange(this)" /> </div> <div class="upload-progress-bar" ng-show="state.uploadingIcon"> <div class="progress" style="width: {{iconUpload.progress}}%;"></div> </div> </div> </article> </div> </div> </div> </div> </div> </form> </div> </div> <div class="overlay overlay-2 {{ state.newStatus ? 'show' : '' }}"> <div class="overlay-inner"> <div class="overlay-controls"> <button type="button" class="btn btn-outline" ng-click="newStatus.close()">Cancel</button> </div> <div class="overlay-header"> <div class="container"> <div class="row"> <div class="col-xs-12"> <h2>Share your experience</h2> </div> </div> </div> </div> <div class="overlay-content"> <div class="container edit-screen panel-new-status"> <div class="row"> <div class="col-xs-3 col-lg-2"> <h4>Platform</h4> <ul class="new-status-platform-list"> <li ng-repeat="platform in context.platforms | toArray | orderBy:'name' | filter:newStatus.filterAppSupportedPlatform" ng-click="state.newStatusReport.platform = platform.$key" class="{{state.newStatusReport.platform === platform.$key ? 'selected' : ''}}">{{platform.name}}</li> </ul> </div> <div class="col-xs-3 col-lg-2" ng-show="state.newStatusReport.platform"> <div ng-show="state.newStatusReport.platform === 'osx'"> <h4>Chip / CPU</h4> <ul class="new-status-platform-version-list"> <li ng-click="state.newStatusReport.platformVersion = 'arm'" class="{{state.newStatusReport.platformVersion === 'arm' ? 'selected' : ''}}"> Apple Silicon </li> </ul> </div> <div ng-show="state.newStatusReport.platform === 'windows'"> <h4>Chip / CPU</h4> <ul class="new-status-platform-version-list"> <li ng-click="state.newStatusReport.platformVersion = 'windowsarm'" class="{{state.newStatusReport.platformVersion === 'windowsarm' ? 'selected' : ''}}"> Windows on ARM </li> </ul> </div> <h4>OS Release</h4> <ul class="new-status-platform-version-list"> <li ng-repeat="pv in context.platforms[state.newStatusReport.platform].versions | toArray | filter:{type:'!cpu'}" ng-init="platformVersion = platform[pv.reference]" ng-click="state.newStatusReport.platformVersion = pv.reference" class="{{state.newStatusReport.platformVersion === pv.reference ? 'selected' : ''}}"> {{pv.name}} <span ng-if="state.newStatusReport.platform == 'osx'">{{pv.id}}</span> </li> </ul> </div> <div class="col-xs-3 col-lg-2" ng-show="state.newStatusReport.platformVersion"> <h4>App version</h4> <ul class="new-status-app-version-list"> <li class="new-status-app-version-add" ng-click="newStatus.toggleCustomVersionInput()"> <strong ng-show="!newStatus.showCustomVersionInput">+</strong> <input type="text" ng-model="state.newStatusReport.appVersion" ng-show="newStatus.showCustomVersionInput" placeholder="+" /> </li> <li ng-repeat="appVersion in compatibility.appVersions[state.newStatusReport.platform] | toArray | orderBy:'-version' | filter:{type: 'App version'}" ng-click="newStatus.setAppVersion(appVersion.$key)" class="{{state.newStatusReport.appVersion === appVersion.$key ? 'selected' : ''}}">{{appVersion.name}}</li> </ul> </div> <div class="col-xs-3 col-lg-2" ng-show="state.newStatusReport.appVersion"> <h4>Compatibility</h4> <ul class="new-status-compatibility"> <li ng-repeat="status in ['works-fine', 'some-problems', 'doesnt-work']" class="{{status}} {{state.newStatusReport.status == status ? 'selected' : ''}}" ng-click="state.newStatusReport.status = status"> <svg class="icon status-report-icon"> <use xlink:href="" ng-attr-xlink:href="{{'/assets/svg/icons.svg#shape-status-' + status}}" /> </svg> </li> </ul> </div> <div class="col-xs-12 col-sm-6 col-sm-offset-6 col-lg-4 col-lg-offset-0" ng-show="state.newStatusReport.status"> <h4>Notes</h4> <div class="form-group"> <textarea name="new-status-notes" class="mid-height" ng-model="state.newStatusReport.note"></textarea> </div> <h4>Summary</h4> <p class="new-status-summary">{{newStatus.summarySentence()}}</p> </div> <div class="col-xs-12 col-sm-6 col-sm-offset-6 col-lg-4 col-lg-offset-0" ng-show="!state.newStatusReport.platform"> <div class="new-status-explainer"> <svg class="icon"> <use xlink:href="/assets/svg/icons.svg#shape-info" /> </svg> <p>When a developer has not stated official support, or if your experience differs, record your individual experience with the app here.</p> <p><strong>Select a platform on the left to get started.</strong> </p> </div> </div> <div class="form-action-area outside-col"> <button type="submit" class="btn btn-outline btn-primary-filled" ng-click="newStatus.submit()" ng-show="state.newStatusReport.platform && state.newStatusReport.platformVersion && state.newStatusReport.appVersion && state.newStatusReport.status">Submit</button> </div> </div> </div> </div> </div><!-- /.overlay-inner --> </div><!-- /.overlay-2 --> <!-- Overlay 3 - developer status --> <div class="overlay overlay-3 {{ state.newDevStatus ? 'show' : '' }}"> <div class="overlay-inner"> <div class="overlay-controls"> <button type="button" class="btn btn-outline" ng-click="devStatus.close()">Cancel</button> <button type="submit" class="btn btn-outline btn-primary-filled pull-right" ng-click="devStatus.submit()" ng-show="devStatus.form.platform && devStatus.form.platformVersion && devStatus.form.status">Submit</button> </div> <div class="overlay-header"> <div class="container"> <div class="row"> <div class="col-xs-12"> <h2>Official developer status</h2> </div> </div> </div> </div> <div class="overlay-content"> <div class="container edit-screen panel-new-status panel-dev-status"> <div class="row"> <div class="col-xs-3 col-lg-2"> <h4>Platform</h4> <ul class="new-status-platform-list"> <li ng-repeat="platform in context.platforms | toArray | orderBy:'name' | filter:newStatus.filterAppSupportedPlatform" ng-click="devStatus.form.platform = platform.$key" class="{{devStatus.form.platform === platform.$key ? 'selected' : ''}}">{{platform.name}}</li> </ul> </div> <div class="col-xs-3 col-lg-2" ng-show="devStatus.form.platform"> <div ng-show="devStatus.form.platform === 'osx'"> <h4>Chip / CPU</h4> <ul class="new-status-platform-version-list"> <li ng-click="devStatus.selectPV('arm')" class="{{devStatus.form.platformVersion === 'arm' ? 'selected' : ''}}"> Apple Silicon </li> </ul> </div> <div ng-show="devStatus.form.platform === 'windows'"> <h4>Chip / CPU</h4> <ul class="new-status-platform-version-list"> <li ng-click="devStatus.selectPV('windowsarm')" class="{{devStatus.form.platformVersion === 'windowsarm' ? 'selected' : ''}}"> Windows on ARM </li> </ul> </div> <h4>Release</h4> <ul class="new-status-platform-version-list"> <li ng-repeat="pv in context.platforms[devStatus.form.platform].versions | toArray | filter:{type:'!cpu'}" ng-init="platformVersion = platform[pv.reference]" ng-click="devStatus.selectPV(pv.reference)" class="{{devStatus.form.platformVersion === pv.reference ? 'selected' : ''}}">{{pv.name}} <span ng-if="devStatus.form.platform == 'osx'">{{pv.id}}</span> </li> </ul> </div> <div class="col-xs-3 col-sm-6 col-lg-2" ng-show="devStatus.form.platformVersion"> <h4>Supported by developer?</h4> <ul class="new-status-compatibility"> <li ng-repeat="status in ['supported', 'not-supported']" class="{{status}} {{getNested(app.developer_status, devStatus.form.platform, devStatus.form.platformVersion, 'status') == status ? 'selected' : ''}}" ng-click="devStatus.form.status = status;setNested(app, ['developer_status', devStatus.form.platform, devStatus.form.platformVersion, 'status'], status)"> <svg class="icon status-report-icon"> <use xlink:href="" ng-attr-xlink:href="{{'/assets/svg/icons.svg#shape-status-' + status}}" /> </svg> </li> </ul> </div> <div class="col-xs-12 col-sm-6 col-lg-4" ng-show="devStatus.form.platformVersion"> <div ng-show="devStatus.form.platformVersion == 'arm'"> <h4>Binary type</h4> <div class="form-group"> <div class="segment-container edit-inline-segment binary-segment"> <a class="segment {{devStatus.form.macosBinary == 'universal' ? 'active' : 'inactive'}}" href="" ng-click="devStatus.form.macosBinary = 'universal'"> Universal </a> <a class="segment {{devStatus.form.macosBinary == 'rosetta' ? 'active' : 'inactive'}}" href="" ng-click="devStatus.form.macosBinary = 'rosetta'"> Rosetta </a> <a class="segment {{devStatus.form.macosBinary == 'unknown' ? 'active' : 'inactive'}}" href="" ng-click="devStatus.form.macosBinary = 'unknown'"> Unknown </a> </div> <p> <small>If the app has been developed & compiled for Apple Silicon, select 'Universal'. For apps that have not been updated, select 'Rosetta'.</small> </p> </div> </div> <div ng-show="devStatus.form.platformVersion == 'windowsarm'"> <h4>Binary type</h4> <div class="form-group"> <div class="segment-container edit-inline-segment binary-segment"> <a class="segment {{devStatus.form.windowsArmBinary == 'native' ? 'active' : 'inactive'}}" href="" ng-click="devStatus.form.windowsArmBinary = 'native'"> Native </a> <a class="segment {{devStatus.form.windowsArmBinary == 'emulation' ? 'active' : 'inactive'}}" href="" ng-click="devStatus.form.windowsArmBinary = 'emulation'"> Emulation </a> <a class="segment {{devStatus.form.windowsArmBinary == 'unknown' ? 'active' : 'inactive'}}" href="" ng-click="devStatus.form.windowsArmBinary = 'unknown'"> Unknown </a> </div> <p> <small>If the app has been developed & compiled for ARM64, select 'Native'. For apps running through Windows' x86/x64 emulation, select 'Emulation'.</small> </p> </div> </div> <h4>Supported app version(s)</h4> <div class="form-group"> <input type="text" name="dev-new-status-app-version" ng-model="devStatus.form.appVersion" /> </div> <h4>Reference (URL to developer support site, blog post, etc)</h4> <div class="form-group"> <input type="url" name="dev-new-status-reference" ng-model="devStatus.form.reference" /> </div> <h4>Summary</h4> <p class="new-status-summary">{{devStatus.summarySentence()}}</p> <p class="new-status-summary" ng-if="devStatus.existingReport.updated_by">Previously reported by {{ devStatus.existingReport.updated_by }} on {{ formatDateForDevStatus(devStatus.existingReport.updated_at) }}. Submitting will update the status.</p> </div> <div class="col-xs-12 col-sm-6 col-sm-offset-6 col-lg-4 col-lg-offset-0" ng-show="!devStatus.form.platform"> <div class="new-status-explainer"> <svg class="icon"> <use xlink:href="/assets/svg/icons.svg#shape-info" /> </svg> <p>Use this to record when a developer has stated they are officially supporting (or not supporting) a particular OS release.</p> <p>Select a platform on the left to get started.</p> </div> </div> </div> </div> </div> </div> </div><!-- /.overlay-3 --> </div><!-- /.overlay-wrapper --> </div> </section> <!-- Footer --> <footer role="contentinfo"> <div class="container"> <div class="row"> <div class="col-md-6"> <p> <i>⚒</i>by Bryce Cameron since 10.7. <!-- <a class="bmc-button" target="_blank" href="https://www.buymeacoffee.com/roaringapps?ref=rawf" style="align-items: center;"><span>Buy me a coffee</span> <img src="https://cdn.buymeacoffee.com/buttons/bmc-new-btn-logo.svg" alt="Buy me a coffee"></a> --> </p> </div> <div class="col-md-6"> <p class="pull-right"> <a href="/">Home</a> · <a href="/about">About</a> · <a href="/newsletter/join">Newsletter</a> · <a href="/help/contribute-to-roaringapps">Contribute</a> · <a href="/contact">Contact</a> · <a href="/account">Account</a> · <a href="/legal">Legal</a> </p> </div> </div><!-- /.row --> </div> </footer> <script data-name="BMC-Widget" data-cfasync="false" src="https://cdnjs.buymeacoffee.com/1.0.0/widget.prod.min.js" data-id="roaringapps" data-description="Support me on Buy me a coffee!" data-message="" data-color="#FF5F5F" data-position="Right" data-x_margin="18" data-y_margin="18"></script> </div> <!-- Modals --> <section class="the-modals" ng-controller="ModalCtrl"> <!-- Sign In --> <div class="modal fade narrow" id="modal-signin" tabindex="-1" role="dialog" aria-labelledby="modal-label-signin" aria-hidden="true"> <div class="modal-dialog"> <p class="modal-outside-meta modal-msg" ng-if="signinModalMsg">{{signinModalMsg}}</p> <div class="modal-content"> <div class="modal-body"> <form id="form-signin" ng-submit="login.submit()"> <div class="gravatar"></div> <input type="email" name="signin-email" ng-model="form.login.email" placeholder="Email address" /> <input type="password" name="signin-password" ng-model="form.login.password" placeholder="Password" /> <button class="btn btn-action" action="submit" name="signin-submit" ng-hide="login.submitting"> <span>Sign in</span> </button> <div class="btn btn-action modal-button-loader" ng-show="login.submitting"> <div class="spinner spinner-three-dots faster"> <div class="bounce1"></div> <div class="bounce2"></div> <div class="bounce3"></div> </div> </div> </form> </div> </div><!-- /.modal-content --> <p class="modal-outside-meta"> <a href="/account/forgot">Forgot?</a> <a class="pull-right" href="#" data-toggle="modal" data-target="#modal-register"><strong>Create an account</strong> </a> </p> </div> </div> <!-- Register / Create account --> <div class="modal fade narrow" id="modal-register" tabindex="-1" role="dialog" aria-labelledby="modal-label-register" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-body"> <form id="form-register" ng-submit="register.submit()"> <div class="gravatar"></div> <input type="email" name="register-email" ng-model="form.register.email" placeholder="Email address" /> <input type="text" name="register-username" ng-model="form.register.username" placeholder="Username" /> <input type="password" name="register-password" ng-model="form.register.password" placeholder="Password" /> <button class="btn btn-action" action="submit" name="register-submit" ng-hide="register.submitting"> <span>Create account</span> </button> <div class="btn btn-action modal-button-loader" ng-show="register.submitting"> <div class="spinner spinner-three-dots faster"> <div class="bounce1"></div> <div class="bounce2"></div> <div class="bounce3"></div> </div> </div> </form> </div> </div><!-- /.modal-content --> <p class="modal-outside-meta">{{register.errors.join(' ')}}</p> </div> </div> <!-- Search --> <div class="modal fade search-modal" id="modal-search" tabindex="-1" role="dialog" aria-labelledby="modal-label-search" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-body"> <form id="form-search"> <input type="search" id="search-input" name="search" ng-model="form.search.query" placeholder="Search applications" autocomplete="off" /> <span class="search-result-count" ng-show="search.results.length > 0">{{search.results.length}} apps</span> </form> <p class="search-msg" ng-show="search.searching">Searching...</p> <p class="search-msg" ng-show="search.empty">No results</p> <ul class="search-results"> <li class="result" ng-repeat="app in search.results | orderBy:'-_searchRank'"> <a href="/app/{{app.slug}}"> <img ng-src="{{app.icon}}" alt="{{app.icon ? app.name + ' icon' : 'No icon'}}" class="{{app.icon ? 'search-result-has-icon' : 'search-result-no-icon'}}" onerror="this.style.display='none'" /> <strong>{{app.name}}</strong> <span class="dev">{{app.developer}}</span> </a> </li> </ul> </div> </div><!-- /.modal-content --> <p class="modal-outside-meta">{{register.errors.join(' ')}}</p> </div> </div> <!-- Moderate --> <div class="modal fade" id="modal-moderate" tabindex="-1" role="dialog" aria-labelledby="modal-label-moderate" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h4>Moderator control panel</h4> </div> <div class="modal-body"> <form id="form-moderate"> <div class="row"> <div class="col-xs-12 col-sm-6"> <div class="form-group"> <label for="moderate-app-name">Application</label> <input type="text" name="moderate-app-name" id="moderate-app-name" ng-model="selectedApp.name" disabled /> </div> </div> <div class="col-xs-12 col-sm-6"> <div class="form-group"> <label for="moderate-app-slug">Slug</label> <input type="text" name="moderate-app-slug" id="moderate-app-slug" ng-model="selectedApp.slug" disabled /> </div> </div> <div class="col-xs-12 col-sm-6"> <div class="form-group"> <label for="moderate-app-developer">Developer</label> <input type="text" name="moderate-app-developer" id="moderate-app-developer" ng-model="selectedApp.developer" disabled /> </div> </div> <div class="col-xs-12 col-sm-6"> <div class="form-group"> <label for="moderate-app-url">URL</label> <input type="text" name="moderate-app-url" id="moderate-app-url" ng-model="selectedApp.url" disabled /> </div> </div> </div> <div class="form-group"> <p ng-if="!selectedApp.statuses">This application has no status reports.</p> </div> <div class="form-group"> <button class="btn btn-outline btn-danger" ng-click="moderate.delete(selectedApp.slug)">Delete app</button> <button class="btn btn-outline" ng-click="moderate.merge.chooseTo(selectedApp.slug)">Merge with...</button> <button class="btn btn-outline" ng-click="moderate.appCollection.add(selectedApp.slug)">Add to collection...</button> <button class="btn btn-outline">Update</button> </div> </form> </div> </div><!-- /.modal-content --> <p class="modal-outside-meta">For use only by approved RoaringApps moderators.</p> </div> </div> <!-- Feedback --> <div class="modal fade" id="modal-feedback" tabindex="-1" role="dialog" aria-labelledby="modal-label-feedback" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h4>Submit Feedback</h4> </div> <div class="modal-body"> <p>I develop RoaringApps in my (rather limited) spare time, so sometimes I miss bugs here and there. If you notice something not quite working properly, or have an idea for the site, I'd love to hear from you.</p> <form id="form-feedback" name="feedbackForm" ng-submit="feedback.submit(feedbackForm.$valid)" novalidate> <!-- novalidate disables HTML5 validation, so we can use the angular validation --> <div class="row"> <div class="col-xs-12 col-sm-6"> <div class="form-group"> <label for="feedback-name">Name</label> <input type="text" name="feedback-name" id="feedback-name" ng-model="form.feedback.name" required /> </div> </div> <div class="col-xs-12 col-sm-6"> <div class="form-group"> <label for="feedback-email">Email (optional)</label> <input type="email" name="feedback-email" id="feedback-email" ng-model="form.feedback.email" /> </div> </div> </div> <div class="form-group"> <label for="feedback-comment">Comment</label> <textarea id="feedback-comment" ng-model="form.feedback.comment" required></textarea> </div> <div class="form-group form-action-area"> <input type="submit" value="Send feedback" class="btn btn-outline" ng-disabled="feedbackForm.$invalid" /> </div> <div class="form-group"> <p class="msg error" ng-if="feedback.errorMsg">{{feedback.errorMsg}}</p> <p class="msg success" ng-if="feedback.successMsg">{{feedback.successMsg}}</p> </div> </form> </div> </div><!-- /.modal-content --> </div> </div> <!-- Report comment --> <div class="modal fade" id="modal-report-comment" tabindex="-1" role="dialog" aria-labelledby="modal-label-report-comment" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h4>Report comment</h4> </div> <div class="modal-body"> <p>Report this comment to help the moderators identify items that require attention.</p> <form id="form-report-comment" name="reportCommentForm" ng-submit="reportComment.submit(reportCommentForm.$valid)" novalidate> <!-- novalidate disables HTML5 validation, so we can use the angular validation --> <div class="row"> <div class="col-xs-12"> <div class="form-group"> <label for="report-comment-reason">Reason</label> <select name="report-comment-reason" id="report-comment-reason" ng-model="form.reportComment.reason" required> <option>Invalid advice</option> <option>Illegal/inappropriate</option> <option>Off-topic</option> <option>Personal attack</option> <option>Spam</option> <option>Other</option> </select> </div> </div> <div class="col-xs-12"> <div class="form-group"> <label for="report-comment-description">Description (optional)</label> <textarea id="report-comment-description" ng-model="form.reportComment.description"></textarea> </div> </div> <div class="col-xs-12"> <div class="form-group form-action-area"> <input type="submit" value="Submit report" class="btn btn-outline" ng-disabled="reportCommentForm.$invalid" /> </div> <div class="form-group"> <p class="msg error" ng-if="reportComment.errorMsg">{{reportComment.errorMsg}}</p> <p class="msg success" ng-if="reportComment.successMsg">{{reportComment.successMsg}}</p> </div> </div> </div><!-- /.row --> </form> </div> </div><!-- /.modal-content --> </div> </div><!-- /.modal (report comment) --> </section> <!-- JS and analytics only. --> <script src="/assets/js/production-2-7-1.js"></script> <script> if (typeof lucide !== undefined) lucide.createIcons(); </script> </body> </html>