+++ /dev/null
-/* content layout */
-.resource-widget.resource-flow-layout {
- display: inline-block;
- margin-right: -20px;
- /* clearfix idiom */ }
- .resource-widget.resource-flow-layout.col-1 {
- width: 60px; }
- .resource-widget.resource-flow-layout.col-2 {
- width: 120px; }
- .resource-widget.resource-flow-layout.col-3 {
- width: 180px; }
- .resource-widget.resource-flow-layout.col-4 {
- width: 240px; }
- .resource-widget.resource-flow-layout.col-5 {
- width: 300px; }
- .resource-widget.resource-flow-layout.col-6 {
- width: 360px; }
- .resource-widget.resource-flow-layout.col-7 {
- width: 420px; }
- .resource-widget.resource-flow-layout.col-8 {
- width: 480px; }
- .resource-widget.resource-flow-layout.col-9 {
- width: 540px; }
- .resource-widget.resource-flow-layout.col-10 {
- width: 600px; }
- .resource-widget.resource-flow-layout.col-11 {
- width: 660px; }
- .resource-widget.resource-flow-layout.col-12 {
- width: 720px; }
- .resource-widget.resource-flow-layout.col-13 {
- width: 780px; }
- .resource-widget.resource-flow-layout.col-14 {
- width: 840px; }
- .resource-widget.resource-flow-layout.col-15 {
- width: 900px; }
- .resource-widget.resource-flow-layout.col-16 {
- width: 960px; }
- .resource-widget.resource-flow-layout:after {
- content: ".";
- display: block;
- height: 0;
- clear: both;
- visibility: hidden; }
- * html .resource-widget.resource-flow-layout {
- height: 1px; }
-
-.resource-card {
- /* stuff that applies to all cards */
- display: -webkit-flex;
- -webkit-transform: translateZ(0);
- float: left;
- position: relative;
- margin-right: 20px;
- margin-bottom: 20px;
- background-color: #fff;
- border-radius: 2px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25);
- opacity: 0.8;
- overflow: hidden;
- transition: 0.4s box-shadow ease, 0.4s opacity ease;
- /* card templates */
- /* specific cards and customizations */ }
- .resource-card .photo {
- position: relative;
- background-color: #eee;
- background-size: cover;
- background-repeat: no-repeat;
- background-position: 50% 50%; }
- .resource-card.nophoto .photo:after {
- content: '';
- display: block;
- position: absolute;
- left: 20px;
- top: 20px;
- right: 20px;
- bottom: 20px;
- opacity: 0.2;
- background-position: center center;
- background-repeat: no-repeat;
- background-size: contain; }
- .resource-card .icon {
- background-position: center center;
- background-repeat: no-repeat;
- background-size: contain;
- opacity: 0;
- transition: 0.4s ease; }
- .resource-card:hover .icon {
- opacity: 0.2; }
- .resource-card:hover {
- opacity: 1;
- box-shadow: 0 6px 12px rgba(0, 0, 0, 0.5); }
- .resource-card.resource-card-youtube.nophoto .photo:after, .resource-card.resource-card-youtube .icon {
- background-image: url(../images/card_video.png); }
- .resource-card.resource-card-samples.nophoto .photo:after, .resource-card.resource-card-samples .icon {
- background-image: url(../images/card_sample.png); }
- .resource-card.resource-card-blog.nophoto .photo:after, .resource-card.resource-card-blog .icon {
- background-image: url(../images/card_post.png); }
- .resource-card.resource-card-training.nophoto .photo:after, .resource-card.resource-card-training .icon {
- background-image: url(../images/card_training.png); }
- .resource-card .resource-card-text {
- color: #333333; }
- .resource-card .title {
- /*font-weight: 700;*/
- font-family: 'Roboto Condensed'; }
- .resource-card .subtitle {
- font-family: 'Roboto Condensed';
- text-transform: uppercase;
- opacity: 0.3; }
- .resource-card .abstract {
- font-weight: 300;
- font-family: 'Roboto'; }
- .resource-card.resource-card-12x7 {
- width: 700px;
- height: 400px;
- -webkit-flex-direction: column; }
- .resource-card.resource-card-12x7 .photo {
- -webkit-flex: 1 1 auto;
- border-bottom: 1px solid #ddd; }
- .resource-card.resource-card-12x7 .resource-card-text {
- margin: 20px;
- padding-right: 88px; }
- .resource-card.resource-card-12x7 .icon {
- position: absolute;
- right: 20px;
- bottom: 20px;
- width: 48px;
- height: 48px; }
- .resource-card.resource-card-12x7 .title {
- font-size: 36px;
- line-height: 35px;
- max-height: 70px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical; }
- .resource-card.resource-card-12x7 .subtitle {
- font-size: 18px;
- line-height: 20px;
- max-height: 20px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 1;
- -webkit-box-orient: vertical;
- max-height: 0;
- margin-top: 0;
- transition: 0.4s ease; }
- .resource-card.resource-card-12x7:hover .subtitle {
- margin-top: 10px;
- max-height: 20px; }
- .resource-card.resource-card-12x7 .abstract {
- font-size: 18px;
- margin-top: 0;
- line-height: 25px;
- max-height: 75px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 3;
- -webkit-box-orient: vertical;
- max-height: 0;
- transition: 0.4s ease; }
- .resource-card.resource-card-12x7:hover .abstract {
- margin-top: 20px;
- max-height: 75px; }
- .resource-card.resource-card-8x6 {
- width: 460px;
- height: 340px;
- -webkit-flex-direction: column; }
- .resource-card.resource-card-8x6 .photo {
- -webkit-flex: 1 1 auto;
- border-bottom: 1px solid #ddd; }
- .resource-card.resource-card-8x6 .resource-card-text {
- margin: 20px;
- padding-right: 88px; }
- .resource-card.resource-card-8x6 .icon {
- position: absolute;
- right: 20px;
- bottom: 20px;
- width: 48px;
- height: 48px; }
- .resource-card.resource-card-8x6 .title {
- font-size: 36px;
- line-height: 35px;
- max-height: 70px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical; }
- .resource-card.resource-card-8x6 .subtitle {
- font-size: 18px;
- line-height: 20px;
- max-height: 20px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 1;
- -webkit-box-orient: vertical;
- max-height: 0;
- margin-top: 0;
- transition: 0.4s ease; }
- .resource-card.resource-card-8x6:hover .subtitle {
- margin-top: 10px;
- max-height: 20px; }
- .resource-card.resource-card-8x6 .abstract {
- font-size: 18px;
- margin-top: 0;
- line-height: 25px;
- max-height: 75px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 3;
- -webkit-box-orient: vertical;
- max-height: 0;
- transition: 0.4s ease; }
- .resource-card.resource-card-8x6:hover .abstract {
- margin-top: 20px;
- max-height: 75px; }
- .resource-card.resource-card-8x6 .icon {
- width: 32px;
- height: 32px; }
- .resource-card.resource-card-8x6 .title {
- font-size: 24px;
- line-height: 25px;
- max-height: 50px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical; }
- .resource-card.resource-card-8x6 .abstract {
- font-size: 16px;
- margin-top: 10px;
- line-height: 20px;
- max-height: 60px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 3;
- -webkit-box-orient: vertical; }
- .resource-card.resource-card-8x6 .subtitle {
- font-size: 16px;
- line-height: 20px;
- max-height: 20px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 1;
- -webkit-box-orient: vertical;
- max-height: 0;
- margin-top: 0;
- transition: 0.4s ease; }
- .resource-card.resource-card-8x6:hover .subtitle {
- margin-top: 10px;
- max-height: 20px; }
- .resource-card.resource-card-8x6 .abstract {
- font-size: 16px;
- margin-top: 0;
- line-height: 20px;
- max-height: 60px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 3;
- -webkit-box-orient: vertical;
- max-height: 0;
- transition: 0.4s ease; }
- .resource-card.resource-card-8x6:hover .abstract {
- margin-top: 10px;
- max-height: 60px; }
- .resource-card.resource-card-6x4 {
- width: 340px;
- height: 220px;
- -webkit-flex-direction: column; }
- .resource-card.resource-card-6x4 .photo {
- -webkit-flex: 1 1 auto;
- border-bottom: 1px solid #ddd; }
- .resource-card.resource-card-6x4 .resource-card-text {
- margin: 10px;
- padding-right: 26px; }
- .resource-card.resource-card-6x4 .icon {
- position: absolute;
- right: 10px;
- bottom: 10px;
- width: 16px;
- height: 16px; }
- .resource-card.resource-card-6x4 .title {
- font-size: 16px;
- line-height: 20px;
- max-height: 40px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical; }
- .resource-card.resource-card-6x4 .subtitle {
- font-size: 13px;
- line-height: 15px;
- max-height: 30px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- max-height: 0;
- margin-top: 0;
- transition: 0.4s ease; }
- .resource-card.resource-card-6x4:hover .subtitle {
- max-height: 30px; }
- .resource-card.resource-card-6x4 .abstract {
- display: none; }
- .resource-card.resource-card-6x4 .abstract {
- font-size: 13px;
- margin-top: 0;
- line-height: 15px;
- max-height: 30px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- max-height: 0;
- display: block;
- transition: 0.4s ease; }
- .resource-card.resource-card-6x4:hover .abstract {
- margin-top: 10px;
- max-height: 30px; }
- .resource-card.resource-card-4x3 {
- width: 220px;
- height: 160px;
- -webkit-flex-direction: column; }
- .resource-card.resource-card-4x3 .photo {
- -webkit-flex: 1 1 auto;
- border-bottom: 1px solid #ddd; }
- .resource-card.resource-card-4x3 .resource-card-text {
- margin: 10px;
- padding-right: 26px; }
- .resource-card.resource-card-4x3 .icon {
- position: absolute;
- right: 10px;
- bottom: 10px;
- width: 16px;
- height: 16px; }
- .resource-card.resource-card-4x3 .title {
- font-size: 16px;
- line-height: 20px;
- max-height: 40px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical; }
- .resource-card.resource-card-4x3 .subtitle {
- font-size: 13px;
- line-height: 15px;
- max-height: 30px;
- text-overflow: ellipsis;
- display: -webkit-box;
- overflow: hidden;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- max-height: 0;
- margin-top: 0;
- transition: 0.4s ease; }
- .resource-card.resource-card-4x3:hover .subtitle {
- max-height: 30px; }
- .resource-card.resource-card-4x3 .abstract {
- display: none; }
+++ /dev/null
-function mergeArrays() {
- var arr = arguments[0] || [];
- for (var i = 1; i < arguments.length; i++) {
- arr = arr.concat(arguments[i]);
- }
- return arr;
-}
-
-var ALL_RESOURCES = mergeArrays(
- DESIGN_RESOURCES,
- DISTRIBUTE_RESOURCES,
- GOOGLE_RESOURCES,
- GUIDE_RESOURCES,
- SAMPLES_RESOURCES,
- TOOLS_RESOURCES,
- TRAINING_RESOURCES,
- YOUTUBE_RESOURCES,
- BLOGGER_RESOURCES
-);
-
-for (var i = 0; i < ALL_RESOURCES.length; i++) {
- ALL_RESOURCES[i].index = i;
-}
-
-function mergeMaps() {
- var allRes = {};
- var offset = 0;
-
- for (var i = 0; i < arguments.length; i++) {
- var r = arguments[i];
- for (var tag in r.map) {
- allRes[tag] = allRes[tag] || [];
- allRes[tag] = allRes[tag].concat(r.map[tag].map(function(i){ return ALL_RESOURCES[i + offset]; }));
- }
- offset += r.arr.length;
- }
-
- return allRes;
-}
-
-function setFromArray(arr) {
- arr = arr || [];
- var set = {};
- for (var i = 0; i < arr.length; i++) {
- set[arr[i]] = true;
- }
- return set;
-}
-
-function buildResourceLookupMap(resourceDict) {
- var map = {};
- for (var key in resourceDict) {
- var dictForKey = {};
- var srcArr = resourceDict[key];
- for (var i = 0; i < srcArr.length; i++) {
- dictForKey[srcArr[i].index] = true;
- }
- map[key] = dictForKey;
- }
- return map;
-}
-
-// Type lookups
-
-var ALL_RESOURCES_BY_TYPE = {
- 'design': DESIGN_RESOURCES,
- 'distribute': DISTRIBUTE_RESOURCES,
- 'google': GOOGLE_RESOURCES,
- 'guide': GUIDE_RESOURCES,
- 'samples': SAMPLES_RESOURCES,
- 'tools': TOOLS_RESOURCES,
- 'training': TRAINING_RESOURCES,
- 'youtube': YOUTUBE_RESOURCES,
- 'blog': BLOGGER_RESOURCES
-};
-var IS_RESOURCE_OF_TYPE = buildResourceLookupMap(ALL_RESOURCES_BY_TYPE);
-
-// Tag lookups
-
-var ALL_RESOURCES_BY_TAG = mergeMaps(
- {map:DESIGN_BY_TAG,arr:DESIGN_RESOURCES},
- {map:DISTRIBUTE_BY_TAG,arr:DISTRIBUTE_RESOURCES},
- {map:GOOGLE_BY_TAG,arr:GOOGLE_RESOURCES},
- {map:GUIDE_BY_TAG,arr:GUIDE_RESOURCES},
- {map:SAMPLES_BY_TAG,arr:SAMPLES_RESOURCES},
- {map:TOOLS_BY_TAG,arr:TOOLS_RESOURCES},
- {map:TRAINING_BY_TAG,arr:TRAINING_RESOURCES},
- {map:YOUTUBE_BY_TAG,arr:YOUTUBE_RESOURCES},
- {map:BLOGGER_BY_TAG,arr:BLOGGER_RESOURCES}
-);
-var IS_RESOURCE_TAGGED = buildResourceLookupMap(ALL_RESOURCES_BY_TAG);
-
-// Language lookups
-
-var ALL_RESOURCES_BY_LANG = {};
-for (var i = 0; i < ALL_RESOURCES.length; i++) {
- var res = ALL_RESOURCES[i];
- var lang = res.lang;
- if (!lang) {
- continue;
- }
-
- ALL_RESOURCES_BY_LANG[lang] = ALL_RESOURCES_BY_LANG[lang] || [];
- ALL_RESOURCES_BY_LANG[lang].push(res);
-}
-var IS_RESOURCE_IN_LANG = buildResourceLookupMap(ALL_RESOURCES_BY_LANG);
\ No newline at end of file
+++ /dev/null
-// Requires jd_tag_helpers.js and the data JS to be loaded.
-
-$(document).ready(function() {
- $('.resource-widget').each(function() {
- initResourceWidget(this);
- });
-});
-
-
-function initResourceWidget(widget) {
- var $widget = $(widget);
- var isFlow, isCarousel;
- isFlow = $widget.hasClass('resource-flow-layout');
- if (!isFlow) {
- isCarousel = $widget.hasClass('resource-carousel-layout');
- }
-
- // find size of widget by pulling out its class name
- var sizeCols = 1;
- var m = $widget.get(0).className.match(/\bcol-(\d+)\b/);
- if (m) {
- sizeCols = parseInt(m[1], 10);
- }
-
- var opts = {
- source: $widget.data('source'),
- cardSizes: ($widget.data('cardsizes') || '').split(','),
- maxResults: parseInt($widget.data('maxresults') || '100'),
- itemsPerPage: $widget.data('itemsperpage'),
- sortOrder: $widget.data('sortorder'),
- query: $widget.data('query'),
- collectionId: $widget.data('collectionid'),
- sizeCols: sizeCols
- };
-
- // run the search for the set of resources to show
- var resources = buildResourceList(opts);
-
- if (isFlow) {
- drawResourcesFlowWidget($widget, opts, resources);
- }
-}
-
-
-function drawResourcesFlowWidget($widget, opts, resources) {
- $widget.empty();
- var cardSizes = opts.cardSizes || ['4x3'];
-
- for (var i = 0; i < resources.length; i++) {
- var resource = resources[i];
-
- var cardSize = i >= cardSizes.length ? cardSizes[cardSizes.length - 1] : cardSizes[i];
- cardSize = cardSize.replace(/^\s+|\s+$/,'');
-
- var $card = $('<a>')
- .addClass('resource-card resource-card-' + cardSize + ' resource-card-' + resource.type)
- .attr('href', resource.url);
-
- $('<img>')
- .addClass('photo')
- .attr('src', resource.image || '')
- .appendTo($card);
-
- var subtitle = resource.type;
- if (resource.timestamp) {
- var d = new Date(resource.timestamp);
- // TODO: localize, humanize
- subtitle = (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear() + ' on ' + subtitle;
- }
-
- $('<div>')
- .addClass('resource-card-text')
- .append($('<div>').addClass('icon'))
- .append($('<div>').addClass('title').text(resource.title))
- .append($('<div>').addClass('subtitle').text(subtitle))
- .append($('<div>').addClass('abstract').text(resource.summary))
- .appendTo($card);
-
- $card.appendTo($widget);
- }
-
- $widget.find('.resource-card .photo').each(function() {
- var src = $(this).attr('src');
- if (!src) {
- $(this).parents('.resource-card').addClass('nophoto');
- $(this).replaceWith($('<div>')
- .addClass('photo'));
- } else {
- $(this).replaceWith($('<div>')
- .addClass('photo')
- .css('background-image', 'url(' + $(this).attr('src') + ')'));
- }
- });
-}
-
-
-function buildResourceList(opts) {
- var maxResults = opts.maxResults || 100;
-
- switch (opts.source) {
- case 'query':
- var query = opts.query || '';
- var expressions = parseResourceQuery(query);
- var alreadyAddedResources = {};
- var allResources = [];
- for (var i = 0; i < expressions.length; i++) {
- var clauses = expressions[i];
-
- // build initial set of resources from first clause
- var firstClause = clauses[0];
- var resources = [];
- switch (firstClause.attr) {
- case 'type':
- resources = ALL_RESOURCES_BY_TYPE[firstClause.value];
- break;
- case 'lang':
- resources = ALL_RESOURCES_BY_LANG[firstClause.value];
- break;
- case 'tag':
- resources = ALL_RESOURCES_BY_TAG[firstClause.value];
- break;
- }
- resources = resources || [];
-
- // use additional clauses to filter corpus
- if (clauses.length > 1) {
- var otherClauses = clauses.slice(1);
- resources = resources.filter(getResourceMatchesClausesFilter(otherClauses));
- }
-
- // filter out resources already added
- if (i > 1) {
- resources = resources.filter(getResourceNotAlreadyAddedFilter(alreadyAddedResources));
- }
-
- allResources = allResources.concat(resources);
- if (allResources.length > maxResults) {
- break;
- }
- }
- if (opts.sortOrder) {
- var attr = opts.sortOrder;
- var desc = attr.charAt(0) == '-';
- if (desc) {
- attr = attr.substring(1);
- }
- allResources = allResources.sort(function(x,y) {
- return (desc ? -1 : 1) * (parseInt(x[attr], 10) - parseInt(y[attr], 10));
- });
- }
- return allResources.slice(0, maxResults);
-
- case 'related':
- // TODO
- break;
-
- case 'collection':
- // TODO
- break;
- }
-}
-
-
-function getResourceNotAlreadyAddedFilter(addedResources) {
- return function(x) {
- return !!addedResources[x];
- };
-}
-
-
-function getResourceMatchesClausesFilter(clauses) {
- return function(x) {
- return doesResourceMatchClauses(x, clauses);
- };
-}
-
-
-function doesResourceMatchClauses(resource, clauses) {
- for (var i = 0; i < clauses.length; i++) {
- var map;
- switch (clauses[i].attr) {
- case 'type':
- map = IS_RESOURCE_OF_TYPE[clauses[i].value];
- break;
- case 'lang':
- map = IS_RESOURCE_IN_LANG[clauses[i].value];
- break;
- case 'tag':
- map = IS_RESOURCE_TAGGED[clauses[i].value];
- break;
- }
-
- if (!map || (!!clauses[i].negative ? map[resource.index] : !map[resource.index])) {
- return false;
- }
- }
- return true;
-}
-
-
-function parseResourceQuery(query) {
- // Parse query into array of expressions (expression e.g. 'tag:foo + type:video')
- var expressions = [];
- var expressionStrs = query.split(',') || [];
- for (var i = 0; i < expressionStrs.length; i++) {
- var expr = expressionStrs[i] || '';
-
- // Break expression into clauses (clause e.g. 'tag:foo')
- var clauses = [];
- var clauseStrs = expr.split(/(?=[\+\-])/);
- for (var j = 0; j < clauseStrs.length; j++) {
- var clauseStr = clauseStrs[j] || '';
-
- // Get attribute and value from clause (e.g. attribute='tag', value='foo')
- var parts = clauseStr.split(':');
- var clause = {};
-
- clause.attr = parts[0].replace(/\s+/g,'');
- if (clause.attr) {
- if (clause.attr.charAt(0) == '+') {
- clause.attr = clause.attr.substring(1);
- } else if (clause.attr.charAt(0) == '-') {
- clause.negative = true;
- clause.attr = clause.attr.substring(1);
- }
- }
-
- if (parts.length > 1) {
- clause.value = parts[1].replace(/\s+/g,'');
- }
-
- clauses.push(clause);
- }
-
- if (!clauses.length) {
- continue;
- }
-
- expressions.push(clauses);
- }
-
- return expressions;
-}
-
</script>
<script src="<?cs var:toroot ?>assets/js/docs.js" type="text/javascript"></script>
-<!-- RESOURCES LIBRARY -->
-<script src="<?cs if:android.whichdoc != 'online' ?>http:<?cs /if ?>//androiddevdocs-staging.appspot.com/ytblogger_lists_unified.js" type="text/javascript"></script>
-<script src="<?cs var:toroot ?>jd_lists_unified.js" type="text/javascript"></script>
-<script src="<?cs var:toroot ?>assets/js/jd_tag_helpers.js" type="text/javascript"></script>
-<link href="<?cs var:toroot ?>assets/css/resourcecards.css" rel="stylesheet" type="text/css" />
-<script src="<?cs var:toroot ?>assets/js/resourcecards.js" type="text/javascript"></script>
-
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-5831155-1']);