1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-09-19 16:58:48 +02:00

Add "device" JS/CSS for reactive stuff

Summary:
As we work through @chad's redesign, one thing I want to do is improve the tablet/mobile experience.

Add a "device" behavior which sets a "device-phone", "device-tablet" or "device-desktop" class on the root div. The behavior (device names, width triggers) is mostly based on Bootstrap.

Also adds a preview viewport=meta tag, which makes the iPhone not scale the page like crazy and is a desirable end state, but currently makes the app less usable since things get cut off.

Test Plan:
Added some classes like this:

	.device-desktop {
	  background: blue;
	}
	.device-tablet {
	  background: orange;
	}
	.device-phone {
	  background: yellow;
	}

...and loaded the site on a desktop, iPad and iPhone. Resized the window. Got the right background color in all cases.

Reviewers: btrahan, chad

Reviewed By: chad

CC: aran

Differential Revision: https://secure.phabricator.com/D3063
This commit is contained in:
epriestley 2012-07-25 11:51:27 -07:00
parent 1fc2dfd54b
commit 59949bf811
4 changed files with 96 additions and 3 deletions

View file

@ -1230,4 +1230,12 @@ return array(
// only enable it when debugging.
'debug.profile-every-request' => false,
// -- Previews ------------------------------------------------------------- //
// Turn on to enable the "viewport" meta tag. This is a preview feature which
// will improve the usability of Phabricator on phones and tablets once it
// is ready.
'preview.viewport-meta-tag' => false,
);

View file

@ -939,6 +939,19 @@ celerity_register_resource_map(array(
),
'disk' => '/rsrc/js/application/core/behavior-dark-console-ajax.js',
),
'javelin-behavior-device' =>
array(
'uri' => '/res/bec84986/rsrc/js/application/core/behavior-device.js',
'type' => 'js',
'requires' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-stratcom',
2 => 'javelin-dom',
3 => 'javelin-vector',
),
'disk' => '/rsrc/js/application/core/behavior-device.js',
),
'javelin-behavior-differential-accept-with-errors' =>
array(
'uri' => '/res/ba5144c5/rsrc/js/application/differential/behavior-accept-with-errors.js',

View file

@ -223,7 +223,18 @@ final class PhabricatorStandardPageView extends AphrontPageView {
}
}
$viewport_tag = null;
if (PhabricatorEnv::getEnvConfig('preview.viewport-meta-tag')) {
$viewport_tag = phutil_render_tag(
'meta',
array(
'name' => 'viewport',
'content' => 'width=device-width, initial-scale=1, maximum-scale=1',
));
}
$head =
$viewport_tag.
'<script type="text/javascript">'.
$framebust.
'window.__DEV__=1;'.
@ -514,14 +525,37 @@ final class PhabricatorStandardPageView extends AphrontPageView {
'</div>';
}
Javelin::initBehavior('device', array('id' => 'base-page'));
$agent = idx($_SERVER, 'HTTP_USER_AGENT');
// Try to guess the device resolution based on UA strings to avoid a flash
// of incorrectly-styled content.
$device_guess = 'device-desktop';
if (preg_match('/iPhone|iPod/', $agent)) {
$device_guess = 'device-phone';
} else if (preg_match('/iPad/', $agent)) {
$device_guess = 'device-tablet';
}
$classes = array(
'phabricator-standard-page',
$admin_class,
$device_guess,
);
$classes = implode(' ', $classes);
return
($console ? '<darkconsole />' : null).
$developer_warning.
'<div class="phabricator-standard-page '.$admin_class.'">'.
phutil_render_tag(
'div',
array(
'id' => 'base-page',
'class' => $classes,
),
$header_chrome.
$this->bodyContent.
'<div style="clear: both;"></div>'.
'</div>'.
'<div style="clear: both;"></div>').
$footer_chrome;
}

View file

@ -0,0 +1,38 @@
/**
* @provides javelin-behavior-device
* @requires javelin-behavior
* javelin-stratcom
* javelin-dom
* javelin-vector
*/
JX.behavior('device', function(config) {
var current;
function onresize() {
var v = JX.Vector.getViewport();
var device = 'desktop';
if (v.x <= 768) {
device = 'tablet';
}
if (v.x <= 480) {
device = 'phone';
}
if (device == current) {
return;
}
current = device;
var e = JX.$(config.id);
JX.DOM.alterClass(e, 'device-phone', (device == 'phone'));
JX.DOM.alterClass(e, 'device-tablet', (device == 'tablet'));
JX.DOM.alterClass(e, 'device-desktop', (device == 'desktop'));
}
JX.Stratcom.listen('resize', null, onresize);
onresize();
});