Added Polymer

This commit is contained in:
Thaum
2014-11-26 10:18:35 +00:00
parent 5eea4714b2
commit 3408ba9e8d
1210 changed files with 394645 additions and 47 deletions

View File

@@ -0,0 +1,25 @@
{
"name": "core-dropdown",
"private": false,
"dependencies": {
"polymer": "Polymer/polymer#^0.5.0",
"core-collapse": "Polymer/core-collapse#^0.5.0",
"core-icon-button": "Polymer/core-icon-button#^0.5.0",
"core-icons": "Polymer/core-icons#^0.5.0",
"core-overlay": "Polymer/core-overlay#^0.5.0"
},
"devDependencies": {
"web-component-tester": "*"
},
"version": "0.5.1",
"homepage": "https://github.com/Polymer/core-dropdown",
"_release": "0.5.1",
"_resolution": {
"type": "version",
"tag": "0.5.1",
"commit": "571ffcf00cfcb230cfdc4551f09cbddcac84c3d7"
},
"_source": "git://github.com/Polymer/core-dropdown.git",
"_target": "^0.5.0",
"_originalSource": "Polymer/core-dropdown"
}

View File

@@ -0,0 +1,6 @@
core-dropdown
=============
owner: [@morethanreal](http://github.com/morethanreal)
See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-dropdown) for more information.

View File

@@ -0,0 +1,15 @@
{
"name": "core-dropdown",
"private": false,
"dependencies": {
"polymer": "Polymer/polymer#^0.5.0",
"core-collapse": "Polymer/core-collapse#^0.5.0",
"core-icon-button": "Polymer/core-icon-button#^0.5.0",
"core-icons": "Polymer/core-icons#^0.5.0",
"core-overlay": "Polymer/core-overlay#^0.5.0"
},
"devDependencies": {
"web-component-tester": "*"
},
"version": "0.5.1"
}

View File

@@ -0,0 +1,117 @@
<!--
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<!--
`core-dropdown-base` is a base class for implementing controls that displays
an overlay when tapped on.
The child element with the class `dropdown` will be used as the drop-down. It
should be a `core-dropdown` or other overlay element.
@group Polymer Core Elements
@element core-dropdown-base
@status unstable
@homepage github.io
-->
<link href="../polymer/polymer.html" rel="import">
<polymer-element name="core-dropdown-base" tabindex="0">
<script>
Polymer({
publish: {
/**
* True if the menu is open.
*
* @attribute opened
* @type boolean
* @default false
*/
opened: false
},
eventDelegates: {
'tap': 'toggleOverlay'
},
overlayListeners: {
'core-overlay-open': 'openAction'
},
get dropdown() {
if (!this._dropdown) {
this._dropdown = this.querySelector('.dropdown');
for (var l in this.overlayListeners) {
this.addElementListener(this._dropdown, l, this.overlayListeners[l]);
}
}
return this._dropdown;
},
attached: function() {
// find the dropdown on attach
// FIXME: Support MO?
this.dropdown;
},
addElementListener: function(node, event, methodName, capture) {
var fn = this._makeBoundListener(methodName);
if (node && fn) {
Polymer.addEventListener(node, event, fn, capture);
}
},
removeElementListener: function(node, event, methodName, capture) {
var fn = this._makeBoundListener(methodName);
if (node && fn) {
Polymer.removeEventListener(node, event, fn, capture);
}
},
_makeBoundListener: function(methodName) {
var self = this, method = this[methodName];
if (!method) {
return;
}
var bound = '_bound' + methodName;
if (!this[bound]) {
this[bound] = function(e) {
method.call(self, e);
};
}
return this[bound];
},
openedChanged: function() {
if (this.disabled) {
return;
}
var dropdown = this.dropdown;
if (dropdown) {
dropdown.opened = this.opened;
}
},
openAction: function(e) {
this.opened = !!e.detail;
},
toggleOverlay: function() {
this.opened = !this.opened;
}
});
</script>
</polymer-element>

View File

@@ -0,0 +1,305 @@
<!--
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<!--
`core-dropdown` is an element that is initially hidden and is positioned relatively to another
element, usually the element that triggers the dropdown. The dropdown and the triggering element
should be children of the same offsetParent, e.g. the same `<div>` with `position: relative`.
It can be used to implement dropdown menus, menu buttons, etc..
Example:
<template is="auto-binding">
<div relative>
<core-icon-button id="trigger" icon="menu"></core-icon-button>
<core-dropdown relatedTarget="{{$.trigger}}">
<core-menu>
<core-item>Cut</core-item>
<core-item>Copy</core-item>
<core-item>Paste</core-item>
</core-menu>
</core-dropdown>
</div>
</template>
Positioning
-----------
By default, the dropdown is absolutely positioned on top of the `relatedTarget` with the top and
left edges aligned. The `halign` and `valign` properties controls the various alignments. The size
of the dropdown is automatically restrained such that it is entirely visible on the screen. Use the
`margin`
If you need more control over the dropdown's position, use CSS. The `halign` and `valign` properties are
ignored if the dropdown is positioned with CSS.
Example:
<style>
/* manually position the dropdown below the trigger */
core-dropdown {
position: absolute;
top: 38px;
left: 0;
}
</style>
<template is="auto-binding">
<div relative>
<core-icon-button id="trigger" icon="menu"></core-icon-button>
<core-dropdown relatedTarget="{{$.trigger}}">
<core-menu>
<core-item>Cut</core-item>
<core-item>Copy</core-item>
<core-item>Paste</core-item>
</core-menu>
</core-dropdown>
</div>
</template>
The `layered` property
----------------------
Sometimes you may need to render the dropdown in a separate layer. For example,
it may be nested inside an element that needs to be `overflow: hidden`, or
its parent may be overlapped by elements above it in stacking order.
The `layered` property will place the dropdown in a separate layer to ensure
it appears on top of everything else. Note that this implies the dropdown will
not scroll with its container.
@group Polymer Core Elements
@element core-dropdown
@extends core-overlay
@homepage github.io
-->
<link href="../polymer/polymer.html" rel="import">
<link href="../core-overlay/core-overlay.html" rel="import">
<style shim-shadowdom>
html /deep/ core-dropdown {
position: absolute;
overflow: auto;
background-color: #fff;
}
</style>
<polymer-element name="core-dropdown" extends="core-overlay">
<script>
(function() {
function docElem(property) {
var t;
return ((t = document.documentElement) || (t = document.body.parentNode)) && (typeof t[property] === 'number') ? t : document.body;
}
// View width and height excluding any visible scrollbars
// http://www.highdots.com/forums/javascript/faq-topic-how-do-i-296669.html
// 1) document.client[Width|Height] always reliable when available, including Safari2
// 2) document.documentElement.client[Width|Height] reliable in standards mode DOCTYPE, except for Safari2, Opera<9.5
// 3) document.body.client[Width|Height] is gives correct result when #2 does not, except for Safari2
// 4) When document.documentElement.client[Width|Height] is unreliable, it will be size of <html> element either greater or less than desired view size
// https://bugzilla.mozilla.org/show_bug.cgi?id=156388#c7
// 5) When document.body.client[Width|Height] is unreliable, it will be size of <body> element less than desired view size
function viewSize() {
// This algorithm avoids creating test page to determine if document.documentElement.client[Width|Height] is greater then view size,
// will succeed where such test page wouldn't detect dynamic unreliability,
// and will only fail in the case the right or bottom edge is within the width of a scrollbar from edge of the viewport that has visible scrollbar(s).
var doc = docElem('clientWidth');
var body = document.body;
var w, h;
return typeof document.clientWidth === 'number' ?
{w: document.clientWidth, h: document.clientHeight} :
doc === body || (w = Math.max( doc.clientWidth, body.clientWidth )) > self.innerWidth || (h = Math.max( doc.clientHeight, body.clientHeight )) > self.innerHeight ?
{w: body.clientWidth, h: body.clientHeight} : {w: w, h: h };
}
Polymer({
publish: {
/**
* The element associated with this dropdown, usually the element that triggers
* the menu. If unset, this property will default to the target's parent node
* or shadow host.
*
* @attribute relatedTarget
* @type Node
*/
relatedTarget: null,
/**
* The horizontal alignment of the popup relative to `relatedTarget`. `left`
* means the left edges are aligned together. `right` means the right edges
* are aligned together.
*
* @attribute halign
* @type 'left' | 'right'
* @default 'left'
*/
halign: 'left',
/**
* The vertical alignment of the popup relative to `relatedTarget`. `top` means
* the top edges are aligned together. `bottom` means the bottom edges are
* aligned together.
*
* @attribute valign
* @type 'top' | 'bottom'
* @default 'top'
*/
valign: 'top',
},
measure: function() {
var target = this.target;
// remember position, because core-overlay may have set the property
var pos = target.style.position;
// get the size of the target as if it's positioned in the top left
// corner of the screen
target.style.position = 'fixed';
target.style.left = '0px';
target.style.top = '0px';
var rect = target.getBoundingClientRect();
target.style.position = pos;
target.style.left = null;
target.style.top = null;
return rect;
},
resetTargetDimensions: function() {
var dims = this.dimensions;
var style = this.target.style;
if (dims.position.h_by === this.localName) {
style[dims.position.h] = null;
dims.position.h_by = null;
}
if (dims.position.v_by === this.localName) {
style[dims.position.v] = null;
dims.position.v_by = null;
}
this.super();
},
positionTarget: function() {
if (!this.relatedTarget) {
this.relatedTarget = this.target.parentElement || (this.target.parentNode && this.target.parentNode.host);
if (!this.relatedTarget) {
this.super();
return;
}
}
// explicitly set width/height, because we don't want it constrained
// to the offsetParent
var target = this.sizingTarget;
var rect = this.measure();
target.style.width = Math.ceil(rect.width) + 'px';
target.style.height = Math.ceil(rect.height) + 'px';
if (this.layered) {
this.positionLayeredTarget();
} else {
this.positionNestedTarget();
}
},
positionLayeredTarget: function() {
var target = this.target;
var rect = this.relatedTarget.getBoundingClientRect();
var dims = this.dimensions;
var margin = dims.margin;
var vp = viewSize();
if (!dims.position.h) {
if (this.halign === 'right') {
target.style.right = vp.w - rect.right - margin.right + 'px';
dims.position.h = 'right';
} else {
target.style.left = rect.left - margin.left + 'px';
dims.position.h = 'left';
}
dims.position.h_by = this.localName;
}
if (!dims.position.v) {
if (this.valign === 'bottom') {
target.style.bottom = vp.h - rect.bottom - margin.bottom + 'px';
dims.position.v = 'bottom';
} else {
target.style.top = rect.top - margin.top + 'px';
dims.position.v = 'top';
}
dims.position.v_by = this.localName;
}
if (dims.position.h_by || dims.position.v_by) {
target.style.position = 'fixed';
}
},
positionNestedTarget: function() {
var target = this.target;
var related = this.relatedTarget;
var t_op = target.offsetParent;
var r_op = related.offsetParent;
if (window.ShadowDOMPolyfill) {
t_op = wrap(t_op);
r_op = wrap(r_op);
}
if (t_op !== r_op && t_op !== related) {
console.warn('core-dropdown-overlay: dropdown\'s offsetParent must be the relatedTarget or the relatedTarget\'s offsetParent!');
}
// Don't use CSS to handle halign/valign so we can use
// dimensions.position to detect custom positioning
var dims = this.dimensions;
var margin = dims.margin;
var inside = t_op === related;
if (!dims.position.h) {
if (this.halign === 'right') {
target.style.right = ((inside ? 0 : t_op.offsetWidth - related.offsetLeft - related.offsetWidth) - margin.right) + 'px';
dims.position.h = 'right';
} else {
target.style.left = ((inside ? 0 : related.offsetLeft) - margin.left) + 'px';
dims.position.h = 'left';
}
dims.position.h_by = this.localName;
}
if (!dims.position.v) {
if (this.valign === 'bottom') {
target.style.bottom = ((inside ? 0 : t_op.offsetHeight - related.offsetTop - related.offsetHeight) - margin.bottom) + 'px';
dims.position.v = 'bottom';
} else {
target.style.top = ((inside ? 0 : related.offsetTop) - margin.top) + 'px';
dims.position.v = 'top';
}
dims.position.v_by = this.localName;
}
}
});
})();
</script>
</polymer-element>

View File

@@ -0,0 +1,440 @@
<!doctype html>
<!--
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<title>core-dropdown</title>
<script src="../webcomponentsjs/webcomponents.js"></script>
<link href="../core-collapse/core-collapse.html" rel="import">
<link href="../core-icons/core-icons.html" rel="import">
<link href="../core-icon-button/core-icon-button.html" rel="import">
<link href="core-dropdown.html" rel="import">
<style shim-shadowdom>
body {
font-family: RobotoDraft, 'Helvetica Neue', Helvetica, Arial;
font-size: 14px;
margin: 0;
padding: 24px;
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-touch-callout: none;
}
section {
padding: 20px 0;
}
section > div {
padding: 14px;
font-size: 16px;
}
html /deep/ core-dropdown {
background-color: #eee;
color: #000;
border: 1px solid #ccc;
border-radius: 3px;
padding: 8px;
}
.with-margin {
margin: 12px;
}
.open-below {
top: 38px;
}
</style>
</head>
<body>
<polymer-element name="x-trigger" extends="core-icon-button" relative on-tap="{{toggle}}">
<script>
Polymer({
toggle: function() {
if (!this.dropdown) {
this.dropdown = this.querySelector('core-dropdown');
}
this.dropdown && this.dropdown.toggle();
}
});
</script>
</polymer-element>
<template is="auto-binding">
<section>
<div>Absolutely positioned dropdowns</div>
<x-trigger icon="menu">
<core-dropdown>
halign = left
<br>
valign = top
</core-dropdown>
</x-trigger>
<x-trigger icon="menu">
<core-dropdown valign="bottom">
halign = left
<br>
valign = bottom
</core-dropdown>
</x-trigger>
<x-trigger icon="menu">
<core-dropdown halign="right">
halign = right
<br>
valign = top
</core-dropdown>
</x-trigger>
</section>
<section>
<div>Layered dropdowns</div>
<button onclick="document.getElementById('collapse').toggle()">toggle core-collapse</button>
<br>
<core-collapse id="collapse">
<x-trigger icon="menu">
<core-dropdown layered>
halign = left
<br>
valign = top
</core-dropdown>
</x-trigger>
</core-collapse>
</section>
<section>
<div>Scrolling and margin</div>
<x-trigger icon="menu">
<core-dropdown>
no margin<br>
<br>
<template repeat="{{countries}}">
{{name}}<br>
</template>
</core-dropdown>
</x-trigger>
<x-trigger icon="menu">
<core-dropdown class="with-margin">
with margin<br>
<br>
<template repeat="{{countries}}">
{{name}}<br>
</template>
</core-dropdown>
</x-trigger>
</section>
<section>
<div>Custom position</div>
<x-trigger icon="menu">
<core-dropdown class="open-below">
top: 38px
</core-dropdown>
</x-trigger>
</section>
</template>
<script>
scope = document.querySelector('template[is=auto-binding]');
scope.countries = [
{name: 'Afghanistan', code: 'AF'},
{name: 'Åland Islands', code: 'AX'},
{name: 'Albania', code: 'AL'},
{name: 'Algeria', code: 'DZ'},
{name: 'American Samoa', code: 'AS'},
{name: 'Andorra', code: 'AD'},
{name: 'Angola', code: 'AO'},
{name: 'Anguilla', code: 'AI'},
{name: 'Antarctica', code: 'AQ'},
{name: 'Antigua and Barbuda', code: 'AG'},
{name: 'Argentina', code: 'AR'},
{name: 'Armenia', code: 'AM'},
{name: 'Aruba', code: 'AW'},
{name: 'Australia', code: 'AU'},
{name: 'Austria', code: 'AT'},
{name: 'Azerbaijan', code: 'AZ'},
{name: 'Bahamas', code: 'BS'},
{name: 'Bahrain', code: 'BH'},
{name: 'Bangladesh', code: 'BD'},
{name: 'Barbados', code: 'BB'},
{name: 'Belarus', code: 'BY'},
{name: 'Belgium', code: 'BE'},
{name: 'Belize', code: 'BZ'},
{name: 'Benin', code: 'BJ'},
{name: 'Bermuda', code: 'BM'},
{name: 'Bhutan', code: 'BT'},
{name: 'Bolivia', code: 'BO'},
{name: 'Bosnia and Herzegovina', code: 'BA'},
{name: 'Botswana', code: 'BW'},
{name: 'Bouvet Island', code: 'BV'},
{name: 'Brazil', code: 'BR'},
{name: 'British Indian Ocean Territory', code: 'IO'},
{name: 'Brunei Darussalam', code: 'BN'},
{name: 'Bulgaria', code: 'BG'},
{name: 'Burkina Faso', code: 'BF'},
{name: 'Burundi', code: 'BI'},
{name: 'Cambodia', code: 'KH'},
{name: 'Cameroon', code: 'CM'},
{name: 'Canada', code: 'CA'},
{name: 'Cape Verde', code: 'CV'},
{name: 'Cayman Islands', code: 'KY'},
{name: 'Central African Republic', code: 'CF'},
{name: 'Chad', code: 'TD'},
{name: 'Chile', code: 'CL'},
{name: 'China', code: 'CN'},
{name: 'Christmas Island', code: 'CX'},
{name: 'Cocos (Keeling) Islands', code: 'CC'},
{name: 'Colombia', code: 'CO'},
{name: 'Comoros', code: 'KM'},
{name: 'Congo', code: 'CG'},
{name: 'Congo, The Democratic Republic of the', code: 'CD'},
{name: 'Cook Islands', code: 'CK'},
{name: 'Costa Rica', code: 'CR'},
{name: 'Cote D\'Ivoire', code: 'CI'},
{name: 'Croatia', code: 'HR'},
{name: 'Cuba', code: 'CU'},
{name: 'Cyprus', code: 'CY'},
{name: 'Czech Republic', code: 'CZ'},
{name: 'Denmark', code: 'DK'},
{name: 'Djibouti', code: 'DJ'},
{name: 'Dominica', code: 'DM'},
{name: 'Dominican Republic', code: 'DO'},
{name: 'Ecuador', code: 'EC'},
{name: 'Egypt', code: 'EG'},
{name: 'El Salvador', code: 'SV'},
{name: 'Equatorial Guinea', code: 'GQ'},
{name: 'Eritrea', code: 'ER'},
{name: 'Estonia', code: 'EE'},
{name: 'Ethiopia', code: 'ET'},
{name: 'Falkland Islands (Malvinas)', code: 'FK'},
{name: 'Faroe Islands', code: 'FO'},
{name: 'Fiji', code: 'FJ'},
{name: 'Finland', code: 'FI'},
{name: 'France', code: 'FR'},
{name: 'French Guiana', code: 'GF'},
{name: 'French Polynesia', code: 'PF'},
{name: 'French Southern Territories', code: 'TF'},
{name: 'Gabon', code: 'GA'},
{name: 'Gambia', code: 'GM'},
{name: 'Georgia', code: 'GE'},
{name: 'Germany', code: 'DE'},
{name: 'Ghana', code: 'GH'},
{name: 'Gibraltar', code: 'GI'},
{name: 'Greece', code: 'GR'},
{name: 'Greenland', code: 'GL'},
{name: 'Grenada', code: 'GD'},
{name: 'Guadeloupe', code: 'GP'},
{name: 'Guam', code: 'GU'},
{name: 'Guatemala', code: 'GT'},
{name: 'Guernsey', code: 'GG'},
{name: 'Guinea', code: 'GN'},
{name: 'Guinea-Bissau', code: 'GW'},
{name: 'Guyana', code: 'GY'},
{name: 'Haiti', code: 'HT'},
{name: 'Heard Island and Mcdonald Islands', code: 'HM'},
{name: 'Holy See (Vatican City State)', code: 'VA'},
{name: 'Honduras', code: 'HN'},
{name: 'Hong Kong', code: 'HK'},
{name: 'Hungary', code: 'HU'},
{name: 'Iceland', code: 'IS'},
{name: 'India', code: 'IN'},
{name: 'Indonesia', code: 'ID'},
{name: 'Iran, Islamic Republic Of', code: 'IR'},
{name: 'Iraq', code: 'IQ'},
{name: 'Ireland', code: 'IE'},
{name: 'Isle of Man', code: 'IM'},
{name: 'Israel', code: 'IL'},
{name: 'Italy', code: 'IT'},
{name: 'Jamaica', code: 'JM'},
{name: 'Japan', code: 'JP'},
{name: 'Jersey', code: 'JE'},
{name: 'Jordan', code: 'JO'},
{name: 'Kazakhstan', code: 'KZ'},
{name: 'Kenya', code: 'KE'},
{name: 'Kiribati', code: 'KI'},
{name: 'Korea, Democratic People\'S Republic of', code: 'KP'},
{name: 'Korea, Republic of', code: 'KR'},
{name: 'Kuwait', code: 'KW'},
{name: 'Kyrgyzstan', code: 'KG'},
{name: 'Lao People\'S Democratic Republic', code: 'LA'},
{name: 'Latvia', code: 'LV'},
{name: 'Lebanon', code: 'LB'},
{name: 'Lesotho', code: 'LS'},
{name: 'Liberia', code: 'LR'},
{name: 'Libyan Arab Jamahiriya', code: 'LY'},
{name: 'Liechtenstein', code: 'LI'},
{name: 'Lithuania', code: 'LT'},
{name: 'Luxembourg', code: 'LU'},
{name: 'Macao', code: 'MO'},
{name: 'Macedonia, The Former Yugoslav Republic of', code: 'MK'},
{name: 'Madagascar', code: 'MG'},
{name: 'Malawi', code: 'MW'},
{name: 'Malaysia', code: 'MY'},
{name: 'Maldives', code: 'MV'},
{name: 'Mali', code: 'ML'},
{name: 'Malta', code: 'MT'},
{name: 'Marshall Islands', code: 'MH'},
{name: 'Martinique', code: 'MQ'},
{name: 'Mauritania', code: 'MR'},
{name: 'Mauritius', code: 'MU'},
{name: 'Mayotte', code: 'YT'},
{name: 'Mexico', code: 'MX'},
{name: 'Micronesia, Federated States of', code: 'FM'},
{name: 'Moldova, Republic of', code: 'MD'},
{name: 'Monaco', code: 'MC'},
{name: 'Mongolia', code: 'MN'},
{name: 'Montserrat', code: 'MS'},
{name: 'Morocco', code: 'MA'},
{name: 'Mozambique', code: 'MZ'},
{name: 'Myanmar', code: 'MM'},
{name: 'Namibia', code: 'NA'},
{name: 'Nauru', code: 'NR'},
{name: 'Nepal', code: 'NP'},
{name: 'Netherlands', code: 'NL'},
{name: 'Netherlands Antilles', code: 'AN'},
{name: 'New Caledonia', code: 'NC'},
{name: 'New Zealand', code: 'NZ'},
{name: 'Nicaragua', code: 'NI'},
{name: 'Niger', code: 'NE'},
{name: 'Nigeria', code: 'NG'},
{name: 'Niue', code: 'NU'},
{name: 'Norfolk Island', code: 'NF'},
{name: 'Northern Mariana Islands', code: 'MP'},
{name: 'Norway', code: 'NO'},
{name: 'Oman', code: 'OM'},
{name: 'Pakistan', code: 'PK'},
{name: 'Palau', code: 'PW'},
{name: 'Palestinian Territory, Occupied', code: 'PS'},
{name: 'Panama', code: 'PA'},
{name: 'Papua New Guinea', code: 'PG'},
{name: 'Paraguay', code: 'PY'},
{name: 'Peru', code: 'PE'},
{name: 'Philippines', code: 'PH'},
{name: 'Pitcairn', code: 'PN'},
{name: 'Poland', code: 'PL'},
{name: 'Portugal', code: 'PT'},
{name: 'Puerto Rico', code: 'PR'},
{name: 'Qatar', code: 'QA'},
{name: 'Reunion', code: 'RE'},
{name: 'Romania', code: 'RO'},
{name: 'Russian Federation', code: 'RU'},
{name: 'RWANDA', code: 'RW'},
{name: 'Saint Helena', code: 'SH'},
{name: 'Saint Kitts and Nevis', code: 'KN'},
{name: 'Saint Lucia', code: 'LC'},
{name: 'Saint Pierre and Miquelon', code: 'PM'},
{name: 'Saint Vincent and the Grenadines', code: 'VC'},
{name: 'Samoa', code: 'WS'},
{name: 'San Marino', code: 'SM'},
{name: 'Sao Tome and Principe', code: 'ST'},
{name: 'Saudi Arabia', code: 'SA'},
{name: 'Senegal', code: 'SN'},
{name: 'Serbia and Montenegro', code: 'CS'},
{name: 'Seychelles', code: 'SC'},
{name: 'Sierra Leone', code: 'SL'},
{name: 'Singapore', code: 'SG'},
{name: 'Slovakia', code: 'SK'},
{name: 'Slovenia', code: 'SI'},
{name: 'Solomon Islands', code: 'SB'},
{name: 'Somalia', code: 'SO'},
{name: 'South Africa', code: 'ZA'},
{name: 'South Georgia and the South Sandwich Islands', code: 'GS'},
{name: 'Spain', code: 'ES'},
{name: 'Sri Lanka', code: 'LK'},
{name: 'Sudan', code: 'SD'},
{name: 'Suriname', code: 'SR'},
{name: 'Svalbard and Jan Mayen', code: 'SJ'},
{name: 'Swaziland', code: 'SZ'},
{name: 'Sweden', code: 'SE'},
{name: 'Switzerland', code: 'CH'},
{name: 'Syrian Arab Republic', code: 'SY'},
{name: 'Taiwan, Province of China', code: 'TW'},
{name: 'Tajikistan', code: 'TJ'},
{name: 'Tanzania, United Republic of', code: 'TZ'},
{name: 'Thailand', code: 'TH'},
{name: 'Timor-Leste', code: 'TL'},
{name: 'Togo', code: 'TG'},
{name: 'Tokelau', code: 'TK'},
{name: 'Tonga', code: 'TO'},
{name: 'Trinidad and Tobago', code: 'TT'},
{name: 'Tunisia', code: 'TN'},
{name: 'Turkey', code: 'TR'},
{name: 'Turkmenistan', code: 'TM'},
{name: 'Turks and Caicos Islands', code: 'TC'},
{name: 'Tuvalu', code: 'TV'},
{name: 'Uganda', code: 'UG'},
{name: 'Ukraine', code: 'UA'},
{name: 'United Arab Emirates', code: 'AE'},
{name: 'United Kingdom', code: 'GB'},
{name: 'United States', code: 'US'},
{name: 'United States Minor Outlying Islands', code: 'UM'},
{name: 'Uruguay', code: 'UY'},
{name: 'Uzbekistan', code: 'UZ'},
{name: 'Vanuatu', code: 'VU'},
{name: 'Venezuela', code: 'VE'},
{name: 'Viet Nam', code: 'VN'},
{name: 'Virgin Islands, British', code: 'VG'},
{name: 'Virgin Islands, U.S.', code: 'VI'},
{name: 'Wallis and Futuna', code: 'WF'},
{name: 'Western Sahara', code: 'EH'},
{name: 'Yemen', code: 'YE'},
{name: 'Zambia', code: 'ZM'},
{name: 'Zimbabwe', code: 'ZW'}
];
scope.pastries = [
'Apple fritter',
'Croissant',
'Donut',
'Financier',
'Jello',
'Madeleine',
'Pound cake',
'Pretzel',
'Sfogliatelle'
];
</script>
</body>
</html>

View File

@@ -0,0 +1,22 @@
<!doctype html>
<!--
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE
The complete set of authors may be found at http://polymer.github.io/AUTHORS
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS
-->
<html>
<head>
<script src="../webcomponentsjs/webcomponents.js"></script>
<link rel="import" href="../core-component-page/core-component-page.html">
</head>
<body unresolved>
<core-component-page sources='["core-dropdown.html","core-dropdown-base.html"]'></core-component-page>
</body>
</html>

View File

@@ -0,0 +1,62 @@
<!--
@license
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<x-meta id="core-menu" label="Menu" group="Core" isContainer>
<template>
<core-menu selected="0" style="font-size: 16px;">
<core-submenu icon="settings" label="Topics">
<core-item label="Topic 1"></core-item>
<core-item label="Topic 2"></core-item>
</core-submenu>
<core-submenu icon="settings" label="Favorites">
<core-item label="Favorite 1"></core-item>
<core-item label="Favorite 2"></core-item>
<core-item label="Favorite 3"></core-item>
</core-submenu>
</core-menu>
</template>
<template id="imports">
<link rel="import" href="core-submenu.html">
</template>
</x-meta>
<x-meta id="core-submenu" label="Sub Menu" group="Core" isContainer>
<template>
<core-submenu icon="settings" label="Topics">
<core-item label="Topic 1"></core-item>
<core-item label="Topic 2"></core-item>
</core-submenu>
</template>
<template id="imports">
<link rel="import" href="core-submenu.html">
</template>
</x-meta>

View File

@@ -0,0 +1,162 @@
<!doctype html>
<!--
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<html>
<head>
<meta charset="UTF-8">
<title>core-dropdown basic tests</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<script src="../../webcomponentsjs/webcomponents.js"></script>
<script src="../../web-component-tester/browser.js"></script>
<link href="../core-dropdown.html" rel="import">
<style>
body {
text-align: center;
margin-top: 200px;
}
</style>
</head>
<body>
<div relative id="trigger1">
tap
<core-dropdown id="dropdown1">Hello World!</core-dropdown>
</div>
<div relative id="trigger2">
tap
<core-dropdown id="dropdown2" valign="bottom">Hello World!</core-dropdown>
</div>
<div relative id="trigger3">
tap
<core-dropdown id="dropdown3" halign="right">Hello World!</core-dropdown>
</div>
<div relative id="trigger4">
tap
<core-dropdown id="dropdown4" layered>Hello World!</core-dropdown>
</div>
<div relative id="trigger5">
tap
<core-dropdown id="dropdown5" layered valign="bottom">Hello World!</core-dropdown>
</div>
<div relative id="trigger6">
tap
<core-dropdown id="dropdown6" layered halign="right">Hello World!</core-dropdown>
</div>
<script>
function approxEqual(a, b) {
return assert.equal(Math.round(a), Math.round(b));
}
function assertPosition(dropdown, trigger) {
var dr = dropdown.getBoundingClientRect();
var tr = trigger.getBoundingClientRect();
if (dropdown.halign === 'left') {
approxEqual(dr.left, tr.left);
} else {
approxEqual(dr.right, tr.right);
}
if (dropdown.valign === 'top') {
approxEqual(dr.top, tr.top);
} else {
approxEqual(dr.bottom, tr.bottom);
}
};
function flushLayoutAndRender(callback) {
flush(function() {
document.body.offsetTop;
requestAnimationFrame(function() {
callback();
});
});
}
var d1 = document.getElementById('dropdown1');
var t1 = document.getElementById('trigger1');
var d2 = document.getElementById('dropdown2');
var t2 = document.getElementById('trigger2');
var d3 = document.getElementById('dropdown3');
var t3 = document.getElementById('trigger3');
var d4 = document.getElementById('dropdown4');
var t4 = document.getElementById('trigger4');
var d5 = document.getElementById('dropdown5');
var t5 = document.getElementById('trigger5');
var d6 = document.getElementById('dropdown6');
var t6 = document.getElementById('trigger6');
test('default', function(done) {
d1.opened = true;
flushLayoutAndRender(function() {
assertPosition(d1, t1);
done();
});
});
test('bottom alignment', function(done) {
d2.opened = true;
flushLayoutAndRender(function() {
assertPosition(d2, t2);
done();
});
});
test('right alignment', function(done) {
d3.opened = true;
flushLayoutAndRender(function() {
assertPosition(d3, t3);
done();
});
});
test('layered', function(done) {
d4.opened = true;
flushLayoutAndRender(function() {
assertPosition(d4, t4);
done();
});
});
test('layered, bottom alignment', function(done) {
d5.opened = true;
flushLayoutAndRender(function() {
assertPosition(d5, t5);
done();
});
});
test('layered, right alignment', function(done) {
d6.opened = true;
flushLayoutAndRender(function() {
assertPosition(d6, t6);
done();
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,24 @@
<!doctype html>
<!--
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<title>core-dropdown tests</title>
<script src="../../web-component-tester/browser.js"></script>
</head>
<body>
<script>
WCT.loadSuites([
'basic.html'
]);
</script>
</body>
</html>