State A: collapse-to-answered-summary UI, with entrance animation
Answering a question collapses it to a one-line green summary with a "Change" link; the next question/instructions animate in below. This is the checkpoint to compare against the "always-visible options, grows downward" experiment (State B). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DyvzxcY41RmRYDebTWxuFo
No files matched your search
@@ -0,0 +1 @@
|
||||
.DS_Store
|
||||
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 5.2 KiB |
@@ -0,0 +1,52 @@
|
||||
Step 1) Is your PC setup: can you list devices over novacom?
|
||||
- Yes: Go to Step 2
|
||||
- No: - Install Java, Install Drivers, Do novacom -l from command line
|
||||
|
||||
Step 2) Is your device activated and healthy? Or do you need to activate, reset or upgrade?
|
||||
- Healthy: Go to Step 5
|
||||
- Activate/Reset: Go to Step 3
|
||||
|
||||
Step 3) Identify your device:
|
||||
- Old Phones: Pre, Pre Plus, Pixi, Pixi Plus
|
||||
- Reset: How to use Doctor (with filenames)
|
||||
- Activate: Go to Step 4
|
||||
- Later Phones: Pre2, Pre3, Veer
|
||||
- Reset or Upgrade: How to use Doctor (with filenames)
|
||||
- Activate: Go to Step 4
|
||||
- Touchpad 10” (WiFi or 4G)
|
||||
- Reset to Stock: How to use Doctor (with filenames), then Step 4
|
||||
- Upgrade to 3.1.0: How to use Doctor (with filenames), NO Step 4-5
|
||||
- Touchpad Go 8” (4G)
|
||||
- Reset to Stock: How to use Doctor (with filenames), then Step 4
|
||||
|
||||
Step 4) Activate with deviceTool
|
||||
- use deviceTool from Command Line, then Step 5
|
||||
|
||||
Step 5) Install App Stores
|
||||
- install Preware from command line
|
||||
- Install App Catalog from command line
|
||||
- Go to Step 6-type variant
|
||||
|
||||
Step 6 Old Phones)
|
||||
- No modern internet, HTTP only, Classic for PalmOS, lots of games to play!
|
||||
|
||||
Step 6 Later Phones)
|
||||
- Modern HTTPS through Preware
|
||||
- Retro browser rendering limitations
|
||||
- Many games, some functional apps (Podcasts, etc…)
|
||||
|
||||
Step 6 Touchpad Go)
|
||||
- Modern HTTPS through Preware
|
||||
- 2018-era browser in Preware
|
||||
- USB, Bluetooth game controllers, many games are compatible (some are not), almost all Touchpad apps work on Go
|
||||
|
||||
Step 6 Touchpad 10”)
|
||||
- Modern HTTPS pre-installed
|
||||
- Modern browsers available
|
||||
- Tons of games, including ports from Pre, Linux, and iOS being made by community
|
||||
- Tons of apps, new and restored apps from community
|
||||
|
||||
Step 7) Developing and hacking webOS
|
||||
- SDK
|
||||
- MCP
|
||||
- Porting guides
|
||||
@@ -0,0 +1,336 @@
|
||||
/* Plain ES5 -- no arrow functions, let/const, template literals, or
|
||||
Array/Object niceties newer than what a 2010/2011 WebKit ships. */
|
||||
|
||||
var STORAGE_KEY = "wosaHelpFlowState2";
|
||||
|
||||
/* Every step card is always visible; collapsedSteps just tracks which
|
||||
ones are collapsed to their header. Step 1 starts open, the rest
|
||||
start collapsed -- expand as you go, or jump straight to any step. */
|
||||
function wosaDefaultState() {
|
||||
var collapsedSteps = {};
|
||||
if (typeof FLOW !== "undefined") {
|
||||
for (var i = 0; i < FLOW.length; i++) {
|
||||
if (FLOW[i].id !== 1) { collapsedSteps[FLOW[i].id] = true; }
|
||||
}
|
||||
}
|
||||
return { path: {}, deviceFilter: null, collapsedSteps: collapsedSteps };
|
||||
}
|
||||
|
||||
function wosaLoadState() {
|
||||
try {
|
||||
if (window.localStorage) {
|
||||
var raw = window.localStorage.getItem(STORAGE_KEY);
|
||||
if (raw) {
|
||||
var parsed = JSON.parse(raw);
|
||||
if (parsed && parsed.path && parsed.collapsedSteps) {
|
||||
if (parsed.deviceFilter === undefined) { parsed.deviceFilter = null; }
|
||||
return parsed;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
/* localStorage unavailable or corrupt -- fall back to defaults */
|
||||
}
|
||||
return wosaDefaultState();
|
||||
}
|
||||
|
||||
var wosaState = wosaLoadState();
|
||||
|
||||
function wosaSaveState() {
|
||||
try {
|
||||
if (window.localStorage) {
|
||||
window.localStorage.setItem(STORAGE_KEY, JSON.stringify(wosaState));
|
||||
}
|
||||
} catch (e) {
|
||||
/* ignore */
|
||||
}
|
||||
}
|
||||
|
||||
function wosaFindStep(id) {
|
||||
for (var i = 0; i < FLOW.length; i++) {
|
||||
if (FLOW[i].id === id) { return FLOW[i]; }
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/* Steps in FILTER_STEP_IDS all ask the same top-level "which device"
|
||||
question. Once it's been answered anywhere, seed that answer into
|
||||
any other filter step that hasn't been asked yet, so it isn't
|
||||
asked over and over. */
|
||||
function wosaGetPath(stepId) {
|
||||
if (!wosaState.path[stepId]) { wosaState.path[stepId] = []; }
|
||||
var isFilterStep = (typeof FILTER_STEP_IDS !== "undefined" && FILTER_STEP_IDS.indexOf(stepId) !== -1);
|
||||
var hasFilter = (wosaState.deviceFilter !== null && wosaState.deviceFilter !== undefined);
|
||||
if (isFilterStep && hasFilter && wosaState.path[stepId].length === 0) {
|
||||
wosaState.path[stepId] = [wosaState.deviceFilter];
|
||||
}
|
||||
return wosaState.path[stepId];
|
||||
}
|
||||
|
||||
function wosaScrollToStep(stepId) {
|
||||
var el = document.getElementById("step-" + stepId);
|
||||
if (el && el.scrollIntoView) {
|
||||
el.scrollIntoView();
|
||||
}
|
||||
}
|
||||
|
||||
/* Every step card is always on the page -- "going to" a step just
|
||||
means making sure it's expanded, then scrolling to it. */
|
||||
function wosaGoto(stepId) {
|
||||
wosaState.collapsedSteps[stepId] = false;
|
||||
wosaSaveState();
|
||||
wosaRender();
|
||||
wosaScrollToStep(stepId);
|
||||
}
|
||||
|
||||
/* Resets any step whose own node.options function reads the device
|
||||
filter (FILTER_DEPENDENT_STEP_IDS) -- called whenever the filter
|
||||
changes, so a stale numeric index can never silently point at a
|
||||
different option once that step's filtered choice list reshuffles. */
|
||||
function wosaInvalidateFilterDependents() {
|
||||
if (typeof FILTER_DEPENDENT_STEP_IDS === "undefined") { return; }
|
||||
for (var i = 0; i < FILTER_DEPENDENT_STEP_IDS.length; i++) {
|
||||
wosaState.path[FILTER_DEPENDENT_STEP_IDS[i]] = [];
|
||||
}
|
||||
}
|
||||
|
||||
/* Pick option `idx` at nesting level `level` within step `stepId`.
|
||||
Truncates any deeper choices previously made under this level. */
|
||||
function wosaChoose(stepId, level, idx) {
|
||||
var p = wosaGetPath(stepId);
|
||||
wosaState.path[stepId] = p.slice(0, level);
|
||||
wosaState.path[stepId][level] = idx;
|
||||
|
||||
/* Answering the shared "which device" question at its top level
|
||||
updates the remembered filter, and carries the answer over to
|
||||
any other filter step so it doesn't have to be asked again. */
|
||||
var isFilterStep = (typeof FILTER_STEP_IDS !== "undefined" && FILTER_STEP_IDS.indexOf(stepId) !== -1);
|
||||
if (isFilterStep && level === 0) {
|
||||
wosaState.deviceFilter = idx;
|
||||
for (var i = 0; i < FILTER_STEP_IDS.length; i++) {
|
||||
var otherId = FILTER_STEP_IDS[i];
|
||||
if (otherId !== stepId) {
|
||||
wosaState.path[otherId] = [idx];
|
||||
}
|
||||
}
|
||||
wosaInvalidateFilterDependents();
|
||||
}
|
||||
|
||||
wosaSaveState();
|
||||
wosaRender();
|
||||
}
|
||||
|
||||
/* Clears the remembered device filter and the top-level answer on
|
||||
every filter step, so the "which device" question is asked fresh
|
||||
again wherever it appears. Doesn't save/render -- callers do that. */
|
||||
function wosaClearFilterState() {
|
||||
wosaState.deviceFilter = null;
|
||||
if (typeof FILTER_STEP_IDS !== "undefined") {
|
||||
for (var i = 0; i < FILTER_STEP_IDS.length; i++) {
|
||||
wosaState.path[FILTER_STEP_IDS[i]] = [];
|
||||
}
|
||||
}
|
||||
wosaInvalidateFilterDependents();
|
||||
}
|
||||
|
||||
function wosaClearDeviceFilter() {
|
||||
wosaClearFilterState();
|
||||
wosaSaveState();
|
||||
wosaRender();
|
||||
}
|
||||
|
||||
/* Re-open a previously answered level so it can be changed. Reopening
|
||||
a filter step's top level (the shared "which device" question) also
|
||||
clears the remembered filter -- otherwise wosaGetPath would just
|
||||
re-seed the answer we're about to clear, right back where it was. */
|
||||
function wosaReopen(stepId, level) {
|
||||
var p = wosaGetPath(stepId);
|
||||
wosaState.path[stepId] = p.slice(0, level);
|
||||
|
||||
var isFilterStep = (typeof FILTER_STEP_IDS !== "undefined" && FILTER_STEP_IDS.indexOf(stepId) !== -1);
|
||||
if (isFilterStep && level === 0) {
|
||||
wosaClearFilterState();
|
||||
}
|
||||
|
||||
wosaSaveState();
|
||||
wosaRender();
|
||||
}
|
||||
|
||||
/* A step's header is always clickable to collapse/expand its body. */
|
||||
function wosaToggleStepCollapse(stepId) {
|
||||
wosaState.collapsedSteps[stepId] = !wosaState.collapsedSteps[stepId];
|
||||
wosaSaveState();
|
||||
wosaRender();
|
||||
}
|
||||
|
||||
function wosaSetAllCollapsed(collapsed) {
|
||||
for (var i = 0; i < FLOW.length; i++) {
|
||||
wosaState.collapsedSteps[FLOW[i].id] = collapsed;
|
||||
}
|
||||
wosaSaveState();
|
||||
wosaRender();
|
||||
}
|
||||
|
||||
function wosaExpandAll() {
|
||||
wosaSetAllCollapsed(false);
|
||||
}
|
||||
|
||||
function wosaCollapseAll() {
|
||||
wosaSetAllCollapsed(true);
|
||||
}
|
||||
|
||||
function wosaReset() {
|
||||
wosaState = wosaDefaultState();
|
||||
wosaSaveState();
|
||||
wosaRender();
|
||||
}
|
||||
|
||||
/* node.options is usually a plain array, but can also be a function
|
||||
(evaluated at render time, e.g. against the current device filter)
|
||||
for a node whose choices depend on state. */
|
||||
function wosaResolveOptions(node) {
|
||||
if (typeof node.options === "function") { return node.options(); }
|
||||
return node.options;
|
||||
}
|
||||
|
||||
/* Renders one question node (and, once answered, its collapsed summary,
|
||||
the chosen answer's instructions, and -- recursively -- whatever
|
||||
sub-question comes next). Returns an HTML string. */
|
||||
function wosaRenderNode(node, path, stepId, level) {
|
||||
var html = "";
|
||||
var options = wosaResolveOptions(node);
|
||||
var chosenIdx = path[level];
|
||||
var hasChoice = (chosenIdx !== undefined && chosenIdx !== null && options[chosenIdx]);
|
||||
|
||||
if (!hasChoice) {
|
||||
html += '<div class="node-block">';
|
||||
if (node.q) {
|
||||
html += '<p class="node-question">' + node.q + '</p>';
|
||||
}
|
||||
if (node.code) {
|
||||
html += '<pre><code>' + node.code + '</code></pre>';
|
||||
}
|
||||
if (node.info) {
|
||||
html += '<div class="node-info">' + node.info + '</div>';
|
||||
}
|
||||
html += '<div class="opt-list">';
|
||||
for (var i = 0; i < options.length; i++) {
|
||||
html += '<button type="button" class="opt-btn" onclick="wosaChoose(' + stepId + ',' + level + ',' + i + ')">' +
|
||||
'<img class="chevron" src="images/chevron.png" alt="">' + options[i].label + '</button>';
|
||||
}
|
||||
html += '</div></div>';
|
||||
return html;
|
||||
}
|
||||
|
||||
var opt = options[chosenIdx];
|
||||
html += '<div class="node-block answered">';
|
||||
html += '<div class="answered-summary" onclick="wosaReopen(' + stepId + ',' + level + ')">' +
|
||||
'<span class="change-hint">Change</span>' +
|
||||
(node.q ? node.q + ' → ' : '') + '<strong>' + opt.label + '</strong>' +
|
||||
'</div>';
|
||||
if (opt.content) {
|
||||
html += '<div class="leaf-content">' + opt.content + '</div>';
|
||||
}
|
||||
if (opt.next) {
|
||||
html += wosaRenderNode(opt.next, path, stepId, level + 1);
|
||||
}
|
||||
html += '</div>';
|
||||
return html;
|
||||
}
|
||||
|
||||
/* Renders a topics list (Step 7 / Step 8) as one continuous scrolling
|
||||
document -- a heading per topic, its content always visible below,
|
||||
like the original docs pages, rather than a click-to-expand list. */
|
||||
function wosaRenderTopics(node) {
|
||||
var html = "";
|
||||
for (var i = 0; i < node.topics.length; i++) {
|
||||
var topic = node.topics[i];
|
||||
html += '<div class="node-block">';
|
||||
html += '<h3 class="node-question">' + topic.label + '</h3>';
|
||||
html += '<div class="leaf-content">' + topic.content + '</div>';
|
||||
html += '</div>';
|
||||
}
|
||||
if (node.after) {
|
||||
html += '<div class="node-block"><div class="leaf-content">' + node.after + '</div></div>';
|
||||
}
|
||||
return html;
|
||||
}
|
||||
|
||||
/* Flattens the chosen-answer chain for a step into a short breadcrumb,
|
||||
shown on its collapsed header. Topics steps have no single "answer,"
|
||||
so they never show a breadcrumb. */
|
||||
/* Strips any markup (e.g. the device icon baked into device option
|
||||
labels) down to plain text -- the collapsed header's summary strip
|
||||
is a single condensed line, not the place for an icon. */
|
||||
function wosaPlainText(html) {
|
||||
return html.replace(/<[^>]*>/g, "");
|
||||
}
|
||||
|
||||
function wosaStepSummary(step) {
|
||||
if (step.node.topics) { return ""; }
|
||||
var path = wosaGetPath(step.id);
|
||||
var node = step.node;
|
||||
var parts = [];
|
||||
var lvl = 0;
|
||||
while (node && path[lvl] !== undefined) {
|
||||
var options = wosaResolveOptions(node);
|
||||
if (!options || !options[path[lvl]]) { break; }
|
||||
parts.push(wosaPlainText(options[path[lvl]].label));
|
||||
node = options[path[lvl]].next;
|
||||
lvl++;
|
||||
}
|
||||
return parts.join(" → ");
|
||||
}
|
||||
|
||||
function wosaRenderStepCard(step) {
|
||||
var html = '<div class="step-card" id="step-' + step.id + '">';
|
||||
var collapsed = !!wosaState.collapsedSteps[step.id];
|
||||
|
||||
if (!collapsed) {
|
||||
html += '<div class="step-header clickable-header" onclick="wosaToggleStepCollapse(' + step.id + ')">' +
|
||||
'<img class="disclosure" src="images/disclosure-open.png" alt="">' +
|
||||
'Step ' + step.id + ': ' + step.title +
|
||||
'</div>';
|
||||
var body = step.node.topics ?
|
||||
wosaRenderTopics(step.node) :
|
||||
wosaRenderNode(step.node, wosaGetPath(step.id), step.id, 0);
|
||||
html += '<div class="step-body">' + body + '</div>';
|
||||
} else {
|
||||
var summary = wosaStepSummary(step);
|
||||
html += '<div class="step-header clickable-header" onclick="wosaToggleStepCollapse(' + step.id + ')">' +
|
||||
'<img class="disclosure" src="images/disclosure-closed.png" alt="">' +
|
||||
'Step ' + step.id + ': ' + step.title +
|
||||
(summary ? ' — <span class="summary-text">' + summary + '</span>' : '') +
|
||||
'</div>';
|
||||
}
|
||||
html += '</div>';
|
||||
return html;
|
||||
}
|
||||
|
||||
/* Updates the removable "Device: ___" chip in #controls. */
|
||||
function wosaRenderDeviceFilterBar() {
|
||||
var el = document.getElementById("deviceFilterBar");
|
||||
if (!el) { return; }
|
||||
var hasFilter = (wosaState.deviceFilter !== null && wosaState.deviceFilter !== undefined);
|
||||
if (!hasFilter) {
|
||||
el.innerHTML = "";
|
||||
return;
|
||||
}
|
||||
var label = (typeof DEVICE_CATEGORY_SHORT !== "undefined" && DEVICE_CATEGORY_SHORT[wosaState.deviceFilter]) || "set";
|
||||
var iconSrc = (typeof DEVICE_CATEGORY_ICONS !== "undefined" && DEVICE_CATEGORY_ICONS[wosaState.deviceFilter]) || "";
|
||||
var iconHtml = iconSrc ? "<img class='filter-chip-icon' src='" + iconSrc + "' alt=''>" : "";
|
||||
el.innerHTML = '<span class="filter-chip">' + iconHtml + 'Device: <strong>' + label + '</strong> ' +
|
||||
'<a href="#" class="filter-clear" onclick="wosaClearDeviceFilter(); return false;">Remove filter</a></span>';
|
||||
}
|
||||
|
||||
function wosaRender() {
|
||||
var app = document.getElementById("app");
|
||||
var html = "";
|
||||
wosaRenderDeviceFilterBar();
|
||||
for (var i = 0; i < FLOW.length; i++) {
|
||||
html += wosaRenderStepCard(FLOW[i]);
|
||||
}
|
||||
app.innerHTML = html;
|
||||
}
|
||||
|
||||
wosaRender();
|
||||
@@ -0,0 +1,570 @@
|
||||
/* Content lives here, separate from the renderer in app.js, so it can be
|
||||
edited without touching any logic. Plain ES5 objects/strings only.
|
||||
|
||||
A "node" is one question: { q, code, info, options: [...] }
|
||||
An "option" is one answer: { label, content, next }
|
||||
- content: HTML shown once this answer is picked
|
||||
- next: optional nested node (a follow-up question)
|
||||
A "step" is a top-level, numbered row: { id, title, node }
|
||||
|
||||
Links: relative for anything on this site; plain http:// (not https://)
|
||||
for webosarchive.org resources so we never force a protocol upgrade on
|
||||
a device that can't do modern TLS; external third-party links keep
|
||||
whatever scheme they require. */
|
||||
|
||||
var STEP1_NODE = {
|
||||
q: "From a command line on your computer, run:",
|
||||
code: "novacom -l",
|
||||
info: "<p>This lists any webOS devices connected over USB. An empty result is fine — it just means nothing's plugged in yet. What matters is whether the computer recognizes the command at all.</p>",
|
||||
options: [
|
||||
{
|
||||
label: "It ran (recognized the command — even with no devices listed)",
|
||||
content: "<p>Good — your computer already has what it needs.</p>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(2)'>Continue to Step 2 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: "Command not found / I've never set this up",
|
||||
next: {
|
||||
q: "What kind of computer are you using?",
|
||||
options: [
|
||||
{
|
||||
label: "Windows",
|
||||
content: "<p>You'll need two things — install Java first, since novacom itself depends on it.</p>" +
|
||||
"<ul>" +
|
||||
"<li>Java 8 — <a href='https://www.java.com/download/ie_manual.jsp'>download here</a></li>" +
|
||||
"<li>novacom driver — <a href='http://www.webosarchive.org/activation/drivers/novacom-win-32/'>32-bit</a> (tested on Windows 7) or <a href='http://www.webosarchive.org/activation/drivers/novacom-win-64/'>64-bit</a> (tested on Windows 10/11)</li>" +
|
||||
"</ul>" +
|
||||
"<p>Use a good quality micro USB cable plugged directly into your computer, not a hub — OEM cables have a small silver indented circle near the connector.</p>" +
|
||||
"<p>Once installed, open a command line and try <code>novacom -l</code> again.</p>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(2)'>Continue to Step 2 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: "macOS",
|
||||
content: "<p>Modern macOS (Catalina and later, including Apple Silicon) needs a community-rebuilt driver. Install Java first — novacom itself depends on it.</p>" +
|
||||
"<ol>" +
|
||||
"<li>Install <a href='https://support.apple.com/en-us/HT204036'>Java</a>.</li>" +
|
||||
"<li>Install <a href='https://brew.sh/'>Homebrew</a>, then run <code>brew install libusb libusb-compat</code> in Terminal.</li>" +
|
||||
"<li>Download and run the <a href='http://www.webosarchive.org/activation/drivers/novacom-macos-64/'>64-bit driver installer</a>. (On very old macOS up to Mojave, use the <a href='http://www.webosarchive.org/activation/drivers/novacom-osx-32/'>32-bit installer</a> instead.)</li>" +
|
||||
"<li>macOS will probably block the installer at first — approve it under System Preferences → Security.</li>" +
|
||||
"</ol>" +
|
||||
"<p>Test it: plug in your device with a good cable and run <code>novacom -l</code> in Terminal.</p>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(2)'>Continue to Step 2 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: "Linux",
|
||||
content: "<p>Install Java first — novacom itself depends on it.</p>" +
|
||||
"<ul>" +
|
||||
"<li>Java 8 — <a href='https://www.fosstechnix.com/install-oracle-java-8-on-ubuntu-20-04/'>install guide</a></li>" +
|
||||
"<li>novacom driver — <a href='http://www.webosarchive.org/activation/drivers/novacom-linux-32/'>32-bit</a> or <a href='http://www.webosarchive.org/activation/drivers/novacom-linux-64/'>64-bit</a> DEB package (tested on Ubuntu)</li>" +
|
||||
"</ul>" +
|
||||
"<p>Use a good quality micro USB cable plugged directly into your computer, not a hub.</p>" +
|
||||
"<p>Once installed, try <code>novacom -l</code> again.</p>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(2)'>Continue to Step 2 →</button></p>"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
var STEP2_NODE = {
|
||||
q: "Is your device working normally right now?",
|
||||
options: [
|
||||
{
|
||||
label: "Yes, it works fine",
|
||||
content: "<p>Nothing to fix — you're ready to move on.</p>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(5)'>Continue to Step 5 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: "It works, but I want to reset or upgrade it",
|
||||
content: "<p>No rush — head to Step 3 and pick your device to see the reset or upgrade option that fits it.</p>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(3)'>Continue to Step 3 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: "It boots, but I can't activate it or get to the Launcher",
|
||||
content: "<p>That's expected, not a problem with your device — Palm/HP's activation servers have been offline for years, so it gets stuck trying (and failing) to activate itself. This is solved with a computer tool called deviceTool, which the next couple of steps walk through.</p>" +
|
||||
"<p>Make sure <a href='#' onclick='wosaGoto(1); return false;'>Step 1</a> (computer + drivers) is done, then continue.</p>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(3)'>Continue to Step 3 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: "It boots, but I'm locked out (forgot the PIN)",
|
||||
content: "<p>You can clear the passcode from the command line — but first, run deviceTool to make sure the device is developer-unlocked. Follow <a href='#' onclick='wosaGoto(4); return false;'>Step 4</a>'s instructions to get into recovery mode and run deviceTool (this works even though you can't get past the lock screen), then come back here.</p>" +
|
||||
"<p>Once that's done, get a shell on the device:</p>" +
|
||||
"<ul>" +
|
||||
"<li>Boot the device normally and connect it to your computer with a good USB cable.</li>" +
|
||||
"<li>On Mac or Linux, run <code>novaterm</code> from a command line. On Windows, run <code>C:\\Program Files\\Palm, Inc\\terminal\\novaterm.bat</code>.</li>" +
|
||||
"</ul>" +
|
||||
"<p>From that shell, enter:</p>" +
|
||||
"<pre><code>luna-send -f -n 1 palm://com.palm.systemmanager/setDevicePasscode '{\"passCode\":\"\", \"lockMode\":\"none\"}'</code></pre>" +
|
||||
"<p>You should see <code>{ \"returnValue\": true }</code>. If you get <code>false</code> instead (common on enterprise setups, which require a PIN), set a new one instead of removing it:</p>" +
|
||||
"<pre><code>luna-send -f -n 1 palm://com.palm.systemmanager/setDevicePasscode '{\"passCode\":\"1234\", \"lockMode\":\"pin\"}'</code></pre>" +
|
||||
"<p>Then reboot from the same shell:</p>" +
|
||||
"<pre><code>reboot</code></pre>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(5)'>Continue to Step 5 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: "It boots, but won't load webOS (or a Doctor won't finish) — often after trying LuneOS, Android, etc.",
|
||||
content: "<p class='note'>TouchPad only.</p>" +
|
||||
"<p>The Touchpad Toolbox loads a rescue environment so you can wipe the partitions and start fresh.</p>" +
|
||||
"<ul>" +
|
||||
"<li>Get the toolbox from the <a href='https://xdaforums.com/t/tools-touchpad-toolbox-updated-2015-02-25.2756314/'>original XDA post</a>, or a <a href='http://www.webosarchive.org/activation/TPToolbox-2015-01-08-v42.zip'>backup copy from webOS Archive</a> if that link ever goes stale.</li>" +
|
||||
"<li>Make sure novacom is working on your computer (<a href='#' onclick='wosaGoto(1); return false;'>Step 1</a>).</li>" +
|
||||
"<li>Power off the TouchPad. Hold Volume Up, then press and hold Power until the screen lights up (about 5 seconds), then release both when the USB symbol appears.</li>" +
|
||||
"<li>Run the matching <code>tptb_</code> startup script for your computer's OS from a terminal or command prompt.</li>" +
|
||||
"<li>Once the Toolbox boots on the TouchPad, use the hardware Volume keys and Home button to navigate. Choose <strong>Complete Data Reset</strong> and confirm, then <strong>Create webOS Volumes</strong> and confirm that too.</li>" +
|
||||
"<li>Reboot back into recovery mode (hold Volume Up while powering on).</li>" +
|
||||
"</ul>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(3)'>Continue to Step 3 →</button> (to run a fresh Doctor)</p>"
|
||||
},
|
||||
{
|
||||
label: "It won't power on or show anything at all",
|
||||
next: {
|
||||
q: "TouchPads have a known battery-chip quirk that can look like a dead device. Let's try charging it back to life first.",
|
||||
info: "<p>Use a <strong>lower-power</strong> charger than the original — something like a 5V/1A phone charger, not the stock 5.3V/2A one. (A drained A6 battery chip can refuse a high-power charge.) Plug it in and wait.</p>" +
|
||||
"<p>Give it 2–3 days, up to a week. Watch for the home button light alternating, or a low-battery symbol — either is a good sign. If you see one, switch to a higher-power charger (5.3V/2A) to finish charging.</p>" +
|
||||
"<p class='note'>Have a phone instead of a TouchPad? There's no documented deep-rescue path here — try a different known-good charger and cable, let it sit for a few hours, and reach out to the <a href='#' onclick='wosaGoto(7); return false;'>Community (Step 7)</a> if it still won't wake up.</p>",
|
||||
options: [
|
||||
{
|
||||
label: "It powered on",
|
||||
content: "<p>Good news — now go run a Doctor.</p>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(3)'>Continue to Step 3 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: "Still nothing after about a week",
|
||||
next: {
|
||||
q: "Try some button combinations before assuming the worst:",
|
||||
info: "<ul>" +
|
||||
"<li>Power alone, 30 seconds</li>" +
|
||||
"<li>Power + Home, 30 seconds</li>" +
|
||||
"<li>Power, then rapidly press Home 15+ times</li>" +
|
||||
"<li>Home, then rapidly press Power 15+ times</li>" +
|
||||
"<li>Power + Home + Volume Up (or Down), 30 seconds</li>" +
|
||||
"</ul>" +
|
||||
"<p class='note'>Careful: Power + Volume Up alone boots into webOS recovery, not a rescue mode.</p>",
|
||||
options: [
|
||||
{
|
||||
label: "It powered on",
|
||||
content: "<p>Now go run a Doctor.</p>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(3)'>Continue to Step 3 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: "Still dead, or showing a white battery with a ‘?’",
|
||||
content: "<p>That usually means the battery chip firmware itself is corrupted, and needs reflashing with a tool called <strong>TP Debrick</strong>. It runs from a bootable USB drive on a separate computer — that drive will be erased in the process, so back it up first.</p>" +
|
||||
"<ul>" +
|
||||
"<li>Read the <a href='https://forum.xda-developers.com/t/hp-touchpad-debrick-linux-live-cd.4189245/'>XDA thread</a> for background, or watch the <a href='https://www.youtube.com/watch?v=WKrXu99XvA0'>video walkthrough</a>.</li>" +
|
||||
"<li>Download the <a href='https://drive.google.com/file/d/1XUJNWqvkfH6WwMi0cTDn99JB1pdf3q-y/view?usp=sharing'>TP Debrick v005 ISO</a> and write it to a USB drive (at least 1GB, will be erased) with <a href='https://unetbootin.github.io/'>UNetbootin</a>.</li>" +
|
||||
"<li>Boot your computer from that USB drive (enable Legacy Boot / disable Secure Boot in the BIOS if needed) and follow the on-screen instructions. The password is <code>1234</code>.</li>" +
|
||||
"<li>Reconnect the TouchPad to its original charger (5.3V/2A) afterward and give it another week.</li>" +
|
||||
"</ul>" +
|
||||
"<p>Still nothing after that? It's likely beyond what can be fixed remotely — worth asking the <a href='#' onclick='wosaGoto(7); return false;'>Community (Step 7)</a>, someone may have ideas.</p>"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
/* Shared across Step 3 and Step 6, in this exact order, so a device
|
||||
category picked in one step can be remembered and reused in the
|
||||
other (see FILTER_STEP_IDS / the device filter chip in app.js). */
|
||||
var DEVICE_CATEGORY_LABELS = [
|
||||
"Older Phone: Pre, Pre Plus, Pixi, or Pixi Plus",
|
||||
"Later Phone: Pre 2, Pre 3, or Veer",
|
||||
"TouchPad 10" (WiFi or 4G)",
|
||||
"TouchPad Go 7" (4G)"
|
||||
];
|
||||
var DEVICE_CATEGORY_SHORT = [
|
||||
"Older Phone",
|
||||
"Later Phone",
|
||||
"TouchPad 10"",
|
||||
"TouchPad Go"
|
||||
];
|
||||
var DEVICE_CATEGORY_ICONS = [
|
||||
"DeviceIcons/ml-pre-small.png",
|
||||
"DeviceIcons/ml-pre3-small.png",
|
||||
"DeviceIcons/ml-touchpad-small.png",
|
||||
"DeviceIcons/ml-touchpad-go.png"
|
||||
];
|
||||
var FILTER_STEP_IDS = [3, 6];
|
||||
|
||||
/* Steps whose node.options is a function that reads the device filter
|
||||
(see STEP4_NODE below) rather than steps that ask the category
|
||||
question itself. Their answers must be invalidated whenever the
|
||||
filter changes -- otherwise a stale numeric index could silently
|
||||
point at the wrong option once the filtered list re-shuffles. */
|
||||
var FILTER_DEPENDENT_STEP_IDS = [4];
|
||||
|
||||
function wosaDeviceIconLabel(i) {
|
||||
return "<img class='device-icon' src='" + DEVICE_CATEGORY_ICONS[i] + "' alt=''>" + DEVICE_CATEGORY_LABELS[i];
|
||||
}
|
||||
|
||||
var STEP3_RESET_PLACEHOLDER = "<div class='callout'>If your device is currently usable, consider doing an app inventory before you reset or upgrade it — you might be carrying apps the archive is still missing. See <a href='#' onclick='wosaGoto(7); return false;'>Contribute to the Archive (Step 7)</a> for how.</div>" +
|
||||
"<p>Doctor instructions (with the right file for your specific device and carrier) are coming soon here. In the meantime, see the <a href='https://archive.org/details/webOSDoctors'>archived webOS Doctors</a> and their readme to find the right file, then run it the same way as deviceTool: <code>java -jar NAMEOFDOCTOR.jar</code>.</p>";
|
||||
|
||||
var STEP3_NODE = {
|
||||
q: "Which best describes your device?",
|
||||
options: [
|
||||
{
|
||||
label: wosaDeviceIconLabel(0),
|
||||
next: {
|
||||
q: "What do you need to do?",
|
||||
options: [
|
||||
{
|
||||
label: "Just activate it (it boots fine, just stuck at setup)",
|
||||
content: "<p><button type='button' class='continue-btn' onclick='wosaGoto(4)'>Continue to Step 4 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: "Reset it to stock / wipe it",
|
||||
content: STEP3_RESET_PLACEHOLDER
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
label: wosaDeviceIconLabel(1),
|
||||
next: {
|
||||
q: "What do you need to do?",
|
||||
options: [
|
||||
{
|
||||
label: "Just activate it (it boots fine, just stuck at setup)",
|
||||
content: "<p><button type='button' class='continue-btn' onclick='wosaGoto(4)'>Continue to Step 4 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: "Reset or upgrade it",
|
||||
content: STEP3_RESET_PLACEHOLDER
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
label: wosaDeviceIconLabel(2),
|
||||
next: {
|
||||
q: "What do you need to do?",
|
||||
options: [
|
||||
{
|
||||
label: "Just activate it (it boots fine, just stuck at setup)",
|
||||
content: "<p><button type='button' class='continue-btn' onclick='wosaGoto(4)'>Continue to Step 4 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: "Reset it to stock",
|
||||
content: STEP3_RESET_PLACEHOLDER
|
||||
},
|
||||
{
|
||||
label: "Upgrade to webOS 3.1.0 Community Edition",
|
||||
content: "<p class='note'>This replaces Steps 4 and 5 entirely — the Community Edition doctor leaves the device activated and ready to use.</p>" + STEP3_RESET_PLACEHOLDER
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
label: wosaDeviceIconLabel(3),
|
||||
next: {
|
||||
q: "What do you need to do?",
|
||||
options: [
|
||||
{
|
||||
label: "Just activate it (it boots fine, just stuck at setup)",
|
||||
content: "<p><button type='button' class='continue-btn' onclick='wosaGoto(4)'>Continue to Step 4 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: "Reset it to stock",
|
||||
content: STEP3_RESET_PLACEHOLDER
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
var STEP4_RUN_TOOL_NODE = {
|
||||
q: "Now run deviceTool from your computer.",
|
||||
info: "<p>Make sure <a href='#' onclick='wosaGoto(1); return false;'>Step 1</a> (Java + drivers) is done first.</p>" +
|
||||
"<ul>" +
|
||||
"<li>Download <a href='http://www.webosarchive.org/activation/devicetool/devicetoolAIO.jar'>devicetoolAIO.jar</a>.</li>" +
|
||||
"<li>From a command line, navigate to the folder you downloaded it to.</li>" +
|
||||
"<li>Run: <code>java -jar devicetoolAIO.jar</code></li>" +
|
||||
"<li>Wait while it updates and reboots your device — this can take a few minutes.</li>" +
|
||||
"</ul>" +
|
||||
"<p class='note'>If it doesn't detect your device, the novacom driver probably isn't working — double check <a href='#' onclick='wosaGoto(1); return false;'>Step 1</a>.</p>",
|
||||
options: [
|
||||
{
|
||||
label: "It finished and rebooted",
|
||||
content: "<p>Once it restarts, join your WiFi network using the built-in Settings — webOS works with 2.4GHz networks and common security types, including WPA.</p>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(5)'>Continue to Step 5 →</button></p>"
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
var STEP4_OPT_BATTERY_PHONE = {
|
||||
label: "Phone with a removable battery (Pre, Pre Plus, Pixi, Pixi Plus, Pre 2, Pre 3)",
|
||||
content: "<ol>" +
|
||||
"<li>Unplug the USB cable from the device end (leave it plugged into your computer).</li>" +
|
||||
"<li>Remove the battery.</li>" +
|
||||
"<li>Hold down the Volume Up button.</li>" +
|
||||
"<li>Plug the USB cable into the device.</li>" +
|
||||
"<li>Reinsert the battery.</li>" +
|
||||
"<li>Release Volume Up.</li>" +
|
||||
"</ol>",
|
||||
next: STEP4_RUN_TOOL_NODE
|
||||
};
|
||||
|
||||
var STEP4_OPT_BROKEN_COVER = {
|
||||
label: "Phone where I can't or don't want to remove the fragile cover (eg: Pre3)",
|
||||
content: "<p class='note'>Especially common on the Pre3 — its back cover cracks easily once removed, which destroys wireless (Touchstone) charging. If yours won't come off cleanly, don't force it; use this instead.</p>" +
|
||||
"<ol>" +
|
||||
"<li>Hold down the Power button.</li>" +
|
||||
"<li>While still holding Power, toggle the mute switch off, then on, three times in a row. This forces a reboot.</li>" +
|
||||
"<li>As soon as it restarts, release Power and hold Volume Up.</li>" +
|
||||
"<li>Keep holding Volume Up until you see the USB symbol.</li>" +
|
||||
"</ol>",
|
||||
next: STEP4_RUN_TOOL_NODE
|
||||
};
|
||||
|
||||
var STEP4_OPT_TOUCHPAD_VEER = {
|
||||
label: "TouchPad or Veer (no removable battery)",
|
||||
content: "<ol>" +
|
||||
"<li>Reboot the device — on TouchPad, hold Home + Power to force a reboot and keep holding; on Veer, power off completely, wait a few seconds, then press and hold Power to turn it back on.</li>" +
|
||||
"<li>As soon as it restarts, release Power (and Home, on TouchPad) and hold Volume Up.</li>" +
|
||||
"<li>Keep holding Volume Up until you see the USB symbol.</li>" +
|
||||
"</ol>",
|
||||
next: STEP4_RUN_TOOL_NODE
|
||||
};
|
||||
|
||||
var STEP4_NODE = {
|
||||
q: "First, get your device into recovery mode so deviceTool can see it.",
|
||||
info: "<p>Connect a good quality micro-USB cable directly between your device and computer — not through a hub. (OEM cables are recognizable by a small silver indented circle near the connector.)</p>",
|
||||
/* Options narrow based on the remembered device filter (see
|
||||
FILTER_STEP_IDS): an Older Phone always has a plain removable
|
||||
back/battery, so the broken-cover variant only makes sense for
|
||||
Later Phones (Pre 2/Pre 3) -- and neither phone option applies
|
||||
to a TouchPad or Veer. With no filter set, show everything. */
|
||||
options: function () {
|
||||
var filter = (typeof wosaState !== "undefined") ? wosaState.deviceFilter : null;
|
||||
if (filter === 0) {
|
||||
return [STEP4_OPT_BATTERY_PHONE];
|
||||
}
|
||||
if (filter === 2 || filter === 3) {
|
||||
return [STEP4_OPT_TOUCHPAD_VEER];
|
||||
}
|
||||
/* Later Phone (1), or no filter set at all. */
|
||||
return [STEP4_OPT_BATTERY_PHONE, STEP4_OPT_BROKEN_COVER, STEP4_OPT_TOUCHPAD_VEER];
|
||||
}
|
||||
};
|
||||
|
||||
var STEP5_WOSQI_NODE = {
|
||||
q: "Install WOSQI, Preware, and an App Store.",
|
||||
info: "<ul>" +
|
||||
"<li>Download <a href='http://www.webosarchive.org/activation/webOSQuickInstall-4.6.0.jar'>webOS Quick Install (WOSQI) 4.6.0</a> and run it: <code>java -jar webOSQuickInstall-4.6.0.jar</code> (double-clicking the jar also works in some environments). With your device plugged in normally (not USB Drive mode), WOSQI should see it.</li>" +
|
||||
"<li>Download <a href='http://www.webosarchive.org/activation/org.webosinternals.preware_1.9.18_arm.ipk'>Preware 1.9.18</a>, drag it onto the WOSQI window (or use the + button), and press Install. This is the original homebrew app store and gives you access to almost everything else.</li>" +
|
||||
"<li>Install an App Store the same way: <a href='https://appcatalog.webosarchive.org/?latest'>download the App Catalog or App Museum II</a> and drag it onto WOSQI. App Catalog is the restored original store (best for webOS 2.2.4/3.0.5+); App Museum II works on any Enyo-capable device, including LuneOS.</li>" +
|
||||
"<li>webOS 1.x devices can skip WOSQI for the app store step — just open <a href='http://appcatalog.webosarchive.org'>appcatalog.webosarchive.org</a> in the built-in browser instead.</li>" +
|
||||
"</ul>",
|
||||
options: [
|
||||
{
|
||||
label: "Done — apps are installed on my device",
|
||||
content: "<p>You won't need WOSQI or your computer again — from here on, just use Preware or App Museum II on the device itself, over WiFi.</p>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(6)'>Continue to Step 6 →</button></p>"
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
var STEP5_DEVMODE_NODE = {
|
||||
q: "Which webOS version?",
|
||||
options: [
|
||||
{
|
||||
label: "webOS 1.0 (original Pre)",
|
||||
content: "<p>From the Launcher, start typing: <code>webos20090606</code>. Tap the Developer Mode icon that appears, and turn it On.</p>",
|
||||
next: STEP5_WOSQI_NODE
|
||||
},
|
||||
{
|
||||
label: "webOS 2.0 and later (Pre 2, Pre 3, Veer, TouchPad)",
|
||||
content: "<p>Use \"Just Type\" on the Launcher and type: <code>upupdowndownleftrightleftrightbastart</code>. Tap the Developer Mode icon that appears and turn it On. When prompted for a password, just hit Enter.</p>",
|
||||
next: STEP5_WOSQI_NODE
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
var STEP5_NODE = {
|
||||
q: "Did your device just finish Step 4 (deviceTool)?",
|
||||
options: [
|
||||
{
|
||||
label: "Yes",
|
||||
content: "<p>Good — deviceTool already enables homebrew installs, so there's nothing extra to turn on.</p>",
|
||||
next: STEP5_WOSQI_NODE
|
||||
},
|
||||
{
|
||||
label: "No, it was already activated and working",
|
||||
content: "<p>You'll need to turn on Developer Mode first, to allow homebrew app installs.</p>",
|
||||
next: STEP5_DEVMODE_NODE
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
var STEP6_NODE = {
|
||||
q: "Which best describes your device?",
|
||||
options: [
|
||||
{
|
||||
label: wosaDeviceIconLabel(0),
|
||||
content: "<p>webOS 1.x can't run the Modern TLS Updates, so you're mostly limited to plain HTTP — but there's still plenty to do.</p>" +
|
||||
"<ul>" +
|
||||
"<li>In Preware, search for <strong>Root Certs Update</strong> and install it — this fixes the out-of-date certificate trust store.</li>" +
|
||||
"<li>Install the <a href='http://www.webosarchive.org/activation/org.webosinternals.openssl-updater_0.9.8-6_armv7.ipk'>OpenSSL Updater</a> via WOSQI — it won't get you to the modern web, but it widens what still connects over HTTPS.</li>" +
|
||||
"<li>For what's left over plain HTTP, DuckDuckGo Lite, <a href='http://68k.news/'>68k.news</a>, and <a href='http://www.frogfind.com/'>FrogFind</a> are good starting points.</li>" +
|
||||
"<li>Install the <a href='http://appcatalog.webosarchive.org/app/ClassicEmulator'>Classic Emulator</a> for a huge catalog of vintage PalmOS apps and games.</li>" +
|
||||
"</ul>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(7)'>Continue to Step 7 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: wosaDeviceIconLabel(1),
|
||||
content: "<p>On webOS 2.2.4, your phone can speak modern TLS natively — no proxy or certificate juggling.</p>" +
|
||||
"<ul>" +
|
||||
"<li>Still on 2.2.0 or 2.1.0? Upgrade to 2.2.4 first with a Super Doctor — see <a href='#' onclick='wosaGoto(3); return false;'>Step 3</a>.</li>" +
|
||||
"<li>In Preware, add the modernize feed if you don't already have it: <code>http://stacks.webosarchive.org/feeds/modernize/ipkgs/</code> (turn on Compressed/gzip), then choose Update Feeds.</li>" +
|
||||
"<li>Search for <strong>TLS 1.3 Updates (Phones)</strong> and install it, confirming any prerequisites Preware offers. This covers the browser, apps, mail, curl, the download manager, current root certificates, automatic clock sync, and the restored App Catalog.</li>" +
|
||||
"<li>The stock browser is dated. On a Pre3, search Preware for <strong>WebBrowser</strong> (nizovn's homebrew browser) for better rendering.</li>" +
|
||||
"</ul>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(7)'>Continue to Step 7 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: wosaDeviceIconLabel(2),
|
||||
content: "<p>Your TouchPad can speak modern TLS natively.</p>" +
|
||||
"<ul>" +
|
||||
"<li>In Preware, add the modernize feed if needed: <code>http://stacks.webosarchive.org/feeds/modernize/ipkgs/</code> (Compressed/gzip on), then Update Feeds.</li>" +
|
||||
"<li>Search for <strong>TLS 1.3 Updates (TouchPad)</strong> and install it. This covers browser/app/mail/curl/download-manager TLS, current root certs, automatic clock sync, the restored App Catalog, plus the restored on-device Help, USB Settings, and Bluetooth gamepad support.</li>" +
|
||||
"<li>Search Preware for <strong>Atlas</strong> and install it — a genuinely modern browser engine for pages the stock browser can't render.</li>" +
|
||||
"</ul>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(7)'>Continue to Step 7 →</button></p>"
|
||||
},
|
||||
{
|
||||
label: wosaDeviceIconLabel(3),
|
||||
content: "<p>Your TouchPad Go can speak modern TLS natively, same as the 10" TouchPad.</p>" +
|
||||
"<ul>" +
|
||||
"<li>In Preware, add the modernize feed if needed: <code>http://stacks.webosarchive.org/feeds/modernize/ipkgs/</code> (Compressed/gzip on), then Update Feeds.</li>" +
|
||||
"<li>Search for <strong>TLS 1.3 Updates (TouchPad)</strong> and install it — the same package covers both TouchPad sizes.</li>" +
|
||||
"<li>Search Preware for <strong>Atlas</strong> and install it for modern browser rendering.</li>" +
|
||||
"</ul>" +
|
||||
"<p><button type='button' class='continue-btn' onclick='wosaGoto(7)'>Continue to Step 7 →</button></p>"
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
var STEP7_NODE = {
|
||||
topics: [
|
||||
{
|
||||
label: "Websites & Browsing",
|
||||
content: "<p>More and more websites are moving to newer encryption over HTTPS as the only way in. On webOS 2.2.4 and above, the <a href='#' onclick='wosaGoto(6); return false;'>Modern TLS Updates</a> solve this outright; on older devices you're more limited. Here are some common sites that still work, or ways to work around the ones that don't:</p>" +
|
||||
"<p><strong>Google</strong>'s website no longer works. Try <a href='https://duckduckgo.com/html'>DuckDuckGo Lite</a> instead.</p>" +
|
||||
"<p><strong>YouTube</strong>'s website no longer works, but there's an app for that called MeTube (see Games & Apps below), or you can try a retro-friendly <a href='https://invidious.io/'>Invidious</a> provider.</p>" +
|
||||
"<p><img src='images/reddit.png' align='right' style='padding-left: 8px'><strong>Reddit</strong> still works once your device can reach HTTPS, via <a href='http://old.reddit.com'>old.reddit.com</a> or the excellent IAmA Reddit app. Reddit videos can also be watched in MeTube.</p>" +
|
||||
"<p><strong>Wikipedia</strong> works great once you have HTTPS. For older devices, webOS Archive provides a “tiny” version at <a href='http://wikipedia.webosarchive.org'>wikipedia.webosarchive.org</a>.</p>" +
|
||||
"<p><strong>RSS:</strong> many sites can be reached through their RSS feed using the FeedSpider app, and a free service like <a href='http://www.inoreader.com'>InoReader</a>.</p>" +
|
||||
"<p><strong>Google News:</strong> retro-computer enthusiast Action Retro built an excellent text-only Google News web app that works on almost anything — check out <a href='http://68k.news/'>68k.news</a>.</p>" +
|
||||
"<p><strong>Text-Only Web:</strong> many popular sites have a text-only version that works well on retro devices. Sijmen J. Mulder keeps a good list at <a href='http://sjmulder.nl/en/textonly.html'>sjmulder.nl/en/textonly.html</a>.</p>" +
|
||||
"<p><strong>FrogFind:</strong> also by Action Retro, is a <a href='http://www.frogfind.com/'>search engine for older devices</a> that renders a simplified version of most sites in its results.</p>" +
|
||||
"<p>For anything else, <a href='https://github.com/tenox7/wrp'>Web Rendering Proxy (WRP)</a> uses Chrome on a PC you run yourself to render pages as images, sidestepping SSL/JS/HTML issues entirely — no video or interactive content, but a lot of the modern web becomes viewable.</p>"
|
||||
},
|
||||
{
|
||||
label: "Email, Calendars & Contacts",
|
||||
content: "<img src='images/touchpad-pim.png' align='right' width='300' style='width:300px; padding-left: 8px'>" +
|
||||
"<p>webOS has a first-class email client (arguably the best Exchange client for any Linux) that still works in some cases. Success varies with the server infrastructure.</p>" +
|
||||
"<p><strong>IMAP and POP mail</strong> still work, provided the server's encryption is compatible with webOS.</p>" +
|
||||
"<p><strong>Exchange Web Access:</strong> private and hosted Exchange servers that provide EAS can still be used.</p>" +
|
||||
"<p><strong>Office365:</strong> Microsoft has moved to modern authentication, including an OAuth sign-in page that can't be rendered on webOS. As a work-around, <a href='https://davmail.sourceforge.net/'>DavMail</a> lets you run a proxy on a PC or server using non-proprietary standards.</p>" +
|
||||
"<p><strong>Gmail:</strong> add it as a plain IMAP account using a <a href='https://myaccount.google.com/apppasswords'>Google App Password</a> rather than your normal password (this requires 2-Step Verification).</p>" +
|
||||
"<p><img src='images/zoho.png' align='right' width='128' style='width:128px; padding-left: 8px'><strong>Zoho</strong> provides a cost-effective, full-featured alternative to Office365 and Google, with support for custom domains and Exchange ActiveSync. It works perfectly with webOS, no hacks required — webOS Archive's top recommendation if you have a choice in mail providers.</p>" +
|
||||
"<p><strong>iCloud:</strong> you may be able to get IMAP access to your iCloud inbox.</p>" +
|
||||
"<p>The Calendar app on webOS is still one of the best out there, particularly on the TouchPad's extra screen real estate. <strong>Exchange Web Access</strong> works the same as mail; <strong>Zoho</strong> syncs via EAS too. For a one-way sync of a public calendar (Google, iCloud, Outlook.com, Canvas), install <strong>WebCal Sync</strong> from the App Museum.</p>" +
|
||||
"<p><img src='images/caldav.png' align='right' width='128' style='width:128px; padding-left: 8px'>If you host your own calendar and contacts in a WebDAV-compatible service like ownCloud or NextCloud, the <strong>C+Dav</strong> app does a one-way or two-way sync.</p>"
|
||||
},
|
||||
{
|
||||
label: "Games & Apps",
|
||||
content: "<img src='images/angrybirds.jpg' align='right' style='padding-left: 8px'>" +
|
||||
"<p>webOS had a great library of games, and you don't have to worry about in-app-purchases and spyware — just great mobile classics, including offerings from big publishers like Gameloft and EA. You'll find plenty in the <a href='http://appcatalog.webosarchive.org/showMuseum.php?category=Games&count=1030'>games section of the App Museum</a>, including Angry Birds, SCUMMVM, The Sims 3, Snes9X EX, Assassin's Creed, Oregon Trail, and Miriel.</p>" +
|
||||
"<p><img src='images/metube-icon.png' align='right' style='padding-left: 8px'><strong>Watch (Some) Videos:</strong> YouTube doesn't officially support webOS, but thanks to the open source community it's still available — MeTube fetches short YouTube videos on demand. FlixNet plays Public Domain movies from archive.org, and Plex for webOS streams from your own server (no transcoding, so only natively-supported formats).</p>" +
|
||||
"<p><img src='images/retropodcasts.png'></p>" +
|
||||
"<p><strong>Podcasts:</strong> a TouchPad in Touchstone with a Bluetooth speaker, or a little Pre or Veer in your pocket, makes a great podcast player. The webOS Archive <a href='http://podcasts.webosarchive.org'>Podcast Directory</a> solves the HTTPS problem many podcasts now require.</p>" +
|
||||
"<p><img src='images/LampsPrePhoto.png' style='width:300px'></p>" +
|
||||
"<p><strong>The Ultimate Night Stand App:</strong> Philips Hue lights are some of the best smart bulbs out there, and a little Pre or Veer — or even a TouchPad — makes a great companion, letting you control them in a dark room without a smart speaker listening to you sleep. <strong>One Night Stand</strong> turns your device into a light controller with a tap.</p>" +
|
||||
"<p><strong>Rock Out:</strong> Pandora and third-party Pandora apps still work. On TouchPad, <strong>Retune</strong> remote-controls Apple Music/iTunes, including HomePods and AppleTVs.</p>" +
|
||||
"<p><img src='images/kindle.png' align='right' style='padding-left: 8px'><strong>Read a Book:</strong> the TouchPad makes a great reading device. Amazon's <strong>Kindle Beta</strong> app is fully functional — watch for a One-Time Password on your second login attempt. <strong>Papyrus eReader</strong> is a modern take on DRM-free ePub reading, derived from the Kindle app and an older indie project.</p>" +
|
||||
"<p><strong>Be an Exhibitionist:</strong> webOS 2.0 and up have an Exhibition mode that shows content continuously while docked — a photo slideshow, or Accuweather's gorgeous weather Exhibition.</p>" +
|
||||
"<p><strong>Remote Control:</strong> the App Museum has apps for remotely controlling Windows, Mac and Linux machines via Splashtop, Remote Desktop, or VNC, plus Roku and iTunes remotes.</p>" +
|
||||
"<p><img src='images/palm-logo.png' align='right' style='padding-left: 8px'><strong>Classic:</strong> the Classic Emulator gives you access to a huge catalog of vintage PalmOS apps and games. Install Classic Emulator from the App Museum, plus (webOS 2.0+) Classic Container via WOSQI. It expires weekly — run it in Airplane Mode, and when it expires, delete <code>/usr/lib/palmos/expired.rgba</code> from a shell to re-arm it.</p>" +
|
||||
"<p><strong>Make Something New:</strong> webOS is an easy platform to learn to develop on, especially with modern AI tools. See <a href='#' onclick='wosaGoto(8); return false;'>Dev & Hack (Step 8)</a> to get started.</p>"
|
||||
},
|
||||
{
|
||||
label: "Join the Community",
|
||||
content: "<img src='images/discord.png' align='right' style='padding-left: 8px'>" +
|
||||
"<p>There's still an active webOS community, swapping notes on devices and patches, and even building new apps.</p>" +
|
||||
"<p><strong>Discord + SimpleChat:</strong> the most active community of webOS users is on a modern webOS app called SimpleChat, which is also connected to a <a href='http://www.webosarchive.org/discord'>Discord server</a>. Join in the conversation from both old and new devices.</p>" +
|
||||
"<p><img src='images/twitter.png' align='right' style='padding-left: 8px'><strong>Bluesky:</strong> webOS Archive has officially eXited Twitter, but you can follow along on <a href='https://bsky.app/profile/webosarchive.org'>Bluesky</a>.</p>" +
|
||||
"<p><strong>Fediverse + RSS:</strong> webOS Archive is on <a href='https://palm.weboslives.eu/users/webosarchive'>Mastodon</a>, thanks to a community-hosted server, and also followable via RSS with FeedSpider.</p>" +
|
||||
"<p><strong>Forums:</strong> the old webOS Nation forums have been archived by the Wayback Machine, with a handy shortcut at <a href='http://forums.webosarchive.org'>forums.webosarchive.org</a>. In 2023, the community started rebuilding at the <a href='https://forums.weboslives.eu/'>webOS Lives Forums</a>.</p>"
|
||||
},
|
||||
{
|
||||
label: "Patches and Hacks",
|
||||
content: "<img src='images/patch.png' align='right' width='128' style='width:128px; padding-left: 8px'>" +
|
||||
"<p>webOS was an extremely customizable operating system, with community-created patches for a wide variety of modifications. Most patches can still be found in <a href='#' onclick='wosaGoto(5); return false;'>Preware</a> and should be installed from there, since they were created by contemporaneous developers.</p>" +
|
||||
"<p>webOS Archive has produced a series of patches that hide dead pre-installed apps that stopped working after HP's servers shut down, for a tidier Launcher. These are meant to be installed with WOSQI from a PC, <em>not</em> from within Preware.</p>" +
|
||||
"<p><strong>Hardware mods</strong> (advanced, requires micro-soldering): community member Alan Morford has guides to <a href='https://pivotce.com/2024/09/25/guide-converting-the-touchpads-micro-usb-port-to-usb-c/'>converting the TouchPad's micro-USB port to USB-C</a> and <a href='https://pivotce.com/2024/12/05/guide-create-an-original-barrel-charging-wire-for-your-hp-touchpad/'>building a warning-free charging cable</a>.</p>"
|
||||
},
|
||||
{
|
||||
label: "Shell Access",
|
||||
content: "<p>webOS may have a beautiful user interface and an easy JavaScript-based programming environment, but underneath it all is a powerful Linux-based operating system. Unlocking the command line lets you control your device in fun and helpful ways — no jailbreaking required, all from bits found in Preware.</p>" +
|
||||
"<p><strong>On device:</strong> install <strong>Xecutah</strong> from Preware (confirm its prerequisites), then launch it from the Launcher. On TouchPad, tap the screen with three fingers to bring up the keyboard — tap again to hide it. The Tweaks app can reserve space for the keyboard so it doesn't keep scrolling out of view.</p>" +
|
||||
"<p><strong>From a computer:</strong> the official Developer Tools give shell access over USB from a connected PC or Mac. The Homebrew community has also built and published an OpenSSH server, installable from Preware.</p>"
|
||||
},
|
||||
{
|
||||
label: "Contribute to the Archive",
|
||||
content: "<img src='images/appscanner.png' align='right' style='padding-left: 8px'>" +
|
||||
"<p>Many apps are still missing from the Museum. If you have a device with apps that might be unique, follow these steps to pull an inventory, so we can check for anything the archive needs.</p>" +
|
||||
"<p>Once you have Preware on your device, the easiest way is to install <strong>App Scanner</strong> from the App Catalog or App Museum II — it automatically inventories your device and compares against the list of missing apps.</p>" +
|
||||
"<p>Or do it manually: with Java and novacom set up (<a href='#' onclick='wosaGoto(1); return false;'>Step 1</a>), connect your device (stay in regular mode, not USB Drive mode) and run <code>java -jar webos-tools.jar palm-log -l</code> (Windows) or <code>java -jar ./webos-tools.jar palm-log -l</code> (Mac/Linux) to get a full list of installed apps.</p>" +
|
||||
"<p>Share the list in the Community section above — if anything's unique, you can back it up over a shell with <code>cp -R /media/cryptofs/apps/usr/palm/applications/<app-id> /media/internal</code>, then copy it off in USB Drive mode.</p>"
|
||||
}
|
||||
],
|
||||
after: "<p><button type='button' class='continue-btn' onclick='wosaGoto(8)'>Continue to Step 8 →</button></p>"
|
||||
};
|
||||
|
||||
var STEP8_NODE = {
|
||||
topics: [
|
||||
{
|
||||
label: "SDK & PDK",
|
||||
content: "<p>webOS apps are built in JavaScript (the <strong>SDK</strong>: Mojo on older devices, Enyo from webOS 2.0 on, with NodeJS-backed Luna services); performance-critical code (mostly games and media) used the <strong>PDK</strong>, C/C++ with more direct hardware access.</p>" +
|
||||
"<ul>" +
|
||||
"<li>Developer Mode is covered in <a href='#' onclick='wosaGoto(5); return false;'>Step 5</a> if you haven't turned it on yet.</li>" +
|
||||
"<li><a href='http://sdk.webosarchive.org'>sdk.webosarchive.org</a> has the restored SDK/PDK, documentation, and emulator downloads.</li>" +
|
||||
"<li>webOS is easy to learn on, especially with modern AI tools — if you can build (or vibe-code) a web page, you can build an app for webOS.</li>" +
|
||||
"<li>The 2009 O'Reilly book <em>Palm webOS: The Insider's Guide</em> is free on <a href='https://books.google.com/books?id=sHT6PeMp1k8C&printsec=frontcover'>Google Books</a>. Tuts+ also has a still-useful <a href='https://web.archive.org/web/20140309041556/https://code.tutsplus.com/series/introduction-to-webos-sdk-development--mobile-22879'>5-part Mojo series</a>.</li>" +
|
||||
"</ul>"
|
||||
},
|
||||
{
|
||||
label: "webOS MCP (AI-Assisted Development)",
|
||||
content: "<p><a href='https://github.com/webOSArchive/webos-mcp'>webos-mcp</a> is a Model Context Protocol server for webOS — it gives AI coding assistants direct access to webOS SDK docs and tooling, so they can actually help you build and debug webOS apps instead of guessing.</p>"
|
||||
},
|
||||
{
|
||||
label: "Emulator",
|
||||
content: "<p>webOS Archive repackaged the original SDK emulator as an OVA Virtual Appliance for current VirtualBox (and probably other virtualization tools). It emulates a TouchPad.</p>" +
|
||||
"<ul>" +
|
||||
"<li><a href='https://github.com/webOSArchive/webos-emulator/releases'>Download from GitHub</a>.</li>" +
|
||||
"<li>Keyboard shortcuts simulate hardware: End = Launcher, Esc = back gesture, Home = minimize/maximize card, Left/Right = switch cards, F6–F9 = orientation.</li>" +
|
||||
"<li>Not supported: audio, camera, Bluetooth, multi-touch, the gesture area, and <strong>HTTPS</strong> (the proxy-setting APIs aren't present in the emulated OS, and it's x86 so ARM-native PDK apps won't run).</li>" +
|
||||
"<li>Preware needs its own <a href='http://www.webosarchive.org/activation'>i686 build</a> to run in the emulator.</li>" +
|
||||
"</ul>"
|
||||
}
|
||||
],
|
||||
after: "<p>That's the whole flow — thanks for exploring webOS.</p><p><a href='#' onclick='wosaReset(); return false;'>Start Over</a></p>"
|
||||
};
|
||||
|
||||
var FLOW = [
|
||||
{ id: 1, title: "Computer Setup", node: STEP1_NODE },
|
||||
{ id: 2, title: "Is Your Device Healthy?", node: STEP2_NODE },
|
||||
{ id: 3, title: "Identify Your Device", node: STEP3_NODE },
|
||||
{ id: 4, title: "Activate", node: STEP4_NODE },
|
||||
{ id: 5, title: "Install App Stores", node: STEP5_NODE },
|
||||
{ id: 6, title: "What Your Device Can Do", node: STEP6_NODE },
|
||||
{ id: 7, title: "Things to Try", node: STEP7_NODE },
|
||||
{ id: 8, title: "Dev & Hack", node: STEP8_NODE }
|
||||
];
|
||||
|
After Width: | Height: | Size: 789 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 444 B |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 7.4 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 284 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 31 KiB |
@@ -0,0 +1,42 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>webOS Help</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="site-header">
|
||||
<div class="content-inner">
|
||||
<h1>webOS Help</h1>
|
||||
<p class="tagline">Answer a few questions, get exactly the steps you need.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="controls">
|
||||
<div class="content-inner">
|
||||
<span class="link-group">
|
||||
<a href="#" onclick="wosaExpandAll(); return false;">Expand all</a>
|
||||
<a href="#" onclick="wosaCollapseAll(); return false;">Collapse all</a>
|
||||
</span>
|
||||
<a href="#" id="resetLink" onclick="wosaReset(); return false;">Start Over</a>
|
||||
<div id="deviceFilterBar"><!-- device filter chip, filled in by app.js --></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="wrap" class="content-inner">
|
||||
<div id="app"><!-- step cards rendered here --></div>
|
||||
</div>
|
||||
|
||||
<div id="site-footer">
|
||||
<div class="content-inner">
|
||||
<p>webOS Archive Help · <a href="http://www.webosarchive.org">webosarchive.org</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="flow-data.js"></script>
|
||||
<script src="app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,452 @@
|
||||
/* Styled after the Enyo 1 "Style Matters" sampler (sdk.webosarchive.org/enyo1sampler) --
|
||||
gradient toolbar/header chrome, bold-caps blue divider labels with a hairline
|
||||
rule, circular disclosure toggles, and flat edge-to-edge list rows instead of
|
||||
boxed cards/buttons.
|
||||
|
||||
Still written to work on ancient WebKit (TouchPad 3.0.5, Pre3 2.1) as well as
|
||||
modern browsers: no flexbox, no grid, no CSS variables, no rem units. */
|
||||
|
||||
/* keep any content image (Step 7/8 in particular) from overflowing a
|
||||
narrow screen, whatever inline size it declares */
|
||||
#app img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: #d7d7d5;
|
||||
color: #333333;
|
||||
font-family: Helvetica, Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
/* Mobile-first: fluid, no cap, so Pre3 (480 wide) and anything narrower
|
||||
fills its whole screen. Wider viewports get progressively more room,
|
||||
breaking right at the Pre3 and TouchPad widths, capped before lines
|
||||
get uncomfortably long on a desktop monitor.
|
||||
|
||||
.content-inner carries the width cap + centering and is reused inside
|
||||
#site-header and #site-footer, so their text keeps the same margins
|
||||
even though the header/footer bands themselves go full page width. */
|
||||
.content-inner {
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
@media (min-width: 481px) {
|
||||
.content-inner {
|
||||
max-width: 760px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.content-inner {
|
||||
max-width: 1000px;
|
||||
}
|
||||
body {
|
||||
font-size: 17px;
|
||||
}
|
||||
}
|
||||
|
||||
/* -- site header: mimics the Enyo gradient "Page Header" chrome -- */
|
||||
|
||||
#site-header {
|
||||
padding: 14px 0 12px 0;
|
||||
background-color: #d8d8d6;
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#eeeeee), to(#c6c6c4));
|
||||
background-image: -webkit-linear-gradient(top, #eeeeee, #c6c6c4);
|
||||
background-image: linear-gradient(to bottom, #eeeeee, #c6c6c4);
|
||||
border-bottom: 1px solid #a8a8a6;
|
||||
}
|
||||
|
||||
#site-header .content-inner,
|
||||
#controls .content-inner,
|
||||
#site-footer .content-inner {
|
||||
padding: 0 16px;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#site-header h1 {
|
||||
font-size: 23px;
|
||||
font-weight: normal;
|
||||
color: #333333;
|
||||
margin: 0 0 3px 0;
|
||||
}
|
||||
|
||||
#site-header .tagline {
|
||||
color: #5a5a5a;
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#controls {
|
||||
overflow: hidden;
|
||||
padding: 10px 0;
|
||||
background: #e3e3e1;
|
||||
border-bottom: 1px solid #bbbbb9;
|
||||
}
|
||||
|
||||
#controls .content-inner {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.link-group {
|
||||
float: left;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.link-group a,
|
||||
#resetLink {
|
||||
color: #4a76a8;
|
||||
text-decoration: none;
|
||||
text-transform: uppercase;
|
||||
font-weight: bold;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
.link-group a {
|
||||
margin-right: 16px;
|
||||
}
|
||||
|
||||
#resetLink {
|
||||
float: right;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
/* device filter chip: sits below the toggle/reset row, holds the
|
||||
remembered device answer with its icon, and a link to remove it */
|
||||
#deviceFilterBar {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.filter-chip {
|
||||
display: inline-block;
|
||||
margin-top: 10px;
|
||||
padding: 6px 10px;
|
||||
background: #e3ebf3;
|
||||
border: 1px solid #b7c7d9;
|
||||
-webkit-border-radius: 14px;
|
||||
border-radius: 14px;
|
||||
font-size: 13px;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.filter-chip-icon {
|
||||
max-height: 20px;
|
||||
width: auto;
|
||||
vertical-align: middle;
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
.filter-chip .filter-clear {
|
||||
color: #4a76a8;
|
||||
text-decoration: underline;
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
/* device icons on the Step 3 / Step 6 option rows */
|
||||
.device-icon {
|
||||
float: left;
|
||||
max-height: 34px;
|
||||
width: auto;
|
||||
margin: 0 10px 4px 0;
|
||||
}
|
||||
|
||||
#app {
|
||||
padding: 10px 16px 16px 16px;
|
||||
}
|
||||
|
||||
/* -- step cards: flat panels, gradient header bands like a toolbar -- */
|
||||
|
||||
.step-card {
|
||||
background: #eeeeec;
|
||||
border: 1px solid #b9b9b7;
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
|
||||
.step-header {
|
||||
padding: 12px 14px;
|
||||
background-color: #d8d8d6;
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#e9e9e7), to(#cccccb));
|
||||
background-image: -webkit-linear-gradient(top, #e9e9e7, #cccccb);
|
||||
background-image: linear-gradient(to bottom, #e9e9e7, #cccccb);
|
||||
border-bottom: 1px solid #b9b9b7;
|
||||
font-weight: bold;
|
||||
font-size: 15px;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
/* every step header is clickable to collapse/expand its body --
|
||||
right padding matches the base .step-header rule (14px), so the
|
||||
disclosure icon sits a reasonable distance from the edge instead
|
||||
of floating way inside it */
|
||||
.step-header.clickable-header {
|
||||
cursor: pointer;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.step-header .summary-text {
|
||||
font-weight: normal;
|
||||
color: #555555;
|
||||
}
|
||||
|
||||
/* disclosure toggle -- the actual Enyo "collapsible divider" arrow
|
||||
icon (cropped from the Onyx theme's divider-arrow.png sprite in the
|
||||
webOS SDK), not a Unicode glyph webOS's own browser may not have.
|
||||
Height comes from the #app img rule above (auto, aspect-preserving). */
|
||||
.disclosure {
|
||||
float: right;
|
||||
width: 28px;
|
||||
margin-left: 8px;
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
.step-body {
|
||||
padding: 14px;
|
||||
}
|
||||
|
||||
/* -- question / option nodes -- */
|
||||
|
||||
.node-block {
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
/* question text styled like the sampler's bold-caps blue divider labels
|
||||
with a hairline rule underneath */
|
||||
.node-question {
|
||||
font-weight: bold;
|
||||
font-size: 15px;
|
||||
color: #3a6288;
|
||||
margin: 0 0 10px 0;
|
||||
padding-bottom: 6px;
|
||||
border-bottom: 1px solid #b7c7d9;
|
||||
}
|
||||
|
||||
.node-info {
|
||||
margin: 0 0 10px 0;
|
||||
}
|
||||
|
||||
.node-info p {
|
||||
margin: 0 0 8px 0;
|
||||
}
|
||||
|
||||
.node-info .note,
|
||||
.leaf-content .note {
|
||||
color: #7a5a20;
|
||||
font-style: italic;
|
||||
margin: 0 0 8px 0;
|
||||
}
|
||||
|
||||
/* noticeable callout box -- for a warning/tip that needs to stand out
|
||||
without reading as a section header (see .node-question for that) */
|
||||
.callout {
|
||||
background: #fbf1dc;
|
||||
border: 1px solid #d9b96c;
|
||||
border-left: 4px solid #b8860b;
|
||||
color: #5c4813;
|
||||
padding: 10px 12px;
|
||||
margin: 0 0 12px 0;
|
||||
}
|
||||
|
||||
.callout a {
|
||||
color: #4a76a8;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.opt-list {
|
||||
margin: 0 0 4px 0;
|
||||
border-top: 1px solid #c9d9ea;
|
||||
}
|
||||
|
||||
/* option rows look like flat webOS list rows, not boxed buttons --
|
||||
full width, disclosure chevron on the right. A light blue tint and
|
||||
left accent bar mark them as tappable against the monotone gray
|
||||
chrome, distinct from the settled look of .answered-summary. */
|
||||
.opt-btn {
|
||||
display: block;
|
||||
width: 100%;
|
||||
text-align: left;
|
||||
padding: 12px 30px 12px 10px;
|
||||
margin: 0;
|
||||
background: #eaf3fb;
|
||||
border: none;
|
||||
border-left: 3px solid #7aa8d8;
|
||||
border-bottom: 1px solid #c9d9ea;
|
||||
-webkit-border-radius: 0;
|
||||
border-radius: 0;
|
||||
font-size: 15px;
|
||||
color: #333333;
|
||||
font-family: Helvetica, Arial, sans-serif;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.opt-btn:active {
|
||||
background: #cfe1f2;
|
||||
}
|
||||
|
||||
/* the actual Enyo menu-item arrow icon, cropped from menuitem-arrow.png
|
||||
in the webOS SDK, in place of a Unicode chevron. Height comes from
|
||||
the #app img rule above (auto, aspect-preserving). */
|
||||
.opt-btn .chevron {
|
||||
float: right;
|
||||
width: 10px;
|
||||
margin-left: 8px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
/* primary "continue" action -- a rounded gradient button, like the
|
||||
sampler's toolbar Back button, tinted with the accent blue */
|
||||
.continue-btn {
|
||||
display: inline-block;
|
||||
padding: 9px 16px;
|
||||
margin: 4px 0;
|
||||
background-color: #5b90c4;
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#7aa8d8), to(#4a7fb8));
|
||||
background-image: -webkit-linear-gradient(top, #7aa8d8, #4a7fb8);
|
||||
background-image: linear-gradient(to bottom, #7aa8d8, #4a7fb8);
|
||||
color: #ffffff;
|
||||
border: 1px solid #3a6699;
|
||||
-webkit-border-radius: 5px;
|
||||
border-radius: 5px;
|
||||
font-size: 15px;
|
||||
font-family: Helvetica, Arial, sans-serif;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.continue-btn:active {
|
||||
background-color: #3a6699;
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
/* EXPERIMENTAL: entrance animation for content that appears after
|
||||
answering a question, so it settles/reveals instead of snapping
|
||||
into place. Plain CSS `animation` (not `transition`) so it plays on
|
||||
insertion even though we render by replacing innerHTML wholesale --
|
||||
no "before" DOM state needed. Caveat: since a render rebuilds every
|
||||
step card, an already-open, unrelated step's content will also
|
||||
replay this on any interaction elsewhere on the page. Fine if only
|
||||
one step is open at a time; worth revisiting if "Expand all" makes
|
||||
it feel noisy. */
|
||||
@-webkit-keyframes wosaSettle {
|
||||
from { background-color: #cfe9cf; }
|
||||
to { background-color: #e9f5e9; }
|
||||
}
|
||||
@keyframes wosaSettle {
|
||||
from { background-color: #cfe9cf; }
|
||||
to { background-color: #e9f5e9; }
|
||||
}
|
||||
|
||||
@-webkit-keyframes wosaReveal {
|
||||
from { opacity: 0; -webkit-transform: translateY(6px); }
|
||||
to { opacity: 1; -webkit-transform: translateY(0); }
|
||||
}
|
||||
@keyframes wosaReveal {
|
||||
from { opacity: 0; transform: translateY(6px); }
|
||||
to { opacity: 1; transform: translateY(0); }
|
||||
}
|
||||
|
||||
/* pale green marks a confirmed choice, distinct from the blue "you can
|
||||
pick this" tint on .opt-btn -- blue means pending, green means settled */
|
||||
.answered-summary {
|
||||
padding: 10px 14px 10px 10px;
|
||||
background: #e9f5e9;
|
||||
border-left: 3px solid #6faa74;
|
||||
border-bottom: 1px solid #cfe4cf;
|
||||
margin-bottom: 8px;
|
||||
cursor: pointer;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
-webkit-animation: wosaSettle 300ms ease-out;
|
||||
animation: wosaSettle 300ms ease-out;
|
||||
}
|
||||
|
||||
/* text hint, not the expander icon -- reopening an answer to change it
|
||||
is a different action from collapsing/expanding a step */
|
||||
.change-hint {
|
||||
float: right;
|
||||
color: #4a76a8;
|
||||
font-size: 12px;
|
||||
text-decoration: underline;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.leaf-content {
|
||||
padding: 2px 4px 10px 4px;
|
||||
margin: 0 0 8px 0;
|
||||
-webkit-animation: wosaReveal 200ms ease-out both;
|
||||
animation: wosaReveal 200ms ease-out both;
|
||||
}
|
||||
|
||||
.leaf-content p {
|
||||
margin: 0 0 8px 0;
|
||||
}
|
||||
|
||||
.leaf-content ul,
|
||||
.leaf-content ol,
|
||||
.node-info ul,
|
||||
.node-info ol {
|
||||
margin: 0 0 10px 0;
|
||||
padding-left: 22px;
|
||||
}
|
||||
|
||||
.leaf-content li,
|
||||
.node-info li {
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.leaf-content a,
|
||||
.node-info a,
|
||||
#site-footer a {
|
||||
color: #4a76a8;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: monospace;
|
||||
font-size: 13px;
|
||||
background: #dde3e8;
|
||||
padding: 1px 4px;
|
||||
-webkit-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
pre {
|
||||
background: #dde3e8;
|
||||
padding: 8px;
|
||||
margin: 0 0 10px 0;
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
-webkit-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
pre code {
|
||||
background: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* nested sub-questions get a light indent so the hierarchy is visible,
|
||||
and reveal slightly after the leaf-content above them (a small
|
||||
cascade: answer settles, then the next question appears) */
|
||||
.node-block .node-block {
|
||||
margin-left: 4px;
|
||||
-webkit-animation: wosaReveal 200ms ease-out 100ms both;
|
||||
animation: wosaReveal 200ms ease-out 100ms both;
|
||||
}
|
||||
|
||||
#site-footer {
|
||||
margin-top: 4px;
|
||||
padding: 14px 0;
|
||||
background: #e3e3e1;
|
||||
border-top: 1px solid #bbbbb9;
|
||||
font-size: 12px;
|
||||
color: #666666;
|
||||
text-align: center;
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
For help flashing your device, please visit www.webosarchive.com
|
||||
webosdoctorp100ewwbellmo.jar - Palm Pre on Bell Mobility to 1.4.5
|
||||
webosdoctorp100ewwsprint.jar - Palm Pre on Sprint to 1.4.5
|
||||
webosdoctorp100ueu-wr.jar - Palm Pre on O2 or Movistar to 1.4.5
|
||||
webosdoctorp101ewwatt.jar - Palm Pre Plus on AT&T to 1.4.5
|
||||
webosdoctorp101ewwverizonwireless-1.4.5.1.jar - Palm Pre Plus on Verizon to 1.4.5.1
|
||||
webosdoctorp101ueu-wr.jar - Palm Pre Plus on O2, Movistar, SFR France to 2.1.0
|
||||
webosdoctorp101ueude-wr.jar - Palm Pre Plus on Vodafone to 2.1.0
|
||||
webosdoctorp102verizonwireless.jar - Palm Pre 2 on Verizon to 2.1.0
|
||||
webosdoctorp121ewwatt.jar - Palm Pixi Plus on AT&T to 1.4.5
|
||||
webosdoctorp121ewweu-wr.jar - Palm Pixi Plus on EU Carriers to 1.4.5
|
||||
webosdoctorp121ewwverizonwireless.jar - Palm Pixi Plus on Verizon to 1.4.5
|
||||
webosdoctorp121pixiplus-verizon-2.1.0.jar - Super Doctor Pixi Plus on Verizon to 2.2.1
|
||||
webosdoctorp121pixiplus-att-2.1.0.jar - Super Doctor Pixi Plus on AT&T to 2.2.1
|
||||
webosdoctorp160unaatt-2.2.4.jar - Super Doctor Veer on AT&T to 2.2.4
|
||||
webosdoctorp160unawr-2.2.4.jar - Super Doctor Veer ROW Carriers to 2.2.4
|
||||
webosdoctorp160unaatt-veer.jar - HP Veer on AT&T to 2.1.1
|
||||
webosdoctorp160unawr.jar - HP Veer on EU Carriers to 2.1.1
|
||||
webosdoctorp160unawr-2.2.4.jar - Super Doctor Veer on EU Carriers to 2.2.4
|
||||
webosdoctorp200ewwsprint.jar - Palm Pixi on Sprint to 1.4.5
|
||||
webosdoctorp224mantaatt-pre3.jar - HP Pre 3 on AT&T to 2.2.4
|
||||
webosdoctorp224mantaverizon.jar - HP Pre 3 on Verizon to 2.2.4
|
||||
webosdoctorp224mantawr.jar - HP Pre 3 Unlocked or EU/ROW Carriers to 2.2.4
|
||||
webosdoctorp224pre2-verizon-2.2.4.jar - Super Doctor Pre2 on Verizon to 2.2.4
|
||||
webosdoctorp224pre2wr.jar - Palm Pre 2 Unlocked or on SFR France, Rogers to 2.2.4
|
||||
webosdoctorp305hstnhatt.jar - HP TouchPad 10" AT&T 3.0.5
|
||||
webosdoctorp305hstnhwifi.jar - HP TouchPad 10" 16gb, 32gb, 64gb WiFi 3.0.5
|
||||
webosdoctoropal3gatt-3.0.5.jar - HP TouchPad Go 7" ALL radios to 3.0.5
|
||||
webosdoctorp310hstnh-ce-600070.jar - HP TouchPad 10" AT&T 3.1.0 Community Edition
|
||||
webosdoctorp310hstnhatt-ce-600071.jar - HP TouchPad 10" 16gb, 32gb, 64gb WiFi 3.1.0 Community Edition
|
||||