import { observes } from 'ember-addons/ember-computed-decorators'; import { createPreviewComponent, LOREM, darkLightDiff } from 'wizard/lib/preview'; export default createPreviewComponent(659, 320, { logo: null, avatar: null, @observes('step.fieldsById.homepage_style.value') styleChanged() { this.triggerRepaint(); }, images() { return { logo: this.get('wizard').getLogoUrl(), avatar: '/images/wizard/trout.png' }; }, paint(ctx, colors, width, height) { this.drawFullHeader(colors); if (this.get('step.fieldsById.homepage_style.value') === "latest") { this.drawPills(colors, height * 0.15); this.renderLatest(ctx, colors, width, height); } else { this.drawPills(colors, height * 0.15, { categories: true }); this.renderCategories(ctx, colors, width, height); } }, renderCategories(ctx, colors, width, height) { const textColor = darkLightDiff(colors.primary, colors.secondary, 50, 50); const margin = height * 0.03; const bodyFontSize = height / 440.0; const drawLine = (x, y) => { ctx.beginPath(); ctx.strokeStyle = darkLightDiff(colors.primary, colors.secondary, 90, -75); ctx.moveTo(margin + x, y); ctx.lineTo(margin + x + ((width * 0.9) / 2), y); ctx.stroke(); }; const cols = [0.025, 0.4, 0.53, 0.58, 0.94].map(c => c * width); const headingY = height * 0.33; ctx.font = `${bodyFontSize * 0.9}em 'Arial'`; ctx.fillStyle = textColor; ctx.fillText("Category", cols[0], headingY); ctx.fillText("Topics", cols[1], headingY); ctx.fillText("Latest", cols[2], headingY); let y = headingY + (bodyFontSize * 12); ctx.lineWidth = 2; drawLine(0, y); drawLine(width / 2, y); const categoryHeight = height / 6; const titles = this.getTitles(); // Categories this.categories().forEach(category => { const textPos = y + (categoryHeight * 0.35); ctx.font = `Bold ${bodyFontSize * 1.1}em 'Arial'`; ctx.fillStyle = colors.primary; ctx.fillText(category.name, cols[0], textPos); ctx.font = `${bodyFontSize * 0.8}em 'Arial'`; ctx.fillStyle = textColor; ctx.fillText(titles[0], cols[0] - (margin * 0.25), textPos + (categoryHeight * 0.36)); ctx.beginPath(); ctx.moveTo(margin, y); ctx.strokeStyle = category.color; ctx.lineWidth = 3.5; ctx.lineTo(margin, y + categoryHeight); ctx.stroke(); y += categoryHeight; ctx.lineWidth = 1; drawLine(0, y); }); // Categories - Latest Topics const topicHeight = height / 8; const avatarSize = topicHeight * 0.7; y = headingY + (bodyFontSize * 12); ctx.lineWidth = 1; ctx.fillStyle = textColor; titles.forEach(title => { const category = this.categories()[0]; ctx.font = `${bodyFontSize}em 'Arial'`; const textPos = y + (topicHeight * 0.45); ctx.fillStyle = textColor; this.scaleImage(this.avatar, cols[2], y + (margin * 0.6), avatarSize, avatarSize); ctx.fillText(title, cols[3], textPos); ctx.font = `Bold ${bodyFontSize}em 'Arial'`; ctx.fillText(Math.floor(Math.random() * 90) + 10, cols[4], textPos); ctx.font = `${bodyFontSize}em 'Arial'`; ctx.fillText(`1h`, cols[4], textPos + (topicHeight * 0.4)); ctx.beginPath(); ctx.fillStyle = category.color; const badgeSize = topicHeight * 0.1; ctx.font = `Bold ${bodyFontSize * 0.5}em 'Arial'`; ctx.rect(cols[3] + (margin * 0.5), y + topicHeight * 0.65, badgeSize, badgeSize); ctx.fill(); ctx.fillStyle = colors.primary; ctx.fillText(category.name, cols[3] + (badgeSize * 3), y + (topicHeight * 0.76)); y += topicHeight; drawLine(width / 2, y); }); }, getTitles() { return LOREM.split(".").slice(0, 7).map(t => t.substring(0, 40)); }, renderLatest(ctx, colors, width, height) { const rowHeight = height / 10.0; const textColor = darkLightDiff(colors.primary, colors.secondary, 50, 50); const bodyFontSize = height / 440.0; ctx.font = `${bodyFontSize}em 'Arial'`; const margin = height * 0.03; const drawLine = y => { ctx.beginPath(); ctx.strokeStyle = darkLightDiff(colors.primary, colors.secondary, 90, -75); ctx.moveTo(margin, y); ctx.lineTo(width - margin, y); ctx.stroke(); }; const cols = [0.02, 0.5, 0.65, 0.8, 0.87, 0.93].map(c => c * width); // Headings const headingY = height * 0.33; ctx.fillStyle = textColor; ctx.font = `${bodyFontSize * 0.9}em 'Arial'`; ctx.fillText("Topic", cols[0], headingY); ctx.fillText("Category", cols[1], headingY); ctx.fillText("Users", cols[2], headingY); ctx.fillText("Replies", cols[3], headingY); ctx.fillText("Views", cols[4], headingY); ctx.fillText("Activity", cols[5], headingY); // Topics let y = headingY + rowHeight / 2.6; ctx.lineWidth = 2; drawLine(y); ctx.font = `${bodyFontSize}em 'Arial'`; ctx.lineWidth = 1; this.getTitles().forEach(title => { const textPos = y + (rowHeight * 0.7); ctx.fillStyle = textColor; ctx.fillText(title, cols[0], textPos); const category = this.categories()[0]; ctx.beginPath(); ctx.fillStyle = category.color; const badgeSize = rowHeight * 0.2; ctx.font = `Bold ${bodyFontSize * 0.5}em 'Arial'`; ctx.rect(cols[1], y + rowHeight * 0.5, badgeSize, badgeSize); ctx.fill(); ctx.fillStyle = colors.primary; ctx.fillText(category.name, cols[1] + (badgeSize * 1.5), y + (rowHeight * 0.65)); this.scaleImage(this.avatar, cols[2], y + rowHeight * 0.3, rowHeight * 0.5, rowHeight * 0.5); ctx.fillStyle = textColor; ctx.font = `${bodyFontSize}em 'Arial'`; for (let j=3; j<=5; j++) { ctx.fillText(Math.floor(Math.random() * 90) + 10, cols[j] + margin, y + (rowHeight * 0.7)); } drawLine(y + (rowHeight * 1)); y += rowHeight; }); } });