Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

WatchUI for Framework7

Apple Watch UI (including optional Home Screen) for Framework7

Introduction

Framework7 is the best HTML Application Framework for iOS 7-styled apps I can imagine. Fast, versatile, modular. But something was missing.

Apple introduced the  ᴡᴀᴛᴄʜ at the September Special Event, alongside the iPhone 6 and iPhone 6 Plus. It seems to run something like iOS, but with a stripped down UI, easy to read on small screens. I though this would be the perfect addition to Framework7, so I recently started working on WatchUI.

WatchUI is something game developers would call "total conversion", something like what FakeFactory's Cinematic Mod is to Half-Life 2. It changes almost every aspect, but it still keeps that original feeling. That's why my recreation of Bug Reporter⁸, Bug Watch, will be based on WatchUI.

What is included

  • Watch Home Screen (more on that in the docs)
  • Lists
  • Modals (including Alerts and Notifications)
  • Status Bar clock
  • Colored Status Bar titles
  • New page transitions

How does it work

Framework7 is initialized by creating a global variable:

var myApp = new Framework7([params])

WatchUI is initalized by injecting into this variable, which then sets up WatchCore and WatchCoreUI:

myApp.watch = new WatchApp([watch_params])

WatchApp accepts several parameters which enable or disable modules, like the WatchUI Home Screen:

VariableDefault valuePurpose
CoreAppListSource"apps/apps.json"Specifies the origin for the remotely loaded apps.
CoreHideNavbartrueHides or shows Navigation Bar on WatchUI Homescreen (beta).
CoreHomeView$('div.view#home')Specifies the parent DOM element that contains the WatchUI Home Screen.
CoreIndexIdentifier"index"Gets the data-page attribute for the inital Framework7 page.
CoreInitHomeScreentrueEnables/disables the WatchUI Home Screen.
CoreLoadAppsRemotefalseEnables or disables remote app loading for WatchUI.
CoreNavbarClocktrueEnables/disables clock in the upper right corner.
CoreNavbarClockElement$('p.time')Specifies the Element the clock should be applied on.
screenContainer$("#screen-container")Sets the Screen container element.
UIIconSize60If you use bigger or smaller icons than normal, you must change this value.
UIBubbleSize80Specifies the size of the icon zoom area of the Home Screen. Which is apparently a bubbble.
UIScrollRangeX35How far the user can scroll in X direction. Default icon size: 35px per circle while having more than one icon.
UIScrollRangeY55How far the user can scroll in Y direction. Default icon size: 55px per circle while having more than one icon.
UIEnableAppLabelsfalseEnables/disables optional App labels

Required libraries

WatchUI requires some libraries to work correctly. These libraries include:

  • jQuery
  • Easing for jQuery
  • fastclick.js
  • Veloctiy.js
  • Hammer.js

Each of these libraries is included in js/lib/

Including WatchUI in your app

Let's assume you already have included Framework7. First, include the required CSS files.

<linkrel="stylesheet" type="text/css" href="css/WatchUI.css"><linkrel="stylesheet" type="text/css" href="css/WatchUI-home.css">

If you are not going to use the WatchUI Home Screen, you can ignoreWatchUI-home.css

After you have included the stylesheets, you can continue to include the JavaScript files. You might want to include WatchUI at the end of the page. After you did that, you can initalize WatchUI alongside Framework7.

[...]
<scripttype="text/javascript" src="js/lib/jquery.js"></script><scripttype="text/javascript" src="js/lib/jquery.easing.1.3.js"></script><scripttype="text/javascript" src="js/lib/fastclick.js"></script><scripttype="text/javascript" src="js/lib/velocity.min.js"></script><scripttype="text/javascript" src="js/lib/hammer.min.js"></script><scripttype="text/javascript" src="js/WatchUI-1.0.1.js"></script><script>
var myApp = new Framework7();
myApp.watch = new WatchApp({
/* Optional parameters */
});
<script>

WatchCore and WatchCoreUI can be accessed always through myApp.watch.core and myApp.watch.ui.

WatchUI Home Screen

Notes:

  • CoreInitHomeScreen needs to be true
  • Navigation Bars should be hidden on Home Screen (CoreHideNavbars)

The Home Screen uses a special DOM layout. The Screen container is located right after the opening <body> tag. This is an example that is used in Bug Watch:

<divid="screen-container"><divclass="view" id="home"><divclass="appicon bugs" id="apps/de.sniperger.bugs/index.html"><imgsrc="img/icons/bugs.png"><pclass="label">Bugs</p></div><divclass="appicon settings" id="apps/de.sniperger.preferences/index.html"><imgsrc="img/icons/settings.png"><pclass="label">Settings</p></div><divclass="appicon update" id="apps/de.sniperger.update/index.html"><imgsrc="img/icons/AppIcon-Update.png"><pclass="label">Update</p></div><divclass="appicon usercp" id="apps/de.sniperger.usercp/index.html"><imgsrc="img/icons/AppIcon-UserCP.png"><pclass="label">User CP</p></div><divclass="appicon tips" id="apps/de.sniperger.tips/index.html"><imgsrc="img/icons/AppIcon-Tips.png"><pclass="label">Tips</p></div><divclass="appicon setup" id="apps/de.sniperger.setup/index.html"><imgsrc="img/icons/AppIcon-Assistant.png"><pclass="label">Setup</p></div><divclass="appicon feedback" id="apps/de.sniperger.feedback/index.html"><imgsrc="img/icons/AppIcon-Feedback.png"><pclass="label">Feedback</p></div></div></div>```
This is what it will look like (sans the optional labels):
<imgsrc="promo/watch_layout.png" width="200">
_Note: These app icons are not included in WatchUI. This is a beta screenshot from Bug Watch_
As you can see, the apps are rendered around the first app in circles from the center, then from top left to bottom right.
You might need some time to get familiar with how App Icons are ordered. Just play around with it until you're happy.
### App API
If you are using Remote Apps, you can easily create your own apps using JSON. This is what the apps.json file is for. The basic syntax is very easy:
```json
{
"apps": [
[YOUR APPS HERE]
]
}

Apps are added to the apps array, which is, if enabled, loaded into WatchUI and generates the Home Screen. If you want to create your own app, just set the following keys to your desire:

{
"title": "Your App",
"identifier": "yourapp",
"bundleID": "com.yourcompany.yourapp",
"executable": "index.html",
"icon": "img/icons/bugs.png"
}

There are more keys that might get useful in the future:

"preinstalled": true,
"notifications": false,
"color": "#ff730f"

The following method returns an app's info as a JavaScript object, which can be used in notifications:

myApp.watch.core.apps.getAppInfo(appID);

Just replace appID with the application ID you require information from.

Notifications

Framework7 has a great modal system. But for WatchUI, it's not good enough.

 ᴡᴀᴛᴄʜ Notifications consist of two "scenes",

  • the "Short Look" interface, which displays the app icon, the app title and a brief description of what happened, and
  • the "Long Look" interface, which is the notification itself and contains the message and action buttons.

Left: Short Look interface, Right: Long Look interface with custom "Like" button

Because of that extended content, WatchUI needed a custom Notification method. Here is the example that is used in the screenshots above:

app.watch.core.notify({title: "Did you know?",subtitle: app.watch.core.apps.getAppInfo("tips").title,message: "Harvard is officially free for those with less than $65,000 in annual family income.",icon: "img/icons/AppIcon-Tips.png",color: app.watch.core.apps.getAppInfo("tips").color,buttons: [{title: "Like",}]});

You might have noticed that only one of the two buttons is specified in this example. This is because the  ᴡᴀᴛᴄʜ OS automatically adds the "Dismiss" button. The same happens in WatchUI. You'll only need to specify the buttons that contain actions.

Buttons only have title and onClick attributes. The onClick attribute can contain a function that gets called when the button is pressed and the notification is gone (so there's not too much action at once).

Debugging

If you want to display the versions of Framework7, WatchApp, WatchCore or WatchCoreUI anywhere, you can access these attributes from your Framework7 object:

myApp.version/* Framework7 Version */myApp.watch.version/* WatchApp Version */myApp.watch.core.version/* WatchCore Version */myApp.watch.ui.version/* WatchCoreUI Versionn */

WatchUI Code is based on Pipes Apple Watch Demo

About

Apple Watch UI (including optional Home Screen) for Framework7

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

WatchUI for Framework7

Apple Watch UI (including optional Home Screen) for Framework7

Introduction

Framework7 is the best HTML Application Framework for iOS 7-styled apps I can imagine. Fast, versatile, modular. But something was missing.

Apple introduced the  ᴡᴀᴛᴄʜ at the September Special Event, alongside the iPhone 6 and iPhone 6 Plus. It seems to run something like iOS, but with a stripped down UI, easy to read on small screens. I though this would be the perfect addition to Framework7, so I recently started working on WatchUI.

WatchUI is something game developers would call "total conversion", something like what FakeFactory's Cinematic Mod is to Half-Life 2. It changes almost every aspect, but it still keeps that original feeling. That's why my recreation of Bug Reporter⁸, Bug Watch, will be based on WatchUI.

What is included

  • Watch Home Screen (more on that in the docs)
  • Lists
  • Modals (including Alerts and Notifications)
  • Status Bar clock
  • Colored Status Bar titles
  • New page transitions

How does it work

Framework7 is initialized by creating a global variable:

var myApp = new Framework7([params])

WatchUI is initalized by injecting into this variable, which then sets up WatchCore and WatchCoreUI:

myApp.watch = new WatchApp([watch_params])

WatchApp accepts several parameters which enable or disable modules, like the WatchUI Home Screen:

VariableDefault valuePurpose
CoreAppListSource"apps/apps.json"Specifies the origin for the remotely loaded apps.
CoreHideNavbartrueHides or shows Navigation Bar on WatchUI Homescreen (beta).
CoreHomeView$('div.view#home')Specifies the parent DOM element that contains the WatchUI Home Screen.
CoreIndexIdentifier"index"Gets the data-page attribute for the inital Framework7 page.
CoreInitHomeScreentrueEnables/disables the WatchUI Home Screen.
CoreLoadAppsRemotefalseEnables or disables remote app loading for WatchUI.
CoreNavbarClocktrueEnables/disables clock in the upper right corner.
CoreNavbarClockElement$('p.time')Specifies the Element the clock should be applied on.
screenContainer$("#screen-container")Sets the Screen container element.
UIIconSize60If you use bigger or smaller icons than normal, you must change this value.
UIBubbleSize80Specifies the size of the icon zoom area of the Home Screen. Which is apparently a bubbble.
UIScrollRangeX35How far the user can scroll in X direction. Default icon size: 35px per circle while having more than one icon.
UIScrollRangeY55How far the user can scroll in Y direction. Default icon size: 55px per circle while having more than one icon.
UIEnableAppLabelsfalseEnables/disables optional App labels

Required libraries

WatchUI requires some libraries to work correctly. These libraries include:

  • jQuery
  • Easing for jQuery
  • fastclick.js
  • Veloctiy.js
  • Hammer.js

Each of these libraries is included in js/lib/

Including WatchUI in your app

Let's assume you already have included Framework7. First, include the required CSS files.

<linkrel="stylesheet" type="text/css" href="css/WatchUI.css"><linkrel="stylesheet" type="text/css" href="css/WatchUI-home.css">

If you are not going to use the WatchUI Home Screen, you can ignoreWatchUI-home.css

After you have included the stylesheets, you can continue to include the JavaScript files. You might want to include WatchUI at the end of the page. After you did that, you can initalize WatchUI alongside Framework7.

[...]
<scripttype="text/javascript" src="js/lib/jquery.js"></script><scripttype="text/javascript" src="js/lib/jquery.easing.1.3.js"></script><scripttype="text/javascript" src="js/lib/fastclick.js"></script><scripttype="text/javascript" src="js/lib/velocity.min.js"></script><scripttype="text/javascript" src="js/lib/hammer.min.js"></script><scripttype="text/javascript" src="js/WatchUI-1.0.1.js"></script><script>
var myApp = new Framework7();
myApp.watch = new WatchApp({
/* Optional parameters */
});
<script>

WatchCore and WatchCoreUI can be accessed always through myApp.watch.core and myApp.watch.ui.

WatchUI Home Screen

Notes:

  • CoreInitHomeScreen needs to be true
  • Navigation Bars should be hidden on Home Screen (CoreHideNavbars)

The Home Screen uses a special DOM layout. The Screen container is located right after the opening <body> tag. This is an example that is used in Bug Watch:

<divid="screen-container"><divclass="view" id="home"><divclass="appicon bugs" id="apps/de.sniperger.bugs/index.html"><imgsrc="img/icons/bugs.png"><pclass="label">Bugs</p></div><divclass="appicon settings" id="apps/de.sniperger.preferences/index.html"><imgsrc="img/icons/settings.png"><pclass="label">Settings</p></div><divclass="appicon update" id="apps/de.sniperger.update/index.html"><imgsrc="img/icons/AppIcon-Update.png"><pclass="label">Update</p></div><divclass="appicon usercp" id="apps/de.sniperger.usercp/index.html"><imgsrc="img/icons/AppIcon-UserCP.png"><pclass="label">User CP</p></div><divclass="appicon tips" id="apps/de.sniperger.tips/index.html"><imgsrc="img/icons/AppIcon-Tips.png"><pclass="label">Tips</p></div><divclass="appicon setup" id="apps/de.sniperger.setup/index.html"><imgsrc="img/icons/AppIcon-Assistant.png"><pclass="label">Setup</p></div><divclass="appicon feedback" id="apps/de.sniperger.feedback/index.html"><imgsrc="img/icons/AppIcon-Feedback.png"><pclass="label">Feedback</p></div></div></div>```
This is what it will look like (sans the optional labels):
<imgsrc="promo/watch_layout.png" width="200">
_Note: These app icons are not included in WatchUI. This is a beta screenshot from Bug Watch_
As you can see, the apps are rendered around the first app in circles from the center, then from top left to bottom right.
You might need some time to get familiar with how App Icons are ordered. Just play around with it until you're happy.
### App API
If you are using Remote Apps, you can easily create your own apps using JSON. This is what the apps.json file is for. The basic syntax is very easy:
```json
{
"apps": [
[YOUR APPS HERE]
]
}

Apps are added to the apps array, which is, if enabled, loaded into WatchUI and generates the Home Screen. If you want to create your own app, just set the following keys to your desire:

{
"title": "Your App",
"identifier": "yourapp",
"bundleID": "com.yourcompany.yourapp",
"executable": "index.html",
"icon": "img/icons/bugs.png"
}

There are more keys that might get useful in the future:

"preinstalled": true,
"notifications": false,
"color": "#ff730f"

The following method returns an app's info as a JavaScript object, which can be used in notifications:

myApp.watch.core.apps.getAppInfo(appID);

Just replace appID with the application ID you require information from.

Notifications

Framework7 has a great modal system. But for WatchUI, it's not good enough.

 ᴡᴀᴛᴄʜ Notifications consist of two "scenes",

  • the "Short Look" interface, which displays the app icon, the app title and a brief description of what happened, and
  • the "Long Look" interface, which is the notification itself and contains the message and action buttons.

Left: Short Look interface, Right: Long Look interface with custom "Like" button

Because of that extended content, WatchUI needed a custom Notification method. Here is the example that is used in the screenshots above:

app.watch.core.notify({title: "Did you know?",subtitle: app.watch.core.apps.getAppInfo("tips").title,message: "Harvard is officially free for those with less than $65,000 in annual family income.",icon: "img/icons/AppIcon-Tips.png",color: app.watch.core.apps.getAppInfo("tips").color,buttons: [{title: "Like",}]});

You might have noticed that only one of the two buttons is specified in this example. This is because the  ᴡᴀᴛᴄʜ OS automatically adds the "Dismiss" button. The same happens in WatchUI. You'll only need to specify the buttons that contain actions.

Buttons only have title and onClick attributes. The onClick attribute can contain a function that gets called when the button is pressed and the notification is gone (so there's not too much action at once).

Debugging

If you want to display the versions of Framework7, WatchApp, WatchCore or WatchCoreUI anywhere, you can access these attributes from your Framework7 object:

myApp.version/* Framework7 Version */myApp.watch.version/* WatchApp Version */myApp.watch.core.version/* WatchCore Version */myApp.watch.ui.version/* WatchCoreUI Versionn */

WatchUI Code is based on Pipes Apple Watch Demo

About

Apple Watch UI (including optional Home Screen) for Framework7

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

WatchUI for Framework7

Apple Watch UI (including optional Home Screen) for Framework7

Introduction

Framework7 is the best HTML Application Framework for iOS 7-styled apps I can imagine. Fast, versatile, modular. But something was missing.

Apple introduced the  ᴡᴀᴛᴄʜ at the September Special Event, alongside the iPhone 6 and iPhone 6 Plus. It seems to run something like iOS, but with a stripped down UI, easy to read on small screens. I though this would be the perfect addition to Framework7, so I recently started working on WatchUI.

WatchUI is something game developers would call "total conversion", something like what FakeFactory's Cinematic Mod is to Half-Life 2. It changes almost every aspect, but it still keeps that original feeling. That's why my recreation of Bug Reporter⁸, Bug Watch, will be based on WatchUI.

What is included

  • Watch Home Screen (more on that in the docs)
  • Lists
  • Modals (including Alerts and Notifications)
  • Status Bar clock
  • Colored Status Bar titles
  • New page transitions

How does it work

Framework7 is initialized by creating a global variable:

var myApp = new Framework7([params])

WatchUI is initalized by injecting into this variable, which then sets up WatchCore and WatchCoreUI:

myApp.watch = new WatchApp([watch_params])

WatchApp accepts several parameters which enable or disable modules, like the WatchUI Home Screen:

VariableDefault valuePurpose
CoreAppListSource"apps/apps.json"Specifies the origin for the remotely loaded apps.
CoreHideNavbartrueHides or shows Navigation Bar on WatchUI Homescreen (beta).
CoreHomeView$('div.view#home')Specifies the parent DOM element that contains the WatchUI Home Screen.
CoreIndexIdentifier"index"Gets the data-page attribute for the inital Framework7 page.
CoreInitHomeScreentrueEnables/disables the WatchUI Home Screen.
CoreLoadAppsRemotefalseEnables or disables remote app loading for WatchUI.
CoreNavbarClocktrueEnables/disables clock in the upper right corner.
CoreNavbarClockElement$('p.time')Specifies the Element the clock should be applied on.
screenContainer$("#screen-container")Sets the Screen container element.
UIIconSize60If you use bigger or smaller icons than normal, you must change this value.
UIBubbleSize80Specifies the size of the icon zoom area of the Home Screen. Which is apparently a bubbble.
UIScrollRangeX35How far the user can scroll in X direction. Default icon size: 35px per circle while having more than one icon.
UIScrollRangeY55How far the user can scroll in Y direction. Default icon size: 55px per circle while having more than one icon.
UIEnableAppLabelsfalseEnables/disables optional App labels

Required libraries

WatchUI requires some libraries to work correctly. These libraries include:

  • jQuery
  • Easing for jQuery
  • fastclick.js
  • Veloctiy.js
  • Hammer.js

Each of these libraries is included in js/lib/

Including WatchUI in your app

Let's assume you already have included Framework7. First, include the required CSS files.

<linkrel="stylesheet" type="text/css" href="css/WatchUI.css"><linkrel="stylesheet" type="text/css" href="css/WatchUI-home.css">

If you are not going to use the WatchUI Home Screen, you can ignoreWatchUI-home.css

After you have included the stylesheets, you can continue to include the JavaScript files. You might want to include WatchUI at the end of the page. After you did that, you can initalize WatchUI alongside Framework7.

[...]
<scripttype="text/javascript" src="js/lib/jquery.js"></script><scripttype="text/javascript" src="js/lib/jquery.easing.1.3.js"></script><scripttype="text/javascript" src="js/lib/fastclick.js"></script><scripttype="text/javascript" src="js/lib/velocity.min.js"></script><scripttype="text/javascript" src="js/lib/hammer.min.js"></script><scripttype="text/javascript" src="js/WatchUI-1.0.1.js"></script><script>
var myApp = new Framework7();
myApp.watch = new WatchApp({
/* Optional parameters */
});
<script>

WatchCore and WatchCoreUI can be accessed always through myApp.watch.core and myApp.watch.ui.

WatchUI Home Screen

Notes:

  • CoreInitHomeScreen needs to be true
  • Navigation Bars should be hidden on Home Screen (CoreHideNavbars)

The Home Screen uses a special DOM layout. The Screen container is located right after the opening <body> tag. This is an example that is used in Bug Watch:

<divid="screen-container"><divclass="view" id="home"><divclass="appicon bugs" id="apps/de.sniperger.bugs/index.html"><imgsrc="img/icons/bugs.png"><pclass="label">Bugs</p></div><divclass="appicon settings" id="apps/de.sniperger.preferences/index.html"><imgsrc="img/icons/settings.png"><pclass="label">Settings</p></div><divclass="appicon update" id="apps/de.sniperger.update/index.html"><imgsrc="img/icons/AppIcon-Update.png"><pclass="label">Update</p></div><divclass="appicon usercp" id="apps/de.sniperger.usercp/index.html"><imgsrc="img/icons/AppIcon-UserCP.png"><pclass="label">User CP</p></div><divclass="appicon tips" id="apps/de.sniperger.tips/index.html"><imgsrc="img/icons/AppIcon-Tips.png"><pclass="label">Tips</p></div><divclass="appicon setup" id="apps/de.sniperger.setup/index.html"><imgsrc="img/icons/AppIcon-Assistant.png"><pclass="label">Setup</p></div><divclass="appicon feedback" id="apps/de.sniperger.feedback/index.html"><imgsrc="img/icons/AppIcon-Feedback.png"><pclass="label">Feedback</p></div></div></div>```
This is what it will look like (sans the optional labels):
<imgsrc="promo/watch_layout.png" width="200">
_Note: These app icons are not included in WatchUI. This is a beta screenshot from Bug Watch_
As you can see, the apps are rendered around the first app in circles from the center, then from top left to bottom right.
You might need some time to get familiar with how App Icons are ordered. Just play around with it until you're happy.
### App API
If you are using Remote Apps, you can easily create your own apps using JSON. This is what the apps.json file is for. The basic syntax is very easy:
```json
{
"apps": [
[YOUR APPS HERE]
]
}

Apps are added to the apps array, which is, if enabled, loaded into WatchUI and generates the Home Screen. If you want to create your own app, just set the following keys to your desire:

{
"title": "Your App",
"identifier": "yourapp",
"bundleID": "com.yourcompany.yourapp",
"executable": "index.html",
"icon": "img/icons/bugs.png"
}

There are more keys that might get useful in the future:

"preinstalled": true,
"notifications": false,
"color": "#ff730f"

The following method returns an app's info as a JavaScript object, which can be used in notifications:

myApp.watch.core.apps.getAppInfo(appID);

Just replace appID with the application ID you require information from.

Notifications

Framework7 has a great modal system. But for WatchUI, it's not good enough.

 ᴡᴀᴛᴄʜ Notifications consist of two "scenes",

  • the "Short Look" interface, which displays the app icon, the app title and a brief description of what happened, and
  • the "Long Look" interface, which is the notification itself and contains the message and action buttons.

Left: Short Look interface, Right: Long Look interface with custom "Like" button

Because of that extended content, WatchUI needed a custom Notification method. Here is the example that is used in the screenshots above:

app.watch.core.notify({title: "Did you know?",subtitle: app.watch.core.apps.getAppInfo("tips").title,message: "Harvard is officially free for those with less than $65,000 in annual family income.",icon: "img/icons/AppIcon-Tips.png",color: app.watch.core.apps.getAppInfo("tips").color,buttons: [{title: "Like",}]});

You might have noticed that only one of the two buttons is specified in this example. This is because the  ᴡᴀᴛᴄʜ OS automatically adds the "Dismiss" button. The same happens in WatchUI. You'll only need to specify the buttons that contain actions.

Buttons only have title and onClick attributes. The onClick attribute can contain a function that gets called when the button is pressed and the notification is gone (so there's not too much action at once).

Debugging

If you want to display the versions of Framework7, WatchApp, WatchCore or WatchCoreUI anywhere, you can access these attributes from your Framework7 object:

myApp.version/* Framework7 Version */myApp.watch.version/* WatchApp Version */myApp.watch.core.version/* WatchCore Version */myApp.watch.ui.version/* WatchCoreUI Versionn */

WatchUI Code is based on Pipes Apple Watch Demo

About

Apple Watch UI (including optional Home Screen) for Framework7

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

WatchUI for Framework7

Apple Watch UI (including optional Home Screen) for Framework7

Introduction

Framework7 is the best HTML Application Framework for iOS 7-styled apps I can imagine. Fast, versatile, modular. But something was missing.

Apple introduced the  ᴡᴀᴛᴄʜ at the September Special Event, alongside the iPhone 6 and iPhone 6 Plus. It seems to run something like iOS, but with a stripped down UI, easy to read on small screens. I though this would be the perfect addition to Framework7, so I recently started working on WatchUI.

WatchUI is something game developers would call "total conversion", something like what FakeFactory's Cinematic Mod is to Half-Life 2. It changes almost every aspect, but it still keeps that original feeling. That's why my recreation of Bug Reporter⁸, Bug Watch, will be based on WatchUI.

What is included

  • Watch Home Screen (more on that in the docs)
  • Lists
  • Modals (including Alerts and Notifications)
  • Status Bar clock
  • Colored Status Bar titles
  • New page transitions

How does it work

Framework7 is initialized by creating a global variable:

var myApp = new Framework7([params])

WatchUI is initalized by injecting into this variable, which then sets up WatchCore and WatchCoreUI:

myApp.watch = new WatchApp([watch_params])

WatchApp accepts several parameters which enable or disable modules, like the WatchUI Home Screen:

VariableDefault valuePurpose
CoreAppListSource"apps/apps.json"Specifies the origin for the remotely loaded apps.
CoreHideNavbartrueHides or shows Navigation Bar on WatchUI Homescreen (beta).
CoreHomeView$('div.view#home')Specifies the parent DOM element that contains the WatchUI Home Screen.
CoreIndexIdentifier"index"Gets the data-page attribute for the inital Framework7 page.
CoreInitHomeScreentrueEnables/disables the WatchUI Home Screen.
CoreLoadAppsRemotefalseEnables or disables remote app loading for WatchUI.
CoreNavbarClocktrueEnables/disables clock in the upper right corner.
CoreNavbarClockElement$('p.time')Specifies the Element the clock should be applied on.
screenContainer$("#screen-container")Sets the Screen container element.
UIIconSize60If you use bigger or smaller icons than normal, you must change this value.
UIBubbleSize80Specifies the size of the icon zoom area of the Home Screen. Which is apparently a bubbble.
UIScrollRangeX35How far the user can scroll in X direction. Default icon size: 35px per circle while having more than one icon.
UIScrollRangeY55How far the user can scroll in Y direction. Default icon size: 55px per circle while having more than one icon.
UIEnableAppLabelsfalseEnables/disables optional App labels

Required libraries

WatchUI requires some libraries to work correctly. These libraries include:

  • jQuery
  • Easing for jQuery
  • fastclick.js
  • Veloctiy.js
  • Hammer.js

Each of these libraries is included in js/lib/

Including WatchUI in your app

Let's assume you already have included Framework7. First, include the required CSS files.

<linkrel="stylesheet" type="text/css" href="css/WatchUI.css"><linkrel="stylesheet" type="text/css" href="css/WatchUI-home.css">

If you are not going to use the WatchUI Home Screen, you can ignoreWatchUI-home.css

After you have included the stylesheets, you can continue to include the JavaScript files. You might want to include WatchUI at the end of the page. After you did that, you can initalize WatchUI alongside Framework7.

[...]
<scripttype="text/javascript" src="js/lib/jquery.js"></script><scripttype="text/javascript" src="js/lib/jquery.easing.1.3.js"></script><scripttype="text/javascript" src="js/lib/fastclick.js"></script><scripttype="text/javascript" src="js/lib/velocity.min.js"></script><scripttype="text/javascript" src="js/lib/hammer.min.js"></script><scripttype="text/javascript" src="js/WatchUI-1.0.1.js"></script><script>
var myApp = new Framework7();
myApp.watch = new WatchApp({
/* Optional parameters */
});
<script>

WatchCore and WatchCoreUI can be accessed always through myApp.watch.core and myApp.watch.ui.

WatchUI Home Screen

Notes:

  • CoreInitHomeScreen needs to be true
  • Navigation Bars should be hidden on Home Screen (CoreHideNavbars)

The Home Screen uses a special DOM layout. The Screen container is located right after the opening <body> tag. This is an example that is used in Bug Watch:

<divid="screen-container"><divclass="view" id="home"><divclass="appicon bugs" id="apps/de.sniperger.bugs/index.html"><imgsrc="img/icons/bugs.png"><pclass="label">Bugs</p></div><divclass="appicon settings" id="apps/de.sniperger.preferences/index.html"><imgsrc="img/icons/settings.png"><pclass="label">Settings</p></div><divclass="appicon update" id="apps/de.sniperger.update/index.html"><imgsrc="img/icons/AppIcon-Update.png"><pclass="label">Update</p></div><divclass="appicon usercp" id="apps/de.sniperger.usercp/index.html"><imgsrc="img/icons/AppIcon-UserCP.png"><pclass="label">User CP</p></div><divclass="appicon tips" id="apps/de.sniperger.tips/index.html"><imgsrc="img/icons/AppIcon-Tips.png"><pclass="label">Tips</p></div><divclass="appicon setup" id="apps/de.sniperger.setup/index.html"><imgsrc="img/icons/AppIcon-Assistant.png"><pclass="label">Setup</p></div><divclass="appicon feedback" id="apps/de.sniperger.feedback/index.html"><imgsrc="img/icons/AppIcon-Feedback.png"><pclass="label">Feedback</p></div></div></div>```
This is what it will look like (sans the optional labels):
<imgsrc="promo/watch_layout.png" width="200">
_Note: These app icons are not included in WatchUI. This is a beta screenshot from Bug Watch_
As you can see, the apps are rendered around the first app in circles from the center, then from top left to bottom right.
You might need some time to get familiar with how App Icons are ordered. Just play around with it until you're happy.
### App API
If you are using Remote Apps, you can easily create your own apps using JSON. This is what the apps.json file is for. The basic syntax is very easy:
```json
{
"apps": [
[YOUR APPS HERE]
]
}

Apps are added to the apps array, which is, if enabled, loaded into WatchUI and generates the Home Screen. If you want to create your own app, just set the following keys to your desire:

{
"title": "Your App",
"identifier": "yourapp",
"bundleID": "com.yourcompany.yourapp",
"executable": "index.html",
"icon": "img/icons/bugs.png"
}

There are more keys that might get useful in the future:

"preinstalled": true,
"notifications": false,
"color": "#ff730f"

The following method returns an app's info as a JavaScript object, which can be used in notifications:

myApp.watch.core.apps.getAppInfo(appID);

Just replace appID with the application ID you require information from.

Notifications

Framework7 has a great modal system. But for WatchUI, it's not good enough.

 ᴡᴀᴛᴄʜ Notifications consist of two "scenes",

  • the "Short Look" interface, which displays the app icon, the app title and a brief description of what happened, and
  • the "Long Look" interface, which is the notification itself and contains the message and action buttons.

Left: Short Look interface, Right: Long Look interface with custom "Like" button

Because of that extended content, WatchUI needed a custom Notification method. Here is the example that is used in the screenshots above:

app.watch.core.notify({title: "Did you know?",subtitle: app.watch.core.apps.getAppInfo("tips").title,message: "Harvard is officially free for those with less than $65,000 in annual family income.",icon: "img/icons/AppIcon-Tips.png",color: app.watch.core.apps.getAppInfo("tips").color,buttons: [{title: "Like",}]});

You might have noticed that only one of the two buttons is specified in this example. This is because the  ᴡᴀᴛᴄʜ OS automatically adds the "Dismiss" button. The same happens in WatchUI. You'll only need to specify the buttons that contain actions.

Buttons only have title and onClick attributes. The onClick attribute can contain a function that gets called when the button is pressed and the notification is gone (so there's not too much action at once).

Debugging

If you want to display the versions of Framework7, WatchApp, WatchCore or WatchCoreUI anywhere, you can access these attributes from your Framework7 object:

myApp.version/* Framework7 Version */myApp.watch.version/* WatchApp Version */myApp.watch.core.version/* WatchCore Version */myApp.watch.ui.version/* WatchCoreUI Versionn */

WatchUI Code is based on Pipes Apple Watch Demo

About

Apple Watch UI (including optional Home Screen) for Framework7

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

WatchUI for Framework7

Apple Watch UI (including optional Home Screen) for Framework7

Introduction

Framework7 is the best HTML Application Framework for iOS 7-styled apps I can imagine. Fast, versatile, modular. But something was missing.

Apple introduced the  ᴡᴀᴛᴄʜ at the September Special Event, alongside the iPhone 6 and iPhone 6 Plus. It seems to run something like iOS, but with a stripped down UI, easy to read on small screens. I though this would be the perfect addition to Framework7, so I recently started working on WatchUI.

WatchUI is something game developers would call "total conversion", something like what FakeFactory's Cinematic Mod is to Half-Life 2. It changes almost every aspect, but it still keeps that original feeling. That's why my recreation of Bug Reporter⁸, Bug Watch, will be based on WatchUI.

What is included

  • Watch Home Screen (more on that in the docs)
  • Lists
  • Modals (including Alerts and Notifications)
  • Status Bar clock
  • Colored Status Bar titles
  • New page transitions

How does it work

Framework7 is initialized by creating a global variable:

var myApp = new Framework7([params])

WatchUI is initalized by injecting into this variable, which then sets up WatchCore and WatchCoreUI:

myApp.watch = new WatchApp([watch_params])

WatchApp accepts several parameters which enable or disable modules, like the WatchUI Home Screen:

VariableDefault valuePurpose
CoreAppListSource"apps/apps.json"Specifies the origin for the remotely loaded apps.
CoreHideNavbartrueHides or shows Navigation Bar on WatchUI Homescreen (beta).
CoreHomeView$('div.view#home')Specifies the parent DOM element that contains the WatchUI Home Screen.
CoreIndexIdentifier"index"Gets the data-page attribute for the inital Framework7 page.
CoreInitHomeScreentrueEnables/disables the WatchUI Home Screen.
CoreLoadAppsRemotefalseEnables or disables remote app loading for WatchUI.
CoreNavbarClocktrueEnables/disables clock in the upper right corner.
CoreNavbarClockElement$('p.time')Specifies the Element the clock should be applied on.
screenContainer$("#screen-container")Sets the Screen container element.
UIIconSize60If you use bigger or smaller icons than normal, you must change this value.
UIBubbleSize80Specifies the size of the icon zoom area of the Home Screen. Which is apparently a bubbble.
UIScrollRangeX35How far the user can scroll in X direction. Default icon size: 35px per circle while having more than one icon.
UIScrollRangeY55How far the user can scroll in Y direction. Default icon size: 55px per circle while having more than one icon.
UIEnableAppLabelsfalseEnables/disables optional App labels

Required libraries

WatchUI requires some libraries to work correctly. These libraries include:

  • jQuery
  • Easing for jQuery
  • fastclick.js
  • Veloctiy.js
  • Hammer.js

Each of these libraries is included in js/lib/

Including WatchUI in your app

Let's assume you already have included Framework7. First, include the required CSS files.

<linkrel="stylesheet" type="text/css" href="css/WatchUI.css"><linkrel="stylesheet" type="text/css" href="css/WatchUI-home.css">

If you are not going to use the WatchUI Home Screen, you can ignoreWatchUI-home.css

After you have included the stylesheets, you can continue to include the JavaScript files. You might want to include WatchUI at the end of the page. After you did that, you can initalize WatchUI alongside Framework7.

[...]
<scripttype="text/javascript" src="js/lib/jquery.js"></script><scripttype="text/javascript" src="js/lib/jquery.easing.1.3.js"></script><scripttype="text/javascript" src="js/lib/fastclick.js"></script><scripttype="text/javascript" src="js/lib/velocity.min.js"></script><scripttype="text/javascript" src="js/lib/hammer.min.js"></script><scripttype="text/javascript" src="js/WatchUI-1.0.1.js"></script><script>
var myApp = new Framework7();
myApp.watch = new WatchApp({
/* Optional parameters */
});
<script>

WatchCore and WatchCoreUI can be accessed always through myApp.watch.core and myApp.watch.ui.

WatchUI Home Screen

Notes:

  • CoreInitHomeScreen needs to be true
  • Navigation Bars should be hidden on Home Screen (CoreHideNavbars)

The Home Screen uses a special DOM layout. The Screen container is located right after the opening <body> tag. This is an example that is used in Bug Watch:

<divid="screen-container"><divclass="view" id="home"><divclass="appicon bugs" id="apps/de.sniperger.bugs/index.html"><imgsrc="img/icons/bugs.png"><pclass="label">Bugs</p></div><divclass="appicon settings" id="apps/de.sniperger.preferences/index.html"><imgsrc="img/icons/settings.png"><pclass="label">Settings</p></div><divclass="appicon update" id="apps/de.sniperger.update/index.html"><imgsrc="img/icons/AppIcon-Update.png"><pclass="label">Update</p></div><divclass="appicon usercp" id="apps/de.sniperger.usercp/index.html"><imgsrc="img/icons/AppIcon-UserCP.png"><pclass="label">User CP</p></div><divclass="appicon tips" id="apps/de.sniperger.tips/index.html"><imgsrc="img/icons/AppIcon-Tips.png"><pclass="label">Tips</p></div><divclass="appicon setup" id="apps/de.sniperger.setup/index.html"><imgsrc="img/icons/AppIcon-Assistant.png"><pclass="label">Setup</p></div><divclass="appicon feedback" id="apps/de.sniperger.feedback/index.html"><imgsrc="img/icons/AppIcon-Feedback.png"><pclass="label">Feedback</p></div></div></div>```
This is what it will look like (sans the optional labels):
<imgsrc="promo/watch_layout.png" width="200">
_Note: These app icons are not included in WatchUI. This is a beta screenshot from Bug Watch_
As you can see, the apps are rendered around the first app in circles from the center, then from top left to bottom right.
You might need some time to get familiar with how App Icons are ordered. Just play around with it until you're happy.
### App API
If you are using Remote Apps, you can easily create your own apps using JSON. This is what the apps.json file is for. The basic syntax is very easy:
```json
{
"apps": [
[YOUR APPS HERE]
]
}

Apps are added to the apps array, which is, if enabled, loaded into WatchUI and generates the Home Screen. If you want to create your own app, just set the following keys to your desire:

{
"title": "Your App",
"identifier": "yourapp",
"bundleID": "com.yourcompany.yourapp",
"executable": "index.html",
"icon": "img/icons/bugs.png"
}

There are more keys that might get useful in the future:

"preinstalled": true,
"notifications": false,
"color": "#ff730f"

The following method returns an app's info as a JavaScript object, which can be used in notifications:

myApp.watch.core.apps.getAppInfo(appID);

Just replace appID with the application ID you require information from.

Notifications

Framework7 has a great modal system. But for WatchUI, it's not good enough.

 ᴡᴀᴛᴄʜ Notifications consist of two "scenes",

  • the "Short Look" interface, which displays the app icon, the app title and a brief description of what happened, and
  • the "Long Look" interface, which is the notification itself and contains the message and action buttons.

Left: Short Look interface, Right: Long Look interface with custom "Like" button

Because of that extended content, WatchUI needed a custom Notification method. Here is the example that is used in the screenshots above:

app.watch.core.notify({title: "Did you know?",subtitle: app.watch.core.apps.getAppInfo("tips").title,message: "Harvard is officially free for those with less than $65,000 in annual family income.",icon: "img/icons/AppIcon-Tips.png",color: app.watch.core.apps.getAppInfo("tips").color,buttons: [{title: "Like",}]});

You might have noticed that only one of the two buttons is specified in this example. This is because the  ᴡᴀᴛᴄʜ OS automatically adds the "Dismiss" button. The same happens in WatchUI. You'll only need to specify the buttons that contain actions.

Buttons only have title and onClick attributes. The onClick attribute can contain a function that gets called when the button is pressed and the notification is gone (so there's not too much action at once).

Debugging

If you want to display the versions of Framework7, WatchApp, WatchCore or WatchCoreUI anywhere, you can access these attributes from your Framework7 object:

myApp.version/* Framework7 Version */myApp.watch.version/* WatchApp Version */myApp.watch.core.version/* WatchCore Version */myApp.watch.ui.version/* WatchCoreUI Versionn */

WatchUI Code is based on Pipes Apple Watch Demo

About

Apple Watch UI (including optional Home Screen) for Framework7

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

WatchUI for Framework7

Apple Watch UI (including optional Home Screen) for Framework7

Introduction

Framework7 is the best HTML Application Framework for iOS 7-styled apps I can imagine. Fast, versatile, modular. But something was missing.

Apple introduced the  ᴡᴀᴛᴄʜ at the September Special Event, alongside the iPhone 6 and iPhone 6 Plus. It seems to run something like iOS, but with a stripped down UI, easy to read on small screens. I though this would be the perfect addition to Framework7, so I recently started working on WatchUI.

WatchUI is something game developers would call "total conversion", something like what FakeFactory's Cinematic Mod is to Half-Life 2. It changes almost every aspect, but it still keeps that original feeling. That's why my recreation of Bug Reporter⁸, Bug Watch, will be based on WatchUI.

What is included

  • Watch Home Screen (more on that in the docs)
  • Lists
  • Modals (including Alerts and Notifications)
  • Status Bar clock
  • Colored Status Bar titles
  • New page transitions

How does it work

Framework7 is initialized by creating a global variable:

var myApp = new Framework7([params])

WatchUI is initalized by injecting into this variable, which then sets up WatchCore and WatchCoreUI:

myApp.watch = new WatchApp([watch_params])

WatchApp accepts several parameters which enable or disable modules, like the WatchUI Home Screen:

VariableDefault valuePurpose
CoreAppListSource"apps/apps.json"Specifies the origin for the remotely loaded apps.
CoreHideNavbartrueHides or shows Navigation Bar on WatchUI Homescreen (beta).
CoreHomeView$('div.view#home')Specifies the parent DOM element that contains the WatchUI Home Screen.
CoreIndexIdentifier"index"Gets the data-page attribute for the inital Framework7 page.
CoreInitHomeScreentrueEnables/disables the WatchUI Home Screen.
CoreLoadAppsRemotefalseEnables or disables remote app loading for WatchUI.
CoreNavbarClocktrueEnables/disables clock in the upper right corner.
CoreNavbarClockElement$('p.time')Specifies the Element the clock should be applied on.
screenContainer$("#screen-container")Sets the Screen container element.
UIIconSize60If you use bigger or smaller icons than normal, you must change this value.
UIBubbleSize80Specifies the size of the icon zoom area of the Home Screen. Which is apparently a bubbble.
UIScrollRangeX35How far the user can scroll in X direction. Default icon size: 35px per circle while having more than one icon.
UIScrollRangeY55How far the user can scroll in Y direction. Default icon size: 55px per circle while having more than one icon.
UIEnableAppLabelsfalseEnables/disables optional App labels

Required libraries

WatchUI requires some libraries to work correctly. These libraries include:

  • jQuery
  • Easing for jQuery
  • fastclick.js
  • Veloctiy.js
  • Hammer.js

Each of these libraries is included in js/lib/

Including WatchUI in your app

Let's assume you already have included Framework7. First, include the required CSS files.

<linkrel="stylesheet" type="text/css" href="css/WatchUI.css"><linkrel="stylesheet" type="text/css" href="css/WatchUI-home.css">

If you are not going to use the WatchUI Home Screen, you can ignoreWatchUI-home.css

After you have included the stylesheets, you can continue to include the JavaScript files. You might want to include WatchUI at the end of the page. After you did that, you can initalize WatchUI alongside Framework7.

[...]
<scripttype="text/javascript" src="js/lib/jquery.js"></script><scripttype="text/javascript" src="js/lib/jquery.easing.1.3.js"></script><scripttype="text/javascript" src="js/lib/fastclick.js"></script><scripttype="text/javascript" src="js/lib/velocity.min.js"></script><scripttype="text/javascript" src="js/lib/hammer.min.js"></script><scripttype="text/javascript" src="js/WatchUI-1.0.1.js"></script><script>
var myApp = new Framework7();
myApp.watch = new WatchApp({
/* Optional parameters */
});
<script>

WatchCore and WatchCoreUI can be accessed always through myApp.watch.core and myApp.watch.ui.

WatchUI Home Screen

Notes:

  • CoreInitHomeScreen needs to be true
  • Navigation Bars should be hidden on Home Screen (CoreHideNavbars)

The Home Screen uses a special DOM layout. The Screen container is located right after the opening <body> tag. This is an example that is used in Bug Watch:

<divid="screen-container"><divclass="view" id="home"><divclass="appicon bugs" id="apps/de.sniperger.bugs/index.html"><imgsrc="img/icons/bugs.png"><pclass="label">Bugs</p></div><divclass="appicon settings" id="apps/de.sniperger.preferences/index.html"><imgsrc="img/icons/settings.png"><pclass="label">Settings</p></div><divclass="appicon update" id="apps/de.sniperger.update/index.html"><imgsrc="img/icons/AppIcon-Update.png"><pclass="label">Update</p></div><divclass="appicon usercp" id="apps/de.sniperger.usercp/index.html"><imgsrc="img/icons/AppIcon-UserCP.png"><pclass="label">User CP</p></div><divclass="appicon tips" id="apps/de.sniperger.tips/index.html"><imgsrc="img/icons/AppIcon-Tips.png"><pclass="label">Tips</p></div><divclass="appicon setup" id="apps/de.sniperger.setup/index.html"><imgsrc="img/icons/AppIcon-Assistant.png"><pclass="label">Setup</p></div><divclass="appicon feedback" id="apps/de.sniperger.feedback/index.html"><imgsrc="img/icons/AppIcon-Feedback.png"><pclass="label">Feedback</p></div></div></div>```
This is what it will look like (sans the optional labels):
<imgsrc="promo/watch_layout.png" width="200">
_Note: These app icons are not included in WatchUI. This is a beta screenshot from Bug Watch_
As you can see, the apps are rendered around the first app in circles from the center, then from top left to bottom right.
You might need some time to get familiar with how App Icons are ordered. Just play around with it until you're happy.
### App API
If you are using Remote Apps, you can easily create your own apps using JSON. This is what the apps.json file is for. The basic syntax is very easy:
```json
{
"apps": [
[YOUR APPS HERE]
]
}

Apps are added to the apps array, which is, if enabled, loaded into WatchUI and generates the Home Screen. If you want to create your own app, just set the following keys to your desire:

{
"title": "Your App",
"identifier": "yourapp",
"bundleID": "com.yourcompany.yourapp",
"executable": "index.html",
"icon": "img/icons/bugs.png"
}

There are more keys that might get useful in the future:

"preinstalled": true,
"notifications": false,
"color": "#ff730f"

The following method returns an app's info as a JavaScript object, which can be used in notifications:

myApp.watch.core.apps.getAppInfo(appID);

Just replace appID with the application ID you require information from.

Notifications

Framework7 has a great modal system. But for WatchUI, it's not good enough.

 ᴡᴀᴛᴄʜ Notifications consist of two "scenes",

  • the "Short Look" interface, which displays the app icon, the app title and a brief description of what happened, and
  • the "Long Look" interface, which is the notification itself and contains the message and action buttons.

Left: Short Look interface, Right: Long Look interface with custom "Like" button

Because of that extended content, WatchUI needed a custom Notification method. Here is the example that is used in the screenshots above:

app.watch.core.notify({title: "Did you know?",subtitle: app.watch.core.apps.getAppInfo("tips").title,message: "Harvard is officially free for those with less than $65,000 in annual family income.",icon: "img/icons/AppIcon-Tips.png",color: app.watch.core.apps.getAppInfo("tips").color,buttons: [{title: "Like",}]});

You might have noticed that only one of the two buttons is specified in this example. This is because the  ᴡᴀᴛᴄʜ OS automatically adds the "Dismiss" button. The same happens in WatchUI. You'll only need to specify the buttons that contain actions.

Buttons only have title and onClick attributes. The onClick attribute can contain a function that gets called when the button is pressed and the notification is gone (so there's not too much action at once).

Debugging

If you want to display the versions of Framework7, WatchApp, WatchCore or WatchCoreUI anywhere, you can access these attributes from your Framework7 object:

myApp.version/* Framework7 Version */myApp.watch.version/* WatchApp Version */myApp.watch.core.version/* WatchCore Version */myApp.watch.ui.version/* WatchCoreUI Versionn */

WatchUI Code is based on Pipes Apple Watch Demo

About

Apple Watch UI (including optional Home Screen) for Framework7

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

WatchUI for Framework7

Apple Watch UI (including optional Home Screen) for Framework7

Introduction

Framework7 is the best HTML Application Framework for iOS 7-styled apps I can imagine. Fast, versatile, modular. But something was missing.

Apple introduced the  ᴡᴀᴛᴄʜ at the September Special Event, alongside the iPhone 6 and iPhone 6 Plus. It seems to run something like iOS, but with a stripped down UI, easy to read on small screens. I though this would be the perfect addition to Framework7, so I recently started working on WatchUI.

WatchUI is something game developers would call "total conversion", something like what FakeFactory's Cinematic Mod is to Half-Life 2. It changes almost every aspect, but it still keeps that original feeling. That's why my recreation of Bug Reporter⁸, Bug Watch, will be based on WatchUI.

What is included

  • Watch Home Screen (more on that in the docs)
  • Lists
  • Modals (including Alerts and Notifications)
  • Status Bar clock
  • Colored Status Bar titles
  • New page transitions

How does it work

Framework7 is initialized by creating a global variable:

var myApp = new Framework7([params])

WatchUI is initalized by injecting into this variable, which then sets up WatchCore and WatchCoreUI:

myApp.watch = new WatchApp([watch_params])

WatchApp accepts several parameters which enable or disable modules, like the WatchUI Home Screen:

VariableDefault valuePurpose
CoreAppListSource"apps/apps.json"Specifies the origin for the remotely loaded apps.
CoreHideNavbartrueHides or shows Navigation Bar on WatchUI Homescreen (beta).
CoreHomeView$('div.view#home')Specifies the parent DOM element that contains the WatchUI Home Screen.
CoreIndexIdentifier"index"Gets the data-page attribute for the inital Framework7 page.
CoreInitHomeScreentrueEnables/disables the WatchUI Home Screen.
CoreLoadAppsRemotefalseEnables or disables remote app loading for WatchUI.
CoreNavbarClocktrueEnables/disables clock in the upper right corner.
CoreNavbarClockElement$('p.time')Specifies the Element the clock should be applied on.
screenContainer$("#screen-container")Sets the Screen container element.
UIIconSize60If you use bigger or smaller icons than normal, you must change this value.
UIBubbleSize80Specifies the size of the icon zoom area of the Home Screen. Which is apparently a bubbble.
UIScrollRangeX35How far the user can scroll in X direction. Default icon size: 35px per circle while having more than one icon.
UIScrollRangeY55How far the user can scroll in Y direction. Default icon size: 55px per circle while having more than one icon.
UIEnableAppLabelsfalseEnables/disables optional App labels

Required libraries

WatchUI requires some libraries to work correctly. These libraries include:

  • jQuery
  • Easing for jQuery
  • fastclick.js
  • Veloctiy.js
  • Hammer.js

Each of these libraries is included in js/lib/

Including WatchUI in your app

Let's assume you already have included Framework7. First, include the required CSS files.

<linkrel="stylesheet" type="text/css" href="css/WatchUI.css"><linkrel="stylesheet" type="text/css" href="css/WatchUI-home.css">

If you are not going to use the WatchUI Home Screen, you can ignoreWatchUI-home.css

After you have included the stylesheets, you can continue to include the JavaScript files. You might want to include WatchUI at the end of the page. After you did that, you can initalize WatchUI alongside Framework7.

[...]
<scripttype="text/javascript" src="js/lib/jquery.js"></script><scripttype="text/javascript" src="js/lib/jquery.easing.1.3.js"></script><scripttype="text/javascript" src="js/lib/fastclick.js"></script><scripttype="text/javascript" src="js/lib/velocity.min.js"></script><scripttype="text/javascript" src="js/lib/hammer.min.js"></script><scripttype="text/javascript" src="js/WatchUI-1.0.1.js"></script><script>
var myApp = new Framework7();
myApp.watch = new WatchApp({
/* Optional parameters */
});
<script>

WatchCore and WatchCoreUI can be accessed always through myApp.watch.core and myApp.watch.ui.

WatchUI Home Screen

Notes:

  • CoreInitHomeScreen needs to be true
  • Navigation Bars should be hidden on Home Screen (CoreHideNavbars)

The Home Screen uses a special DOM layout. The Screen container is located right after the opening <body> tag. This is an example that is used in Bug Watch:

<divid="screen-container"><divclass="view" id="home"><divclass="appicon bugs" id="apps/de.sniperger.bugs/index.html"><imgsrc="img/icons/bugs.png"><pclass="label">Bugs</p></div><divclass="appicon settings" id="apps/de.sniperger.preferences/index.html"><imgsrc="img/icons/settings.png"><pclass="label">Settings</p></div><divclass="appicon update" id="apps/de.sniperger.update/index.html"><imgsrc="img/icons/AppIcon-Update.png"><pclass="label">Update</p></div><divclass="appicon usercp" id="apps/de.sniperger.usercp/index.html"><imgsrc="img/icons/AppIcon-UserCP.png"><pclass="label">User CP</p></div><divclass="appicon tips" id="apps/de.sniperger.tips/index.html"><imgsrc="img/icons/AppIcon-Tips.png"><pclass="label">Tips</p></div><divclass="appicon setup" id="apps/de.sniperger.setup/index.html"><imgsrc="img/icons/AppIcon-Assistant.png"><pclass="label">Setup</p></div><divclass="appicon feedback" id="apps/de.sniperger.feedback/index.html"><imgsrc="img/icons/AppIcon-Feedback.png"><pclass="label">Feedback</p></div></div></div>```
This is what it will look like (sans the optional labels):
<imgsrc="promo/watch_layout.png" width="200">
_Note: These app icons are not included in WatchUI. This is a beta screenshot from Bug Watch_
As you can see, the apps are rendered around the first app in circles from the center, then from top left to bottom right.
You might need some time to get familiar with how App Icons are ordered. Just play around with it until you're happy.
### App API
If you are using Remote Apps, you can easily create your own apps using JSON. This is what the apps.json file is for. The basic syntax is very easy:
```json
{
"apps": [
[YOUR APPS HERE]
]
}

Apps are added to the apps array, which is, if enabled, loaded into WatchUI and generates the Home Screen. If you want to create your own app, just set the following keys to your desire:

{
"title": "Your App",
"identifier": "yourapp",
"bundleID": "com.yourcompany.yourapp",
"executable": "index.html",
"icon": "img/icons/bugs.png"
}

There are more keys that might get useful in the future:

"preinstalled": true,
"notifications": false,
"color": "#ff730f"

The following method returns an app's info as a JavaScript object, which can be used in notifications:

myApp.watch.core.apps.getAppInfo(appID);

Just replace appID with the application ID you require information from.

Notifications

Framework7 has a great modal system. But for WatchUI, it's not good enough.

 ᴡᴀᴛᴄʜ Notifications consist of two "scenes",

  • the "Short Look" interface, which displays the app icon, the app title and a brief description of what happened, and
  • the "Long Look" interface, which is the notification itself and contains the message and action buttons.

Left: Short Look interface, Right: Long Look interface with custom "Like" button

Because of that extended content, WatchUI needed a custom Notification method. Here is the example that is used in the screenshots above:

app.watch.core.notify({title: "Did you know?",subtitle: app.watch.core.apps.getAppInfo("tips").title,message: "Harvard is officially free for those with less than $65,000 in annual family income.",icon: "img/icons/AppIcon-Tips.png",color: app.watch.core.apps.getAppInfo("tips").color,buttons: [{title: "Like",}]});

You might have noticed that only one of the two buttons is specified in this example. This is because the  ᴡᴀᴛᴄʜ OS automatically adds the "Dismiss" button. The same happens in WatchUI. You'll only need to specify the buttons that contain actions.

Buttons only have title and onClick attributes. The onClick attribute can contain a function that gets called when the button is pressed and the notification is gone (so there's not too much action at once).

Debugging

If you want to display the versions of Framework7, WatchApp, WatchCore or WatchCoreUI anywhere, you can access these attributes from your Framework7 object:

myApp.version/* Framework7 Version */myApp.watch.version/* WatchApp Version */myApp.watch.core.version/* WatchCore Version */myApp.watch.ui.version/* WatchCoreUI Versionn */

WatchUI Code is based on Pipes Apple Watch Demo

About

Apple Watch UI (including optional Home Screen) for Framework7

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

WatchUI for Framework7

Apple Watch UI (including optional Home Screen) for Framework7

Introduction

Framework7 is the best HTML Application Framework for iOS 7-styled apps I can imagine. Fast, versatile, modular. But something was missing.

Apple introduced the  ᴡᴀᴛᴄʜ at the September Special Event, alongside the iPhone 6 and iPhone 6 Plus. It seems to run something like iOS, but with a stripped down UI, easy to read on small screens. I though this would be the perfect addition to Framework7, so I recently started working on WatchUI.

WatchUI is something game developers would call "total conversion", something like what FakeFactory's Cinematic Mod is to Half-Life 2. It changes almost every aspect, but it still keeps that original feeling. That's why my recreation of Bug Reporter⁸, Bug Watch, will be based on WatchUI.

What is included

  • Watch Home Screen (more on that in the docs)
  • Lists
  • Modals (including Alerts and Notifications)
  • Status Bar clock
  • Colored Status Bar titles
  • New page transitions

How does it work

Framework7 is initialized by creating a global variable:

var myApp = new Framework7([params])

WatchUI is initalized by injecting into this variable, which then sets up WatchCore and WatchCoreUI:

myApp.watch = new WatchApp([watch_params])

WatchApp accepts several parameters which enable or disable modules, like the WatchUI Home Screen:

VariableDefault valuePurpose
CoreAppListSource"apps/apps.json"Specifies the origin for the remotely loaded apps.
CoreHideNavbartrueHides or shows Navigation Bar on WatchUI Homescreen (beta).
CoreHomeView$('div.view#home')Specifies the parent DOM element that contains the WatchUI Home Screen.
CoreIndexIdentifier"index"Gets the data-page attribute for the inital Framework7 page.
CoreInitHomeScreentrueEnables/disables the WatchUI Home Screen.
CoreLoadAppsRemotefalseEnables or disables remote app loading for WatchUI.
CoreNavbarClocktrueEnables/disables clock in the upper right corner.
CoreNavbarClockElement$('p.time')Specifies the Element the clock should be applied on.
screenContainer$("#screen-container")Sets the Screen container element.
UIIconSize60If you use bigger or smaller icons than normal, you must change this value.
UIBubbleSize80Specifies the size of the icon zoom area of the Home Screen. Which is apparently a bubbble.
UIScrollRangeX35How far the user can scroll in X direction. Default icon size: 35px per circle while having more than one icon.
UIScrollRangeY55How far the user can scroll in Y direction. Default icon size: 55px per circle while having more than one icon.
UIEnableAppLabelsfalseEnables/disables optional App labels

Required libraries

WatchUI requires some libraries to work correctly. These libraries include:

  • jQuery
  • Easing for jQuery
  • fastclick.js
  • Veloctiy.js
  • Hammer.js

Each of these libraries is included in js/lib/

Including WatchUI in your app

Let's assume you already have included Framework7. First, include the required CSS files.

<linkrel="stylesheet" type="text/css" href="css/WatchUI.css"><linkrel="stylesheet" type="text/css" href="css/WatchUI-home.css">

If you are not going to use the WatchUI Home Screen, you can ignoreWatchUI-home.css

After you have included the stylesheets, you can continue to include the JavaScript files. You might want to include WatchUI at the end of the page. After you did that, you can initalize WatchUI alongside Framework7.

[...]
<scripttype="text/javascript" src="js/lib/jquery.js"></script><scripttype="text/javascript" src="js/lib/jquery.easing.1.3.js"></script><scripttype="text/javascript" src="js/lib/fastclick.js"></script><scripttype="text/javascript" src="js/lib/velocity.min.js"></script><scripttype="text/javascript" src="js/lib/hammer.min.js"></script><scripttype="text/javascript" src="js/WatchUI-1.0.1.js"></script><script>
var myApp = new Framework7();
myApp.watch = new WatchApp({
/* Optional parameters */
});
<script>

WatchCore and WatchCoreUI can be accessed always through myApp.watch.core and myApp.watch.ui.

WatchUI Home Screen

Notes:

  • CoreInitHomeScreen needs to be true
  • Navigation Bars should be hidden on Home Screen (CoreHideNavbars)

The Home Screen uses a special DOM layout. The Screen container is located right after the opening <body> tag. This is an example that is used in Bug Watch:

<divid="screen-container"><divclass="view" id="home"><divclass="appicon bugs" id="apps/de.sniperger.bugs/index.html"><imgsrc="img/icons/bugs.png"><pclass="label">Bugs</p></div><divclass="appicon settings" id="apps/de.sniperger.preferences/index.html"><imgsrc="img/icons/settings.png"><pclass="label">Settings</p></div><divclass="appicon update" id="apps/de.sniperger.update/index.html"><imgsrc="img/icons/AppIcon-Update.png"><pclass="label">Update</p></div><divclass="appicon usercp" id="apps/de.sniperger.usercp/index.html"><imgsrc="img/icons/AppIcon-UserCP.png"><pclass="label">User CP</p></div><divclass="appicon tips" id="apps/de.sniperger.tips/index.html"><imgsrc="img/icons/AppIcon-Tips.png"><pclass="label">Tips</p></div><divclass="appicon setup" id="apps/de.sniperger.setup/index.html"><imgsrc="img/icons/AppIcon-Assistant.png"><pclass="label">Setup</p></div><divclass="appicon feedback" id="apps/de.sniperger.feedback/index.html"><imgsrc="img/icons/AppIcon-Feedback.png"><pclass="label">Feedback</p></div></div></div>```
This is what it will look like (sans the optional labels):
<imgsrc="promo/watch_layout.png" width="200">
_Note: These app icons are not included in WatchUI. This is a beta screenshot from Bug Watch_
As you can see, the apps are rendered around the first app in circles from the center, then from top left to bottom right.
You might need some time to get familiar with how App Icons are ordered. Just play around with it until you're happy.
### App API
If you are using Remote Apps, you can easily create your own apps using JSON. This is what the apps.json file is for. The basic syntax is very easy:
```json
{
"apps": [
[YOUR APPS HERE]
]
}

Apps are added to the apps array, which is, if enabled, loaded into WatchUI and generates the Home Screen. If you want to create your own app, just set the following keys to your desire:

{
"title": "Your App",
"identifier": "yourapp",
"bundleID": "com.yourcompany.yourapp",
"executable": "index.html",
"icon": "img/icons/bugs.png"
}

There are more keys that might get useful in the future:

"preinstalled": true,
"notifications": false,
"color": "#ff730f"

The following method returns an app's info as a JavaScript object, which can be used in notifications:

myApp.watch.core.apps.getAppInfo(appID);

Just replace appID with the application ID you require information from.

Notifications

Framework7 has a great modal system. But for WatchUI, it's not good enough.

 ᴡᴀᴛᴄʜ Notifications consist of two "scenes",

  • the "Short Look" interface, which displays the app icon, the app title and a brief description of what happened, and
  • the "Long Look" interface, which is the notification itself and contains the message and action buttons.

Left: Short Look interface, Right: Long Look interface with custom "Like" button

Because of that extended content, WatchUI needed a custom Notification method. Here is the example that is used in the screenshots above:

app.watch.core.notify({title: "Did you know?",subtitle: app.watch.core.apps.getAppInfo("tips").title,message: "Harvard is officially free for those with less than $65,000 in annual family income.",icon: "img/icons/AppIcon-Tips.png",color: app.watch.core.apps.getAppInfo("tips").color,buttons: [{title: "Like",}]});

You might have noticed that only one of the two buttons is specified in this example. This is because the  ᴡᴀᴛᴄʜ OS automatically adds the "Dismiss" button. The same happens in WatchUI. You'll only need to specify the buttons that contain actions.

Buttons only have title and onClick attributes. The onClick attribute can contain a function that gets called when the button is pressed and the notification is gone (so there's not too much action at once).

Debugging

If you want to display the versions of Framework7, WatchApp, WatchCore or WatchCoreUI anywhere, you can access these attributes from your Framework7 object:

myApp.version/* Framework7 Version */myApp.watch.version/* WatchApp Version */myApp.watch.core.version/* WatchCore Version */myApp.watch.ui.version/* WatchCoreUI Versionn */

WatchUI Code is based on Pipes Apple Watch Demo

About

Apple Watch UI (including optional Home Screen) for Framework7

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages