Full Code of johnleider/vue-materials for AI

master e2f344e58e33 cached
70 files
53.3 KB
13.1k tokens
14 symbols
1 requests
Download .txt
Repository: johnleider/vue-materials
Branch: master
Commit: e2f344e58e33
Files: 70
Total size: 53.3 KB

Directory structure:
gitextract_g08_wqlj/

├── .babelrc
├── .gitignore
├── .npmignore
├── README.md
├── build/
│   ├── release.sh
│   ├── webpack.config.js
│   └── webpack.dev.config.js
├── index.html
├── package.json
└── src/
    ├── components/
    │   ├── _index.js
    │   ├── badge.vue
    │   ├── breadcrumbs.vue
    │   ├── button-link.vue
    │   ├── button.vue
    │   ├── card.vue
    │   ├── carousel-item.vue
    │   ├── carousel.vue
    │   ├── checkbox.vue
    │   ├── chip.vue
    │   ├── collapsible.vue
    │   ├── collection-avatar.vue
    │   ├── collection-item.vue
    │   ├── collection-link.vue
    │   ├── collection.vue
    │   ├── date-input.vue
    │   ├── fab.vue
    │   ├── file-input.vue
    │   ├── footer.vue
    │   ├── functional/
    │   │   ├── _index.js
    │   │   ├── collapsible-body.js
    │   │   ├── collapsible-header.js
    │   │   ├── container.js
    │   │   ├── dropdown.js
    │   │   ├── grid.js
    │   │   └── row.js
    │   ├── icon.vue
    │   ├── material-box.vue
    │   ├── modal.vue
    │   ├── nav.vue
    │   ├── pagination-item.vue
    │   ├── pagination.vue
    │   ├── parallax.vue
    │   ├── progress-circular.vue
    │   ├── progress-linear.vue
    │   ├── radio.vue
    │   ├── range.vue
    │   ├── select.vue
    │   ├── side-nav.vue
    │   ├── slide.vue
    │   ├── slider.vue
    │   ├── switch.vue
    │   ├── tab.vue
    │   ├── tabs.vue
    │   ├── text-area.vue
    │   └── text-input.vue
    ├── directives/
    │   ├── _index.js
    │   ├── dropdown.js
    │   ├── modal.js
    │   ├── side-nav.js
    │   └── tooltip.js
    ├── index.js
    ├── mixins/
    │   ├── buttons.js
    │   ├── collection-item.js
    │   ├── counter.js
    │   ├── dropdown.js
    │   ├── is-loadable.js
    │   └── waves.js
    └── util/
        ├── dialog.js
        ├── load.js
        └── scroll-fire.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .babelrc
================================================
{
  "presets": ["es2015"]
}

================================================
FILE: .gitignore
================================================
.DS_Store
node_modules/
npm-debug.log
.idea/
dev/

================================================
FILE: .npmignore
================================================
dev/
build/
index.html

================================================
FILE: README.md
================================================
# Docs
https://vuematerials.com

# Deprecated

This project is no longer maintained, please see [Vuetify](https://github.com/vuetifyjs/vuetify)


================================================
FILE: build/release.sh
================================================
set -e
echo "Enter release version: "
read VERSION

read -p "Releasing $VERSION - are you sure (y/n)" -n 1 -r
echo #
if [[ $REPLY =~ ^[Yy]$ ]]
then
  echo "Releasing $VERSION ..."

  npm run build
  git add -A
  git commit -m "[build] $VERSION"
  npm version $VERSION --message "[release] $VERSION"

  git push
  npm publish
fi


================================================
FILE: build/webpack.config.js
================================================
var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, '../dist'),
    filename: 'vue-materials.min.js',
    library: 'VueMaterials',
    libraryTarget: 'umd'
  },
  resolveLoader: {
    root: path.join(__dirname, 'node_modules'),
  },
  module: {
    loaders: [
      {
        test: /\.vue$/,
        loader: 'vue'
      },
      {
        test: /\.js$/,
        loader: 'babel',
        exclude: /node_modules/
      },
      {
        test: /\.scss$/,
        loaders: ['style', 'css', 'sass']
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        loader: 'file',
        query: {
          name: '[name].[ext]?[hash]'
        }
      },
      {
          test: /\.(eot|svg|ttf|woff|woff2)$/,
          loader: 'file?name=/fonts/[name].[ext]'
      }
    ]
  },
  devServer: {
    historyApiFallback: true,
    noInfo: true
  },
  devtool: '#eval-source-map'
}

if (process.env.NODE_ENV === 'production') {
  module.exports.devtool = '#source-map'
  // http://vue-loader.vuejs.org/en/workflow/production.html
  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      compress: {
        warnings: true
      }
    })
  ])
}


================================================
FILE: build/webpack.dev.config.js
================================================
var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: './dev/index.js',
  output: {
    path: path.resolve(__dirname, '../dev'),
    publicPath: '/dev/',
    filename: 'dev.js'
  },
  resolveLoader: {
    root: path.join(__dirname, 'node_modules'),
  },
  module: {
    loaders: [
      {
        test: /\.vue$/,
        loader: 'vue'
      },
      {
        test: /\.js$/,
        loader: 'babel',
        exclude: /node_modules|dist/
      },
      {
        test: /\.scss$/,
        loaders: ['style', 'css', 'sass']
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        loader: 'file',
        query: {
          name: '[name].[ext]?[hash]'
        }
      },
      {
          test: /\.(eot|svg|ttf|woff|woff2)$/,
          loader: 'file?name=/fonts/[name].[ext]'
      }
    ]
  },
  devServer: {
    historyApiFallback: true,
    noInfo: true
  },
  devtool: '#eval-source-map'
}


================================================
FILE: index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>vue-materialize</title>
    <link href="http://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
    <link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.0/css/materialize.min.css" rel="stylesheet">
  </head>
  <body>
    <div id="app">
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.0/js/materialize.min.js"></script>
    <script src="/dev/dev.js"></script>
  </body>
</html>


================================================
FILE: package.json
================================================
{
  "name": "vue-materials",
  "description": "Materialize.css components for Vue JS",
  "author": "John Leider <john.j.leider@gmail.com>",
  "version": "1.0.7-rc.7",
  "private": false,
  "main": "dist/vue-materials.min.js",
  "license": "MIT",
  "scripts": {
    "dev": "webpack-dev-server --inline --hot --host=0.0.0.0 --port=8082 --config=build/webpack.dev.config.js",
    "build": "cross-env NODE_ENV=production webpack  --progress --hide-modules --config=build/webpack.config.js"
  },
  "dependencies": {
    "vue": "^2.0.1"
  },
  "devDependencies": {
    "babel-cli": "^6.10.1",
    "babel-core": "^6.0.0",
    "babel-loader": "^6.0.0",
    "babel-preset-es2015": "^6.0.0",
    "cross-env": "^1.0.6",
    "css-loader": "^0.23.1",
    "file-loader": "^0.8.4",
    "materialize-css": "^0.97.6",
    "node-sass": "^3.8.0",
    "rollup": "^0.33.0",
    "rollup-plugin-babel": "^2.6.1",
    "rollup-plugin-vue": "^2.0.1",
    "sass-loader": "^4.0.0",
    "style-loader": "^0.13.1",
    "uglify-js": "^2.7.0",
    "vue-hot-reload-api": "^2.0.5",
    "vue-loader": "^9.1.2",
    "webpack": "^1.13.1",
    "webpack-dev-server": "^1.12.0"
  }
}


================================================
FILE: src/components/_index.js
================================================
import VFooter from './footer.vue'
import VNav from './nav.vue'
import VSideNav from './side-nav.vue'
import VBadge from './badge.vue'
import VBreadcrumbs from './breadcrumbs.vue'
import VBtn from './button.vue'
import VBtnLink from './button-link.vue'
import VCard from './card.vue'
import VCarousel from './carousel.vue'
import VCarouselItem from './carousel-item.vue'
import VCheckbox from './checkbox.vue'
import VChip from './chip.vue'
import VCollapsible from './collapsible.vue'
import VCollection from './collection.vue'
import VCollectionItem from './collection-item.vue'
import VCollectionLink from './collection-link.vue'
import VCollectionAvatar from './collection-avatar.vue'
import VDateInput from './date-input.vue'
import VFileInput from './file-input.vue'
import VIcon from './icon.vue'
import VMaterialBox from './material-box.vue'
import VModal from './modal.vue'
import VFab from './fab.vue'
import VPagination from './pagination.vue'
import VPaginationItem from './pagination-item.vue'
import VParallax from './parallax.vue'
import VProgressLinear from './progress-linear.vue'
import VProgressCircular from './progress-circular.vue'
import VRadio from './radio.vue'
import VRange from './range.vue'
import VSelect from './select.vue'
import VSlider from './slider.vue'
import VSlide from './slide.vue'
import VSwitch from './switch.vue'
import VTab from './tab.vue'
import VTabs from './tabs.vue'
import VTextArea from './text-area.vue'
import VTextInput from './text-input.vue'

export default {
    VFooter,
    VNav,
    VSideNav,
    VBadge,
    VBreadcrumbs,
    VBtn,
    VBtnLink,
    VCard,
    VCarousel,
    VCarouselItem,
    VChip,
    VCollapsible,
    VCollection,
    VCollectionItem,
    VCheckbox,
    VCollectionLink,
    VCollectionAvatar,
    VDateInput,
    VFileInput,
    VIcon,
    VMaterialBox,
    VModal,
    VFab,
    VPagination,
    VPaginationItem,
    VParallax,
    VProgressLinear,
    VProgressCircular,
    VRadio,
    VRange,
    VSelect,
    VSlider,
    VSlide,
    VSwitch,
    VTab,
    VTabs,
    VTextArea,
    VTextInput
}

================================================
FILE: src/components/badge.vue
================================================
<template>
    <span class="badge"
          :class="classes"
    >
        <slot></slot>
    </span>
</template>

<script type="text/babel">
    export default {
        props: {
            new: {
                type: Boolean,
                default: false
            }
        },

        computed: {
            classes () {
                return {
                    'new': this.new
                }
            }
        }
    }
</script>


================================================
FILE: src/components/breadcrumbs.vue
================================================
<template>
    <nav>
        <div class="nav-wrapper">
            <div class="col s12">
                <a v-for="crumb in items"
                   :href="crumb.href" 
                   class="breadcrumb"
                >
                    {{ crumb.text }}    
                </a>
                <slot></slot>
            </div>
        </div>
    </nav>
</template>

<script type="text/babel">
    export default {
        props: {
            items: {
                type: Array,
                default: () => []
            }
        }
    }
</script>


================================================
FILE: src/components/button-link.vue
================================================
<template>
    <a :class="classes"
       :href="href"
       :data-induration="induration"
       :data-outduration="outduration"
       :data-constrainwidth="constrainwidth"
       :data-hover="hover"
       :data-gutter="gutter"
       :data-beloworigin="beloworigin"
       :data-alignment="alignment"
    >
        <slot></slot>
    </a>
</template>

<script type="text/babel">
    import Buttons from '../mixins/buttons'
    import Waves from '../mixins/waves'
    import Dropdown from '../mixins/dropdown'
    
    export default {
        mixins: [
            Buttons,
            Waves,
            Dropdown
        ],

        props: {
            href: {
                type: String,
                default: '#!'
            }
        },

        computed: {
            classes () {
                return Object.assign(
                    this.buttonsMixin,
                    this.wavesMixin
                )
            }
        }
    }
</script>


================================================
FILE: src/components/button.vue
================================================
<template>
    <button :class="classes"
            :type="type"
            :data-induration="induration"
            :data-outduration="outduration"
            :data-constrainwidth="constrainwidth"
            :data-hover="hover"
            :data-gutter="gutter"
            :data-beloworigin="beloworigin"
            :data-alignment="alignment"
    >
        <slot></slot>
    </button>
</template>

<script type="text/babel">
    import Buttons from '../mixins/buttons'
    import Waves from '../mixins/waves'
    import Dropdown from '../mixins/dropdown'

    export default {
        mixins: [
            Buttons,
            Waves,
            Dropdown
        ],

        props: {
            type: {
                type: String,
                default: 'button'
            }
        },

        computed: {
            classes () {
                return Object.assign(
                    this.buttonsMixin,
                    this.wavesMixin
                )
            }
        }
    }
</script>


================================================
FILE: src/components/card.vue
================================================
<template>
    <div :class="classes">
        <slot></slot>
    </div>
</template>

<script type="text/babel">
    export default {
        props: {
            large: {
                type: Boolean,
                default: false
            },

            medium: {
                type: Boolean,
                default: false
            },

            panel: {
                type: Boolean,
                default: false
            },

            small: {
                type: Boolean,
                default: false
            }
        },

        computed: {
            classes () {
                return {
                    'card': !this.panel,
                    'card-panel': this.panel,
                    'large': this.large,
                    'medium': this.medium,
                    'small': this.small
                }
            }
        }
    }
</script>


================================================
FILE: src/components/carousel-item.vue
================================================
<template>
    <a href="#!"
       class="carousel-item"
    >
        <img :src="src">
        <slot></slot>
    </a>
</template>

<script type="text/babel">
    export default {
        props: {
            src: {
                type: String,
                required: true
            }
        }
    }
</script>


================================================
FILE: src/components/carousel.vue
================================================
<template>
    <div class="carousel"
         :class="classes"
         :style="styles"
    >
        <v-carousel-item v-for="i in items"
                       :src="i"
        ></v-carousel-item>
        <slot></slot>
    </div>
</template>

<script type="text/babel">
    import IsLoadable from '../mixins/is-loadable'

    export default {
        mixins: [
            IsLoadable
        ],
        
        props: {
            height: {
                type: Number,
                default: 300
            },

            dist: {
                type: Number,
                default: -100
            },
            
            timeConstant: {
                type: Number,
                default: 200
            },

            shift: {
                type: Number,
                default: 0
            },

            padding: {
                type: Number,
                default: 0
            },

            full_width: {
                type: Boolean,
                default: false
            },

            slider: {
                type: Boolean,
                default: false
            },

            items: {
                type: Array,
                default: () => []
            }
        },

        computed: {
            classes () {
                return {
                    'carousel-slider': this.slider
                }
            },

            styles () {
                return {
                    'height': this.height
                }
            },

            params () {
                return {
                    time_constant: this.timeConstant,
                    dist: this.dist,
                    shift: this.shift,
                    padding: this.padding,
                    full_width: this.fullWidth
                }
            }
        },

        methods: {
            init () {
                $(this.$el).carousel(this.params)
            },

            next (n = 1) {
                $(this.$el).carousel('next', [n])
                this.$emit('next')
            },

            prev (n = 1) {
                $(this.$el).carousel('prev', [n])
                this.$emit('prev')
            }
        }
    }
</script>


================================================
FILE: src/components/checkbox.vue
================================================
<template>
    <p>
      <input type="checkbox"
             :id="id || name"
             :name="name"
             :disabled="disabled"
             :class="classes"
             ref="checkbox"
      >
      <label :for="id || name">
          <slot></slot>
      </label>
    </p>
</template>

<script type="text/babel">
    export default {
        props: {
            id: String,

            name: {
                type: String,
                required: true
            },

            checked: {
                type: Boolean,
                default: false
            },

            value: {
                required: false
            },

            disabled: {
                type: Boolean,
                default: false
            },

            indeterminate: {
                type: Boolean,
                default: false
            },

            filledIn: {
                type: Boolean,
                default: false
            },

            valueV: {
                required: false
            }
        },

        computed: {
            classes () {
                return {
                    'filled-in': this.filledIn
                }
            }
        },

        watch: {
            value () {
                if (Array.isArray(this.value)) {
                    const index = this.value.indexOf(this.valueV)

                    if (index !== -1) {
                        this.$refs.checkbox.checked = true
                    } else {
                        this.$refs.checkbox.checked = false
                    }
                } else {
                    this.$refs.checkbox.checked = this.value
                }
                this.check()
            }
        },

        mounted () {
            if (this.indeterminate) {
                this.$refs.checkbox.indeterminate = true
            }

            this.check()

            const vm = this
            this.$refs.checkbox.onchange = function () {
                let value = vm.value
                if (Array.isArray(vm.value)) {
                    const index = vm.value.indexOf(vm.valueV)

                    if (index !== -1) {
                        value.splice(index, 1)
                    } else {
                        value = vm.value
                        value.push(vm.valueV)
                    }
                }

                vm.$emit('input', value)
            }
        },

        methods: {
            check () {
                if ((Array.isArray(this.value) &&
                    this.value.includes(this.valueV)) ||
                        (!Array.isArray(this.value) &&
                            this.value)
                ) {
                    this.$refs.checkbox.setAttribute('checked', true)
                }
            }
        }
    }
</script>


================================================
FILE: src/components/chip.vue
================================================
<template>
    <div class="chip"
         v-if="!remove"
    >
        <slot></slot>
        <v-icon v-if="close">close</v-icon>
    </div>
</template>

<script type="text/babel">
    import IsLoadable from '../mixins/is-loadable'

    export default {
        mixins: [
            IsLoadable
        ],

        events: {
            close () {
                this.remove = true
            }
        },

        data () {
            return {
                remove: false
            }
        },

        props: {
            close: {
                type: Boolean,
                default: false
            }
        },

        methods: {
            init () {
                if (this.remove) {
                    this.$el.addEventListener('click', () => this.$emit('close'))
                }
            }
        }
    }
</script>


================================================
FILE: src/components/collapsible.vue
================================================
<template>
    <ul class="collapsible"
        :data-collapsible="type"
        :class="classes"
    >
        <slot></slot>
    </ul>
</template>

<script type="text/babel">
    import IsLoadable from '../mixins/is-loadable'

    export default {
        mixins: [
            IsLoadable
        ],

        props: {
            collapse: {
                type: Boolean,
                default: false
            },

            expand: {
                type: Boolean,
                default: false
            },

            popout: {
                type: Boolean,
                default: false
            }
        },

        computed: {
            classes () {
                return {
                    'popout': this.popout
                }
            },

            params () {
                return {
                    accordion: this.type === 'accordion'
                }
            },

            type () {
                if (this.collapse) return 'accordion'
                if (this.expand)  return 'expandable'
            }
        },

        methods: {
            init () {
                $(this.$el).collapsible(this.params)
            }
        }
    }
</script>


================================================
FILE: src/components/collection-avatar.vue
================================================
<template>
    <li class="avatar"
        :class="classes"
    >
        <img :src="src" 
             class="circle"
        >
        <slot></slot>
        <a href="#!" 
           class="secondary-content"
        >
            <slot name="secondary"></slot>
        </a>
    </li>
</template>

<script type="text/babel">
    import CollectionItem from '../mixins/collection-item'

    export default {
        mixins: [
            CollectionItem
        ],

        props: {
            src: {
                type: String,
                required: true
            }
        },

        computed: {
            classes () {
                return this.collectionsMixin
            }
        }
    }
</script>


================================================
FILE: src/components/collection-item.vue
================================================
<template>
    <li :class="classes">
        <slot></slot>
        <a href="#!" 
           class="secondary-content"
        >
            <slot name="secondary"></slot>
        </a>
    </li>
</template>

<script type="text/babel">
    import CollectionItem from '../mixins/collection-item'

    export default {
        mixins: [
            CollectionItem
        ],

        computed: {
            classes () {
                return this.collectionsMixin
            }
        }
    }
</script>


================================================
FILE: src/components/collection-link.vue
================================================
<template>
    <a href="#!"
       :class="classes"
    >
        <slot></slot>
        <a href="#!" 
           class="secondary-content"
        >
            <slot name="secondary"></slot>
        </a>
    </a>
</template>

<script type="text/babel">
    import CollectionItem from '../mixins/collection-item'

    export default {
        mixins: [
            CollectionItem
        ],

        computed: {
            classes () {
                return this.collectionsMixin
            }
        }
    }
</script>


================================================
FILE: src/components/collection.vue
================================================
<template>
    <ul class="collection"
        :class="classes"
    >
        <slot></slot>
    </ul>
</template>

<script type="text/babel">
    export default {
        props: {
            withHeader: {
                type: Boolean,
                default: false
            }
        },

        computed: {
            classes () {
                return {
                    'with-header': this.withHeader
                }
            }
        }
    }
</script>


================================================
FILE: src/components/date-input.vue
================================================
<template>
    <input type="date" 
           class="datepicker"
    >
</template>

<script type="text/babel">
    import IsLoadable from '../mixins/is-loadable'

    export default {
        mixins: [
            IsLoadable
        ],

        props: {
            value: {
                type: String
            },
            format: {
                type: String
            }
        },

        methods: {
            init () {
                if (this.format) $(this.$el).pickadate({format: this.format})
                else $(this.$el).pickadate()

                const picker = $(this.$el).pickadate('picker')
                picker.set('select', this.value)

                const vm = this
                this.$el.onchange = function () {
                    if (vm.format)
                        vm.$emit('input', picker.get('select', vm.format))
                    else
                        vm.$emit('input', picker.get('select', 'd mmmm, yyyy'))
                }
            }
        }    
    }
</script>


================================================
FILE: src/components/fab.vue
================================================
<template>
    <div class="fixed-action-btn"
         :class="classes"
    >
        <v-btn-link large
                  floating
        >
            <v-icon>{{ icon }}</v-icon>
        </v-btn-link>
        <slot name="items"></slot>
    </div>
</template>

<script type="text/babel">
    export default {
        props: {
            icon: {
                type: String,
                required: true
            },
            
            horizontal: {
                type: Boolean,
                default: false
            },

            toggle: {
                type: Boolean,
                default: false
            }
        },

        computed: {
            classes () {
                return {
                    'click-to-toggle': this.toggle,
                    'horizontal': this.horizontal
                }
            }
        },

        methods: {
            open () {
                $(this.$el).openFAB()
                this.$emit('open')
            },

            close () {
                $(this.$el).closeFAB()
                this.$emit('close')
            }
        }
    }
</script>


================================================
FILE: src/components/file-input.vue
================================================
<template>
    <div class="file-field input-field">
        <div class="btn">
            <span>File</span>
            <input type="file"
                   :multiple="multiple"
            >
        </div>
        <div class="file-path-wrapper">
            <v-text-input class="file-path validate"></v-text-input>
        </div>
    </div>
</template>

<script type="text/babel">
    export default {
        props: {
            multiple: {
                type: Boolean,
                default: false
            }
        }
    }
</script>


================================================
FILE: src/components/footer.vue
================================================
<template>
    <footer class="page-footer">
        <slot name="content"></slot>
        <div class="footer-copyright">
            <slot name="copyright"></slot>
        </div>
    </footer>
</template>


================================================
FILE: src/components/functional/_index.js
================================================
import VRow from './row'
import VGrid from './grid'
import VContainer from './container'
import VCollapsibleHeader from './collapsible-header'
import VCollapsibleBody from './collapsible-body'
import VDropdown from './dropdown'

export default {
    VRow,
    VGrid,
    VContainer,
    VCollapsibleHeader,
    VCollapsibleBody,
    VDropdown
}


================================================
FILE: src/components/functional/collapsible-body.js
================================================
export default {
    functional: true,

    render: (h, { data, children }) => {
        if (!data.staticClass) {
            data.staticClass = ''
        }

        data.staticClass += ' collapsible-body'

        return h('div', data, children)
    }
}


================================================
FILE: src/components/functional/collapsible-header.js
================================================
export default {
    functional: true,

    render: (h, { data, children }) => {
        if (!data.staticClass) {
            data.staticClass = ''
        }

        data.staticClass += ' collapsible-header'

        return h('div', data, children)
    }
}


================================================
FILE: src/components/functional/container.js
================================================
export default {
    functional: true,

    render: (h, { data, children }) => {
        data.staticClass = data.staticClass || ''
        data.staticClass += ' container'

        return h('div', data, children)
    }
}


================================================
FILE: src/components/functional/dropdown.js
================================================
export default {
    functional: true,

    render: (h, { data, children }) => {
        if (!data.staticClass) {
            data.staticClass = ''
        }

        data.staticClass += ' dropdown-content'

        return h('ul', data, children)
    }
}


================================================
FILE: src/components/functional/grid.js
================================================
export default {
    functional: true,

    render: (h, { data, children }) => {
        let attrs = Object.keys(data.attrs)
        attrs.unshift('col')
        data.attrs = {}
        data.attrs.class = attrs.join(' ')

        return h('div', data, children)
    }
}


================================================
FILE: src/components/functional/row.js
================================================
export default {
    functional: true,

    render: (h, { data, children }) => {
        data.staticClass = data.staticClass || ''
        data.staticClass += ' row'

        return h('div', data, children)
    }
}


================================================
FILE: src/components/icon.vue
================================================
<template>
    <i class="material-icons"
       :class="classes"
    >
        <slot></slot>
    </i>
</template>

<script type="text/babel">
    export default {
        props: {
            tiny: {
                type: Boolean,
                default: false
            },
            
            small: {
                type: Boolean,
                default: false
            },
            
            medium: {
                type: Boolean,
                default: false
            },

            large: {
                type: Boolean,
                default: false
            },

            prefix: {
                type: Boolean,
                default: false
            },

            right: {
                type: Boolean,
                default: false
            },

            left: {
                type: Boolean,
                default: false
            }
        },

        computed: {
            classes () {
                return {
                    'tiny': this.tiny,
                    'small': this.small,
                    'medium': this.medium,
                    'large': this.large,
                    'prefix': this.prefix,
                    'right': this.right,
                    'left': this.left
                }
            }
        }
    }
</script>


================================================
FILE: src/components/material-box.vue
================================================
<template>
    <img class="materialboxed" 
         :width="width"
         :src="src"
         :data-caption="caption"
    >
</template>

<script type="text/babel">
    import IsLoadable from '../mixins/is-loadable'

    export default {
        mixins: [
            IsLoadable
        ],

        props: {
            caption: {
                type: [Boolean, String],
                default: false
            },

            src: {
                type: String,
                required: true
            },

            width: {
                type: [Boolean, Number, String],
                default: '100%'
            }
        },

        methods: {
            init () {
                $(this.$el).materialbox()
            }
        }
    }
</script>


================================================
FILE: src/components/modal.vue
================================================
<template>
    <div :id="id" 
         :class="classes"
         class="modal"
    >
        <div class="modal-content">
            <slot name="content"></slot>
        </div>
        <div class="modal-footer">
            <slot name="footer"></slot>
        </div>
    </div>
</template>

<script type="text/babel">
    export default {
        props: {
            bottomSheet: {
                type: Boolean,
                default: false
            },

            id: {
                type: String,
                required: true
            },

            fixedFooter: {
                type: Boolean,
                default: false
            },

            params: {
                type: Object,
                default: () => {}
            }
        },

        computed: {
            classes () {
                return {
                    'bottom-sheet': this.bottomSheet,
                    'modal-fixed-footer': this.fixedFooter
                }
            }
        },

        methods: {
            close () {
                $(this.$el).closeModal()
                this.$emit('close')
            },
            
            open () {
                $(this.$el).openModal()
                this.$emit('open')
            }
        }
    }
</script>


================================================
FILE: src/components/nav.vue
================================================
<template>
    <div :class="{ 'navbar-fixed': fixed }">
        <nav :class="[navClass]">
            <div class="nav-wrapper">
                <slot name="logo"></slot>
                <slot></slot>
                <slot name="side-nav"></slot>
            </div>
        </nav>
    </div>
</template>

<script type="text/babel">
    export default {
        props: {
            navClass: {
                type: String,
                default: ''
            },

            fixed: {
                type: Boolean,
                default: false
            }
        }
    }
</script>

================================================
FILE: src/components/pagination-item.vue
================================================
<template>
    <li :class="classes"
        @click.prevent="click"
    >
        <a href="#!">
            <slot></slot>
        </a>
    </li>
</template>

<script type="text/babel">
    export default {
        props: {
            active: {
                type: Boolean,
                default: false
            },

            color: {
                type: String,
                default: ''
            },

            disabled: {
                type: Boolean,
                default: false
            },

            waves: {
                type: Boolean,
                default: false
            }
        },

        computed: {
            classes () {
                return {
                    'active': this.active,
                    [this.color]: this.active,
                    'disabled': this.disabled,
                    'waves-effect': this.waves
                }
            }
        },

        methods: {
            click () {
                if (!this.disabled) {
                    this.$emit('click')
                }
            }
        }
    }
</script>


================================================
FILE: src/components/pagination.vue
================================================
<template>
    <ul class="pagination">
        <v-pagination-item :disabled="value === 1"
                         @click="prev"
        >
            <i class="material-icons">chevron_left</i>
        </v-pagination-item>
        <v-pagination-item v-if="length > 0"
                         v-for="n in length"
                         :active="value === n"
                         :waves="waves"
                         :color="color"
                         @click="page(n)"
        >
            {{ n }}
        </v-pagination-item>
        <v-pagination-item :disabled="value === length"
                         @click="next"
        >
            <i class="material-icons">chevron_right</i>
        </v-pagination-item>
    </ul>
</template>

<script type="text/babel">
    export default {
        props: {
            active: {
                type: Boolean,
                default: false
            },

            value: {
                type: [Number, String],
                default: 0
            },

            color: {
                type: String,
                default: ''
            },

            length: {
                type: Number,
                default: 0
            },

            waves: {
                type: Boolean,
                default: false
            }
        },

        methods: {
            next () {
                this.$emit('input', this.value + 1)
            },

            page (n) {
                this.$emit('input', n)
            },

            prev () {
                this.$emit('input', this.value - 1)
            }
        }
    }
</script>


================================================
FILE: src/components/parallax.vue
================================================
<template>
    <div class="parallax-container"
         :style="style"
    >
        <div class="parallax">
            <img :src="src">
        </div>
        <slot></slot>
    </div>
</template>

<script type="text/babel">
    import IsLoadable from '../mixins/is-loadable'

    export default {
        mixins: [
            IsLoadable
        ],

        props: {
            height: {
                type: Number,
                default: 500
            },

            src: {
                type: String,
                required: true
            }
        },

        computed: {
            style () {
                return {
                    height: `${this.height}px`
                }
            }
        },

        methods: {
            init () {
                $('.parallax').parallax()
            }
        }
    }
</script>


================================================
FILE: src/components/progress-circular.vue
================================================
<template>
    <div class="preloader-wrapper"
         :class="wrapper_classes"
    >
        <div class="spinner-layer"
             :class="classes"
        >
            <div class="circle-clipper left">
                <div class="circle"></div>
            </div>
            <div class="gap-patch">
                <div class="circle"></div>
            </div>
            <div class="circle-clipper right">
                <div class="circle"></div>
            </div>
        </div>
    </div>
</template>

<script type="text/babel">
    export default {
        props: {
            active: {
                type: Boolean,
                default: false
            },

            blue: {
                type: Boolean,
                default: false
            },

            blueFlash: {
                type: Boolean,
                default: false
            },

            green: {
                type: Boolean,
                default: false
            },

            greenFlash: {
                type: Boolean,
                default: false
            },

            small: {
                type: Boolean,
                default: false
            },

            large: {
                type: Boolean,
                default: false
            },

            red: {
                type: Boolean,
                default: false
            },

            redFlash: {
                type: Boolean,
                default: false
            },

            yellow: {
                type: Boolean,
                default: false
            },

            yellowFlash: {
                type: Boolean,
                default: false
            }
        },

        computed: {
            classes () {
                return {
                    'spinner-blue-only': this.blue,
                    'spinner-red-only': this.red,
                    'spinner-green-only': this.green,
                    'spinner-yellow-only': this.yellow,
                    'spinner-blue': this.blueFlash,
                    'spinner-red': this.redFlash,
                    'spinner-green': this.greenFlash,
                    'spinner-yellow': this.yellowFlash
                }
            },

            wrapper_classes () {
                return {
                    'active': this.active,
                    'small': this.small,
                    'large': this.large
                }
            }
        }
    }
</script>


================================================
FILE: src/components/progress-linear.vue
================================================
<template>
    <div class="progress">
        <div :class="classes" 
             :style="style"
        ></div>
    </div>
</template>

<script type="text/babel">
    export default {
        props: {
            determinate: {
                type: Boolean,
                default: false
            },

            indeterminate: {
                type: Boolean,
                default: false
            },

            value: {
                type: [String, Number]
            },

            width: {
                type: [String, Number]
            }
        },

        computed: {
            classes () {
                return {
                    'determinate': this.determinate,
                    'indeterminate': this.indeterminate
                }
            },

            style () {
                if (!this.width && !this.value) {
                    return {}
                }

                const value = this.value ? this.value : this.width

                return {
                    'width': value
                }
            }
        }
    }
</script>


================================================
FILE: src/components/radio.vue
================================================
<template>
    <p>
      <input type="radio"
             :id="id"
             :name="name"
             :disabled="disabled"
             :class="classes"
             :value="val"
             ref="radio"
      >
      <label :for="id">
          <slot></slot>
      </label>
    </p>
</template>

<script type="text/babel">
    export default {
        props: {
            id: {
                type: String,
                required: true
            },

            name: {
                type: String
            },

            checked: {
                type: Boolean,
                default: false
            },

            val: {
                type: [String, Number]
            },

            value: {
                type: [String, Number]
            },

            disabled: {
                type: Boolean,
                default: false
            },

            withGap: {
                type: Boolean,
                default: false
            }
        },

        watch: {
            value () {
                this.$refs.radio.checked = this.value == this.val
            }
        },

        computed: {
            classes () {
                return {
                    'with-gap': this.withGap
                }
            }
        },

        mounted () {
            this.$refs.radio.checked = this.$refs.radio.value == this.value || this.checked

            const vm = this
            this.$refs.radio.onchange = function () {
                vm.$emit('input', this.value)
            }
        }
    }
</script>


================================================
FILE: src/components/range.vue
================================================
<template>
    <p class="range-field">
        <input type="range"
               :min="min"
               :max="max"
               :value="value"
               ref="range"
        >
    </p>
</template>

<script type="text/babel">
    export default {
        props: {
            max: {
                type: [String, Number],
                default: 100
            },

            min: {
                type: [String, Number],
                default: 0
            },

            value: {
                type: [String, Number]
            }
        },

        mounted () {
            const vm = this
            this.$refs.range.onchange = function () {
                vm.$emit('input', this.value)
            }
        }
    }
</script>


================================================
FILE: src/components/select.vue
================================================
<template>
    <select v-model="model" v-bind:multiple="multiple">
        <option value=""
                disabled
        >{{ selectText }}</option>
        <option v-for="item in items"
                v-bind:value="item.id"
                v-text="item[textField]"
        ></option>
        <slot></slot>
    </select>
</template>

<script type="text/babel">
    import IsLoadable from '../mixins/is-loadable'

    export default {
        props: {
            items: {
                type: Array,
                default: () => []
            },
            multiple: {
                type: Boolean,
                default: false
            },
            selectText: {
                type: String,
                default: 'Choose your options'
            },
            value: {
                default: null,
                required: false
            },
            textField: {
                type: String,
                default: 'text'
            }
        },

        watch: {
            items () {
                this.$el.removeAttribute('onchange')
                this.$nextTick(this.init)
            },
            value () {
                this.$el.removeAttribute('onchange')
                this.$nextTick(this.init)
            }
        },

        computed: {
            model () {
                if (this.multiple && !this.value) {
                    return []
                }

                return this.value
            }
        },

        mixins: [
            IsLoadable
        ],

        methods: {
            init () {
                $(this.$el).material_select()

                const vm = this
                this.$el.onchange = function () {
                    if (!this.multiple) {
                        vm.$emit('input', this.value)
                    } else {
                        vm.multi(this, vm)
                    }
                }
            },

            multi (context, vm) {
                const siblings = [...vm.$el.previousSibling.getElementsByClassName('active')].map(i => {
                    return i.getElementsByTagName('label')[0].nextSibling.nodeValue
                })

                const options = [...context.getElementsByTagName('option')]
                let array = []
                
                siblings.forEach(i => {
                    const option = options.find(j => j.textContent == i)
                    
                    if (option) {
                        array.push(option.value)
                    }
                })

                vm.$emit('input', array)
            }
        }
    }
</script>


================================================
FILE: src/components/side-nav.vue
================================================
<template>
    <ul :id="id" 
        :class="options"
        class="side-nav"
    >
        <slot></slot>
    </ul>
</template>

<script type="text/babel">
    export default {
        props: {
            fixed: {
                type: Boolean,
                default: false
            },

            id: {
                type: String,
                required: true
            }
        },

        computed: {
            options () {
                return {
                    'fixed': this.fixed
                }
            }
        }
    }
</script>


================================================
FILE: src/components/slide.vue
================================================
<template>
    <li>
        <img :src="src">
        <div class="caption"
             :class="classes"
        >
            <slot></slot>
        </div>
    </li>
</template>

<script type="text/babel">
    export default {
        props: {
            center: {
                type: Boolean,
                default: false
            },

            left: {
                type: Boolean,
                default: false
            },

            right: {
                type: Boolean,
                default: false
            },

            src: {
                type: String,
                required: true
            }
        },

        computed: {
            classes () {
                return {
                    'left-align': this.left,
                    'center-align': this.center,
                    'right-align': this.right
                }
            }
        }
    }
</script>


================================================
FILE: src/components/slider.vue
================================================
<template>
    <div class="slider"
         :class="classes"
    >
        <ul class="slides">
            <slot></slot>
        </ul>
    </div>
</template>

<script type="text/babel">
    import IsLoadable from '../mixins/is-loadable'

    export default {
        mixins: [
            IsLoadable
        ],

        props: {
            fullWidth: {
                type: Boolean,
                default: false
            },

            indicators: {
                type: Boolean,
                default: true
            },

            height: {
                type: Number,
                default: 400
            },

            transition: {
                type: Number,
                default: 500
            },

            interval: {
                type: Number,
                default: 6000
            }
        },

        computed: {
            classes () {
                return {
                    'fullscreen': this.fullWidth
                }
            },

            params () {
                return {
                    full_width: this.fullWidth,
                    indicators: this.indicators,
                    height: this.height,
                    transition: this.transition,
                    interval: this.interval
                }
            }
        },

        methods: {
            init () {
                $(this.$el).slider(this.params)
            },

            pause () {
                $(this.$el).slider('pause')
                this.$emit('pause')
            },

            start () {
                $(this.$el).slider('start')
                this.$emit('start')
            },

            next () {
                $(this.$el).slider('next')
                this.$emit('next')
            },

            prev () {
                $(this.$el).slider('prev')
                this.$emit('prev')
            }
        }
    }
</script>


================================================
FILE: src/components/switch.vue
================================================
<template>
    <div class="switch">
        <label>
            {{ off }}
            <input type="checkbox"
                   ref="checkbox"
                   :name="name"
            >
            <span class="lever"></span>
            {{ on }}
        </label>
    </div>
</template>

<script type="text/babel">
    export default {
        props: {
            off: {
                type: String,
                default: 'Off'
            },

            on: {
                type: String,
                default: 'On'
            },

            name: String,

            checked: {
                type: Boolean,
                default: false
            },

            value: {
                type: Boolean
            }
        },

        mounted () {
            if (this.value || this.checked) {
                this.$refs.checkbox.checked = true
            }

            const vm = this
            this.$el.onchange = function () {
                vm.$emit('input', vm.$refs.checkbox.checked)
            }
        }
    }
</script>


================================================
FILE: src/components/tab.vue
================================================
<template>
    <li class="tab col"
        :class="{ 'disabled': this.disabled }"
    >
        <a :href="target"
           :class="classes"
        >
            <slot></slot>
        </a>
    </li>
</template>

<script type="text/babel">
    export default {
        props: {
            active: {
                type: Boolean,
                default: false
            },

            target: {
                type: String,
                required: true
            }
        },

        computed: {
            classes () {
                return {
                    'active': this.active
                }
            }
        }
    }
</script>


================================================
FILE: src/components/tabs.vue
================================================
<template>
    <ul class="tabs">
        <slot></slot>
    </ul>
</template>

<script type="text/babel">
    import IsLoadable from '../mixins/is-loadable'

    export default {
        mixins: [
            IsLoadable
        ],

        props: {
            selected: {
                type: String,
                default: ''
            }
        },

        methods: {
            init () {
                if (!this.selected) {
                    $(this.$el).tabs()
                } else {
                    $(this.$el).tabs('select_tab', this.selected)
                }
            }
        }
    }
</script>


================================================
FILE: src/components/text-area.vue
================================================
<template>
    <textarea class="materialize-textarea"
              :length="length"
              @input="$emit('input', $event.target.value)"
    >
        <slot></slot>
    </textarea>
</template>

<script type="text/babel">
    import Counter from '../mixins/counter'

    export default {
        mixins: [
            Counter
        ]
    }
</script>


================================================
FILE: src/components/text-input.vue
================================================
<template>
    <input class="validate"
           type="text"
           :length="length"
           :value="value"
           @input="$emit('input', $event.target.value)"
    >
</template>

<script type="text/babel">
    import Counter from '../mixins/counter'

    export default {
        props: ['value'],

        mixins: [
            Counter
        ]
    }
</script>


================================================
FILE: src/directives/_index.js
================================================
import Dropdown from './dropdown'
import Modal from './modal'
import SideNav from './side-nav'
import Tooltip from './tooltip'

export default {
    Dropdown,
    Modal,
    SideNav,
    Tooltip
}


================================================
FILE: src/directives/dropdown.js
================================================
import Load from '../util/load'

export default {
    bind (el, binding, vnode) {
        Load.call(vnode.context, () => {
            const params = binding.value || {}

            el.setAttribute('data-activates', binding.arg || params.value)
            $(el).dropdown(params)
        })
    }
}


================================================
FILE: src/directives/modal.js
================================================
import Load from '../util/load'

export default {
    bind (el, binding, vnode) {
        Load.call(vnode.context, () => {
            const params = binding.value || {}
            if (el.nodeName === 'button') {
                el.setAttribute('data-target', binding.arg || params.value)
            } else {
                el.setAttribute('href', `#${binding.arg || params.value}`)
            }
            
            $(`#${binding.arg || params.value}`).modal()
        })
    }
}


================================================
FILE: src/directives/side-nav.js
================================================
import Load from '../util/load'

export default {
    bind (el, binding, vnode) {
        Load.call(vnode.context, () => {
            el.setAttribute('data-activates', binding.arg)
            $(el).sideNav(binding.value || {})
        })
    }
}


================================================
FILE: src/directives/tooltip.js
================================================
import Load from '../util/load'

const tooltip = (el, binding, vnode) => {
    const delay = typeof binding.modifiers !== 'undefined'
        ? Object.keys(binding.modifiers)[0]
        : 50

    el.classList.add('tooltipped')
    el.setAttribute('data-position', binding.arg)
    el.setAttribute('data-delay', delay)
    el.setAttribute('data-tooltip', binding.expression.replace(/\'/g, ''))

    Load.call(vnode.context, () => $(el).tooltip())
} 

export default {
    bind (el, binding, vnode) {
        tooltip(el, binding, vnode)
    },

    postupdate (el, binding, vnode) {
        tooltip(el, binding, vnode)
    }
}


================================================
FILE: src/index.js
================================================
import Components from './components/_index'
import Directives from './directives/_index'
import Functional from './components/functional/_index'
import Dialog from './util/dialog'
import ScrollFire from './util/scroll-fire'

function plugin(Vue) {
    if (plugin.installed) return

    for (let key in Components) {
        Vue.component(key, Components[key])
    }
    
    for (let key in Functional) {
        Vue.component(key, Functional[key])
    }

    for (let key in Directives) {
        Vue.directive(key, Directives[key])
    }

    Vue.dialog = Dialog
    Vue.scrollFire = ScrollFire

    Object.defineProperties(Vue.prototype, {
        $dialog: {
            get: () => Vue.dialog.bind(this)
        },

        $scrollFire: {
            get: () => Vue.scrollFire.bind(this)
        }
    })
}

if (typeof window !== 'undefined' && window.Vue) {
    window.Vue.use(plugin);
}

export default plugin


================================================
FILE: src/mixins/buttons.js
================================================
export default {
    props: {
        disabled: {
            type: Boolean,
            default: false
        },

        flat: {
            type: Boolean,
            default: false
        },

        floating: {
            type: Boolean,
            default: false
        },

        large: {
            type: Boolean,
            default: false
        },

        modal: {
            type: Boolean,
            default: false
        }
    },

    computed: {
        buttonsMixin () {
            return {
                'btn': !this.flat,
                'btn-floating': this.floating,
                'btn-large': this.large,
                'btn-flat': this.flat,
                'modal-action modal-close': this.modal,
                'disabled': this.disabled
            }
        }
    }
}


================================================
FILE: src/mixins/collection-item.js
================================================
export default {
    props: {
        active: {
            type: Boolean,
            default: false
        },

        dismissable: {
            type: Boolean,
            default: false
        },

        header: {
            type: Boolean,
            default: false
        }
    },

    computed: {
        collectionsMixin () {
            return {
                'active': this.active,
                'dismissable': this.dismissable,
                'collection-item': !this.header,
                'collection-header': this.header
            }
        }
    }
}


================================================
FILE: src/mixins/counter.js
================================================
import Load from '../util/load'

export default {
    props: {
        length: {
            type: [Boolean, Number, String],
            default: false
        }
    },

    mounted () {
        Load.call(this, () => $(this.$el).characterCounter())
    },

    postupdate () {
        Load.call(this, () => $(this.$el).characterCounter())
    }
}


================================================
FILE: src/mixins/dropdown.js
================================================
export default {
    props: {
        induration: {
            type: Number,
            default: 300
        },

        outduration: {
            type: Number,
            default: 225
        },

        constrainwidth: {
            type: Boolean,
            default: true
        },

        hover: {
            type: Boolean,
            default: false
        },

        gutter: {
            type: Number,
            default: 0
        },

        beloworigin: {
            type: Boolean,
            default: false
        },

        alignment: {
            type: String,
            default: 'left'
        }
    }
}

================================================
FILE: src/mixins/is-loadable.js
================================================
import Load from '../util/load'

export default {
    mounted () {
        Load.call(this, () => this.init())
    }
}


================================================
FILE: src/mixins/waves.js
================================================
export default {
    props: {
        wavesCircle: {
            type: Boolean,
            default: false
        },

        wavesLight: {
            type: Boolean,
            default: false
        },

        wavesOrange: {
            type: Boolean,
            default: false
        },

        wavesPurple: {
            type: Boolean,
            default: false
        },

        wavesGreen: {
            type: Boolean,
            default: false
        },

        wavesTeal: {
            type: Boolean,
            default: false
        },

        wavesRed: {
            type: Boolean,
            default: false
        },

        wavesYellow: {
            type: Boolean,
            default: false
        }
    },

    computed: {
        wavesMixin () {
            return {
                'waves-effect waves-light': this.wavesLight,
                'waves-effect waves-red': this.wavesRed,
                'waves-effect waves-yellow': this.wavesYellow,
                'waves-effect waves-orange': this.wavesOrange,
                'waves-effect waves-purple': this.wavesPurple,
                'waves-effect waves-green': this.wavesGreen,
                'waves-effect waves-teal': this.wavesTeal,
                'waves-circle': this.wavesCircle
            }
        }
    }
}


================================================
FILE: src/util/dialog.js
================================================
export default function Dialog(message, duration = 4000, rounded, cb) {
    if (typeof rounded === 'function') {
        cb = rounded
        rounded = ''
    }
    
    Materialize.toast(message, duration, rounded, cb)
}


================================================
FILE: src/util/load.js
================================================
export default function (cb) {
    if (document.readyState !== 'loading') {
        this.$nextTick(() => cb())
    } else {
        document.addEventListener('DOMContentLoaded', () => cb())
    }
}


================================================
FILE: src/util/scroll-fire.js
================================================
export default function ScrollFire(options) {
    Materialize.scrollFire(options)
}
Download .txt
gitextract_g08_wqlj/

├── .babelrc
├── .gitignore
├── .npmignore
├── README.md
├── build/
│   ├── release.sh
│   ├── webpack.config.js
│   └── webpack.dev.config.js
├── index.html
├── package.json
└── src/
    ├── components/
    │   ├── _index.js
    │   ├── badge.vue
    │   ├── breadcrumbs.vue
    │   ├── button-link.vue
    │   ├── button.vue
    │   ├── card.vue
    │   ├── carousel-item.vue
    │   ├── carousel.vue
    │   ├── checkbox.vue
    │   ├── chip.vue
    │   ├── collapsible.vue
    │   ├── collection-avatar.vue
    │   ├── collection-item.vue
    │   ├── collection-link.vue
    │   ├── collection.vue
    │   ├── date-input.vue
    │   ├── fab.vue
    │   ├── file-input.vue
    │   ├── footer.vue
    │   ├── functional/
    │   │   ├── _index.js
    │   │   ├── collapsible-body.js
    │   │   ├── collapsible-header.js
    │   │   ├── container.js
    │   │   ├── dropdown.js
    │   │   ├── grid.js
    │   │   └── row.js
    │   ├── icon.vue
    │   ├── material-box.vue
    │   ├── modal.vue
    │   ├── nav.vue
    │   ├── pagination-item.vue
    │   ├── pagination.vue
    │   ├── parallax.vue
    │   ├── progress-circular.vue
    │   ├── progress-linear.vue
    │   ├── radio.vue
    │   ├── range.vue
    │   ├── select.vue
    │   ├── side-nav.vue
    │   ├── slide.vue
    │   ├── slider.vue
    │   ├── switch.vue
    │   ├── tab.vue
    │   ├── tabs.vue
    │   ├── text-area.vue
    │   └── text-input.vue
    ├── directives/
    │   ├── _index.js
    │   ├── dropdown.js
    │   ├── modal.js
    │   ├── side-nav.js
    │   └── tooltip.js
    ├── index.js
    ├── mixins/
    │   ├── buttons.js
    │   ├── collection-item.js
    │   ├── counter.js
    │   ├── dropdown.js
    │   ├── is-loadable.js
    │   └── waves.js
    └── util/
        ├── dialog.js
        ├── load.js
        └── scroll-fire.js
Download .txt
SYMBOL INDEX (14 symbols across 12 files)

FILE: src/directives/dropdown.js
  method bind (line 4) | bind (el, binding, vnode) {

FILE: src/directives/modal.js
  method bind (line 4) | bind (el, binding, vnode) {

FILE: src/directives/side-nav.js
  method bind (line 4) | bind (el, binding, vnode) {

FILE: src/directives/tooltip.js
  method bind (line 17) | bind (el, binding, vnode) {
  method postupdate (line 21) | postupdate (el, binding, vnode) {

FILE: src/index.js
  function plugin (line 7) | function plugin(Vue) {

FILE: src/mixins/buttons.js
  method buttonsMixin (line 30) | buttonsMixin () {

FILE: src/mixins/collection-item.js
  method collectionsMixin (line 20) | collectionsMixin () {

FILE: src/mixins/counter.js
  method mounted (line 11) | mounted () {
  method postupdate (line 15) | postupdate () {

FILE: src/mixins/is-loadable.js
  method mounted (line 4) | mounted () {

FILE: src/mixins/waves.js
  method wavesMixin (line 45) | wavesMixin () {

FILE: src/util/dialog.js
  function Dialog (line 1) | function Dialog(message, duration = 4000, rounded, cb) {

FILE: src/util/scroll-fire.js
  function ScrollFire (line 1) | function ScrollFire(options) {
Condensed preview — 70 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (62K chars).
[
  {
    "path": ".babelrc",
    "chars": 27,
    "preview": "{\n  \"presets\": [\"es2015\"]\n}"
  },
  {
    "path": ".gitignore",
    "chars": 49,
    "preview": ".DS_Store\nnode_modules/\nnpm-debug.log\n.idea/\ndev/"
  },
  {
    "path": ".npmignore",
    "chars": 22,
    "preview": "dev/\nbuild/\nindex.html"
  },
  {
    "path": "README.md",
    "chars": 144,
    "preview": "# Docs\nhttps://vuematerials.com\n\n# Deprecated\n\nThis project is no longer maintained, please see [Vuetify](https://github"
  },
  {
    "path": "build/release.sh",
    "chars": 328,
    "preview": "set -e\necho \"Enter release version: \"\nread VERSION\n\nread -p \"Releasing $VERSION - are you sure (y/n)\" -n 1 -r\necho #\nif "
  },
  {
    "path": "build/webpack.config.js",
    "chars": 1395,
    "preview": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/index.js',\n  output: {\n "
  },
  {
    "path": "build/webpack.dev.config.js",
    "chars": 932,
    "preview": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './dev/index.js',\n  output: {\n "
  },
  {
    "path": "index.html",
    "chars": 619,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>vue-materialize</title>\n    <link href=\""
  },
  {
    "path": "package.json",
    "chars": 1144,
    "preview": "{\n  \"name\": \"vue-materials\",\n  \"description\": \"Materialize.css components for Vue JS\",\n  \"author\": \"John Leider <john.j."
  },
  {
    "path": "src/components/_index.js",
    "chars": 2087,
    "preview": "import VFooter from './footer.vue'\nimport VNav from './nav.vue'\nimport VSideNav from './side-nav.vue'\nimport VBadge from"
  },
  {
    "path": "src/components/badge.vue",
    "chars": 451,
    "preview": "<template>\n    <span class=\"badge\"\n          :class=\"classes\"\n    >\n        <slot></slot>\n    </span>\n</template>\n\n<scri"
  },
  {
    "path": "src/components/breadcrumbs.vue",
    "chars": 565,
    "preview": "<template>\n    <nav>\n        <div class=\"nav-wrapper\">\n            <div class=\"col s12\">\n                <a v-for=\"crumb"
  },
  {
    "path": "src/components/button-link.vue",
    "chars": 969,
    "preview": "<template>\n    <a :class=\"classes\"\n       :href=\"href\"\n       :data-induration=\"induration\"\n       :data-outduration=\"ou"
  },
  {
    "path": "src/components/button.vue",
    "chars": 1019,
    "preview": "<template>\n    <button :class=\"classes\"\n            :type=\"type\"\n            :data-induration=\"induration\"\n            :"
  },
  {
    "path": "src/components/card.vue",
    "chars": 895,
    "preview": "<template>\n    <div :class=\"classes\">\n        <slot></slot>\n    </div>\n</template>\n\n<script type=\"text/babel\">\n    expor"
  },
  {
    "path": "src/components/carousel-item.vue",
    "chars": 317,
    "preview": "<template>\n    <a href=\"#!\"\n       class=\"carousel-item\"\n    >\n        <img :src=\"src\">\n        <slot></slot>\n    </a>\n<"
  },
  {
    "path": "src/components/carousel.vue",
    "chars": 2214,
    "preview": "<template>\n    <div class=\"carousel\"\n         :class=\"classes\"\n         :style=\"styles\"\n    >\n        <v-carousel-item v"
  },
  {
    "path": "src/components/checkbox.vue",
    "chars": 2823,
    "preview": "<template>\n    <p>\n      <input type=\"checkbox\"\n             :id=\"id || name\"\n             :name=\"name\"\n             :di"
  },
  {
    "path": "src/components/chip.vue",
    "chars": 845,
    "preview": "<template>\n    <div class=\"chip\"\n         v-if=\"!remove\"\n    >\n        <slot></slot>\n        <v-icon v-if=\"close\">close<"
  },
  {
    "path": "src/components/collapsible.vue",
    "chars": 1206,
    "preview": "<template>\n    <ul class=\"collapsible\"\n        :data-collapsible=\"type\"\n        :class=\"classes\"\n    >\n        <slot></s"
  },
  {
    "path": "src/components/collection-avatar.vue",
    "chars": 716,
    "preview": "<template>\n    <li class=\"avatar\"\n        :class=\"classes\"\n    >\n        <img :src=\"src\" \n             class=\"circle\"\n  "
  },
  {
    "path": "src/components/collection-item.vue",
    "chars": 502,
    "preview": "<template>\n    <li :class=\"classes\">\n        <slot></slot>\n        <a href=\"#!\" \n           class=\"secondary-content\"\n  "
  },
  {
    "path": "src/components/collection-link.vue",
    "chars": 522,
    "preview": "<template>\n    <a href=\"#!\"\n       :class=\"classes\"\n    >\n        <slot></slot>\n        <a href=\"#!\" \n           class=\""
  },
  {
    "path": "src/components/collection.vue",
    "chars": 472,
    "preview": "<template>\n    <ul class=\"collection\"\n        :class=\"classes\"\n    >\n        <slot></slot>\n    </ul>\n</template>\n\n<scrip"
  },
  {
    "path": "src/components/date-input.vue",
    "chars": 1033,
    "preview": "<template>\n    <input type=\"date\" \n           class=\"datepicker\"\n    >\n</template>\n\n<script type=\"text/babel\">\n    impor"
  },
  {
    "path": "src/components/fab.vue",
    "chars": 1133,
    "preview": "<template>\n    <div class=\"fixed-action-btn\"\n         :class=\"classes\"\n    >\n        <v-btn-link large\n                 "
  },
  {
    "path": "src/components/file-input.vue",
    "chars": 547,
    "preview": "<template>\n    <div class=\"file-field input-field\">\n        <div class=\"btn\">\n            <span>File</span>\n            "
  },
  {
    "path": "src/components/footer.vue",
    "chars": 204,
    "preview": "<template>\n    <footer class=\"page-footer\">\n        <slot name=\"content\"></slot>\n        <div class=\"footer-copyright\">\n"
  },
  {
    "path": "src/components/functional/_index.js",
    "chars": 345,
    "preview": "import VRow from './row'\nimport VGrid from './grid'\nimport VContainer from './container'\nimport VCollapsibleHeader from "
  },
  {
    "path": "src/components/functional/collapsible-body.js",
    "chars": 256,
    "preview": "export default {\n    functional: true,\n\n    render: (h, { data, children }) => {\n        if (!data.staticClass) {\n      "
  },
  {
    "path": "src/components/functional/collapsible-header.js",
    "chars": 258,
    "preview": "export default {\n    functional: true,\n\n    render: (h, { data, children }) => {\n        if (!data.staticClass) {\n      "
  },
  {
    "path": "src/components/functional/container.js",
    "chars": 221,
    "preview": "export default {\n    functional: true,\n\n    render: (h, { data, children }) => {\n        data.staticClass = data.staticC"
  },
  {
    "path": "src/components/functional/dropdown.js",
    "chars": 255,
    "preview": "export default {\n    functional: true,\n\n    render: (h, { data, children }) => {\n        if (!data.staticClass) {\n      "
  },
  {
    "path": "src/components/functional/grid.js",
    "chars": 270,
    "preview": "export default {\n    functional: true,\n\n    render: (h, { data, children }) => {\n        let attrs = Object.keys(data.at"
  },
  {
    "path": "src/components/functional/row.js",
    "chars": 215,
    "preview": "export default {\n    functional: true,\n\n    render: (h, { data, children }) => {\n        data.staticClass = data.staticC"
  },
  {
    "path": "src/components/icon.vue",
    "chars": 1321,
    "preview": "<template>\n    <i class=\"material-icons\"\n       :class=\"classes\"\n    >\n        <slot></slot>\n    </i>\n</template>\n\n<scri"
  },
  {
    "path": "src/components/material-box.vue",
    "chars": 767,
    "preview": "<template>\n    <img class=\"materialboxed\" \n         :width=\"width\"\n         :src=\"src\"\n         :data-caption=\"caption\"\n"
  },
  {
    "path": "src/components/modal.vue",
    "chars": 1284,
    "preview": "<template>\n    <div :id=\"id\" \n         :class=\"classes\"\n         class=\"modal\"\n    >\n        <div class=\"modal-content\">"
  },
  {
    "path": "src/components/nav.vue",
    "chars": 589,
    "preview": "<template>\n    <div :class=\"{ 'navbar-fixed': fixed }\">\n        <nav :class=\"[navClass]\">\n            <div class=\"nav-wr"
  },
  {
    "path": "src/components/pagination-item.vue",
    "chars": 1104,
    "preview": "<template>\n    <li :class=\"classes\"\n        @click.prevent=\"click\"\n    >\n        <a href=\"#!\">\n            <slot></slot>"
  },
  {
    "path": "src/components/pagination.vue",
    "chars": 1623,
    "preview": "<template>\n    <ul class=\"pagination\">\n        <v-pagination-item :disabled=\"value === 1\"\n                         @clic"
  },
  {
    "path": "src/components/parallax.vue",
    "chars": 853,
    "preview": "<template>\n    <div class=\"parallax-container\"\n         :style=\"style\"\n    >\n        <div class=\"parallax\">\n            "
  },
  {
    "path": "src/components/progress-circular.vue",
    "chars": 2463,
    "preview": "<template>\n    <div class=\"preloader-wrapper\"\n         :class=\"wrapper_classes\"\n    >\n        <div class=\"spinner-layer\""
  },
  {
    "path": "src/components/progress-linear.vue",
    "chars": 1097,
    "preview": "<template>\n    <div class=\"progress\">\n        <div :class=\"classes\" \n             :style=\"style\"\n        ></div>\n    </d"
  },
  {
    "path": "src/components/radio.vue",
    "chars": 1563,
    "preview": "<template>\n    <p>\n      <input type=\"radio\"\n             :id=\"id\"\n             :name=\"name\"\n             :disabled=\"dis"
  },
  {
    "path": "src/components/range.vue",
    "chars": 754,
    "preview": "<template>\n    <p class=\"range-field\">\n        <input type=\"range\"\n               :min=\"min\"\n               :max=\"max\"\n "
  },
  {
    "path": "src/components/select.vue",
    "chars": 2637,
    "preview": "<template>\n    <select v-model=\"model\" v-bind:multiple=\"multiple\">\n        <option value=\"\"\n                disabled\n   "
  },
  {
    "path": "src/components/side-nav.vue",
    "chars": 567,
    "preview": "<template>\n    <ul :id=\"id\" \n        :class=\"options\"\n        class=\"side-nav\"\n    >\n        <slot></slot>\n    </ul>\n</t"
  },
  {
    "path": "src/components/slide.vue",
    "chars": 914,
    "preview": "<template>\n    <li>\n        <img :src=\"src\">\n        <div class=\"caption\"\n             :class=\"classes\"\n        >\n      "
  },
  {
    "path": "src/components/slider.vue",
    "chars": 1919,
    "preview": "<template>\n    <div class=\"slider\"\n         :class=\"classes\"\n    >\n        <ul class=\"slides\">\n            <slot></slot>"
  },
  {
    "path": "src/components/switch.vue",
    "chars": 1059,
    "preview": "<template>\n    <div class=\"switch\">\n        <label>\n            {{ off }}\n            <input type=\"checkbox\"\n           "
  },
  {
    "path": "src/components/tab.vue",
    "chars": 658,
    "preview": "<template>\n    <li class=\"tab col\"\n        :class=\"{ 'disabled': this.disabled }\"\n    >\n        <a :href=\"target\"\n      "
  },
  {
    "path": "src/components/tabs.vue",
    "chars": 623,
    "preview": "<template>\n    <ul class=\"tabs\">\n        <slot></slot>\n    </ul>\n</template>\n\n<script type=\"text/babel\">\n    import IsLo"
  },
  {
    "path": "src/components/text-area.vue",
    "chars": 358,
    "preview": "<template>\n    <textarea class=\"materialize-textarea\"\n              :length=\"length\"\n              @input=\"$emit('input'"
  },
  {
    "path": "src/components/text-input.vue",
    "chars": 375,
    "preview": "<template>\n    <input class=\"validate\"\n           type=\"text\"\n           :length=\"length\"\n           :value=\"value\"\n    "
  },
  {
    "path": "src/directives/_index.js",
    "chars": 197,
    "preview": "import Dropdown from './dropdown'\nimport Modal from './modal'\nimport SideNav from './side-nav'\nimport Tooltip from './to"
  },
  {
    "path": "src/directives/dropdown.js",
    "chars": 300,
    "preview": "import Load from '../util/load'\n\nexport default {\n    bind (el, binding, vnode) {\n        Load.call(vnode.context, () =>"
  },
  {
    "path": "src/directives/modal.js",
    "chars": 489,
    "preview": "import Load from '../util/load'\n\nexport default {\n    bind (el, binding, vnode) {\n        Load.call(vnode.context, () =>"
  },
  {
    "path": "src/directives/side-nav.js",
    "chars": 248,
    "preview": "import Load from '../util/load'\n\nexport default {\n    bind (el, binding, vnode) {\n        Load.call(vnode.context, () =>"
  },
  {
    "path": "src/directives/tooltip.js",
    "chars": 625,
    "preview": "import Load from '../util/load'\n\nconst tooltip = (el, binding, vnode) => {\n    const delay = typeof binding.modifiers !="
  },
  {
    "path": "src/index.js",
    "chars": 916,
    "preview": "import Components from './components/_index'\nimport Directives from './directives/_index'\nimport Functional from './comp"
  },
  {
    "path": "src/mixins/buttons.js",
    "chars": 811,
    "preview": "export default {\n    props: {\n        disabled: {\n            type: Boolean,\n            default: false\n        },\n\n    "
  },
  {
    "path": "src/mixins/collection-item.js",
    "chars": 578,
    "preview": "export default {\n    props: {\n        active: {\n            type: Boolean,\n            default: false\n        },\n\n      "
  },
  {
    "path": "src/mixins/counter.js",
    "chars": 348,
    "preview": "import Load from '../util/load'\n\nexport default {\n    props: {\n        length: {\n            type: [Boolean, Number, Str"
  },
  {
    "path": "src/mixins/dropdown.js",
    "chars": 635,
    "preview": "export default {\n    props: {\n        induration: {\n            type: Number,\n            default: 300\n        },\n\n     "
  },
  {
    "path": "src/mixins/is-loadable.js",
    "chars": 118,
    "preview": "import Load from '../util/load'\n\nexport default {\n    mounted () {\n        Load.call(this, () => this.init())\n    }\n}\n"
  },
  {
    "path": "src/mixins/waves.js",
    "chars": 1310,
    "preview": "export default {\n    props: {\n        wavesCircle: {\n            type: Boolean,\n            default: false\n        },\n\n "
  },
  {
    "path": "src/util/dialog.js",
    "chars": 222,
    "preview": "export default function Dialog(message, duration = 4000, rounded, cb) {\n    if (typeof rounded === 'function') {\n       "
  },
  {
    "path": "src/util/load.js",
    "chars": 198,
    "preview": "export default function (cb) {\n    if (document.readyState !== 'loading') {\n        this.$nextTick(() => cb())\n    } els"
  },
  {
    "path": "src/util/scroll-fire.js",
    "chars": 84,
    "preview": "export default function ScrollFire(options) {\n    Materialize.scrollFire(options)\n}\n"
  }
]

About this extraction

This page contains the full source code of the johnleider/vue-materials GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 70 files (53.3 KB), approximately 13.1k tokens, and a symbol index with 14 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!