npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

pugs

v0.0.9

Published

Common pug component templates

Downloads

24

Readme

Common pug component templates

通用pug组件模板

目录

Install

安装

$ cnpm i [-S|D] pugs

Useage

使用方式一: web端js

const menu = require('pugs/menu.pug');
let html = menu({menu: {...}});
console.log(html);  // -> <div class="menu">...</div>

使用方式二: node服务端js

const components = require('pugs');
let html = components.menu({menu: {...}});

// 或者直接引用目标组件包 可以有效减少缓存
const menu = require('pugs/menu');
let html = menu({menu: {...}});

console.log(html);  // -> <div class="menu">...</div>

使用方式三: web端pug(jade) 或 node服务端pug(jade) 模板

//- 需要在locals中预设locals.menu对象数据
include ~pugs/menu

使用方式四(推荐): web端pug(jade) 或 node服务端pug(jade) mixin

include ~pugs/mixins/menu
+menu({...});

Alert

信息提示

// 参数说明
{
  // locals.alert, 必须, 否则输出为空
  alert: {
    // prefix: 'alert',       // 类前缀, 可选, 默认alert
    // style: 'success',      // 样式, 可选, 默认空
    // dismiss: true,         // 关闭按钮, 可选, 默认true, false不渲染
    fade: false,              // 过渡效果, 可选, 默认false
    icon: {name: 'success'},  // 图标, 可选, 默认空
    html: '<strong>带html的</strong>',  // 内容html, 可选, 最先渲染
    text: 'alert',            // 内容文本, 可选, 最后渲染
  },
}
<!-- 输出html结构 -->
<div class="alert alert-dismissible fade" role="alert">
  <button class="close" type="button" data-dismiss="alert" aria-label="Close">
    <span aria-hidden="true">&times;</span>
  </button>
  <i class="icon icon-success" aria-hidden="true"></i>
  <strong>带html的</strong>   <!-- 参数html的值 -->
  alert   <!-- 参数text的值 -->
</div>

Box

内容区域, 用于隔离功能区域

// 参数说明
{
  // locals.box, 必须, 否则输出为空
  box: {
    // prefix: 'box',   // 类前缀, 可选, 默认box, 则标题区域为box-hd, 内容区域为box-hd
    cls: ['box-more'],  // 最外层额外class类, 可选, 默认为空
    title: 'title',     // 标题, 可选, 如果不传或为空则不渲染标题区域
    html: '<strong>带html的</strong>',  // 内容html, 可选, 最先渲染
    text: 'box',        // 内容文本, 可选, 最后渲染
  },
}
<!-- 输出html结构 -->
<div class="box box-more">
  <div class="box-hd">
    <h3>title</h3>
  </div>
  <strong>带html的</strong>   <!-- 参数html的值 -->
  box   <!-- 参数text的值 -->
</div>

Breadcrumb

面包屑

// 参数说明
{
  // locals.breadcrumb, 必须, 否则输出为空
  breadcrumb: {
    cls: ['breadcrumb', 'breadcrumb-more'],   // 最外层class类, 可选, 默认breadcrumb, 覆盖形式
    active_cls: ['active', 'active-more'],     // 自动选中最后一个的类, 可选, 默认空

    // 如果默认的item结构不满足需求, 可以通过item字符串模板或回调自定义结构, 可选
    // item: '<a href="${url}" class="${active}">${name}</a>',
    // item: (item, i) => {
    //  console.log(item);
    //  console.log(i);
    //  return `<a href="${item.url}" class="${item.active && 'active' || ''}">${item.name}</a>`;
    // },

    // 子项, 必须, 否则输出为空
    items: [
      {
        name: 'Home',             // 名称, 必须
        url: '/',                 // url, 可选, 名称在此项有值时为a标签
        cls: ['first', 'home'],   // 额外的类定义
      },
      {
        name: 'Library',
      },
      {
        name: 'Data',
      },
    ],
  },
}
<!-- 输出html结构 -->
<ol class="breadcrumb breadcrumb-more">
  <li class="first home"><a href="/">Home</a></li>
  <li>Library</li>
  <li class="active active-more">Data</li>  <!-- 自动选中最后一个 -->
</ol>

Button

按钮

// 参数说明
{
  // locals.button, 必须, 否则输出为空
  button: {
    // prefix: 'btn',     // 类前缀, 可选, 默认btn
    cls: ['btn-more'],    // 额外class类, 可选, 默认为空
    // href: '',          // 设置链接地址, 可选, 空为button标签, 非空为a标签
    // type: 'button',    // 按钮类型, 可选, 默认button
    name: 'button-name',  // 名称, 可选, 默认和a标签时不设置此属性
    style: 'primary',     // 样式, 可选, 默认不带样式
    // size: 'sm',        // 尺寸, 可选, 默认尺寸为空, 大(lg), 小(sm), 超小(xs)
    // block: false,      // 块级, 可选, 默认false非块级, true块级
    // active: false,     // 激活, 可选, 默认false非激活, true激活
    // disabled: false,   // 禁用, 可选, 默认false非禁用, true禁用
    html: '<strong>带html的</strong>',  // 内容html, 可选, 最先渲染
    text: 'button',       // 内容文本, 可选, 最后渲染

    // 带图标的按钮, 可选, 非空则自动调用并将值对象传入icon
    // icon: {
    //   prefix: 'fa',
    //   name: 'spinner',
    // },
  },
}
<!-- 输出html结构 -->
<button class="btn btn-primary btn-more" type="button" name="button-name">
    <strong>带html的</strong>   <!-- 参数html的值 -->
    button  <!-- 参数text的值 -->
</button>

Checkbox

单选/复选

// 参数说明
{
  // locals.checkbox, 必须, 否则输出为空
  checkbox: {
    // fake: false,           // 自定义单选/复选, 可选, 默认false原生, true自定义
    // icon: false,           // 增加额外i标签以显示icon, 可选, 默认false不增加, 需要fake和icon同时为true时才会增加
    // label: false,          // 增加label包裹, 可选, 默认false不包裹
    // radio: false,          // 单选, 可选, 默认false复选, true单选
    // id: 'checkbox-id',     // id, 可选, 同input
    cls: ['checkbox-more'],   // 额外的class类, 可选, 默认为空
    name: 'checkbox-name',    // 键, 同input
    value: 'checkbox-value',  // 值, 同input
    // checked: false,        // 选中状态, 可选, 默认false非选中
    // readonly: false,       // 只读状态, 可选, 同input
    // disabled: false,       // 禁用状态, 可选, 同input
  },
}
<!-- 输出html结构 -->
<input class="checkbox-more" type="checkbox" name="checkbox-name" value="checkbox-value"/>
// 参数说明
{
  // locals.checkbox, 必须, 否则输出为空
  checkbox: {
    fake: true,               // 自定义单选/复选, 可选, 默认false原生, true自定义
    // icon: false,           // 增加额外i标签以显示icon, 可选, 默认false不增加, 需要fake和icon同时为true时才会增加
    // label: false,          // 增加label包裹, 可选, 默认false不包裹
    radio: true,              // 单选, 可选, 默认false复选, true单选
    id: 'radio-id',           // id, 可选, 同input
    cls: ['radio-more'],      // 额外的class类, 可选, 默认为空
    name: 'radio-name',       // 键, 同input
    value: 'radio-value',     // 值, 同input
    checked: true,            // 选中状态, 可选, 默认false非选中
    readonly: true,           // 只读状态, 可选, 同input
    disabled: true,           // 禁用状态, 可选, 同input
    html: '<strong>带html的</strong>',  // 内容html, 可选, 最先渲染, 仅fake为true时可用
    text: 'radio',            // 内容文本, 可选, 最后渲染, 仅fake为true时可用
  },
}
<!-- 输出html结构 -->
<label class="radio radio-more fake readonly disabled" for="radio-id">
  <input type="radio" id="radio-id" name="radio-name" value="radio-value" checked="checked" readonly="readonly" disabled="disabled"/>
  <strong>带html的</strong>   <!-- 参数html的值 -->
  radio  <!-- 参数text的值 -->
</label>

Dismiss

关闭按钮

// 参数说明
{
  // locals.dismiss, 必须, 否则输出为空
  dismiss: {
    name: 'modal',                  // 需要关闭的对象名称, 必须, 会在标签中生成data-dismiss=${name}的属性
    cls: ['close', 'close-more'],   // class类, 可选, 默认close, 覆盖形式
    // html: '<span aria-hidden="true">&times;</span>', // 内容html, 可选
  },
}
<!-- 输出html结构 -->
<button class="close close-more" type="button" data-dismiss="modal" aria-label="Close">
  <span aria-hidden="true">&times;</span>
</button>

Dropdown

下拉列表/菜单

// 参数说明
{
  // locals.dropdown, 必须, 否则输出为空
  dropdown: {
    // prefix: 'dropdown',    // 类前缀, 可选, 默认dropdown
    // wrap: true,            // 最外层包裹, 可选, 默认true
    cls: ['dropdown-more'],   // 额外class类, 可选, 默认为空
    up: true,                 // 向上弹出, 可选, 默认false向下弹出
    static: true,             // 静态展示, 可选, 默认false
    align: 'right',           // 向右对齐, 可选, 默认为空向左对齐
    size: 'sm',               // 按钮尺寸, 可选, 默认为空正常尺寸
    html: '<strong>带html的</strong>',  // button内html内容, 可选, 最先渲染, 仅fake为true时可用
    text: 'dropdown',         // button内容文本, 可选, 最后渲染, 仅fake为true时可用

    // 如果默认的item结构不满足需求, 可以通过item回调自定义结构, 可选
    // item: (item, i) => {
    // 	console.dir(item);
    // 	console.dir(i);
    // 	return `<a href="${item.url}"><i class="icon icon-${item.icon.name}"></i>${item.name}</a>`;
    // },

    // 下拉列表项, 可选, 默认空列表则整个下拉框为禁用状态
    items: [
      {
        header: 'Dropdown header',
        name: 'Action',
        url: 'javascript:;',
        icon: {name: 'action'},
      },
      {
        name: 'Another action',
        url: 'javascript:;',
      },
      {
        name: 'Something else here',
        url: 'javascript:;',
        target: '_blank',
      },
      {
        divider: true,                // 在当前项前增加分割线, 可选, 优先级最高
        header: 'Dropdown header',    // 在当前项前增加额外标题, 可选, 优先级低于分割线
        name: 'Separated link',
        url: 'javascript:;',
      },
      {
        name: 'Disabled link',
        url: 'javascript:;',
        disabled: true,               // 禁用选择, 可选, 默认false
      },
    ],
  },
}
<!-- 输出html结构 -->
<div class="dropup dropdown dropdown-more">
  <button class="btn btn-sm dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
    <strong>带html的</strong>   <!-- 参数html的值 -->
    dropdown  <!-- 参数text的值 -->
    <span class="caret"></span>
  </button>
  <ul class="dropdown-menu dropdown-menu-right">
    <li class="dropdown-header">Dropdown header</li>
    <li><a href="javascript:;"><i class="icon icon-action" aria-hidden="true"></i>Action</a></li>
    <li><a href="javascript:;">Another action</a></li>
    <li><a href="javascript:;" target="_blank">Something else here</a></li>
    <li class="dropdown-divider" role="separator"></li>
    <li class="dropdown-header">Dropdown header</li>
    <li><a href="javascript:;">Separated link</a></li>
    <li class="disabled"><a href="javascript:;">Disabled link</a></li>
  </ul>
</div>

File

文件上传按钮

// 参数说明
{
  // locals.file, 必须, 否则输出为空
  file: {
    // prefix: 'btn',     // 类前缀, 可选, 同button
    cls: ['btn-more'],    // 额外class类, 可选, 同button
    // href: '',          // 设置链接地址, 可选, 同button
    // type: 'button',    // 按钮类型, 可选, 同button
    style: 'primary',     // 样式, 可选, 同button
    // size: 'sm',        // 尺寸, 可选, 同button
    // block: false,      // 块级, 可选, 同button
    // active: false,     // 激活, 可选, 同button
    // disabled: false,   // 禁用, 可选, 为true时会额外禁用file input
    html: '<strong>带html的</strong>',  // 内容html, 可选, 最先渲染
    text: 'file',         // 内容文本, 可选, 最后渲染

    // 带图标的按钮, 可选, 同button
    icon: {
      prefix: 'fa',
      name: 'upload',
    },

    // file input控件的attributes属性设置
    input: {
      name: 'file',
      attributes: {
        multiple: 'multiple',
      },
    },

  },
}
<!-- 输出html结构 -->
<button class="btn btn-primary btn-more btn-file" type="button">
  <i class="fa fa-upload" aria-hidden="true"></i>
  <span>
    <strong>带html的</strong>   <!-- 参数html的值 -->
    file  <!-- 参数text的值 -->
  </span>
  <input type="file" name="file" multiple="multiple"/>
</button>

Form

表单

// 参数说明
{
  // locals.form, 必须, 否则输出为空
  form: {
    // prefix: 'form',          // 类前缀, 可选, 默认form
    type: 'horizontal',         // 表单排列类型, 可选, 默认为空, horizontal水平排列, inline内联排列
    cls: ['form-more'],         // 额外class类, 可选, 默认为空
    name: 'form-name',          // 名称, 可选, 默认为空
    action: '/path/to/action',  // 提交地址, 可选, 默认当前页
    method: 'post',             // 提交方法, 可选, 默认get
    file: true,                 // 带文件提交, 可选, 默认false, true时将会自动设置enctype属性值为multipart/form-data
    // fieldset: true,          // 自动渲染一个下级fieldset, 可选, 默认true渲染, false不渲染
    disabled: true,             // 禁用整个表单, 作用于fieldset上, 如fieldset为false, 则此选项无效, 可选, 默认false
    title: 'title',             // legend标题, 可选, 默认不渲染legend标签
    html: '...',                // 内容html, 可选, 默认为空

    // 控件组, 可选, 默认空, 同form_group, 渲染优先级高于html参数
    groups: [
      {
        label: 'Username',
        control: {
          // type: 'text',
          id: 'username',
          name: 'Username',
          placeholder: 'Username',
        },
      },
      {
        label: 'Password',
        control: {
          type: 'password',
          id: 'password',
          name: 'Password',
          placeholder: 'Password',
        },
      },
    ],

    // 表单提交区域, 可选, 默认空, 同button, 渲染优先级高低于html参数, 如此数组个数大于0, 则会生成一个form-submit的div外层包裹
    buttons: [
      {
        style: 'default',
        text: 'Cancel',
      },
      {
        type: 'submit',
        style: 'primary',
        text: 'Submit',
      },
    ],

  },
}
<!-- 输出html结构 -->
<form class="form-horizontal form-more" name="form-name" action="/path/to/action" method="post" enctype="multipart/form-data">
  <fieldset disabled="disabled">
    <legend>title</legend>
    <div class="form-group">
      <label class="control-label" for="username">Username</label>
      <input class="form-control" type="text" id="username" name="Username" placeholder="Username" />
    </div>
    <div class="form-group">
      <label class="control-label" for="password">Password</label>
      <input class="form-control" type="password" id="password" name="Password" placeholder="Password" />
    </div>
    ...
    <div class="form-submit">
      <button class="btn btn-default" type="button">Cancel</button>
      <button class="btn btn-primary" type="submit">Submit</button>
    </div>
  </fieldset>
</form>

Form Group

表单控件组

// 参数说明
{
  // locals.form_group, 必须, 否则输出为空
  form_group: {
    // prefix: 'form',          // 类前缀, 可选, 默认form
    cls: ['form-group-more'],   // 额外class类, 可选, 默认为空
    // size: false,             // 尺寸, 可选, 默认false正常尺寸, lg大号, sm小号
    // status: false,           // 校验状态, 可选, 默认false, success成功, warning警告, error错误
    // feedback: false,         // 额外图标, 可选, 默认false
    label: false,               // label标签配置, 可选, 默认false不渲染,

    // 控件配置, 必须, 默认类型text, input系列的type将使用input组件来渲染, 参数同input
    control: {
      // type: 'text',
      id: 'input-id',
      name: 'input-name',
      value: 'input-value',
      placeholder: 'input-placeholder',
    },

    // help: false,             // 帮助文本, 可选, 默认false
  },
}
<!-- 输出html结构 -->
<div class="form-group form-group-more">
  <input class="form-control" type="text" id="input-id" name="input-name" value="input-value" placeholder="input-placeholder"/>
</div>
// 参数说明
{
  // locals.form_group, 必须, 否则输出为空
  form_group: {
    // prefix: 'form',            // 类前缀, 可选, 默认form
    cls: ['form-group-more'],     // 额外class类, 可选, 默认为空
    size: 'lg',                   // 尺寸, 可选, 默认false正常尺寸, lg大号, sm小号
    status: 'success',            // 校验状态, 可选, 默认false, success成功, warning警告, error错误
    feedback: {name: 'success'},  // 额外图标, 可选, 默认false, 配置后将使用icon组件渲染, 参数同con
    label: 'Username',            // label标签配置, 可选, 默认false不渲染, 可为字符串

    // 控件配置, 必须, 默认类型text, input系列的type将使用input组件来渲染, 参数同input
    control: {
      // type: 'text',
      id: 'username',
      name: 'Username',
      value: 'My username',
      placeholder: 'Username',
    },

    help: 'Please enter your username.',  // 帮助文本, 可选, 默认false, 可为字符串
  },
}
<!-- 输出html结构 -->
<div class="form-group form-group-lg has-success has-feedback form-group-more">
  <label class="control-label" for="username">Username</label>
  <input class="form-control" type="text" id="username" name="Username" value="My username" placeholder="Username" />
  <i class="icon icon-success form-control-feedback" aria-hidden="true"></i>
  <div class="help-block">Please enter your username.</div>
</div>
// 参数说明
{
  // locals.form_group, 必须, 否则输出为空
  form_group: {
    // prefix: 'form',          // 类前缀, 可选, 默认form
    cls: ['form-group-more'],   // 额外class类, 可选, 默认为空
    size: 'lg',                 // 尺寸, 可选, 默认false正常尺寸, lg大号, sm小号
    status: 'error',            // 校验状态, 可选, 默认false, success成功, warning警告, error错误
    feedback: {name: 'error'},  // 额外图标, 可选, 默认false, 配置后将使用icon组件渲染, 参数同con

    // label标签配置, 可选, 默认false不渲染, 可为label标签的配置对象
    label: {
      cls: ['control-label-more', 'col-xs-3'],
      html: '<strong>*</strong>',   // 内容html, 可选, 最先渲染
      text: 'Password',   // 内容文本, 可选, 最后渲染
    },

    // 控件配置, 必须, 默认类型text, input系列的type将使用input组件来渲染, 参数同input
    control: {
      type: 'password',
      id: 'password',
      name: 'Password',
      placeholder: 'Password',
      wrapper: ['col-xs-6'],  // 增加外层, 可选, 默认不增加, 一般用于栅栏结构布局
    },

    help: 'Please enter your password.',  // 帮助文本, 可选, 默认false, 可为字符串
  },
}
<!-- 输出html结构 -->
<div class="form-group form-group-lg has-error has-feedback form-group-more">
  <label class="control-label control-label-more col-xs-3" for="password">
    <strong>*</strong>   <!-- 参数html的值 -->
    Password  <!-- 参数text的值 -->
  </label>
  <div class="col-xs-6">
    <input class="form-control" type="password" id="password" name="Password" placeholder="Password" />
    <i class="icon icon-error form-control-feedback" aria-hidden="true"></i>
  </div>
  <div class="help-block">Please enter your password.</div>
</div>
// 参数说明
{
  // locals.form_group, 必须, 否则输出为空
  form_group: {
    // prefix: 'form',        // 类前缀, 可选, 默认form
    cls: ['form-group-more'], // 额外class类, 可选, 默认为空
    size: 'sm',               // 尺寸, 可选, 默认false正常尺寸, lg大号, sm小号
    status: 'warning',        // 校验状态, 可选, 默认false, success成功, warning警告, error错误
    // feedback: false,       // 额外图标, 可选, 默认false

    // label标签配置, 可选, 默认false不渲染, 可为label标签的配置对象
    label: {
      srOnly: true,         // 隐藏
      text: 'Remember me',
    },

    // 控件配置, 必须, 默认类型text, checkbox或radio将使用checkbox组件来渲染, 参数同checkbox
    control: {
      type: 'checkbox',
      name: 'remember',
      checked: true,

      // 增加外层, 可选, 默认不增加, 可为外层配置对象, 一般用于栅栏结构布局
      wrapper: {
        cls: ['col-xs-6', 'col-xs-push-3'],
      },
    },

    help: false,  // 帮助文本, 可选, 默认false
  },
}
<!-- 输出html结构 -->
<div class="form-group form-group-sm has-warning form-group-more">
  <label class="control-label sr-only">Remember me</label>
  <div class="col-xs-6 col-xs-push-3">
    <input type="checkbox" name="remember" checked="checked"/>
  </div>
</div>

Icon

文件上传按钮

// 参数说明
{
  // locals.icon, 必须, 否则输出为空
  icon: {
    name: 'spinner',    // 图标名称, 必须, 会和prefix参数组合成图标识别类
    prefix: 'fa',       // 类前缀, 可选, 默认icon
    cls: ['fa-more'],   // 最外层额外class类, 可选, 默认为空
    // href: '',        // 设置链接地址, 可选, 空为i标签, 非空为a标签
    html: '<strong>带html的</strong>',  // 内容html, 可选, 最先渲染
    text: 'icon',       // 内容文本, 可选, 最后渲染
  },
}
<!-- 输出html结构 -->
<i class="fa fa-spinner fa-more" aria-hidden="true">
  <strong>带html的</strong>   <!-- 参数html的值 -->
  icon  <!-- 参数text的值 -->
</i>

Input

输入控件

// 参数说明
{
  // locals.icon, 必须, 否则输出为空
  input: {
    // prefix: 'input',                   // 类前缀, 可选, 默认input
    size: 'lg',                           // 尺寸, 可选, 默认空
    // type: 'text',                      // 控件类型, 可选, 默认text文本输入框, password密码输入框, radio单选, checkbox复选, 更多请参阅html参考手册
    id: 'input',                          // id, 可选, 默认为空
    cls: ['form-control', 'input-more'],  // class类, 可选, 默认form-control, 覆盖形式
    name: 'name',                         // 键, 可选, 默认为空
    value: 'value',                       // 值, 可选, 默认为空
    placeholder: 'placeholder',           // 占位符, 可选, 默认为空
    // checked: false,                    // 选中状态, 用于单选和复选控件, 可选, 默认false
    readonly: true,                       // 只读状态, 可选, 默认false非只读
    disabled: true,                       // 禁用状态, 可选, 默认false非禁用
    required: true,                       // 必填项, 可选, 默认false非必填
    autofocus: true,                      // 自动获取焦点, 可选, 默认false非自动获取
    autocomplete: 'off',                  // 自动补全, 可选, 默认'on'自动补全
    // left: false,                       // 左侧附加组件, 可选, 默认false
    // right: false,                      // 右侧附加组件, 可选, 默认false
  },
}
<!-- 输出html结构 -->
<input class="form-control input-more input-lg" type="text" id="input" name="name" value="value" placeholder="placeholder" readonly="readonly" disabled="disabled" required="required" autofocus="autofocus" autocomplete="off"/>
// 参数说明
{
  // locals.icon, 必须, 否则输出为空
  input: {
    // prefix: 'input',                   // 类前缀, 可选, 默认input
    // size: '',                          // 尺寸, 可选, 默认空
    // type: 'text',                      // 控件类型, 可选, 默认text文本输入框, password密码输入框, radio单选, checkbox复选, 更多请参阅html参考手册
    // id: 'input',                       // id, 可选, 默认为空
    // cls: ['form-control'],             // class类, 可选, 默认form-control, 覆盖形式
    name: 'name',                         // 键, 可选, 默认为空
    value: 'value',                       // 值, 可选, 默认为空
    placeholder: 'placeholder',           // 占位符, 可选, 默认为空
    // checked: false,                    // 选中状态, 用于单选和复选控件, 可选, 默认false
    // readonly: false,                   // 只读状态, 可选, 默认false非只读
    // disabled: false,                   // 禁用状态, 可选, 默认false非禁用
    // required: false,                   // 必填项, 可选, 默认false非必填
    // autofocus: false,                  // 自动获取焦点, 可选, 默认false非自动获取
    // autocomplete: 'on',                // 自动补全, 可选, 默认'on'自动补全
    left: '@',                            // 左侧附加组件, 可选, 默认false, 可为html字符串
    right: {name: 'calendar'},            // 右侧附加组件, 可选, 默认false, 可为icon属性
  },
}
<!-- 输出html结构 -->
<div class="input-group">
  <div class="input-group-addon">@</div>
  <input class="form-control" type="text" name="name" value="value" placeholder="placeholder"/>
  <div class="input-group-addon">
    <i class="icon icon-calendar" aria-hidden="true"></i>
  </div>
</div>
// 参数说明
{
  // locals.icon, 必须, 否则输出为空
  input: {
    // prefix: 'input',                   // 类前缀, 可选, 默认input
    // size: '',                          // 尺寸, 可选, 默认空
    // type: 'text',                      // 控件类型, 可选, 默认text文本输入框, password密码输入框, radio单选, checkbox复选, 更多请参阅html参考手册
    // id: 'input',                       // id, 可选, 默认为空
    // cls: ['form-control'],             // class类, 可选, 默认form-control, 覆盖形式
    name: 'name',                         // 键, 可选, 默认为空
    value: 'value',                       // 值, 可选, 默认为空
    placeholder: 'placeholder',           // 占位符, 可选, 默认为空
    // checked: false,                    // 选中状态, 用于单选和复选控件, 可选, 默认false
    // readonly: false,                   // 只读状态, 可选, 默认false非只读
    // disabled: false,                   // 禁用状态, 可选, 默认false非禁用
    // required: false,                   // 必填项, 可选, 默认false非必填
    // autofocus: false,                  // 自动获取焦点, 可选, 默认false非自动获取
    // autocomplete: 'on',                // 自动补全, 可选, 默认'on'自动补全

    // 左侧附加组件, 可选, 默认false, 可为buttons和dropdown的数据
    left: [
      {
        type: 'button',
        style: 'default',
        text: 'left',
      },
    ],

    // 右侧附加组件, 可选, 默认false, 可为buttons和dropdown的数据
    right: {
      {
        type: 'button',
        style: 'primary',
        text: 'right',
      },
      {
        type: 'dropdown',
        align: 'right',
        wrap: false,
        items: [
          {
            header: 'Dropdown header',
            name: 'Action',
            url: 'javascript:;',
            icon: {name: 'action'},
          },
          {
            name: 'Another action',
            url: 'javascript:;',
          },
          {
            name: 'Something else here',
            url: 'javascript:;',
            target: '_blank',
          },
          {
            divider: true,
            header: 'Dropdown header',
            name: 'Separated link',
            url: 'javascript:;',
          },
          {
            name: 'Disabled link',
            url: 'javascript:;',
            disabled: true,
          },
        ],
      },
    },

  },
}
<!-- 输出html结构 -->
<div class="input-group">
  <div class="input-group-btn">
    <button class="btn btn-default" type="button">left</button>
  </div>
  <input class="form-control" type="text" name="name" value="value" placeholder="placeholder" />
  <div class="input-group-btn">
    <button class="btn btn-primary" type="button">right</button>
    <button class="btn dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true">
      <span class="caret"></span>
    </button>
    <ul class="dropdown-menu dropdown-menu-right">
      <li class="dropdown-header">Dropdown header</li>
      <li><a href="javascript:;"><i class="icon icon-action" aria-hidden="true"></i>Action</a></li>
      <li><a href="javascript:;">Another action</a></li>
      <li><a href="javascript:;" target="_blank">Something else here</a></li>
      <li class="dropdown-divider" role="separator"></li>
      <li class="dropdown-header">Dropdown header</li>
      <li><a href="javascript:;">Separated link</a></li>
      <li class="disabled"><a href="javascript:;">Disabled link</a></li>
    </ul>
  </div>
</div>

Menu

菜单

// 参数说明
{
  // locals.menu, 必须, 否则输出为空
  menu: {
    cls: ['menu', 'menu-more'],   // 最外层class类, 可选, 默认menu, 覆盖形式
    arrow: ['icon-arrow-down'],   // 如果有下级菜单, 不展开情况下i标签图标的class类, 可选, 无默认值
    active_cls: ['active'],        // 当前菜单的class, 可选, 默认active
    activeId: 1,                  // 当前菜单的id标识, 可选, 无默认值
    depth: true,                  // 渲染从0开始的深度层级, 可选, 默认false

    // 如果默认的item结构不满足需求, 可以通过item回调自定义结构, 可选
    // item: (item, active, depth, i) => {
    //  console.log(item);
    //  console.log(active);
    //  console.log(depth);
    //  console.log(i);
    //  return `<a href="${item.url}" class="${active && 'active' || ''}" data-id="${item.id}" data-depth="${depth}"><i class="icon icon-${item.icon.name}"></i>${item.name}</a>`;
    // },

    // 菜单项, 必须, 否则输出为空
    items: [
      {
        id: 1,                    // id, 必须, 将与activeId匹配是否为当前菜单
        name: 'menu1',            // 名称, 必须
        url: '/menu1',            // url, 可选, 名称在此项有值时为a标签, 否则为span标签
        icon: ['icon-1'],         // 名称前的i标签图标class类
      },
      {
        id: 2,
        name: 'menu2',
        icon: ['icon-2'],
        children: [
          {
            id: 6,
            name: 'menu6',
            url: '/menu6',
          },
        ],
      },
    ...
    ],

  },
}
<!-- 输出html结构 -->
<div class="menu menu-more">
  <div class="menu-scroller">
    <ul>
      <li class="active" data-id="1" data-depth="0">
        <div class="item">
          <i class="icon icon-home" aria-hidden="true"></i>
          <a href="/menu1">menu1</a>
        </div>
      </li>
      <li data-id="2" data-depth="0">
        <div class="item">
          <i class="icon-arrow-down"></i>
          <i class="icon icon-home" aria-hidden="true"></i>
          <span>menu2</span>
        </div>
        <ul>
          <li data-id="6" data-depth="1">
            <div class="item">
              <a href="/menu6">menu6</a>
            </div>
          </li>
        </ul>
      </li>
      ...
    </ul>
  </div>
</div>

Modal

模态框

// 参数说明
{
  // locals.modal, 必须, 否则输出为空
  modal: {
    // prefix: 'modal',   // 类前缀, 可选, 默认modal
    cls: ['modal-more'],  // 最外层额外class类, 可选, 默认为空
    // fade: true,        // 过渡效果, 可选, 默认true
    // size: 'sm',        // 尺寸, 可选, 默认尺寸为空, 大(lg), 小(sm)
    title: 'title',       // 标题, 可选, 默认空不显示, 非空显示
    // dismiss: true,     // 显示关闭按钮, 可选, 默认true显示, false不显示
    html: '<strong>带html的</strong>',  // 内容html, 可选, 最先渲染
    text: 'modal',        // 内容文本, 可选, 最后渲染

    // content区域的attributes配置, 可选, 默认div渲染, 若action和method设置了任意一个, 则为form表单渲染
    content: {
      action: '/route/to/submit',
      method: 'post',
    },

    // 尾部按钮区域, 可选, 数组中的每个对象对应一个button的配置
    buttons: [
      {style: 'default', text: '取消', autofocus: true, attributes: {'data-dismiss': 'modal'}},
      {style: 'primary', text: '提交', type: 'submit'},
    ],

  },
}
<!-- 输出html结构 -->
<div class="modal fade modal-more">
  <div class="modal-dialog">
    <form class="modal-content" action="/route/to/submit" method="post">
      <fieldset>
        <div class="modal-header">
          <button class="close" type="button" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
          </button>
          <h4>title</h4>
        </div>
        <div class="modal-body">
          <strong>带html的</strong>   <!-- 参数html的值 -->
          modal   <!-- 参数text的值 -->
        </div>
        <div class="modal-footer">
          <button class="btn btn-default" type="button" autofocus="autofocus" data-dismiss="modal">取消</button>
          <button class="btn btn-primary" type="submit">提交</button>
        </div>
      </fieldset>
    </form>
  </div>
</div>

Pagination

分页

// 参数说明
{
  // locals.pagination, 必须, 否则输出为空
  pagination: {
    totalCount: 666,                                            // 总数据条数, 必须
    cls: ['pagination', 'pagination-more'],                     // 最外层class类, 可选, 默认pagination, 覆盖形式
    first_cls: ['first'],                                        // 第一页按钮样式类, 可选, 默认空
    last_cls: ['last'],                                          // 最后一页按钮样式类, 可选, 默认空
    prev_cls: ['prev'],                                          // 前一页按钮样式类, 可选, 默认空
    next_cls: ['next'],                                          // 下一页按钮样式类, 可选, 默认空
    page_cls: ['page'],                                          // 分页按钮样式类, 可选, 默认空
    // active_cls: ['active'],                                   // 激活样式类, 可选, 默认active
    // disabled_cls: ['disabled'],                               // 禁用样式类, 可选, 默认disabled
    first: 'first',                                             // 第一页按钮的文本, 可选, 默认为空, false不显示第一页按钮
    last: 'last',                                               // 最后一页按钮的文本, 可选, 默认为空, false不显示最后一页按钮
    prev: '«',                                                  // 前一页按钮的文本, 可选, 默认为空, false不显示前一页按钮
    next: '»',                                                  // 下一页按钮的文本, 可选, 默认为空, false不显示下一页按钮
    url: '/route/path?query=string&page=${page}&size=${size}',  // 跳转url, 可选, 默认javascript:;, 会自动替换${page}和${size}
    page: 10,                                                   // 当前页码, 可选, 默认1
    // size: 20,                                                // 每页数量, 可选, 默认20
    // max_button_count: 6,                                       // 最多显示页数, 可选, 默认6
    // hide_on_single_page: false,                                 // 只有一页时隐藏, 可选, 默认false不隐藏
    // disable_active_page_button: false,                          // 禁用当前页, 可选, 默认false不禁用
    ellipsis: '...',                                            // 是否省略显示第一页和最后一页的按钮, 可选, 默认不显示
  },
}
<!-- 输出html结构 -->
<ul class="pagination pagination-more">
  <li class="first"><a href="/route/path?query=string&amp;page=1&amp;size=20">first</a></li>
  <li class="prev"><a href="/route/path?query=string&amp;page=9&amp;size=20">«</a></li>
  <li class="page"><a href="/route/path?query=string&amp;page=1&amp;size=20">1</a></li>     <!-- 通过参数ellipsis配置 -->
  <li><em>...</em></li>                                                                     <!-- 通过参数ellipsis配置 -->
  <li class="page"><a href="/route/path?query=string&amp;page=7&amp;size=20">7</a></li>
  <li class="page"><a href="/route/path?query=string&amp;page=8&amp;size=20">8</a></li>
  <li class="page"><a href="/route/path?query=string&amp;page=9&amp;size=20">9</a></li>
  <li class="page active"><span>10</span></li>
  <li class="page"><a href="/route/path?query=string&amp;page=11&amp;size=20">11</a></li>
  <li class="page"><a href="/route/path?query=string&amp;page=12&amp;size=20">12</a></li>
  <li><em>...</em></li>                                                                     <!-- 通过参数ellipsis配置 -->
  <li class="page"><a href="/route/path?query=string&amp;page=34&amp;size=20">34</a></li>   <!-- 通过参数ellipsis配置 -->
  <li class="next"><a href="/route/path?query=string&amp;page=11&amp;size=20">»</a></li>
  <li class="last"><a href="/route/path?query=string&amp;page=34&amp;size=20">last</a></li>
</ul>

Select

下拉列表

// 参数说明
{
  // locals.select, 必须, 否则输出为空
  select: {
    // fake: true,                          // 自定义下拉列表, 可选, 默认false原生, true自定义
    id: 'select-id',                        // id, 可选, 默认为空
    cls: ['form-control', 'select-more'],   // 额外class类, 可选, 默认为空
    name: 'select-name',                    // 键, 可选, 默认为空
    value: 1,                               // 值, 可选, 默认为空
    size: 'lg',                             // 尺寸, 可选, 默认为普通, lg大号, sm小号
    multiple: true,                         // 多选, 可选, 默认为false

    // 下拉选项, 可选, 默认空数组
    items: [
      {name: 'a', value: 0},
      {name: 'b', value: 1},
      {name: 'c', value: 2},
      {name: 'd', value: 3},
      {name: 'e', value: 4},
      {name: 'f', value: 5},
    ],

  },
}
<!-- 输出html结构 -->
<select class="form-control select-more input-lg" id="select-id" name="select-name" multiple="multiple">
  <option value="0">a</option>
  <option value="1" selected="selected">b</option>
  <option value="2">c</option>
  <option value="3">d</option>
  <option value="4">e</option>
  <option value="5">f</option>
</select>
// 参数说明
{
  // locals.select, 必须, 否则输出为空
  select: {
    fake: true,             // 自定义下拉列表, 可选, 默认false原生, true自定义
    id: 'select-id',        // id, 可选, 默认为空
    cls: ['select-more'],   // 额外class类, 可选, 默认为空
    name: 'select-name',    // 键, 可选, 默认为空
    value: 2,               // 值, 可选, 默认为空
    size: 'sm',             // 尺寸, 可选, 默认为普通, lg大号, sm小号
    multiple: true,         // 多选, 可选, 默认为false
    up: true,               // 向上弹出, 可选, 默认false向下弹出, 同dropdown
    align: 'right',         // 向右对齐, 可选, 默认为空向左对齐, 同dropdown

    // 下拉选项, 可选, 默认空数组
    items: [
      {name: '0值名称', value: 0},
      {name: '1值名称', value: 1},
      {name: '2值名称', value: 2},
      {name: '3值名称', value: 3},
      {name: '4值名称', value: 4},
      {name: '5值名称', value: 5},
    ],

  },
}
<!-- 输出html结构 -->
<div class="dropup select select-more multiple">
  <button class="btn btn-sm dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" id="select-id">
    <input type="hidden" name="select-name" value="2" />
    <strong></strong>
    <span class="caret"></span>
  </button>
  <ul class="dropdown-menu dropdown-menu-right">
    <li data-value="0">0值名称</li>
    <li data-value="1">1值名称</li>
    <li class="selected" data-value="2">2值名称</li>
    <li data-value="3">3值名称</li>
    <li class="disabled" data-value="4">4值名称</li>
    <li data-value="5">5值名称</li></ul>
</div>

Table

表格

// 参数说明
{
  // locals.table, 必须, 否则输出为空
  table: {
    // prefix: 'table',                 // 类前缀, 可选, 默认table
    cls: ['table-cls', 'table-more'],   // 最外层额外class类, 可选, 默认为空
    bordered: true,                     // 带边框的表格, 可选, 默认false, 为表格和其中的每个单元格增加边框
    condensed: true,                    // 紧缩表格, 可选, 默认false, 可以让表格更加紧凑, 单元格中的内补(padding)均会减半
    hover: true,                        // 鼠标悬停, 可选, 默认false, 可以让 <tbody> 中的每一行对鼠标悬停状态作出响应
    responsive: true,                   // 响应式表格, 可选, 默认false, 其会在小屏幕设备上(小于768px)水平滚动, 当屏幕大于 768px 宽度时, 水平滚动条消失
    striped: true,                      // 条纹状表格, 可选, 默认false, 可以给 <tbody> 之内的每一行增加斑马条纹样式
    title: 'title',                     // caption标题, 可选, 默认不渲染caption标签

    // 列设置, 必须
    columns: [
      {
        name: '#',                                                        // 列名称, 必须, 可以是回调形式
        key: (item, i, items) => i + 1,                                   // 对应行数据取值用到的key, 必须, 可以是回调形式
        width: '10%',                                                     // 列宽度, 可选, 默认自适应
        attributes: {class: ['index']},                                   // 列对应的数据单元格attributes设置, 可选
        item: (item, i, items) => {return {class: i == 0 && 'active'}},   // 本列下的数据单元格attributes设置, 可选, 可以是回调形式
      },
      {name: 'First Name', key: 'firstName', width: '30%', attributes: {class: ['first-name']}, item: (item, i) => {return {class: i == 2 && 'success'}}},
      {name: 'Last Name', key: 'lastName', width: '30%', attributes: {class: ['last-name']}, item: (item, i) => {return {class: i == 0 && 'info'}}},
      {name: 'Username', key: 'userName', width: '30%', attributes: {class: ['username']}, item: (item, i) => {return {class: i == 2 && 'danger'}}},
    ],

    // 行设置, 必须
    items: [
      {firstName: 'Mark', lastName: 'Otto', userName: '@mdo'},
      {
        firstName: 'Jacob',
        lastName: 'Thornton',
        userName: '@fat',
        attributes: {class: 'active'},  // 当前数据行attributes设置, 可选
      },
      {firstName: 'Larry', lastName: 'the Bird', userName: '@twitter'},
      ...
    ],

    // 空数据, 可选, 如不设置此值则则在空数据状态下不输出整个表格
    empty: {
      cls: ['empty'],
      text: 'No matched data',
    },

    // tfoot的html, 可选
    html: '<tr><td colspan="4">foot</td></tr>',

  },
}
<!-- 输出html结构 -->
<div class="table-cls table-more table-responsive">
  <table class="table table-bordered table-condensed table-hover table-striped">
    <caption>title</caption>
    <thead>
      <tr>
        <th class="index" width="10%">#</th>
        <th class="first-name" width="30%">First Name</th>
        <th class="last-name" width="30%">Last Name</th>
        <th class="username" width="30%">Username</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td class="active">1</td>
        <td>Mark</td>
        <td class="info">Otto</td>
        <td>@mdo</td>
      </tr>
      <tr class="active">
        <td>2</td>
        <td>Jacob</td>
        <td>Thornton</td>
        <td>@fat</td>
      </tr>
      <tr>
        <td>3</td>
        <td class="success">Larry</td>
        <td>the Bird</td>
        <td class="danger">@twitter</td>
      </tr>
      ...
    </tbody>
    <tfoot>
      <tr>
        <td colspan="4">foot</td>
      </tr>
    </tfoot>
  </table>
</div>

Tree

树列表

// 参数说明
{
  // locals.tree, 必须, 否则输出为空
  tree: {
    arrow: ['icon-arrow-down'],   // 如果有下级菜单, 不展开情况下i标签图标的class类, 可选, 无默认值
    active_cls: ['active'],        // 当前菜单的class, 可选, 默认active
    activeId: 1,                  // 当前菜单的id标识, 可选, 无默认值
    depth: true,                  // 渲染从0开始的深度层级, 可选, 默认false

    // 如果默认的item结构不满足需求, 可以通过item回调自定义结构, 可选
    // item: (item, active, depth, i) => {
    //  console.log(item);
    //  console.log(active);
    //  console.log(depth);
    //  console.log(i);
    //  return `<a href="${item.url}" class="${active && 'active' || ''}" data-id="${item.id}" data-depth="${depth}"><i class="icon icon-${item.icon.name}"></i>${item.name}</a>`;
    // },

    // 树列表项, 必须, 否则输出为空
    items: [
      {
        id: 1,                    // id, 必须, 将与activeId匹配是否为当前菜单
        name: 'menu1',            // 名称, 必须
        url: '/menu1',            // url, 可选, 名称在此项有值时为a标签, 否则为span标签
        icon: ['icon-1'],         // 名称前的i标签图标class类
      },
      {
        id: 2,
        name: 'menu2',
        icon: ['icon-2'],
        children: [
          {
            id: 6,
            name: 'menu6',
            url: '/menu6',
          },
        ],
      },
    ...
    ],

  },
}
<!-- 输出html结构 -->
<ul>
  <li class="active" data-id="1" data-depth="0">
    <div class="item">
      <i class="icon icon-home" aria-hidden="true"></i>
      <a href="/menu1">menu1</a>
    </div>
  </li>
  <li data-id="2" data-depth="0">
    <div class="item">
      <i class="icon-arrow-down"></i>
      <i class="icon icon-home" aria-hidden="true"></i>
      <span>menu2</span>
    </div>
    <ul>
      <li data-id="6" data-depth="1">
        <div class="item">
          <a href="/menu6">menu6</a>
        </div>
      </li>
    </ul>
  </li>
  ...
</ul>

License

MIT - xiewulong