start the creation of button "edit on codepen"

This commit is contained in:
Marcos Moura 2016-12-01 04:56:51 -02:00
parent f07f608d02
commit 815c58b29f
6 changed files with 263 additions and 24 deletions

View file

@ -12,16 +12,16 @@
<meta name="application-name" content="Vue Material">
<meta name="description" content="Material Design for Vue">
<meta name="msapplication-config" content="assets/favicon/browserconfig.xml">
<meta name="msapplication-config" content="/assets/favicon/browserconfig.xml">
<meta name="theme-color" content="#2196f3">
<link rel="apple-touch-icon" sizes="180x180" href="assets/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" href="assets/favicon/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="assets/favicon/favicon-194x194.png" sizes="194x194">
<link rel="icon" type="image/png" href="assets/favicon/android-chrome-192x192.png" sizes="192x192">
<link rel="icon" type="image/png" href="assets/favicon/favicon-16x16.png" sizes="16x16">
<link rel="manifest" href="assets/favicon/manifest.json">
<link rel="mask-icon" href="assets/favicon/safari-pinned-tab.svg" color="#2196f3">
<link rel="shortcut icon" href="assets/favicon/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" href="/assets/favicon/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/assets/favicon/favicon-194x194.png" sizes="194x194">
<link rel="icon" type="image/png" href="/assets/favicon/android-chrome-192x192.png" sizes="192x192">
<link rel="icon" type="image/png" href="/assets/favicon/favicon-16x16.png" sizes="16x16">
<link rel="manifest" href="/assets/favicon/manifest.json">
<link rel="mask-icon" href="/assets/favicon/safari-pinned-tab.svg" color="#2196f3">
<link rel="shortcut icon" href="/assets/favicon/favicon.ico">
<title>Vue Material</title>

BIN
docs/src/assets/codepen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

View file

@ -16,7 +16,6 @@
@import '../../../src/core/stylesheets/variables.scss';
.code-block {
//margin: -16px;
overflow: hidden;
position: relative;
border-radius: 2px;
@ -166,6 +165,7 @@
import highlightJavascript from 'highlight.js/lib/languages/javascript';
import highlightBash from 'highlight.js/lib/languages/bash';
import Clipboard from 'clipboard';
import getClosestVueParent from '../../../src/core/utils/getClosestVueParent';
highlight.registerLanguage('scss', highlightSCSS);
highlight.registerLanguage('xml', highlightXML);
@ -221,9 +221,17 @@
}
},
mounted() {
this.exampleBoxParent = getClosestVueParent(this.$parent, 'example-box');
this.reindent();
this.enableCopy();
if (this.exampleBoxParent) {
this.exampleBoxParent.codeBlocks.push({
lang: this.lang,
code: this.$refs.block.innerHTML
});
}
highlight.highlightBlock(this.$refs.block);
}
};

View file

@ -1,19 +1,51 @@
<template>
<md-card class="example-box">
<md-toolbar class="md-dense" v-md-theme="'white'">
<h3 class="md-title">{{ cardTitle }}</h3>
</md-toolbar>
<div class="example-box">
<md-card class="example-box-card">
<md-toolbar class="md-dense" v-md-theme="'white'">
<h3 class="md-title">{{ cardTitle }}</h3>
</md-toolbar>
<md-tabs md-right :md-dynamic-height="false" class="md-transparent example-tabs">
<md-tab class="example-content" md-label="Demo">
<slot name="demo"></slot>
</md-tab>
<md-card-area>
<md-tabs md-right :md-dynamic-height="false" class="md-transparent example-tabs">
<md-tab class="example-content" md-label="Demo">
<slot name="demo"></slot>
</md-tab>
<md-tab class="code-content" md-label="Code">
<slot name="code"></slot>
</md-tab>
</md-tabs>
</md-card>
<md-tab class="code-content" md-label="Code">
<slot name="code"></slot>
</md-tab>
</md-tabs>
</md-card-area>
<!-- <button type="button" class="md-codepen" @click="editOnCodepen">
<img src="assets/codepen.png" alt="Edit on Codepen">
<md-tooltip md-direction="left">Edit on codepen</md-tooltip>
</button> -->
</md-card>
<form action="http://codepen.io/pen/define" method="POST" target="_blank" v-if="codeBlocks.length" ref="form">
<input type="hidden" name="data" :value="codeString">
</form>
<pre ref="initialJs">
Vue.use(VueMaterial)
Vue.material.theme.register('default', {
primary: 'blue',
accent: 'pink'
})
var App = new Vue({
el: '#app'
})
</pre>
<pre ref="initialHtml">
&lt;div id=&quot;app&quot; v-md-theme=&quot;&#039;default&#039;&quot;&gt;
### TEMPLATE ###
&lt;/div&gt;
</pre>
</div>
</template>
<style lang="scss">
@ -26,6 +58,10 @@
}
}
}
.md-tooltip.md-codepen-tooltip {
margin-left: -4px;
}
</style>
<style lang="scss" scoped>
@ -46,12 +82,92 @@
background-color: #fff;
}
}
.example-box-card {
position: relative;
overflow: hidden;
&:hover .md-codepen {
opacity: .54;
transform: translate3D(0, 0, 0);
transition: .4s cubic-bezier(.25, .8, .25, 1);
}
}
.md-codepen {
margin: 0;
padding: 4px;
cursor: pointer;
position: absolute;
right: 4px;
bottom: 4px;
border: none;
background: none;
opacity: .26;
transform: translate3D(120%, 0, 0);
transition: .3s cubic-bezier(.55, 0, .55, .2);
img {
width: 32px;
}
}
pre {
display: none;
}
</style>
<script>
export default {
props: {
cardTitle: String
},
data: () => ({
codeBlocks: [],
codeString: ''
}),
methods: {
editOnCodepen() {
let data = {
title: 'Vue Material - ' + this.cardTitle,
private: false,
head: '<meta name="viewport" content="width=device-width">',
html_pre_processor: 'none',
js_pre_processor: 'none',
js: this.$refs.initialJs.innerHTML,
css_pre_processor: 'scss',
css_starter: 'neither',
css_prefix_free: false,
css_external: [
'http://fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic',
'http://fonts.googleapis.com/icon?family=Material+Icons',
'https://cdn.rawgit.com/marcosmoura/vue-material/master/dist/vue-material.css'
].join(';'),
js_external: [
'https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.3/vue.min.js',
'https://cdn.rawgit.com/marcosmoura/vue-material/master/dist/vue-material.js'
].join(';')
};
this.codeBlocks.forEach((block) => {
if (block.lang === 'xml') {
let initialHtml = this.$refs.initialHtml.innerHTML;
data.html = initialHtml.replace('### TEMPLATE ###', block.code);
} else if (block.lang === 'javascript') {
data.js = data.js += block.code;
} else {
data.css = block.code;
}
});
this.codeString = JSON.stringify(data).replace(/"/g, '&quot;').replace(/'/g, '&apos;');
this.$nextTick(() => {
console.log(this.$refs.initialJs);
this.$refs.form.submit();
});
}
}
};
</script>

View file

@ -183,7 +183,68 @@
<div slot="code">
<code-block lang="xml">
&lt;div class=&quot;field-group&quot;&gt;
&lt;md-input-container&gt;
&lt;label for=&quot;movie&quot;&gt;Movie&lt;/label&gt;
&lt;md-select name=&quot;movie&quot; id=&quot;movie&quot; v-model=&quot;movie&quot;&gt;
&lt;md-option value=&quot;fight_club&quot;&gt;Fight Club&lt;/md-option&gt;
&lt;md-option value=&quot;godfather&quot;&gt;Godfather&lt;/md-option&gt;
&lt;md-option value=&quot;godfather_ii&quot;&gt;Godfather II&lt;/md-option&gt;
&lt;md-option value=&quot;godfather_iii&quot;&gt;Godfather III&lt;/md-option&gt;
&lt;md-option value=&quot;godfellas&quot;&gt;Godfellas&lt;/md-option&gt;
&lt;md-option value=&quot;pulp_fiction&quot;&gt;Pulp Fiction&lt;/md-option&gt;
&lt;md-option value=&quot;scarface&quot;&gt;Scarface&lt;/md-option&gt;
&lt;/md-select&gt;
&lt;/md-input-container&gt;
&lt;md-input-container&gt;
&lt;label for=&quot;country&quot;&gt;Country&lt;/label&gt;
&lt;md-select name=&quot;country&quot; id=&quot;country&quot; v-model=&quot;country&quot;&gt;
&lt;md-option value=&quot;australia&quot;&gt;Australia&lt;/md-option&gt;
&lt;md-option value=&quot;brazil&quot;&gt;Brazil&lt;/md-option&gt;
&lt;md-option value=&quot;japan&quot;&gt;Japan&lt;/md-option&gt;
&lt;md-option value=&quot;united_states&quot;&gt;United States&lt;/md-option&gt;
&lt;/md-select&gt;
&lt;/md-input-container&gt;
&lt;md-input-container&gt;
&lt;label for=&quot;font&quot;&gt;Font&lt;/label&gt;
&lt;md-select name=&quot;font&quot; id=&quot;font&quot; v-model=&quot;font&quot;&gt;
&lt;md-option value=&quot;arial&quot;&gt;Arial&lt;/md-option&gt;
&lt;md-option value=&quot;calibri&quot;&gt;Calibri&lt;/md-option&gt;
&lt;md-option value=&quot;cambria&quot;&gt;Cambria&lt;/md-option&gt;
&lt;md-option value=&quot;comic_sans&quot;&gt;Comic Sans&lt;/md-option&gt;
&lt;md-option value=&quot;consolas&quot;&gt;Consolas&lt;/md-option&gt;
&lt;md-option value=&quot;courier&quot;&gt;Courier&lt;/md-option&gt;
&lt;md-option value=&quot;droid_sans&quot;&gt;Droid Sans&lt;/md-option&gt;
&lt;md-option value=&quot;georgia&quot;&gt;Georgia&lt;/md-option&gt;
&lt;md-option value=&quot;helvetica&quot;&gt;Helvetica&lt;/md-option&gt;
&lt;md-option value=&quot;impact&quot;&gt;Impact&lt;/md-option&gt;
&lt;md-option value=&quot;roboto&quot;&gt;Roboto&lt;/md-option&gt;
&lt;md-option value=&quot;segoe_ui&quot;&gt;Segoe UI&lt;/md-option&gt;
&lt;md-option value=&quot;times_new_roman&quot;&gt;Times New Roman&lt;/md-option&gt;
&lt;md-option value=&quot;ubuntu&quot;&gt;Ubuntu&lt;/md-option&gt;
&lt;md-option value=&quot;verdana&quot;&gt;Verdana&lt;/md-option&gt;
&lt;/md-select&gt;
&lt;/md-input-container&gt;
&lt;/div&gt;
&lt;md-button class=&quot;md-raised md-primary&quot; @click=&quot;setPulpFiction&quot;&gt;Set Pulp Fiction&lt;/md-button&gt;
</code-block>
<code-block lang="javascript">
export default {
data: () => ({
movie: 'godfather',
country: '',
font: ''
}),
methods: {
setPulpFiction() {
this.movie = 'pulp_fiction';
}
}
};
</code-block>
</div>
</example-box>
@ -237,7 +298,61 @@
<div slot="code">
<code-block lang="xml">
&lt;md-input-container&gt;
&lt;label for=&quot;food&quot;&gt;Food&lt;/label&gt;
&lt;md-select name=&quot;food&quot; id=&quot;food&quot; v-model=&quot;food&quot;&gt;
&lt;md-subheader&gt;Fruits&lt;/md-subheader&gt;
&lt;md-option value=&quot;apples&quot;&gt;Apples&lt;/md-option&gt;
&lt;md-option value=&quot;bananas&quot;&gt;Bananas&lt;/md-option&gt;
&lt;md-option value=&quot;peaches&quot;&gt;Peaches&lt;/md-option&gt;
&lt;md-option value=&quot;oranges&quot;&gt;Oranges&lt;/md-option&gt;
&lt;md-subheader&gt;Vegetables&lt;/md-subheader&gt;
&lt;md-option value=&quot;carrots&quot;&gt;Carrots&lt;/md-option&gt;
&lt;md-option value=&quot;cucumbers&quot;&gt;Cucumbers&lt;/md-option&gt;
&lt;md-subheader&gt;Baked Goods&lt;/md-subheader&gt;
&lt;md-option value=&quot;apple_pie&quot;&gt;Apple Pie&lt;/md-option&gt;
&lt;md-option value=&quot;chocolate_cake&quot;&gt;Chocolate Cake&lt;/md-option&gt;
&lt;/md-select&gt;
&lt;/md-input-container&gt;
&lt;md-input-container&gt;
&lt;label for=&quot;users&quot;&gt;Users&lt;/label&gt;
&lt;md-select name=&quot;users&quot; id=&quot;users&quot; multiple v-model=&quot;users&quot;&gt;
&lt;md-subheader&gt;Managers&lt;/md-subheader&gt;
&lt;md-option value=&quot;jim_halpert&quot;&gt;Jim Halpert&lt;/md-option&gt;
&lt;md-option value=&quot;dwight_schrute&quot;&gt;Dwight Schrute&lt;/md-option&gt;
&lt;md-option value=&quot;michael_scott&quot;&gt;Michael Scott&lt;/md-option&gt;
&lt;md-subheader&gt;Employees&lt;/md-subheader&gt;
&lt;md-option value=&quot;pam_beesly&quot;&gt;Pam Beesly&lt;/md-option&gt;
&lt;md-option value=&quot;angela_martin&quot;&gt;Angela Martin&lt;/md-option&gt;
&lt;md-option value=&quot;kelly_kapoor&quot;&gt;Kelly Kapoor&lt;/md-option&gt;
&lt;md-option value=&quot;ryan_howard&quot;&gt;Ryan Howard&lt;/md-option&gt;
&lt;md-option value=&quot;kevin_malone&quot;&gt;Kevin Malone&lt;/md-option&gt;
&lt;md-option value=&quot;creed_bratton&quot;&gt;Creed Bratton&lt;/md-option&gt;
&lt;md-option value=&quot;oscar_nunez&quot;&gt;Oscar Nunez&lt;/md-option&gt;
&lt;md-option value=&quot;toby_flenderson&quot;&gt;Toby Flenderson&lt;/md-option&gt;
&lt;md-option value=&quot;stanley_hudson&quot;&gt;Stanley Hudson&lt;/md-option&gt;
&lt;md-option value=&quot;meredith_palmer&quot;&gt;Meredith Palmer&lt;/md-option&gt;
&lt;md-option value=&quot;phyllis_lapin_vance&quot;&gt;Phyllis Lapin-Vance&lt;/md-option&gt;
&lt;/md-select&gt;
&lt;/md-input-container&gt;
&lt;div&gt;Selected users: {{ users }}&lt;/div&gt;
</code-block>
<code-block lang="javascript">
export default {
data: () => ({
food: '',
users: [
'jim_halpert',
'michael_scott'
]
})
};
</code-block>
</div>
</example-box>

View file

@ -1,5 +1,5 @@
let getClosestVueParent = ($parent, cssClass) => {
if (!$parent.$el) {
if (!$parent || !$parent.$el) {
return false;
}