32
This commit is contained in:
parent
bedf4c3bfe
commit
50cb078e68
|
|
@ -24,10 +24,10 @@ export const getReservationList = async (index = 1, size = 20) => {
|
|||
* @returns {Promise<any>}
|
||||
*/
|
||||
export const getMyReservation = async (type = 0, index = 1, size = 10) => {
|
||||
const res = await request.get("sq/GetMyReservation", {
|
||||
type: type,
|
||||
index: index,
|
||||
size: size
|
||||
const res = await request.get("sq/GetMyReservation", {
|
||||
type: type,
|
||||
index: index,
|
||||
size: size
|
||||
});
|
||||
if (res.code == 0) {
|
||||
return res.data;
|
||||
|
|
@ -47,10 +47,42 @@ export const getMyUseReservation = async () => {
|
|||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取预约评价
|
||||
* @param {number} reId 预约ID
|
||||
* @returns {Promise<any>}
|
||||
*/
|
||||
export const getEvaluateServices = async (reId) => {
|
||||
const res = await request.get("sq/GetEvaluateServices", { reId: reId });
|
||||
if (res.code == 0) {
|
||||
return res.data;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加预约评价
|
||||
* @param {Object} evaluate 评价数据
|
||||
* @param {number} evaluate.reservation_id 预约ID
|
||||
* @param {number} evaluate.to_user_id 被评价用户ID
|
||||
* @param {number} evaluate.play_level 游戏水平评分
|
||||
* @param {number} evaluate.skills_level 技能水平评分
|
||||
* @returns {Promise<any>}
|
||||
*/
|
||||
export const addEvaluateServices = async (evaluate) => {
|
||||
const res = await request.post("sq/AddEvaluateServices", evaluate);
|
||||
if (res.code == 0) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
export const sqInterface = {
|
||||
getReservationList,
|
||||
getMyReservation,
|
||||
getMyUseReservation
|
||||
getMyUseReservation,
|
||||
getEvaluateServices,
|
||||
addEvaluateServices
|
||||
}
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
import { getUserInfo, editUserInfo, anonymousLogin as anonymousLoginInterface, userInterface } from '@/common/server/interface/user'
|
||||
import { ref } from 'vue'
|
||||
import throttle from 'lodash/throttle';
|
||||
|
||||
import { showModalConfirm } from '@/common/utils.js'
|
||||
// 用户信息响应式数据
|
||||
export const userInfo = ref(null);
|
||||
|
||||
|
|
@ -153,4 +153,76 @@ export const anonymousLogin = async () => {
|
|||
};
|
||||
|
||||
|
||||
|
||||
// 取消拉黑
|
||||
export const cancelBlack = async (userId) => {
|
||||
try {
|
||||
const res = await showModalConfirm("取消拉黑", "确定将用户移出黑名单吗?");
|
||||
if (!res) {
|
||||
return false;
|
||||
}
|
||||
const success = await userInterface.cancelUserBlack(userId)
|
||||
if (success) {
|
||||
uni.showToast({
|
||||
title: '已取消拉黑',
|
||||
icon: 'success'
|
||||
})
|
||||
return true;
|
||||
} else {
|
||||
uni.showToast({
|
||||
title: '取消拉黑失败',
|
||||
icon: 'none'
|
||||
})
|
||||
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('取消拉黑失败:', error)
|
||||
uni.showToast({
|
||||
title: '取消拉黑失败',
|
||||
icon: 'none'
|
||||
})
|
||||
} finally {
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 添加黑名单
|
||||
* @param {*} userId 要拉黑的用户ID
|
||||
* @returns {Promise<boolean>}
|
||||
*/
|
||||
export const addBlack = async (userId) => {
|
||||
try {
|
||||
const res = await showModalConfirm("拉黑用户", "确定将用户拉入黑名单吗?");
|
||||
if (!res) {
|
||||
return false;
|
||||
}
|
||||
const success = await userInterface.addUserBlack(userId)
|
||||
if (success) {
|
||||
uni.showToast({
|
||||
title: '已拉黑',
|
||||
icon: 'success'
|
||||
})
|
||||
return true;
|
||||
} else {
|
||||
uni.showToast({
|
||||
title: '拉黑失败',
|
||||
icon: 'none'
|
||||
})
|
||||
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('拉黑失败:', error)
|
||||
uni.showToast({
|
||||
title: '拉黑失败',
|
||||
icon: 'none'
|
||||
})
|
||||
} finally {
|
||||
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
2
main.js
2
main.js
|
|
@ -13,8 +13,10 @@ app.$mount()
|
|||
|
||||
// #ifdef VUE3
|
||||
import { createSSRApp } from 'vue'
|
||||
import uviewPlus from '@/uni_modules/uview-plus'
|
||||
export function createApp() {
|
||||
const app = createSSRApp(App)
|
||||
app.use(uviewPlus)
|
||||
return {
|
||||
app
|
||||
}
|
||||
|
|
|
|||
|
|
@ -56,7 +56,8 @@
|
|||
"setting" : {
|
||||
"urlCheck" : false
|
||||
},
|
||||
"usingComponents" : true
|
||||
"usingComponents" : true,
|
||||
"mergeVirtualHostAttributes" : true
|
||||
},
|
||||
"mp-alipay" : {
|
||||
"usingComponents" : true
|
||||
|
|
|
|||
1258
node_modules/.package-lock.json
generated
vendored
1258
node_modules/.package-lock.json
generated
vendored
File diff suppressed because it is too large
Load Diff
11
node_modules/clipboard/.babelrc.json
generated
vendored
11
node_modules/clipboard/.babelrc.json
generated
vendored
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"presets": [
|
||||
[
|
||||
"@babel/env",
|
||||
{
|
||||
"forceAllTransforms": true,
|
||||
"modules": false
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
22
node_modules/clipboard/.editorconfig
generated
vendored
22
node_modules/clipboard/.editorconfig
generated
vendored
|
|
@ -1,22 +0,0 @@
|
|||
# EditorConfig helps developers define and maintain consistent
|
||||
# coding styles between different editors and IDEs
|
||||
# http://editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
# Change these settings to your own preference
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
# We recommend you to keep these unchanged
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[{package.json,bower.json}]
|
||||
indent_size = 2
|
||||
12
node_modules/clipboard/.eslintignore
generated
vendored
12
node_modules/clipboard/.eslintignore
generated
vendored
|
|
@ -1,12 +0,0 @@
|
|||
# Ignore artifacts:
|
||||
dist
|
||||
|
||||
lib
|
||||
npm-debug.log
|
||||
bower_components
|
||||
node_modules
|
||||
yarn-error.log
|
||||
yarn.lock
|
||||
|
||||
src/*.ts
|
||||
/*.js
|
||||
24
node_modules/clipboard/.eslintrc.json
generated
vendored
24
node_modules/clipboard/.eslintrc.json
generated
vendored
|
|
@ -1,24 +0,0 @@
|
|||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es2021": true,
|
||||
"mocha": true
|
||||
},
|
||||
"extends": ["airbnb-base", "plugin:prettier/recommended"],
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 12,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"plugins": ["prettier"],
|
||||
"rules": {
|
||||
"prettier/prettier": "error",
|
||||
"prefer-const": "off",
|
||||
"camelcase": "off",
|
||||
"no-underscore-dangle": "off",
|
||||
"consistent-return": "off",
|
||||
/* Remove the necessity to use this on classes */
|
||||
"class-methods-use-this": "off",
|
||||
/* Enable variables declarations from shadowing variables declared in the outer scope */
|
||||
"no-shadow": "off"
|
||||
}
|
||||
}
|
||||
57
node_modules/clipboard/.github/ISSUE_TEMPLATE/bug_report.md
generated
vendored
57
node_modules/clipboard/.github/ISSUE_TEMPLATE/bug_report.md
generated
vendored
|
|
@ -1,57 +0,0 @@
|
|||
---
|
||||
name: 🐛 Bug Report
|
||||
about: Submit a bug report to help us improve
|
||||
labels: 'bug, needs triage'
|
||||
---
|
||||
|
||||
<!--
|
||||
|
||||
! PLEASE HELP US HELP YOU !
|
||||
|
||||
Bugs are fixed faster if you include:
|
||||
- a repro repository to inspect the code
|
||||
- an url to see the problem live
|
||||
|
||||
-->
|
||||
|
||||
## 🐛 Bug Report
|
||||
|
||||
> Fork this [JSFiddle](https://jsfiddle.net/zenorocha/5kk0eysw/) and reproduce your issue.
|
||||
|
||||
(A clear and concise description of what the issue is.)
|
||||
|
||||
### Have you read the [Contributing Guidelines on issues](https://github.com/zenorocha/clipboard.js/blob/master/contributing.md)?
|
||||
|
||||
(Write your answer here.)
|
||||
|
||||
### Expected Behaviour
|
||||
|
||||
<!--
|
||||
How did you expect your project to behave?
|
||||
It’s fine if you’re not sure your understanding is correct.
|
||||
Write down what you thought would happen.
|
||||
-->
|
||||
|
||||
I thought that by going to the page '...' and pressing the button '...' then '...' would happen.
|
||||
|
||||
_Tip: Try to use screenshots, gifs, videos, always remember people better understand with a visual way._
|
||||
|
||||
### Actual Behaviour
|
||||
|
||||
Instead of '...', what I saw was that '...' happened instead.
|
||||
|
||||
### To Reproduce
|
||||
|
||||
(Write your steps such as:)
|
||||
|
||||
1. Step 1...
|
||||
1. Step 2...
|
||||
1. Step 3...
|
||||
|
||||
### Browsers Affected
|
||||
|
||||
I tested on all major browsers and only IE 11 does not work.
|
||||
|
||||
### Operational System
|
||||
|
||||
(Place here your Operational System.)
|
||||
13
node_modules/clipboard/.github/ISSUE_TEMPLATE/documentation.md
generated
vendored
13
node_modules/clipboard/.github/ISSUE_TEMPLATE/documentation.md
generated
vendored
|
|
@ -1,13 +0,0 @@
|
|||
---
|
||||
name: 📚 Documentation
|
||||
about: Report an issue related to documentation
|
||||
labels: 'documentation, needs triage'
|
||||
---
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
(A clear and concise description of what the issue is.)
|
||||
|
||||
### Have you read the [Contributing Guidelines on issues](https://github.com/zenorocha/clipboard.js/blob/master/contributing.md)?
|
||||
|
||||
(Write your answer here.)
|
||||
26
node_modules/clipboard/.github/ISSUE_TEMPLATE/proposal.md
generated
vendored
26
node_modules/clipboard/.github/ISSUE_TEMPLATE/proposal.md
generated
vendored
|
|
@ -1,26 +0,0 @@
|
|||
---
|
||||
name: 💥 Proposal
|
||||
about: Propose a non-trivial change to Clipboard.js
|
||||
labels: 'proposal, needs triage'
|
||||
---
|
||||
|
||||
## 💥 Proposal
|
||||
|
||||
**Is your feature request related to a problem? Please describe**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Are you able to assist to bring the feature to reality?**
|
||||
no | yes, I can...
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
|
||||
### Have you read the [Contributing Guidelines on issues](https://github.com/zenorocha/clipboard.js/blob/master/contributing.md)?
|
||||
|
||||
(Write your answer here.)
|
||||
35
node_modules/clipboard/.github/PULL_REQUEST_TEMPLATE.md
generated
vendored
35
node_modules/clipboard/.github/PULL_REQUEST_TEMPLATE.md
generated
vendored
|
|
@ -1,35 +0,0 @@
|
|||
<!--
|
||||
Please make sure to read the Pull Request Guidelines:
|
||||
https://github.com/zenorocha/clipboard.js/blob/master/contributing.md#proposing-pull-requests
|
||||
-->
|
||||
|
||||
<!-- PULL REQUEST TEMPLATE -->
|
||||
<!-- (Update "[ ]" to "[x]" to check a box) -->
|
||||
|
||||
**What kind of change does this PR introduce?** (check at least one)
|
||||
|
||||
- [ ] Bugfix
|
||||
- [ ] Feature
|
||||
- [ ] Code style update
|
||||
- [ ] Refactor
|
||||
- [ ] Build-related changes
|
||||
- [ ] Other, please describe:
|
||||
|
||||
**Does this PR introduce a breaking change?** (check one)
|
||||
|
||||
- [ ] Yes
|
||||
- [ ] No
|
||||
|
||||
If yes, please describe the impact and migration path for existing applications:
|
||||
|
||||
**The PR fulfills these requirements:**
|
||||
|
||||
- [ ] It's submitted to the `dev` branch for v2.x (or to a previous version branch), _not_ the `master` branch
|
||||
- [ ] When resolving a specific issue, it's referenced in the PR's title (e.g. `fix #xxx[,#xxx]`, where "xxx" is the issue number)
|
||||
- [ ] New/updated tests are included
|
||||
|
||||
If adding a **new feature**, the PR's description includes:
|
||||
|
||||
- [ ] A convincing reason for adding this feature (to avoid wasting your time, it's best to open a suggestion issue first and wait for approval before working on it)
|
||||
|
||||
**Other information:**
|
||||
21
node_modules/clipboard/.github/stale.yml
generated
vendored
21
node_modules/clipboard/.github/stale.yml
generated
vendored
|
|
@ -1,21 +0,0 @@
|
|||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 60
|
||||
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 7
|
||||
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- pinned
|
||||
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: stale
|
||||
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
This issue has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed if no further activity occurs. Thank you
|
||||
for your contributions.
|
||||
|
||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||
closeComment: false
|
||||
47
node_modules/clipboard/.github/workflows/publish.yml
generated
vendored
47
node_modules/clipboard/.github/workflows/publish.yml
generated
vendored
|
|
@ -1,47 +0,0 @@
|
|||
# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
|
||||
|
||||
name: publish
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [created]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 14
|
||||
- run: npm ci
|
||||
- run: npm test
|
||||
|
||||
publish-npm:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 14
|
||||
registry-url: https://registry.npmjs.org/
|
||||
- run: npm ci
|
||||
- run: npm publish
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{secrets.npm_token}}
|
||||
|
||||
publish-gpr:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 14
|
||||
registry-url: https://npm.pkg.github.com/
|
||||
- run: npm ci
|
||||
- run: npm publish
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||
34
node_modules/clipboard/.github/workflows/test.js.yml
generated
vendored
34
node_modules/clipboard/.github/workflows/test.js.yml
generated
vendored
|
|
@ -1,34 +0,0 @@
|
|||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
pull_request:
|
||||
branches: [master]
|
||||
|
||||
env:
|
||||
FORCE_COLOR: 2
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [10.x, 12.x, 14.x, 15.x]
|
||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
# For now is not possible to target LTS verssions =/ check progress here https://github.com/actions/setup-node/issues/26
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- run: npm ci
|
||||
- run: npm run build --if-present
|
||||
- run: npm run lint
|
||||
- run: npm test
|
||||
4
node_modules/clipboard/.husky/pre-commit
generated
vendored
4
node_modules/clipboard/.husky/pre-commit
generated
vendored
|
|
@ -1,4 +0,0 @@
|
|||
#!/bin/sh
|
||||
. "$(dirname "$0")/_/husky.sh"
|
||||
|
||||
npx --no-install lint-staged
|
||||
1
node_modules/clipboard/.nvmrc
generated
vendored
1
node_modules/clipboard/.nvmrc
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
14
|
||||
9
node_modules/clipboard/.prettierignore
generated
vendored
9
node_modules/clipboard/.prettierignore
generated
vendored
|
|
@ -1,9 +0,0 @@
|
|||
# Ignore artifacts:
|
||||
dist
|
||||
|
||||
lib
|
||||
npm-debug.log
|
||||
bower_components
|
||||
node_modules
|
||||
yarn-error.log
|
||||
yarn.lock
|
||||
9
node_modules/clipboard/.prettierrc.json
generated
vendored
9
node_modules/clipboard/.prettierrc.json
generated
vendored
|
|
@ -1,9 +0,0 @@
|
|||
{
|
||||
"printWidth": 80,
|
||||
"tabWidth": 2,
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"trailingComma": "es5",
|
||||
"bracketSpacing": true,
|
||||
"arrowParens": "always"
|
||||
}
|
||||
21
node_modules/clipboard/LICENSE
generated
vendored
21
node_modules/clipboard/LICENSE
generated
vendored
|
|
@ -1,21 +0,0 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) Zeno Rocha
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
18
node_modules/clipboard/bower.json
generated
vendored
18
node_modules/clipboard/bower.json
generated
vendored
|
|
@ -1,18 +0,0 @@
|
|||
{
|
||||
"name": "clipboard",
|
||||
"version": "2.0.11",
|
||||
"description": "Modern copy to clipboard. No Flash. Just 3kb",
|
||||
"license": "MIT",
|
||||
"main": "dist/clipboard.js",
|
||||
"ignore": [
|
||||
"/.*/",
|
||||
"/demo/",
|
||||
"/test/",
|
||||
"/.*",
|
||||
"/bower.json",
|
||||
"/karma.conf.js",
|
||||
"/src",
|
||||
"/lib"
|
||||
],
|
||||
"keywords": ["clipboard", "copy", "cut"]
|
||||
}
|
||||
25
node_modules/clipboard/composer.json
generated
vendored
25
node_modules/clipboard/composer.json
generated
vendored
|
|
@ -1,25 +0,0 @@
|
|||
{
|
||||
"name": "zenorocha/clipboardjs",
|
||||
"description": "Modern copy to clipboard. No Flash. Just 3kb gzipped https://clipboardjs.com",
|
||||
"type": "component",
|
||||
"homepage": "https://clipboardjs.com/",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Zeno Rocha",
|
||||
"homepage": "http://zenorocha.com/"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"oomphinc/composer-installers-extender": "*"
|
||||
},
|
||||
"extra": {
|
||||
"component": {
|
||||
"scripts": [
|
||||
"dist/clipboard.js"
|
||||
],
|
||||
"files": [
|
||||
"dist/clipboard.min.js"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
29
node_modules/clipboard/contributing.md
generated
vendored
29
node_modules/clipboard/contributing.md
generated
vendored
|
|
@ -1,29 +0,0 @@
|
|||
# Contributing guide
|
||||
|
||||
Want to contribute to Clipboard.js? Awesome!
|
||||
There are many ways you can contribute, see below.
|
||||
|
||||
## Opening issues
|
||||
|
||||
Open an issue to report bugs or to propose new features.
|
||||
|
||||
- Reporting bugs: describe the bug as clearly as you can, including steps to reproduce, what happened and what you were expecting to happen. Also include browser version, OS and other related software's (npm, Node.js, etc) versions when applicable.
|
||||
|
||||
- Proposing features: explain the proposed feature, what it should do, why it is useful, how users should use it. Give us as much info as possible so it will be easier to discuss, access and implement the proposed feature. When you're unsure about a certain aspect of the feature, feel free to leave it open for others to discuss and find an appropriate solution.
|
||||
|
||||
## Proposing pull requests
|
||||
|
||||
Pull requests are very welcome. Note that if you are going to propose drastic changes, be sure to open an issue for discussion first, to make sure that your PR will be accepted before you spend effort coding it.
|
||||
|
||||
Fork the Clipboard.js repository, clone it locally and create a branch for your proposed bug fix or new feature. Avoid working directly on the master branch.
|
||||
|
||||
Implement your bug fix or feature, write tests to cover it and make sure all tests are passing (run a final `npm test` to make sure everything is correct). Then commit your changes, push your bug fix/feature branch to the origin (your forked repo) and open a pull request to the upstream (the repository you originally forked)'s master branch.
|
||||
|
||||
## Documentation
|
||||
|
||||
Documentation is extremely important and takes a fair deal of time and effort to write and keep updated. Please submit any and all improvements you can make to the repository's docs.
|
||||
|
||||
## Known issues
|
||||
|
||||
If you're using npm@3 you'll probably face some issues related to peerDependencies.
|
||||
https://github.com/npm/npm/issues/9204
|
||||
35
node_modules/clipboard/demo/constructor-node.html
generated
vendored
35
node_modules/clipboard/demo/constructor-node.html
generated
vendored
|
|
@ -1,35 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>constructor-node</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<div id="btn" data-clipboard-text="1">
|
||||
<span>Copy</span>
|
||||
</div>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/clipboard.min.js"></script>
|
||||
|
||||
<!-- 3. Instantiate clipboard by passing a HTML element -->
|
||||
<script>
|
||||
var btn = document.getElementById('btn');
|
||||
var clipboard = new ClipboardJS(btn);
|
||||
|
||||
clipboard.on('success', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
|
||||
clipboard.on('error', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
35
node_modules/clipboard/demo/constructor-nodelist.html
generated
vendored
35
node_modules/clipboard/demo/constructor-nodelist.html
generated
vendored
|
|
@ -1,35 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>constructor-nodelist</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<button data-clipboard-text="1">Copy</button>
|
||||
<button data-clipboard-text="2">Copy</button>
|
||||
<button data-clipboard-text="3">Copy</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/clipboard.min.js"></script>
|
||||
|
||||
<!-- 3. Instantiate clipboard by passing a list of HTML elements -->
|
||||
<script>
|
||||
var btns = document.querySelectorAll('button');
|
||||
var clipboard = new ClipboardJS(btns);
|
||||
|
||||
clipboard.on('success', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
|
||||
clipboard.on('error', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
34
node_modules/clipboard/demo/constructor-selector.html
generated
vendored
34
node_modules/clipboard/demo/constructor-selector.html
generated
vendored
|
|
@ -1,34 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>constructor-selector</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<button class="btn" data-clipboard-text="1">Copy</button>
|
||||
<button class="btn" data-clipboard-text="2">Copy</button>
|
||||
<button class="btn" data-clipboard-text="3">Copy</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/clipboard.min.js"></script>
|
||||
|
||||
<!-- 3. Instantiate clipboard by passing a string selector -->
|
||||
<script>
|
||||
var clipboard = new ClipboardJS('.btn');
|
||||
|
||||
clipboard.on('success', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
|
||||
clipboard.on('error', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
37
node_modules/clipboard/demo/function-target.html
generated
vendored
37
node_modules/clipboard/demo/function-target.html
generated
vendored
|
|
@ -1,37 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>function-target</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<button class="btn">Copy</button>
|
||||
<div>hello</div>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/clipboard.min.js"></script>
|
||||
|
||||
<!-- 3. Instantiate clipboard -->
|
||||
<script>
|
||||
var clipboard = new ClipboardJS('.btn', {
|
||||
target: function () {
|
||||
return document.querySelector('div');
|
||||
},
|
||||
});
|
||||
|
||||
clipboard.on('success', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
|
||||
clipboard.on('error', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
36
node_modules/clipboard/demo/function-text.html
generated
vendored
36
node_modules/clipboard/demo/function-text.html
generated
vendored
|
|
@ -1,36 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>function-text</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<button class="btn">Copy</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/clipboard.min.js"></script>
|
||||
|
||||
<!-- 3. Instantiate clipboard -->
|
||||
<script>
|
||||
var clipboard = new ClipboardJS('.btn', {
|
||||
text: function () {
|
||||
return 'to be or not to be';
|
||||
},
|
||||
});
|
||||
|
||||
clipboard.on('success', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
|
||||
clipboard.on('error', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
39
node_modules/clipboard/demo/target-div.html
generated
vendored
39
node_modules/clipboard/demo/target-div.html
generated
vendored
|
|
@ -1,39 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>target-div</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<div>hello</div>
|
||||
<button
|
||||
class="btn"
|
||||
data-clipboard-action="copy"
|
||||
data-clipboard-target="div"
|
||||
>
|
||||
Copy
|
||||
</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/clipboard.min.js"></script>
|
||||
|
||||
<!-- 3. Instantiate clipboard -->
|
||||
<script>
|
||||
var clipboard = new ClipboardJS('.btn');
|
||||
|
||||
clipboard.on('success', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
|
||||
clipboard.on('error', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
37
node_modules/clipboard/demo/target-input-number.html
generated
vendored
37
node_modules/clipboard/demo/target-input-number.html
generated
vendored
|
|
@ -1,37 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>target-input-number</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<input id="foo" type="number" value="0" />
|
||||
<button
|
||||
class="btn"
|
||||
data-clipboard-action="copy"
|
||||
data-clipboard-target="#foo"
|
||||
>
|
||||
Copy
|
||||
</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/clipboard.min.js"></script>
|
||||
|
||||
<!-- 3. Instantiate clipboard -->
|
||||
<script>
|
||||
var clipboard = new ClipboardJS('.btn');
|
||||
|
||||
clipboard.on('success', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
|
||||
clipboard.on('error', function (e) {
|
||||
console.log(e);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
37
node_modules/clipboard/demo/target-input.html
generated
vendored
37
node_modules/clipboard/demo/target-input.html
generated
vendored
|
|
@ -1,37 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>target-input</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<input id="foo" type="text" value="hello" />
|
||||
<button
|
||||
class="btn"
|
||||
data-clipboard-action="copy"
|
||||
data-clipboard-target="#foo"
|
||||
>
|
||||
Copy
|
||||
</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/clipboard.min.js"></script>
|
||||
|
||||
<!-- 3. Instantiate clipboard -->
|
||||
<script>
|
||||
var clipboard = new ClipboardJS('.btn');
|
||||
|
||||
clipboard.on('success', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
|
||||
clipboard.on('error', function (e) {
|
||||
console.log(e);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
28
node_modules/clipboard/demo/target-programmatic-copy.html
generated
vendored
28
node_modules/clipboard/demo/target-programmatic-copy.html
generated
vendored
|
|
@ -1,28 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>target-programmatic-copy</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<textarea id="bar">hello</textarea>
|
||||
<button id="btn">
|
||||
Copy
|
||||
</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/clipboard.min.js"></script>
|
||||
|
||||
<!-- 3. Instantiate clipboard -->
|
||||
<script>
|
||||
var btn = document.querySelector('#btn');
|
||||
|
||||
btn.addEventListener('click', () => {
|
||||
const textCopied = ClipboardJS.copy(document.querySelector('#bar'));
|
||||
console.log('copied!', textCopied);
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
28
node_modules/clipboard/demo/target-programmatic-cut.html
generated
vendored
28
node_modules/clipboard/demo/target-programmatic-cut.html
generated
vendored
|
|
@ -1,28 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>target-programmatic-cut</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<textarea id="bar">hello</textarea>
|
||||
<button id="btn">
|
||||
Cut
|
||||
</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/clipboard.min.js"></script>
|
||||
|
||||
<!-- 3. Instantiate clipboard -->
|
||||
<script>
|
||||
var btn = document.querySelector('#btn');
|
||||
|
||||
btn.addEventListener('click', () => {
|
||||
const textCut = ClipboardJS.cut(document.querySelector('#bar'));
|
||||
console.log('cut!', textCut);
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
39
node_modules/clipboard/demo/target-textarea.html
generated
vendored
39
node_modules/clipboard/demo/target-textarea.html
generated
vendored
|
|
@ -1,39 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>target-textarea</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<textarea id="bar">hello</textarea>
|
||||
<button
|
||||
class="btn"
|
||||
data-clipboard-action="cut"
|
||||
data-clipboard-target="#bar"
|
||||
>
|
||||
Cut
|
||||
</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/clipboard.min.js"></script>
|
||||
|
||||
<!-- 3. Instantiate clipboard -->
|
||||
<script>
|
||||
var clipboard = new ClipboardJS('.btn');
|
||||
|
||||
clipboard.on('success', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
|
||||
clipboard.on('error', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
27
node_modules/clipboard/demo/text-programmatic-copy.html
generated
vendored
27
node_modules/clipboard/demo/text-programmatic-copy.html
generated
vendored
|
|
@ -1,27 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>text-programmatic-copy</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<button id="btn">
|
||||
Copy
|
||||
</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/clipboard.min.js"></script>
|
||||
|
||||
<!-- 3. Instantiate clipboard -->
|
||||
<script>
|
||||
var btn = document.querySelector('#btn');
|
||||
|
||||
btn.addEventListener('click', () => {
|
||||
const textCopied = ClipboardJS.copy('123');
|
||||
console.log('copied!', textCopied);
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
890
node_modules/clipboard/dist/clipboard.js
generated
vendored
890
node_modules/clipboard/dist/clipboard.js
generated
vendored
|
|
@ -1,890 +0,0 @@
|
|||
/*!
|
||||
* clipboard.js v2.0.11
|
||||
* https://clipboardjs.com/
|
||||
*
|
||||
* Licensed MIT © Zeno Rocha
|
||||
*/
|
||||
(function webpackUniversalModuleDefinition(root, factory) {
|
||||
if(typeof exports === 'object' && typeof module === 'object')
|
||||
module.exports = factory();
|
||||
else if(typeof define === 'function' && define.amd)
|
||||
define([], factory);
|
||||
else if(typeof exports === 'object')
|
||||
exports["ClipboardJS"] = factory();
|
||||
else
|
||||
root["ClipboardJS"] = factory();
|
||||
})(this, function() {
|
||||
return /******/ (function() { // webpackBootstrap
|
||||
/******/ var __webpack_modules__ = ({
|
||||
|
||||
/***/ 686:
|
||||
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
||||
|
||||
"use strict";
|
||||
|
||||
// EXPORTS
|
||||
__webpack_require__.d(__webpack_exports__, {
|
||||
"default": function() { return /* binding */ clipboard; }
|
||||
});
|
||||
|
||||
// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js
|
||||
var tiny_emitter = __webpack_require__(279);
|
||||
var tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);
|
||||
// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js
|
||||
var listen = __webpack_require__(370);
|
||||
var listen_default = /*#__PURE__*/__webpack_require__.n(listen);
|
||||
// EXTERNAL MODULE: ./node_modules/select/src/select.js
|
||||
var src_select = __webpack_require__(817);
|
||||
var select_default = /*#__PURE__*/__webpack_require__.n(src_select);
|
||||
;// CONCATENATED MODULE: ./src/common/command.js
|
||||
/**
|
||||
* Executes a given operation type.
|
||||
* @param {String} type
|
||||
* @return {Boolean}
|
||||
*/
|
||||
function command(type) {
|
||||
try {
|
||||
return document.execCommand(type);
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
;// CONCATENATED MODULE: ./src/actions/cut.js
|
||||
|
||||
|
||||
/**
|
||||
* Cut action wrapper.
|
||||
* @param {String|HTMLElement} target
|
||||
* @return {String}
|
||||
*/
|
||||
|
||||
var ClipboardActionCut = function ClipboardActionCut(target) {
|
||||
var selectedText = select_default()(target);
|
||||
command('cut');
|
||||
return selectedText;
|
||||
};
|
||||
|
||||
/* harmony default export */ var actions_cut = (ClipboardActionCut);
|
||||
;// CONCATENATED MODULE: ./src/common/create-fake-element.js
|
||||
/**
|
||||
* Creates a fake textarea element with a value.
|
||||
* @param {String} value
|
||||
* @return {HTMLElement}
|
||||
*/
|
||||
function createFakeElement(value) {
|
||||
var isRTL = document.documentElement.getAttribute('dir') === 'rtl';
|
||||
var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS
|
||||
|
||||
fakeElement.style.fontSize = '12pt'; // Reset box model
|
||||
|
||||
fakeElement.style.border = '0';
|
||||
fakeElement.style.padding = '0';
|
||||
fakeElement.style.margin = '0'; // Move element out of screen horizontally
|
||||
|
||||
fakeElement.style.position = 'absolute';
|
||||
fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically
|
||||
|
||||
var yPosition = window.pageYOffset || document.documentElement.scrollTop;
|
||||
fakeElement.style.top = "".concat(yPosition, "px");
|
||||
fakeElement.setAttribute('readonly', '');
|
||||
fakeElement.value = value;
|
||||
return fakeElement;
|
||||
}
|
||||
;// CONCATENATED MODULE: ./src/actions/copy.js
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Create fake copy action wrapper using a fake element.
|
||||
* @param {String} target
|
||||
* @param {Object} options
|
||||
* @return {String}
|
||||
*/
|
||||
|
||||
var fakeCopyAction = function fakeCopyAction(value, options) {
|
||||
var fakeElement = createFakeElement(value);
|
||||
options.container.appendChild(fakeElement);
|
||||
var selectedText = select_default()(fakeElement);
|
||||
command('copy');
|
||||
fakeElement.remove();
|
||||
return selectedText;
|
||||
};
|
||||
/**
|
||||
* Copy action wrapper.
|
||||
* @param {String|HTMLElement} target
|
||||
* @param {Object} options
|
||||
* @return {String}
|
||||
*/
|
||||
|
||||
|
||||
var ClipboardActionCopy = function ClipboardActionCopy(target) {
|
||||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
|
||||
container: document.body
|
||||
};
|
||||
var selectedText = '';
|
||||
|
||||
if (typeof target === 'string') {
|
||||
selectedText = fakeCopyAction(target, options);
|
||||
} else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {
|
||||
// If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange
|
||||
selectedText = fakeCopyAction(target.value, options);
|
||||
} else {
|
||||
selectedText = select_default()(target);
|
||||
command('copy');
|
||||
}
|
||||
|
||||
return selectedText;
|
||||
};
|
||||
|
||||
/* harmony default export */ var actions_copy = (ClipboardActionCopy);
|
||||
;// CONCATENATED MODULE: ./src/actions/default.js
|
||||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Inner function which performs selection from either `text` or `target`
|
||||
* properties and then executes copy or cut operations.
|
||||
* @param {Object} options
|
||||
*/
|
||||
|
||||
var ClipboardActionDefault = function ClipboardActionDefault() {
|
||||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||||
// Defines base properties passed from constructor.
|
||||
var _options$action = options.action,
|
||||
action = _options$action === void 0 ? 'copy' : _options$action,
|
||||
container = options.container,
|
||||
target = options.target,
|
||||
text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.
|
||||
|
||||
if (action !== 'copy' && action !== 'cut') {
|
||||
throw new Error('Invalid "action" value, use either "copy" or "cut"');
|
||||
} // Sets the `target` property using an element that will be have its content copied.
|
||||
|
||||
|
||||
if (target !== undefined) {
|
||||
if (target && _typeof(target) === 'object' && target.nodeType === 1) {
|
||||
if (action === 'copy' && target.hasAttribute('disabled')) {
|
||||
throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
|
||||
}
|
||||
|
||||
if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {
|
||||
throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');
|
||||
}
|
||||
} else {
|
||||
throw new Error('Invalid "target" value, use a valid Element');
|
||||
}
|
||||
} // Define selection strategy based on `text` property.
|
||||
|
||||
|
||||
if (text) {
|
||||
return actions_copy(text, {
|
||||
container: container
|
||||
});
|
||||
} // Defines which selection strategy based on `target` property.
|
||||
|
||||
|
||||
if (target) {
|
||||
return action === 'cut' ? actions_cut(target) : actions_copy(target, {
|
||||
container: container
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/* harmony default export */ var actions_default = (ClipboardActionDefault);
|
||||
;// CONCATENATED MODULE: ./src/clipboard.js
|
||||
function clipboard_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return clipboard_typeof(obj); }
|
||||
|
||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||||
|
||||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
||||
|
||||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
||||
|
||||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
||||
|
||||
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
||||
|
||||
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
||||
|
||||
function _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
|
||||
|
||||
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
||||
|
||||
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Helper function to retrieve attribute value.
|
||||
* @param {String} suffix
|
||||
* @param {Element} element
|
||||
*/
|
||||
|
||||
function getAttributeValue(suffix, element) {
|
||||
var attribute = "data-clipboard-".concat(suffix);
|
||||
|
||||
if (!element.hasAttribute(attribute)) {
|
||||
return;
|
||||
}
|
||||
|
||||
return element.getAttribute(attribute);
|
||||
}
|
||||
/**
|
||||
* Base class which takes one or more elements, adds event listeners to them,
|
||||
* and instantiates a new `ClipboardAction` on each click.
|
||||
*/
|
||||
|
||||
|
||||
var Clipboard = /*#__PURE__*/function (_Emitter) {
|
||||
_inherits(Clipboard, _Emitter);
|
||||
|
||||
var _super = _createSuper(Clipboard);
|
||||
|
||||
/**
|
||||
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
|
||||
* @param {Object} options
|
||||
*/
|
||||
function Clipboard(trigger, options) {
|
||||
var _this;
|
||||
|
||||
_classCallCheck(this, Clipboard);
|
||||
|
||||
_this = _super.call(this);
|
||||
|
||||
_this.resolveOptions(options);
|
||||
|
||||
_this.listenClick(trigger);
|
||||
|
||||
return _this;
|
||||
}
|
||||
/**
|
||||
* Defines if attributes would be resolved using internal setter functions
|
||||
* or custom functions that were passed in the constructor.
|
||||
* @param {Object} options
|
||||
*/
|
||||
|
||||
|
||||
_createClass(Clipboard, [{
|
||||
key: "resolveOptions",
|
||||
value: function resolveOptions() {
|
||||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||||
this.action = typeof options.action === 'function' ? options.action : this.defaultAction;
|
||||
this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;
|
||||
this.text = typeof options.text === 'function' ? options.text : this.defaultText;
|
||||
this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;
|
||||
}
|
||||
/**
|
||||
* Adds a click event listener to the passed trigger.
|
||||
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: "listenClick",
|
||||
value: function listenClick(trigger) {
|
||||
var _this2 = this;
|
||||
|
||||
this.listener = listen_default()(trigger, 'click', function (e) {
|
||||
return _this2.onClick(e);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Defines a new `ClipboardAction` on each click event.
|
||||
* @param {Event} e
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: "onClick",
|
||||
value: function onClick(e) {
|
||||
var trigger = e.delegateTarget || e.currentTarget;
|
||||
var action = this.action(trigger) || 'copy';
|
||||
var text = actions_default({
|
||||
action: action,
|
||||
container: this.container,
|
||||
target: this.target(trigger),
|
||||
text: this.text(trigger)
|
||||
}); // Fires an event based on the copy operation result.
|
||||
|
||||
this.emit(text ? 'success' : 'error', {
|
||||
action: action,
|
||||
text: text,
|
||||
trigger: trigger,
|
||||
clearSelection: function clearSelection() {
|
||||
if (trigger) {
|
||||
trigger.focus();
|
||||
}
|
||||
|
||||
window.getSelection().removeAllRanges();
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Default `action` lookup function.
|
||||
* @param {Element} trigger
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: "defaultAction",
|
||||
value: function defaultAction(trigger) {
|
||||
return getAttributeValue('action', trigger);
|
||||
}
|
||||
/**
|
||||
* Default `target` lookup function.
|
||||
* @param {Element} trigger
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: "defaultTarget",
|
||||
value: function defaultTarget(trigger) {
|
||||
var selector = getAttributeValue('target', trigger);
|
||||
|
||||
if (selector) {
|
||||
return document.querySelector(selector);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Allow fire programmatically a copy action
|
||||
* @param {String|HTMLElement} target
|
||||
* @param {Object} options
|
||||
* @returns Text copied.
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: "defaultText",
|
||||
|
||||
/**
|
||||
* Default `text` lookup function.
|
||||
* @param {Element} trigger
|
||||
*/
|
||||
value: function defaultText(trigger) {
|
||||
return getAttributeValue('text', trigger);
|
||||
}
|
||||
/**
|
||||
* Destroy lifecycle.
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: "destroy",
|
||||
value: function destroy() {
|
||||
this.listener.destroy();
|
||||
}
|
||||
}], [{
|
||||
key: "copy",
|
||||
value: function copy(target) {
|
||||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
|
||||
container: document.body
|
||||
};
|
||||
return actions_copy(target, options);
|
||||
}
|
||||
/**
|
||||
* Allow fire programmatically a cut action
|
||||
* @param {String|HTMLElement} target
|
||||
* @returns Text cutted.
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: "cut",
|
||||
value: function cut(target) {
|
||||
return actions_cut(target);
|
||||
}
|
||||
/**
|
||||
* Returns the support of the given action, or all actions if no action is
|
||||
* given.
|
||||
* @param {String} [action]
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: "isSupported",
|
||||
value: function isSupported() {
|
||||
var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];
|
||||
var actions = typeof action === 'string' ? [action] : action;
|
||||
var support = !!document.queryCommandSupported;
|
||||
actions.forEach(function (action) {
|
||||
support = support && !!document.queryCommandSupported(action);
|
||||
});
|
||||
return support;
|
||||
}
|
||||
}]);
|
||||
|
||||
return Clipboard;
|
||||
}((tiny_emitter_default()));
|
||||
|
||||
/* harmony default export */ var clipboard = (Clipboard);
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ 828:
|
||||
/***/ (function(module) {
|
||||
|
||||
var DOCUMENT_NODE_TYPE = 9;
|
||||
|
||||
/**
|
||||
* A polyfill for Element.matches()
|
||||
*/
|
||||
if (typeof Element !== 'undefined' && !Element.prototype.matches) {
|
||||
var proto = Element.prototype;
|
||||
|
||||
proto.matches = proto.matchesSelector ||
|
||||
proto.mozMatchesSelector ||
|
||||
proto.msMatchesSelector ||
|
||||
proto.oMatchesSelector ||
|
||||
proto.webkitMatchesSelector;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the closest parent that matches a selector.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @return {Function}
|
||||
*/
|
||||
function closest (element, selector) {
|
||||
while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
|
||||
if (typeof element.matches === 'function' &&
|
||||
element.matches(selector)) {
|
||||
return element;
|
||||
}
|
||||
element = element.parentNode;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = closest;
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ 438:
|
||||
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
||||
|
||||
var closest = __webpack_require__(828);
|
||||
|
||||
/**
|
||||
* Delegates event to a selector.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @param {Boolean} useCapture
|
||||
* @return {Object}
|
||||
*/
|
||||
function _delegate(element, selector, type, callback, useCapture) {
|
||||
var listenerFn = listener.apply(this, arguments);
|
||||
|
||||
element.addEventListener(type, listenerFn, useCapture);
|
||||
|
||||
return {
|
||||
destroy: function() {
|
||||
element.removeEventListener(type, listenerFn, useCapture);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delegates event to a selector.
|
||||
*
|
||||
* @param {Element|String|Array} [elements]
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @param {Boolean} useCapture
|
||||
* @return {Object}
|
||||
*/
|
||||
function delegate(elements, selector, type, callback, useCapture) {
|
||||
// Handle the regular Element usage
|
||||
if (typeof elements.addEventListener === 'function') {
|
||||
return _delegate.apply(null, arguments);
|
||||
}
|
||||
|
||||
// Handle Element-less usage, it defaults to global delegation
|
||||
if (typeof type === 'function') {
|
||||
// Use `document` as the first parameter, then apply arguments
|
||||
// This is a short way to .unshift `arguments` without running into deoptimizations
|
||||
return _delegate.bind(null, document).apply(null, arguments);
|
||||
}
|
||||
|
||||
// Handle Selector-based usage
|
||||
if (typeof elements === 'string') {
|
||||
elements = document.querySelectorAll(elements);
|
||||
}
|
||||
|
||||
// Handle Array-like based usage
|
||||
return Array.prototype.map.call(elements, function (element) {
|
||||
return _delegate(element, selector, type, callback, useCapture);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds closest match and invokes callback.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Function}
|
||||
*/
|
||||
function listener(element, selector, type, callback) {
|
||||
return function(e) {
|
||||
e.delegateTarget = closest(e.target, selector);
|
||||
|
||||
if (e.delegateTarget) {
|
||||
callback.call(element, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = delegate;
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ 879:
|
||||
/***/ (function(__unused_webpack_module, exports) {
|
||||
|
||||
/**
|
||||
* Check if argument is a HTML element.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.node = function(value) {
|
||||
return value !== undefined
|
||||
&& value instanceof HTMLElement
|
||||
&& value.nodeType === 1;
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if argument is a list of HTML elements.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.nodeList = function(value) {
|
||||
var type = Object.prototype.toString.call(value);
|
||||
|
||||
return value !== undefined
|
||||
&& (type === '[object NodeList]' || type === '[object HTMLCollection]')
|
||||
&& ('length' in value)
|
||||
&& (value.length === 0 || exports.node(value[0]));
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if argument is a string.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.string = function(value) {
|
||||
return typeof value === 'string'
|
||||
|| value instanceof String;
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if argument is a function.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.fn = function(value) {
|
||||
var type = Object.prototype.toString.call(value);
|
||||
|
||||
return type === '[object Function]';
|
||||
};
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ 370:
|
||||
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
||||
|
||||
var is = __webpack_require__(879);
|
||||
var delegate = __webpack_require__(438);
|
||||
|
||||
/**
|
||||
* Validates all params and calls the right
|
||||
* listener function based on its target type.
|
||||
*
|
||||
* @param {String|HTMLElement|HTMLCollection|NodeList} target
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listen(target, type, callback) {
|
||||
if (!target && !type && !callback) {
|
||||
throw new Error('Missing required arguments');
|
||||
}
|
||||
|
||||
if (!is.string(type)) {
|
||||
throw new TypeError('Second argument must be a String');
|
||||
}
|
||||
|
||||
if (!is.fn(callback)) {
|
||||
throw new TypeError('Third argument must be a Function');
|
||||
}
|
||||
|
||||
if (is.node(target)) {
|
||||
return listenNode(target, type, callback);
|
||||
}
|
||||
else if (is.nodeList(target)) {
|
||||
return listenNodeList(target, type, callback);
|
||||
}
|
||||
else if (is.string(target)) {
|
||||
return listenSelector(target, type, callback);
|
||||
}
|
||||
else {
|
||||
throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an event listener to a HTML element
|
||||
* and returns a remove listener function.
|
||||
*
|
||||
* @param {HTMLElement} node
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listenNode(node, type, callback) {
|
||||
node.addEventListener(type, callback);
|
||||
|
||||
return {
|
||||
destroy: function() {
|
||||
node.removeEventListener(type, callback);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an event listener to a list of HTML elements
|
||||
* and returns a remove listener function.
|
||||
*
|
||||
* @param {NodeList|HTMLCollection} nodeList
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listenNodeList(nodeList, type, callback) {
|
||||
Array.prototype.forEach.call(nodeList, function(node) {
|
||||
node.addEventListener(type, callback);
|
||||
});
|
||||
|
||||
return {
|
||||
destroy: function() {
|
||||
Array.prototype.forEach.call(nodeList, function(node) {
|
||||
node.removeEventListener(type, callback);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an event listener to a selector
|
||||
* and returns a remove listener function.
|
||||
*
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listenSelector(selector, type, callback) {
|
||||
return delegate(document.body, selector, type, callback);
|
||||
}
|
||||
|
||||
module.exports = listen;
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ 817:
|
||||
/***/ (function(module) {
|
||||
|
||||
function select(element) {
|
||||
var selectedText;
|
||||
|
||||
if (element.nodeName === 'SELECT') {
|
||||
element.focus();
|
||||
|
||||
selectedText = element.value;
|
||||
}
|
||||
else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
|
||||
var isReadOnly = element.hasAttribute('readonly');
|
||||
|
||||
if (!isReadOnly) {
|
||||
element.setAttribute('readonly', '');
|
||||
}
|
||||
|
||||
element.select();
|
||||
element.setSelectionRange(0, element.value.length);
|
||||
|
||||
if (!isReadOnly) {
|
||||
element.removeAttribute('readonly');
|
||||
}
|
||||
|
||||
selectedText = element.value;
|
||||
}
|
||||
else {
|
||||
if (element.hasAttribute('contenteditable')) {
|
||||
element.focus();
|
||||
}
|
||||
|
||||
var selection = window.getSelection();
|
||||
var range = document.createRange();
|
||||
|
||||
range.selectNodeContents(element);
|
||||
selection.removeAllRanges();
|
||||
selection.addRange(range);
|
||||
|
||||
selectedText = selection.toString();
|
||||
}
|
||||
|
||||
return selectedText;
|
||||
}
|
||||
|
||||
module.exports = select;
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ 279:
|
||||
/***/ (function(module) {
|
||||
|
||||
function E () {
|
||||
// Keep this empty so it's easier to inherit from
|
||||
// (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
|
||||
}
|
||||
|
||||
E.prototype = {
|
||||
on: function (name, callback, ctx) {
|
||||
var e = this.e || (this.e = {});
|
||||
|
||||
(e[name] || (e[name] = [])).push({
|
||||
fn: callback,
|
||||
ctx: ctx
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
once: function (name, callback, ctx) {
|
||||
var self = this;
|
||||
function listener () {
|
||||
self.off(name, listener);
|
||||
callback.apply(ctx, arguments);
|
||||
};
|
||||
|
||||
listener._ = callback
|
||||
return this.on(name, listener, ctx);
|
||||
},
|
||||
|
||||
emit: function (name) {
|
||||
var data = [].slice.call(arguments, 1);
|
||||
var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
|
||||
var i = 0;
|
||||
var len = evtArr.length;
|
||||
|
||||
for (i; i < len; i++) {
|
||||
evtArr[i].fn.apply(evtArr[i].ctx, data);
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
off: function (name, callback) {
|
||||
var e = this.e || (this.e = {});
|
||||
var evts = e[name];
|
||||
var liveEvents = [];
|
||||
|
||||
if (evts && callback) {
|
||||
for (var i = 0, len = evts.length; i < len; i++) {
|
||||
if (evts[i].fn !== callback && evts[i].fn._ !== callback)
|
||||
liveEvents.push(evts[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove event from queue to prevent memory leak
|
||||
// Suggested by https://github.com/lazd
|
||||
// Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
|
||||
|
||||
(liveEvents.length)
|
||||
? e[name] = liveEvents
|
||||
: delete e[name];
|
||||
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = E;
|
||||
module.exports.TinyEmitter = E;
|
||||
|
||||
|
||||
/***/ })
|
||||
|
||||
/******/ });
|
||||
/************************************************************************/
|
||||
/******/ // The module cache
|
||||
/******/ var __webpack_module_cache__ = {};
|
||||
/******/
|
||||
/******/ // The require function
|
||||
/******/ function __webpack_require__(moduleId) {
|
||||
/******/ // Check if module is in cache
|
||||
/******/ if(__webpack_module_cache__[moduleId]) {
|
||||
/******/ return __webpack_module_cache__[moduleId].exports;
|
||||
/******/ }
|
||||
/******/ // Create a new module (and put it into the cache)
|
||||
/******/ var module = __webpack_module_cache__[moduleId] = {
|
||||
/******/ // no module.id needed
|
||||
/******/ // no module.loaded needed
|
||||
/******/ exports: {}
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // Execute the module function
|
||||
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
||||
/******/
|
||||
/******/ // Return the exports of the module
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/
|
||||
/************************************************************************/
|
||||
/******/ /* webpack/runtime/compat get default export */
|
||||
/******/ !function() {
|
||||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||||
/******/ __webpack_require__.n = function(module) {
|
||||
/******/ var getter = module && module.__esModule ?
|
||||
/******/ function() { return module['default']; } :
|
||||
/******/ function() { return module; };
|
||||
/******/ __webpack_require__.d(getter, { a: getter });
|
||||
/******/ return getter;
|
||||
/******/ };
|
||||
/******/ }();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/define property getters */
|
||||
/******/ !function() {
|
||||
/******/ // define getter functions for harmony exports
|
||||
/******/ __webpack_require__.d = function(exports, definition) {
|
||||
/******/ for(var key in definition) {
|
||||
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
||||
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
||||
/******/ }
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ }();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
||||
/******/ !function() {
|
||||
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
|
||||
/******/ }();
|
||||
/******/
|
||||
/************************************************************************/
|
||||
/******/ // module exports must be returned from runtime so entry inlining is disabled
|
||||
/******/ // startup
|
||||
/******/ // Load entry module and return exports
|
||||
/******/ return __webpack_require__(686);
|
||||
/******/ })()
|
||||
.default;
|
||||
});
|
||||
7
node_modules/clipboard/dist/clipboard.min.js
generated
vendored
7
node_modules/clipboard/dist/clipboard.min.js
generated
vendored
File diff suppressed because one or more lines are too long
36
node_modules/clipboard/karma.conf.js
generated
vendored
36
node_modules/clipboard/karma.conf.js
generated
vendored
|
|
@ -1,36 +0,0 @@
|
|||
var webpackConfig = require('./webpack.config.js');
|
||||
|
||||
module.exports = function (karma) {
|
||||
karma.set({
|
||||
plugins: [
|
||||
'karma-webpack',
|
||||
'karma-chai',
|
||||
'karma-sinon',
|
||||
'karma-mocha',
|
||||
'karma-chrome-launcher',
|
||||
],
|
||||
|
||||
frameworks: ['chai', 'sinon', 'mocha', 'webpack'],
|
||||
|
||||
files: [
|
||||
{ pattern: 'src/**/*.js', watched: false },
|
||||
{ pattern: 'test/**/*.js', watched: false },
|
||||
],
|
||||
|
||||
preprocessors: {
|
||||
'src/**/*.js': ['webpack'],
|
||||
'test/**/*.js': ['webpack'],
|
||||
},
|
||||
|
||||
webpack: {
|
||||
module: webpackConfig.module,
|
||||
plugins: webpackConfig.plugins,
|
||||
},
|
||||
|
||||
webpackMiddleware: {
|
||||
stats: 'errors-only',
|
||||
},
|
||||
|
||||
browsers: ['ChromeHeadless'],
|
||||
});
|
||||
};
|
||||
12
node_modules/clipboard/package.js
generated
vendored
12
node_modules/clipboard/package.js
generated
vendored
|
|
@ -1,12 +0,0 @@
|
|||
// Package metadata for Meteor.js.
|
||||
|
||||
Package.describe({
|
||||
name: 'zenorocha:clipboard',
|
||||
summary: 'Modern copy to clipboard. No Flash. Just 3kb.',
|
||||
version: '2.0.11',
|
||||
git: 'https://github.com/zenorocha/clipboard.js',
|
||||
});
|
||||
|
||||
Package.onUse(function (api) {
|
||||
api.addFiles('dist/clipboard.js', 'client');
|
||||
});
|
||||
63
node_modules/clipboard/package.json
generated
vendored
63
node_modules/clipboard/package.json
generated
vendored
|
|
@ -1,63 +0,0 @@
|
|||
{
|
||||
"name": "clipboard",
|
||||
"version": "2.0.11",
|
||||
"description": "Modern copy to clipboard. No Flash. Just 2kb",
|
||||
"homepage": "https://clipboardjs.com",
|
||||
"repository": "zenorocha/clipboard.js",
|
||||
"license": "MIT",
|
||||
"main": "dist/clipboard.js",
|
||||
"types": "src/clipboard.d.ts",
|
||||
"keywords": [
|
||||
"clipboard",
|
||||
"copy",
|
||||
"cut"
|
||||
],
|
||||
"dependencies": {
|
||||
"good-listener": "^1.2.2",
|
||||
"select": "^1.1.2",
|
||||
"tiny-emitter": "^2.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.12.10",
|
||||
"@babel/preset-env": "^7.12.11",
|
||||
"babel-loader": "^8.2.2",
|
||||
"chai": "^4.2.0",
|
||||
"cross-env": "^7.0.3",
|
||||
"eslint": "^7.20.0",
|
||||
"eslint-config-airbnb-base": "^14.2.1",
|
||||
"eslint-config-prettier": "^7.2.0",
|
||||
"eslint-plugin-import": "^2.22.1",
|
||||
"eslint-plugin-prettier": "^3.3.1",
|
||||
"husky": "^5.0.9",
|
||||
"karma": "^6.0.0",
|
||||
"karma-chai": "^0.1.0",
|
||||
"karma-chrome-launcher": "^3.1.0",
|
||||
"karma-mocha": "^2.0.1",
|
||||
"karma-sinon": "^1.0.4",
|
||||
"karma-webpack": "^5.0.0-alpha.5",
|
||||
"lint-staged": "^10.5.3",
|
||||
"mocha": "^8.2.1",
|
||||
"prettier": "2.2.1",
|
||||
"sinon": "^9.2.3",
|
||||
"tsd": "^0.7.2",
|
||||
"uglifyjs-webpack-plugin": "^2.2.0",
|
||||
"webpack": "^5.15.0",
|
||||
"webpack-cli": "^4.4.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test:types": "tsd",
|
||||
"build": "npm run build-debug && npm run build-min",
|
||||
"build-debug": "webpack",
|
||||
"build-min": "cross-env NODE_ENV=production webpack",
|
||||
"build-watch": "webpack --watch",
|
||||
"test": "karma start --single-run",
|
||||
"prepublish": "npm run build",
|
||||
"lint": "eslint --ext .js src/"
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.{js,css,md}": [
|
||||
"prettier --write",
|
||||
"eslint --fix"
|
||||
]
|
||||
}
|
||||
}
|
||||
192
node_modules/clipboard/readme.md
generated
vendored
192
node_modules/clipboard/readme.md
generated
vendored
|
|
@ -1,192 +0,0 @@
|
|||
# clipboard.js
|
||||
|
||||

|
||||

|
||||
|
||||
> Modern copy to clipboard. No Flash. Just 3kb gzipped.
|
||||
|
||||
<a href="https://clipboardjs.com/"><img width="728" src="https://cloud.githubusercontent.com/assets/398893/16165747/a0f6fc46-349a-11e6-8c9b-c5fd58d9099c.png" alt="Demo"></a>
|
||||
|
||||
## Why
|
||||
|
||||
Copying text to the clipboard shouldn't be hard. It shouldn't require dozens of steps to configure or hundreds of KBs to load. But most of all, it shouldn't depend on Flash or any bloated framework.
|
||||
|
||||
That's why clipboard.js exists.
|
||||
|
||||
## Install
|
||||
|
||||
You can get it on npm.
|
||||
|
||||
```
|
||||
npm install clipboard --save
|
||||
```
|
||||
|
||||
Or if you're not into package management, just [download a ZIP](https://github.com/zenorocha/clipboard.js/archive/master.zip) file.
|
||||
|
||||
## Setup
|
||||
|
||||
First, include the script located on the `dist` folder or load it from [a third-party CDN provider](https://github.com/zenorocha/clipboard.js/wiki/CDN-Providers).
|
||||
|
||||
```html
|
||||
<script src="dist/clipboard.min.js"></script>
|
||||
```
|
||||
|
||||
Now, you need to instantiate it by [passing a DOM selector](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-selector.html#L18), [HTML element](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-node.html#L16-L17), or [list of HTML elements](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-nodelist.html#L18-L19).
|
||||
|
||||
```js
|
||||
new ClipboardJS('.btn');
|
||||
```
|
||||
|
||||
Internally, we need to fetch all elements that matches with your selector and attach event listeners for each one. But guess what? If you have hundreds of matches, this operation can consume a lot of memory.
|
||||
|
||||
For this reason we use [event delegation](https://stackoverflow.com/questions/1687296/what-is-dom-event-delegation) which replaces multiple event listeners with just a single listener. After all, [#perfmatters](https://twitter.com/hashtag/perfmatters).
|
||||
|
||||
# Usage
|
||||
|
||||
We're living a _declarative renaissance_, that's why we decided to take advantage of [HTML5 data attributes](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_data_attributes) for better usability.
|
||||
|
||||
### Copy text from another element
|
||||
|
||||
A pretty common use case is to copy content from another element. You can do that by adding a `data-clipboard-target` attribute in your trigger element.
|
||||
|
||||
The value you include on this attribute needs to match another's element selector.
|
||||
|
||||
<a href="https://clipboardjs.com/#example-target"><img width="473" alt="example-2" src="https://cloud.githubusercontent.com/assets/398893/9983467/a4946aaa-5fb1-11e5-9780-f09fcd7ca6c8.png"></a>
|
||||
|
||||
```html
|
||||
<!-- Target -->
|
||||
<input id="foo" value="https://github.com/zenorocha/clipboard.js.git" />
|
||||
|
||||
<!-- Trigger -->
|
||||
<button class="btn" data-clipboard-target="#foo">
|
||||
<img src="assets/clippy.svg" alt="Copy to clipboard" />
|
||||
</button>
|
||||
```
|
||||
|
||||
### Cut text from another element
|
||||
|
||||
Additionally, you can define a `data-clipboard-action` attribute to specify if you want to either `copy` or `cut` content.
|
||||
|
||||
If you omit this attribute, `copy` will be used by default.
|
||||
|
||||
<a href="https://clipboardjs.com/#example-action"><img width="473" alt="example-3" src="https://cloud.githubusercontent.com/assets/398893/10000358/7df57b9c-6050-11e5-9cd1-fbc51d2fd0a7.png"></a>
|
||||
|
||||
```html
|
||||
<!-- Target -->
|
||||
<textarea id="bar">Mussum ipsum cacilds...</textarea>
|
||||
|
||||
<!-- Trigger -->
|
||||
<button class="btn" data-clipboard-action="cut" data-clipboard-target="#bar">
|
||||
Cut to clipboard
|
||||
</button>
|
||||
```
|
||||
|
||||
As you may expect, the `cut` action only works on `<input>` or `<textarea>` elements.
|
||||
|
||||
### Copy text from attribute
|
||||
|
||||
Truth is, you don't even need another element to copy its content from. You can just include a `data-clipboard-text` attribute in your trigger element.
|
||||
|
||||
<a href="https://clipboardjs.com/#example-text"><img width="147" alt="example-1" src="https://cloud.githubusercontent.com/assets/398893/10000347/6e16cf8c-6050-11e5-9883-1c5681f9ec45.png"></a>
|
||||
|
||||
```html
|
||||
<!-- Trigger -->
|
||||
<button
|
||||
class="btn"
|
||||
data-clipboard-text="Just because you can doesn't mean you should — clipboard.js"
|
||||
>
|
||||
Copy to clipboard
|
||||
</button>
|
||||
```
|
||||
|
||||
## Events
|
||||
|
||||
There are cases where you'd like to show some user feedback or capture what has been selected after a copy/cut operation.
|
||||
|
||||
That's why we fire custom events such as `success` and `error` for you to listen and implement your custom logic.
|
||||
|
||||
```js
|
||||
var clipboard = new ClipboardJS('.btn');
|
||||
|
||||
clipboard.on('success', function (e) {
|
||||
console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);
|
||||
|
||||
e.clearSelection();
|
||||
});
|
||||
|
||||
clipboard.on('error', function (e) {
|
||||
console.error('Action:', e.action);
|
||||
console.error('Trigger:', e.trigger);
|
||||
});
|
||||
```
|
||||
|
||||
For a live demonstration, go to this [site](https://clipboardjs.com/) and open your console.
|
||||
|
||||
## Tooltips
|
||||
|
||||
Each application has different design needs, that's why clipboard.js does not include any CSS or built-in tooltip solution.
|
||||
|
||||
The tooltips you see on the [demo site](https://clipboardjs.com/) were built using [GitHub's Primer](https://primer.style/css/components/tooltips). You may want to check that out if you're looking for a similar look and feel.
|
||||
|
||||
## Advanced Options
|
||||
|
||||
If you don't want to modify your HTML, there's a pretty handy imperative API for you to use. All you need to do is declare a function, do your thing, and return a value.
|
||||
|
||||
For instance, if you want to dynamically set a `target`, you'll need to return a Node.
|
||||
|
||||
```js
|
||||
new ClipboardJS('.btn', {
|
||||
target: function (trigger) {
|
||||
return trigger.nextElementSibling;
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
If you want to dynamically set a `text`, you'll return a String.
|
||||
|
||||
```js
|
||||
new ClipboardJS('.btn', {
|
||||
text: function (trigger) {
|
||||
return trigger.getAttribute('aria-label');
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
For use in Bootstrap Modals or with any other library that changes the focus you'll want to set the focused element as the `container` value.
|
||||
|
||||
```js
|
||||
new ClipboardJS('.btn', {
|
||||
container: document.getElementById('modal'),
|
||||
});
|
||||
```
|
||||
|
||||
Also, if you are working with single page apps, you may want to manage the lifecycle of the DOM more precisely. Here's how you clean up the events and objects that we create.
|
||||
|
||||
```js
|
||||
var clipboard = new ClipboardJS('.btn');
|
||||
clipboard.destroy();
|
||||
```
|
||||
|
||||
## Browser Support
|
||||
|
||||
This library relies on both [Selection](https://developer.mozilla.org/en-US/docs/Web/API/Selection) and [execCommand](https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand) APIs. The first one is [supported by all browsers](https://caniuse.com/#search=selection) while the second one is supported in the following browsers.
|
||||
|
||||
| <img src="https://clipboardjs.com/assets/images/chrome.png" width="48px" height="48px" alt="Chrome logo"> | <img src="https://clipboardjs.com/assets/images/edge.png" width="48px" height="48px" alt="Edge logo"> | <img src="https://clipboardjs.com/assets/images/firefox.png" width="48px" height="48px" alt="Firefox logo"> | <img src="https://clipboardjs.com/assets/images/ie.png" width="48px" height="48px" alt="Internet Explorer logo"> | <img src="https://clipboardjs.com/assets/images/opera.png" width="48px" height="48px" alt="Opera logo"> | <img src="https://clipboardjs.com/assets/images/safari.png" width="48px" height="48px" alt="Safari logo"> |
|
||||
| :-------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------: |
|
||||
| 42+ ✔ | 12+ ✔ | 41+ ✔ | 9+ ✔ | 29+ ✔ | 10+ ✔ |
|
||||
|
||||
The good news is that clipboard.js gracefully degrades if you need to support older browsers. All you have to do is show a tooltip saying `Copied!` when `success` event is called and `Press Ctrl+C to copy` when `error` event is called because the text is already selected.
|
||||
|
||||
You can also check if clipboard.js is supported or not by running `ClipboardJS.isSupported()`, that way you can hide copy/cut buttons from the UI.
|
||||
|
||||
## Bonus
|
||||
|
||||
A browser extension that adds a "copy to clipboard" button to every code block on _GitHub, MDN, Gist, StackOverflow, StackExchange, npm, and even Medium._
|
||||
|
||||
Install for [Chrome](https://chrome.google.com/webstore/detail/codecopy/fkbfebkcoelajmhanocgppanfoojcdmg) and [Firefox](https://addons.mozilla.org/en-US/firefox/addon/codecopy/).
|
||||
|
||||
## License
|
||||
|
||||
[MIT License](https://zenorocha.mit-license.org/) © Zeno Rocha
|
||||
47
node_modules/clipboard/src/actions/copy.js
generated
vendored
47
node_modules/clipboard/src/actions/copy.js
generated
vendored
|
|
@ -1,47 +0,0 @@
|
|||
import select from 'select';
|
||||
import command from '../common/command';
|
||||
import createFakeElement from '../common/create-fake-element';
|
||||
|
||||
/**
|
||||
* Create fake copy action wrapper using a fake element.
|
||||
* @param {String} target
|
||||
* @param {Object} options
|
||||
* @return {String}
|
||||
*/
|
||||
const fakeCopyAction = (value, options) => {
|
||||
const fakeElement = createFakeElement(value);
|
||||
options.container.appendChild(fakeElement);
|
||||
const selectedText = select(fakeElement);
|
||||
command('copy');
|
||||
fakeElement.remove();
|
||||
|
||||
return selectedText;
|
||||
};
|
||||
|
||||
/**
|
||||
* Copy action wrapper.
|
||||
* @param {String|HTMLElement} target
|
||||
* @param {Object} options
|
||||
* @return {String}
|
||||
*/
|
||||
const ClipboardActionCopy = (
|
||||
target,
|
||||
options = { container: document.body }
|
||||
) => {
|
||||
let selectedText = '';
|
||||
if (typeof target === 'string') {
|
||||
selectedText = fakeCopyAction(target, options);
|
||||
} else if (
|
||||
target instanceof HTMLInputElement &&
|
||||
!['text', 'search', 'url', 'tel', 'password'].includes(target?.type)
|
||||
) {
|
||||
// If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange
|
||||
selectedText = fakeCopyAction(target.value, options);
|
||||
} else {
|
||||
selectedText = select(target);
|
||||
command('copy');
|
||||
}
|
||||
return selectedText;
|
||||
};
|
||||
|
||||
export default ClipboardActionCopy;
|
||||
15
node_modules/clipboard/src/actions/cut.js
generated
vendored
15
node_modules/clipboard/src/actions/cut.js
generated
vendored
|
|
@ -1,15 +0,0 @@
|
|||
import select from 'select';
|
||||
import command from '../common/command';
|
||||
|
||||
/**
|
||||
* Cut action wrapper.
|
||||
* @param {String|HTMLElement} target
|
||||
* @return {String}
|
||||
*/
|
||||
const ClipboardActionCut = (target) => {
|
||||
const selectedText = select(target);
|
||||
command('cut');
|
||||
return selectedText;
|
||||
};
|
||||
|
||||
export default ClipboardActionCut;
|
||||
53
node_modules/clipboard/src/actions/default.js
generated
vendored
53
node_modules/clipboard/src/actions/default.js
generated
vendored
|
|
@ -1,53 +0,0 @@
|
|||
import ClipboardActionCut from './cut';
|
||||
import ClipboardActionCopy from './copy';
|
||||
|
||||
/**
|
||||
* Inner function which performs selection from either `text` or `target`
|
||||
* properties and then executes copy or cut operations.
|
||||
* @param {Object} options
|
||||
*/
|
||||
const ClipboardActionDefault = (options = {}) => {
|
||||
// Defines base properties passed from constructor.
|
||||
const { action = 'copy', container, target, text } = options;
|
||||
|
||||
// Sets the `action` to be performed which can be either 'copy' or 'cut'.
|
||||
if (action !== 'copy' && action !== 'cut') {
|
||||
throw new Error('Invalid "action" value, use either "copy" or "cut"');
|
||||
}
|
||||
|
||||
// Sets the `target` property using an element that will be have its content copied.
|
||||
if (target !== undefined) {
|
||||
if (target && typeof target === 'object' && target.nodeType === 1) {
|
||||
if (action === 'copy' && target.hasAttribute('disabled')) {
|
||||
throw new Error(
|
||||
'Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'
|
||||
);
|
||||
}
|
||||
|
||||
if (
|
||||
action === 'cut' &&
|
||||
(target.hasAttribute('readonly') || target.hasAttribute('disabled'))
|
||||
) {
|
||||
throw new Error(
|
||||
'Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'
|
||||
);
|
||||
}
|
||||
} else {
|
||||
throw new Error('Invalid "target" value, use a valid Element');
|
||||
}
|
||||
}
|
||||
|
||||
// Define selection strategy based on `text` property.
|
||||
if (text) {
|
||||
return ClipboardActionCopy(text, { container });
|
||||
}
|
||||
|
||||
// Defines which selection strategy based on `target` property.
|
||||
if (target) {
|
||||
return action === 'cut'
|
||||
? ClipboardActionCut(target)
|
||||
: ClipboardActionCopy(target, { container });
|
||||
}
|
||||
};
|
||||
|
||||
export default ClipboardActionDefault;
|
||||
91
node_modules/clipboard/src/clipboard.d.ts
generated
vendored
91
node_modules/clipboard/src/clipboard.d.ts
generated
vendored
|
|
@ -1,91 +0,0 @@
|
|||
/// <reference lib="dom"/>
|
||||
|
||||
type Action = 'cut' | 'copy';
|
||||
type Response = 'success' | 'error';
|
||||
type CopyActionOptions = {
|
||||
container?: Element;
|
||||
};
|
||||
|
||||
/**
|
||||
* Base class which takes one or more elements, adds event listeners to them,
|
||||
* and instantiates a new `ClipboardAction` on each click.
|
||||
*/
|
||||
declare class ClipboardJS {
|
||||
constructor(
|
||||
selector: string | Element | NodeListOf<Element>,
|
||||
options?: ClipboardJS.Options
|
||||
);
|
||||
|
||||
/**
|
||||
* Subscribes to events that indicate the result of a copy/cut operation.
|
||||
* @param type Event type ('success' or 'error').
|
||||
* @param handler Callback function.
|
||||
*/
|
||||
on(type: Response, handler: (e: ClipboardJS.Event) => void): this;
|
||||
|
||||
on(type: string, handler: (...args: any[]) => void): this;
|
||||
|
||||
/**
|
||||
* Clears all event bindings.
|
||||
*/
|
||||
destroy(): void;
|
||||
|
||||
/**
|
||||
* Checks if clipboard.js is supported
|
||||
*/
|
||||
static isSupported(): boolean;
|
||||
|
||||
|
||||
/**
|
||||
* Fires a copy action
|
||||
*/
|
||||
static copy(target: string | Element, options?: CopyActionOptions): string;
|
||||
|
||||
/**
|
||||
* Fires a cut action
|
||||
*/
|
||||
static cut(target: string | Element): string;
|
||||
}
|
||||
|
||||
declare namespace ClipboardJS {
|
||||
interface Options {
|
||||
/**
|
||||
* Overwrites default command ('cut' or 'copy').
|
||||
* @param elem Current element
|
||||
*/
|
||||
action?(elem: Element): Action;
|
||||
|
||||
/**
|
||||
* Overwrites default target input element.
|
||||
* @param elem Current element
|
||||
* @returns <input> element to use.
|
||||
*/
|
||||
target?(elem: Element): Element;
|
||||
|
||||
/**
|
||||
* Returns the explicit text to copy.
|
||||
* @param elem Current element
|
||||
* @returns Text to be copied.
|
||||
*/
|
||||
text?(elem: Element): string;
|
||||
|
||||
/**
|
||||
* For use in Bootstrap Modals or with any
|
||||
* other library that changes the focus
|
||||
* you'll want to set the focused element
|
||||
* as the container value.
|
||||
*/
|
||||
container?: Element;
|
||||
}
|
||||
|
||||
interface Event {
|
||||
action: string;
|
||||
text: string;
|
||||
trigger: Element;
|
||||
clearSelection(): void;
|
||||
}
|
||||
}
|
||||
|
||||
export = ClipboardJS;
|
||||
|
||||
export as namespace ClipboardJS;
|
||||
165
node_modules/clipboard/src/clipboard.js
generated
vendored
165
node_modules/clipboard/src/clipboard.js
generated
vendored
|
|
@ -1,165 +0,0 @@
|
|||
import Emitter from 'tiny-emitter';
|
||||
import listen from 'good-listener';
|
||||
import ClipboardActionDefault from './actions/default';
|
||||
import ClipboardActionCut from './actions/cut';
|
||||
import ClipboardActionCopy from './actions/copy';
|
||||
|
||||
/**
|
||||
* Helper function to retrieve attribute value.
|
||||
* @param {String} suffix
|
||||
* @param {Element} element
|
||||
*/
|
||||
function getAttributeValue(suffix, element) {
|
||||
const attribute = `data-clipboard-${suffix}`;
|
||||
|
||||
if (!element.hasAttribute(attribute)) {
|
||||
return;
|
||||
}
|
||||
|
||||
return element.getAttribute(attribute);
|
||||
}
|
||||
|
||||
/**
|
||||
* Base class which takes one or more elements, adds event listeners to them,
|
||||
* and instantiates a new `ClipboardAction` on each click.
|
||||
*/
|
||||
class Clipboard extends Emitter {
|
||||
/**
|
||||
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
|
||||
* @param {Object} options
|
||||
*/
|
||||
constructor(trigger, options) {
|
||||
super();
|
||||
|
||||
this.resolveOptions(options);
|
||||
this.listenClick(trigger);
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines if attributes would be resolved using internal setter functions
|
||||
* or custom functions that were passed in the constructor.
|
||||
* @param {Object} options
|
||||
*/
|
||||
resolveOptions(options = {}) {
|
||||
this.action =
|
||||
typeof options.action === 'function'
|
||||
? options.action
|
||||
: this.defaultAction;
|
||||
this.target =
|
||||
typeof options.target === 'function'
|
||||
? options.target
|
||||
: this.defaultTarget;
|
||||
this.text =
|
||||
typeof options.text === 'function' ? options.text : this.defaultText;
|
||||
this.container =
|
||||
typeof options.container === 'object' ? options.container : document.body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a click event listener to the passed trigger.
|
||||
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
|
||||
*/
|
||||
listenClick(trigger) {
|
||||
this.listener = listen(trigger, 'click', (e) => this.onClick(e));
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines a new `ClipboardAction` on each click event.
|
||||
* @param {Event} e
|
||||
*/
|
||||
onClick(e) {
|
||||
const trigger = e.delegateTarget || e.currentTarget;
|
||||
const action = this.action(trigger) || 'copy';
|
||||
const text = ClipboardActionDefault({
|
||||
action,
|
||||
container: this.container,
|
||||
target: this.target(trigger),
|
||||
text: this.text(trigger),
|
||||
});
|
||||
|
||||
// Fires an event based on the copy operation result.
|
||||
this.emit(text ? 'success' : 'error', {
|
||||
action,
|
||||
text,
|
||||
trigger,
|
||||
clearSelection() {
|
||||
if (trigger) {
|
||||
trigger.focus();
|
||||
}
|
||||
window.getSelection().removeAllRanges();
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Default `action` lookup function.
|
||||
* @param {Element} trigger
|
||||
*/
|
||||
defaultAction(trigger) {
|
||||
return getAttributeValue('action', trigger);
|
||||
}
|
||||
|
||||
/**
|
||||
* Default `target` lookup function.
|
||||
* @param {Element} trigger
|
||||
*/
|
||||
defaultTarget(trigger) {
|
||||
const selector = getAttributeValue('target', trigger);
|
||||
|
||||
if (selector) {
|
||||
return document.querySelector(selector);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow fire programmatically a copy action
|
||||
* @param {String|HTMLElement} target
|
||||
* @param {Object} options
|
||||
* @returns Text copied.
|
||||
*/
|
||||
static copy(target, options = { container: document.body }) {
|
||||
return ClipboardActionCopy(target, options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow fire programmatically a cut action
|
||||
* @param {String|HTMLElement} target
|
||||
* @returns Text cutted.
|
||||
*/
|
||||
static cut(target) {
|
||||
return ClipboardActionCut(target);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the support of the given action, or all actions if no action is
|
||||
* given.
|
||||
* @param {String} [action]
|
||||
*/
|
||||
static isSupported(action = ['copy', 'cut']) {
|
||||
const actions = typeof action === 'string' ? [action] : action;
|
||||
let support = !!document.queryCommandSupported;
|
||||
|
||||
actions.forEach((action) => {
|
||||
support = support && !!document.queryCommandSupported(action);
|
||||
});
|
||||
|
||||
return support;
|
||||
}
|
||||
|
||||
/**
|
||||
* Default `text` lookup function.
|
||||
* @param {Element} trigger
|
||||
*/
|
||||
defaultText(trigger) {
|
||||
return getAttributeValue('text', trigger);
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroy lifecycle.
|
||||
*/
|
||||
destroy() {
|
||||
this.listener.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
export default Clipboard;
|
||||
4
node_modules/clipboard/src/clipboard.test-d.ts
generated
vendored
4
node_modules/clipboard/src/clipboard.test-d.ts
generated
vendored
|
|
@ -1,4 +0,0 @@
|
|||
import { expectType } from 'tsd';
|
||||
import * as Clipboard from './clipboard';
|
||||
|
||||
expectType<Clipboard>(new Clipboard('.btn'));
|
||||
12
node_modules/clipboard/src/common/command.js
generated
vendored
12
node_modules/clipboard/src/common/command.js
generated
vendored
|
|
@ -1,12 +0,0 @@
|
|||
/**
|
||||
* Executes a given operation type.
|
||||
* @param {String} type
|
||||
* @return {Boolean}
|
||||
*/
|
||||
export default function command(type) {
|
||||
try {
|
||||
return document.execCommand(type);
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
26
node_modules/clipboard/src/common/create-fake-element.js
generated
vendored
26
node_modules/clipboard/src/common/create-fake-element.js
generated
vendored
|
|
@ -1,26 +0,0 @@
|
|||
/**
|
||||
* Creates a fake textarea element with a value.
|
||||
* @param {String} value
|
||||
* @return {HTMLElement}
|
||||
*/
|
||||
export default function createFakeElement(value) {
|
||||
const isRTL = document.documentElement.getAttribute('dir') === 'rtl';
|
||||
const fakeElement = document.createElement('textarea');
|
||||
// Prevent zooming on iOS
|
||||
fakeElement.style.fontSize = '12pt';
|
||||
// Reset box model
|
||||
fakeElement.style.border = '0';
|
||||
fakeElement.style.padding = '0';
|
||||
fakeElement.style.margin = '0';
|
||||
// Move element out of screen horizontally
|
||||
fakeElement.style.position = 'absolute';
|
||||
fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px';
|
||||
// Move element to the same position vertically
|
||||
let yPosition = window.pageYOffset || document.documentElement.scrollTop;
|
||||
fakeElement.style.top = `${yPosition}px`;
|
||||
|
||||
fakeElement.setAttribute('readonly', '');
|
||||
fakeElement.value = value;
|
||||
|
||||
return fakeElement;
|
||||
}
|
||||
69
node_modules/clipboard/test/actions/copy.js
generated
vendored
69
node_modules/clipboard/test/actions/copy.js
generated
vendored
|
|
@ -1,69 +0,0 @@
|
|||
import ClipboardActionCopy from '../../src/actions/copy';
|
||||
|
||||
describe('ClipboardActionCopy', () => {
|
||||
before(() => {
|
||||
global.input = document.createElement('input');
|
||||
global.input.setAttribute('id', 'input');
|
||||
global.input.setAttribute('value', 'abc');
|
||||
document.body.appendChild(global.input);
|
||||
|
||||
global.paragraph = document.createElement('p');
|
||||
global.paragraph.setAttribute('id', 'paragraph');
|
||||
global.paragraph.textContent = 'abc';
|
||||
document.body.appendChild(global.paragraph);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
document.body.innerHTML = '';
|
||||
});
|
||||
|
||||
describe('#selectText', () => {
|
||||
it('should select its value based on input target', () => {
|
||||
const selectedText = ClipboardActionCopy(
|
||||
document.querySelector('#input'),
|
||||
{
|
||||
container: document.body,
|
||||
}
|
||||
);
|
||||
|
||||
assert.equal(selectedText, document.querySelector('#input').value);
|
||||
});
|
||||
|
||||
it('should select its value based on element target', () => {
|
||||
const selectedText = ClipboardActionCopy(
|
||||
document.querySelector('#paragraph'),
|
||||
{
|
||||
container: document.body,
|
||||
}
|
||||
);
|
||||
|
||||
assert.equal(
|
||||
selectedText,
|
||||
document.querySelector('#paragraph').textContent
|
||||
);
|
||||
});
|
||||
|
||||
it('should select its value based on text', () => {
|
||||
const text = 'abc';
|
||||
const selectedText = ClipboardActionCopy(text, {
|
||||
container: document.body,
|
||||
});
|
||||
|
||||
assert.equal(selectedText, text);
|
||||
});
|
||||
|
||||
it('should select its value in a input number based on text', () => {
|
||||
const value = 1;
|
||||
document.querySelector('#input').setAttribute('type', 'number');
|
||||
document.querySelector('#input').setAttribute('value', value);
|
||||
const selectedText = ClipboardActionCopy(
|
||||
document.querySelector('#input'),
|
||||
{
|
||||
container: document.body,
|
||||
}
|
||||
);
|
||||
|
||||
assert.equal(Number(selectedText), value);
|
||||
});
|
||||
});
|
||||
});
|
||||
32
node_modules/clipboard/test/actions/cut.js
generated
vendored
32
node_modules/clipboard/test/actions/cut.js
generated
vendored
|
|
@ -1,32 +0,0 @@
|
|||
import ClipboardActionCut from '../../src/actions/cut';
|
||||
|
||||
describe('ClipboardActionCut', () => {
|
||||
before(() => {
|
||||
global.input = document.createElement('input');
|
||||
global.input.setAttribute('id', 'input');
|
||||
global.input.setAttribute('value', 'abc');
|
||||
document.body.appendChild(global.input);
|
||||
|
||||
global.paragraph = document.createElement('p');
|
||||
global.paragraph.setAttribute('id', 'paragraph');
|
||||
global.paragraph.textContent = 'abc';
|
||||
document.body.appendChild(global.paragraph);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
document.body.innerHTML = '';
|
||||
});
|
||||
|
||||
describe('#selectText', () => {
|
||||
it('should select its value', () => {
|
||||
const selectedText = ClipboardActionCut(
|
||||
document.querySelector('#input'),
|
||||
{
|
||||
container: document.body,
|
||||
}
|
||||
);
|
||||
|
||||
assert.equal(selectedText, document.querySelector('#input').value);
|
||||
});
|
||||
});
|
||||
});
|
||||
80
node_modules/clipboard/test/actions/default.js
generated
vendored
80
node_modules/clipboard/test/actions/default.js
generated
vendored
|
|
@ -1,80 +0,0 @@
|
|||
import ClipboardActionDefault from '../../src/actions/default';
|
||||
|
||||
describe('ClipboardActionDefault', () => {
|
||||
before(() => {
|
||||
global.input = document.createElement('input');
|
||||
global.input.setAttribute('id', 'input');
|
||||
global.input.setAttribute('value', 'abc');
|
||||
document.body.appendChild(global.input);
|
||||
|
||||
global.paragraph = document.createElement('p');
|
||||
global.paragraph.setAttribute('id', 'paragraph');
|
||||
global.paragraph.textContent = 'abc';
|
||||
document.body.appendChild(global.paragraph);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
document.body.innerHTML = '';
|
||||
});
|
||||
|
||||
describe('#resolveOptions', () => {
|
||||
it('should set base properties', () => {
|
||||
const selectedText = ClipboardActionDefault({
|
||||
container: document.body,
|
||||
text: 'foo',
|
||||
});
|
||||
|
||||
assert.equal(selectedText, 'foo');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#set action', () => {
|
||||
it('should throw an error since "action" is invalid', (done) => {
|
||||
try {
|
||||
let clip = ClipboardActionDefault({
|
||||
text: 'foo',
|
||||
action: 'paste',
|
||||
});
|
||||
} catch (e) {
|
||||
assert.equal(
|
||||
e.message,
|
||||
'Invalid "action" value, use either "copy" or "cut"'
|
||||
);
|
||||
done();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('#set target', () => {
|
||||
it('should throw an error since "target" do not match any element', (done) => {
|
||||
try {
|
||||
let clip = ClipboardActionDefault({
|
||||
target: document.querySelector('#foo'),
|
||||
});
|
||||
} catch (e) {
|
||||
assert.equal(e.message, 'Invalid "target" value, use a valid Element');
|
||||
done();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('#selectedText', () => {
|
||||
it('should select text from editable element', () => {
|
||||
const selectedText = ClipboardActionDefault({
|
||||
container: document.body,
|
||||
target: document.querySelector('#input'),
|
||||
});
|
||||
|
||||
assert.equal(selectedText, 'abc');
|
||||
});
|
||||
|
||||
it('should select text from non-editable element', () => {
|
||||
const selectedText = ClipboardActionDefault({
|
||||
container: document.body,
|
||||
target: document.querySelector('#paragraph'),
|
||||
});
|
||||
|
||||
assert.equal(selectedText, 'abc');
|
||||
});
|
||||
});
|
||||
});
|
||||
192
node_modules/clipboard/test/clipboard.js
generated
vendored
192
node_modules/clipboard/test/clipboard.js
generated
vendored
|
|
@ -1,192 +0,0 @@
|
|||
import Clipboard from '../src/clipboard';
|
||||
|
||||
describe('Clipboard', () => {
|
||||
before(() => {
|
||||
global.button = document.createElement('button');
|
||||
global.button.setAttribute('class', 'btn');
|
||||
global.button.setAttribute('data-clipboard-text', 'foo');
|
||||
document.body.appendChild(global.button);
|
||||
|
||||
global.span = document.createElement('span');
|
||||
global.span.innerHTML = 'bar';
|
||||
|
||||
global.button.appendChild(span);
|
||||
|
||||
global.event = {
|
||||
target: global.button,
|
||||
currentTarget: global.button,
|
||||
};
|
||||
});
|
||||
|
||||
after(() => {
|
||||
document.body.innerHTML = '';
|
||||
});
|
||||
|
||||
describe('#resolveOptions', () => {
|
||||
before(() => {
|
||||
global.fn = () => {};
|
||||
});
|
||||
|
||||
it('should set action as a function', () => {
|
||||
let clipboard = new Clipboard('.btn', {
|
||||
action: global.fn,
|
||||
});
|
||||
|
||||
assert.equal(global.fn, clipboard.action);
|
||||
});
|
||||
|
||||
it('should set target as a function', () => {
|
||||
let clipboard = new Clipboard('.btn', {
|
||||
target: global.fn,
|
||||
});
|
||||
|
||||
assert.equal(global.fn, clipboard.target);
|
||||
});
|
||||
|
||||
it('should set text as a function', () => {
|
||||
let clipboard = new Clipboard('.btn', {
|
||||
text: global.fn,
|
||||
});
|
||||
|
||||
assert.equal(global.fn, clipboard.text);
|
||||
});
|
||||
|
||||
it('should set container as an object', () => {
|
||||
let clipboard = new Clipboard('.btn', {
|
||||
container: document.body,
|
||||
});
|
||||
|
||||
assert.equal(document.body, clipboard.container);
|
||||
});
|
||||
|
||||
it('should set container as body by default', () => {
|
||||
let clipboard = new Clipboard('.btn');
|
||||
|
||||
assert.equal(document.body, clipboard.container);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#listenClick', () => {
|
||||
it('should add a click event listener to the passed selector', () => {
|
||||
let clipboard = new Clipboard('.btn');
|
||||
assert.isObject(clipboard.listener);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#onClick', () => {
|
||||
it('should init when called', (done) => {
|
||||
let clipboard = new Clipboard('.btn');
|
||||
|
||||
clipboard.on('success', () => {
|
||||
done();
|
||||
});
|
||||
|
||||
clipboard.onClick(global.event);
|
||||
});
|
||||
|
||||
it("should use an event's currentTarget when not equal to target", (done) => {
|
||||
let clipboard = new Clipboard('.btn');
|
||||
let bubbledEvent = {
|
||||
target: global.span,
|
||||
currentTarget: global.button,
|
||||
};
|
||||
|
||||
clipboard.on('success', () => {
|
||||
done();
|
||||
});
|
||||
|
||||
clipboard.onClick(bubbledEvent);
|
||||
});
|
||||
|
||||
it('should throw an exception when target is invalid', (done) => {
|
||||
try {
|
||||
const clipboard = new Clipboard('.btn', {
|
||||
target() {
|
||||
return null;
|
||||
},
|
||||
});
|
||||
|
||||
clipboard.onClick(global.event);
|
||||
} catch (e) {
|
||||
assert.equal(e.message, 'Invalid "target" value, use a valid Element');
|
||||
done();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('#static isSupported', () => {
|
||||
it('should return the support of the given action', () => {
|
||||
assert.equal(Clipboard.isSupported('copy'), true);
|
||||
assert.equal(Clipboard.isSupported('cut'), true);
|
||||
});
|
||||
|
||||
it('should return the support of the cut and copy actions', () => {
|
||||
assert.equal(Clipboard.isSupported(), true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#static copy', () => {
|
||||
it('should copy in an programatic way based on text', () => {
|
||||
assert.equal(Clipboard.copy('lorem'), 'lorem');
|
||||
});
|
||||
|
||||
it('should copy in an programatic way based on target', () => {
|
||||
assert.equal(Clipboard.copy(document.querySelector('span')), 'bar');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#static cut', () => {
|
||||
it('should cut in an programatic way based on text', () => {
|
||||
assert.equal(Clipboard.cut(document.querySelector('span')), 'bar');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#destroy', () => {
|
||||
it('should destroy an existing instance of ClipboardActionDefault', () => {
|
||||
let clipboard = new Clipboard('.btn');
|
||||
|
||||
clipboard.onClick(global.event);
|
||||
clipboard.destroy();
|
||||
|
||||
assert.equal(clipboard.clipboardAction, null);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#events', () => {
|
||||
it('should fire a success event with certain properties', (done) => {
|
||||
let clipboard = new Clipboard('.btn');
|
||||
|
||||
clipboard.on('success', (e) => {
|
||||
assert.property(e, 'action');
|
||||
assert.equal(e.action, 'copy');
|
||||
assert.property(e, 'text');
|
||||
assert.property(e, 'trigger');
|
||||
assert.property(e, 'clearSelection');
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
clipboard.onClick(global.event);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#clearSelection', () => {
|
||||
it('should clear text selection without moving focus', (done) => {
|
||||
let clipboard = new Clipboard('.btn');
|
||||
|
||||
clipboard.on('success', (e) => {
|
||||
e.clearSelection();
|
||||
|
||||
let selectedElem = document.activeElement;
|
||||
let selectedText = window.getSelection().toString();
|
||||
|
||||
assert.equal(selectedElem, e.trigger);
|
||||
assert.equal(selectedText, '');
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
clipboard.onClick(global.event);
|
||||
});
|
||||
});
|
||||
});
|
||||
49
node_modules/clipboard/test/common/command.js
generated
vendored
49
node_modules/clipboard/test/common/command.js
generated
vendored
|
|
@ -1,49 +0,0 @@
|
|||
import select from 'select';
|
||||
import command from '../../src/common/command';
|
||||
|
||||
describe('#command', () => {
|
||||
before(() => {
|
||||
global.stub = sinon.stub(document, 'execCommand');
|
||||
global.input = document.createElement('input');
|
||||
global.input.setAttribute('id', 'input');
|
||||
global.input.setAttribute('value', 'abc');
|
||||
document.body.appendChild(global.input);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
global.stub.restore();
|
||||
document.body.innerHTML = '';
|
||||
});
|
||||
|
||||
it('should execute cut', (done) => {
|
||||
global.stub.returns(true);
|
||||
select(document.querySelector('#input'));
|
||||
|
||||
assert.isTrue(command('cut'));
|
||||
done();
|
||||
});
|
||||
|
||||
it('should execute copy', (done) => {
|
||||
global.stub.returns(true);
|
||||
select(document.querySelector('#input'));
|
||||
|
||||
assert.isTrue(command('copy'));
|
||||
done();
|
||||
});
|
||||
|
||||
it('should not execute copy', (done) => {
|
||||
global.stub.returns(false);
|
||||
select(document.querySelector('#input'));
|
||||
|
||||
assert.isFalse(command('copy'));
|
||||
done();
|
||||
});
|
||||
|
||||
it('should not execute cut', (done) => {
|
||||
global.stub.returns(false);
|
||||
select(document.querySelector('#input'));
|
||||
|
||||
assert.isFalse(command('cut'));
|
||||
done();
|
||||
});
|
||||
});
|
||||
13
node_modules/clipboard/test/common/create-fake-element.js
generated
vendored
13
node_modules/clipboard/test/common/create-fake-element.js
generated
vendored
|
|
@ -1,13 +0,0 @@
|
|||
import createFakeElement from '../../src/common/create-fake-element';
|
||||
|
||||
describe('createFakeElement', () => {
|
||||
it('should define a fake element and set the position right style property', (done) => {
|
||||
// Set document direction
|
||||
document.documentElement.setAttribute('dir', 'rtl');
|
||||
|
||||
const el = createFakeElement(document.body);
|
||||
|
||||
assert.equal(el.style.right, '-9999px');
|
||||
done();
|
||||
});
|
||||
});
|
||||
46
node_modules/clipboard/webpack.config.js
generated
vendored
46
node_modules/clipboard/webpack.config.js
generated
vendored
|
|
@ -1,46 +0,0 @@
|
|||
const pkg = require('./package.json');
|
||||
const path = require('path');
|
||||
const webpack = require('webpack');
|
||||
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
|
||||
|
||||
const production = process.env.NODE_ENV === 'production' || false;
|
||||
|
||||
const banner = `clipboard.js v${pkg.version}
|
||||
https://clipboardjs.com/
|
||||
|
||||
Licensed MIT © Zeno Rocha`;
|
||||
|
||||
module.exports = {
|
||||
entry: './src/clipboard.js',
|
||||
mode: 'production',
|
||||
target: ['web', 'es5'],
|
||||
output: {
|
||||
filename: production ? 'clipboard.min.js' : 'clipboard.js',
|
||||
path: path.resolve(__dirname, 'dist'),
|
||||
library: 'ClipboardJS',
|
||||
globalObject: 'this',
|
||||
libraryExport: 'default',
|
||||
libraryTarget: 'umd',
|
||||
},
|
||||
module: {
|
||||
rules: [{ test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader' }],
|
||||
},
|
||||
optimization: {
|
||||
minimize: production,
|
||||
minimizer: [
|
||||
new UglifyJSPlugin({
|
||||
parallel: require('os').cpus().length,
|
||||
uglifyOptions: {
|
||||
ie8: false,
|
||||
keep_fnames: false,
|
||||
output: {
|
||||
beautify: false,
|
||||
comments: (node, { value, type }) =>
|
||||
type == 'comment2' && value.startsWith('!'),
|
||||
},
|
||||
},
|
||||
}),
|
||||
],
|
||||
},
|
||||
plugins: [new webpack.BannerPlugin({ banner })],
|
||||
};
|
||||
21
node_modules/dayjs/CHANGELOG.md
generated
vendored
21
node_modules/dayjs/CHANGELOG.md
generated
vendored
|
|
@ -1,3 +1,24 @@
|
|||
## [1.11.18](https://github.com/iamkun/dayjs/compare/v1.11.17...v1.11.18) (2025-08-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* error semantic-release dependency ([8cfb313](https://github.com/iamkun/dayjs/commit/8cfb31386d840d31e9655870f4d8c01592eb753a))
|
||||
|
||||
## [1.11.17](https://github.com/iamkun/dayjs/compare/v1.11.16...v1.11.17) (2025-08-29)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* [en-AU] locale use the same ordinal as moment ([#2878](https://github.com/iamkun/dayjs/issues/2878)) ([1b95ecd](https://github.com/iamkun/dayjs/commit/1b95ecd21d4feafe7ab113a2d48d7d8d93bb95c9))
|
||||
|
||||
## [1.11.16](https://github.com/iamkun/dayjs/compare/v1.11.15...v1.11.16) (2025-08-29)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* test release workflow (no code changes) ([c38c428](https://github.com/iamkun/dayjs/commit/c38c428a78c344699eff373adfc8c007bb3a514f))
|
||||
|
||||
## [1.11.15](https://github.com/iamkun/dayjs/compare/v1.11.14...v1.11.15) (2025-08-28)
|
||||
|
||||
|
||||
|
|
|
|||
8
node_modules/dayjs/esm/locale/en-au.js
generated
vendored
8
node_modules/dayjs/esm/locale/en-au.js
generated
vendored
|
|
@ -8,9 +8,6 @@ var locale = {
|
|||
weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
|
||||
monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
|
||||
weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
|
||||
ordinal: function ordinal(n) {
|
||||
return n;
|
||||
},
|
||||
formats: {
|
||||
LT: 'h:mm A',
|
||||
LTS: 'h:mm:ss A',
|
||||
|
|
@ -33,6 +30,11 @@ var locale = {
|
|||
MM: '%d months',
|
||||
y: 'a year',
|
||||
yy: '%d years'
|
||||
},
|
||||
ordinal: function ordinal(n) {
|
||||
var s = ['th', 'st', 'nd', 'rd'];
|
||||
var v = n % 100;
|
||||
return "[" + n + (s[(v - 20) % 10] || s[v] || s[0]) + "]";
|
||||
}
|
||||
};
|
||||
dayjs.locale(locale, null, true);
|
||||
|
|
|
|||
2
node_modules/dayjs/locale.json
generated
vendored
2
node_modules/dayjs/locale.json
generated
vendored
File diff suppressed because one or more lines are too long
2
node_modules/dayjs/locale/en-au.js
generated
vendored
2
node_modules/dayjs/locale/en-au.js
generated
vendored
|
|
@ -1 +1 @@
|
|||
!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_en_au=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e),_={name:"en-au",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),weekStart:1,weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ordinal:function(e){return e},formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"}};return t.default.locale(_,null,!0),_}));
|
||||
!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_en_au=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e),_={name:"en-au",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),weekStart:1,weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(e){var a=["th","st","nd","rd"],t=e%100;return"["+e+(a[(t-20)%10]||a[t]||a[0])+"]"}};return t.default.locale(_,null,!0),_}));
|
||||
3
node_modules/dayjs/package.json
generated
vendored
3
node_modules/dayjs/package.json
generated
vendored
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "dayjs",
|
||||
"version": "1.11.15",
|
||||
"version": "1.11.18",
|
||||
"description": "2KB immutable date time library alternative to Moment.js with the same modern API ",
|
||||
"main": "dayjs.min.js",
|
||||
"types": "index.d.ts",
|
||||
|
|
@ -55,6 +55,7 @@
|
|||
"@babel/core": "^7.0.0-beta.44",
|
||||
"@babel/node": "^7.0.0-beta.44",
|
||||
"@babel/preset-env": "^7.0.0-beta.44",
|
||||
"@semantic-release/github": "^11.0.4",
|
||||
"babel-core": "^7.0.0-bridge.0",
|
||||
"babel-jest": "^22.4.3",
|
||||
"babel-plugin-external-helpers": "^6.22.0",
|
||||
|
|
|
|||
22
node_modules/delegate/.editorconfig
generated
vendored
22
node_modules/delegate/.editorconfig
generated
vendored
|
|
@ -1,22 +0,0 @@
|
|||
# EditorConfig helps developers define and maintain consistent
|
||||
# coding styles between different editors and IDEs
|
||||
# http://editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
# Change these settings to your own preference
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
# We recommend you to keep these unchanged
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[{package.json,bower.json}]
|
||||
indent_size = 2
|
||||
3
node_modules/delegate/.travis.yml
generated
vendored
3
node_modules/delegate/.travis.yml
generated
vendored
|
|
@ -1,3 +0,0 @@
|
|||
language: node_js
|
||||
node_js:
|
||||
- stable
|
||||
29
node_modules/delegate/demo/delegate.html
generated
vendored
29
node_modules/delegate/demo/delegate.html
generated
vendored
|
|
@ -1,29 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Delegate</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Write some markup -->
|
||||
<ul>
|
||||
<li><button>Item 1</button></li>
|
||||
<li><button>Item 2</button></li>
|
||||
<li><button>Item 3</button></li>
|
||||
<li><button>Item 4</button></li>
|
||||
<li><button>Item 5</button></li>
|
||||
</ul>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/delegate.js"></script>
|
||||
|
||||
<!-- 3. Add event delegation -->
|
||||
<script>
|
||||
var ul = document.querySelector('ul');
|
||||
|
||||
delegate(ul, 'button', 'click', function(e) {
|
||||
console.log(e.target);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
37
node_modules/delegate/demo/multiple.html
generated
vendored
37
node_modules/delegate/demo/multiple.html
generated
vendored
|
|
@ -1,37 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Delegate</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Write some markup -->
|
||||
<ul>
|
||||
<li><button>Item 1</button></li>
|
||||
<li><button>Item 2</button></li>
|
||||
<li><button>Item 3</button></li>
|
||||
<li><button>Item 4</button></li>
|
||||
<li><button>Item 5</button></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><span>Item 6</span></li>
|
||||
<li><span>Item 7</span></li>
|
||||
</ul>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/delegate.js"></script>
|
||||
|
||||
<!-- 3. Add event delegation -->
|
||||
<script>
|
||||
var ul = document.querySelector('ul');
|
||||
|
||||
delegate(ul, 'button', 'click', function(e) {
|
||||
console.log(e.target);
|
||||
});
|
||||
|
||||
delegate(document.body, 'span', 'click', function(e) {
|
||||
console.log(e.target);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
31
node_modules/delegate/demo/undelegate.html
generated
vendored
31
node_modules/delegate/demo/undelegate.html
generated
vendored
|
|
@ -1,31 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Undelegate</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Write some markup -->
|
||||
<ul>
|
||||
<li><button>Item 1</button></li>
|
||||
<li><button>Item 2</button></li>
|
||||
<li><button>Item 3</button></li>
|
||||
<li><button>Item 4</button></li>
|
||||
<li><button>Item 5</button></li>
|
||||
</ul>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/delegate.js"></script>
|
||||
|
||||
<!-- 3. Remove event delegation -->
|
||||
<script>
|
||||
var ul = document.querySelector('ul');
|
||||
|
||||
var delegation = delegate(ul, 'li button', 'click', function(e) {
|
||||
console.log(e.target);
|
||||
});
|
||||
|
||||
delegation.destroy();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
80
node_modules/delegate/dist/delegate.js
generated
vendored
80
node_modules/delegate/dist/delegate.js
generated
vendored
|
|
@ -1,80 +0,0 @@
|
|||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.delegate = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
||||
var DOCUMENT_NODE_TYPE = 9;
|
||||
|
||||
/**
|
||||
* A polyfill for Element.matches()
|
||||
*/
|
||||
if (typeof Element !== 'undefined' && !Element.prototype.matches) {
|
||||
var proto = Element.prototype;
|
||||
|
||||
proto.matches = proto.matchesSelector ||
|
||||
proto.mozMatchesSelector ||
|
||||
proto.msMatchesSelector ||
|
||||
proto.oMatchesSelector ||
|
||||
proto.webkitMatchesSelector;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the closest parent that matches a selector.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @return {Function}
|
||||
*/
|
||||
function closest (element, selector) {
|
||||
while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
|
||||
if (element.matches(selector)) return element;
|
||||
element = element.parentNode;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = closest;
|
||||
|
||||
},{}],2:[function(require,module,exports){
|
||||
var closest = require('./closest');
|
||||
|
||||
/**
|
||||
* Delegates event to a selector.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @param {Boolean} useCapture
|
||||
* @return {Object}
|
||||
*/
|
||||
function delegate(element, selector, type, callback, useCapture) {
|
||||
var listenerFn = listener.apply(this, arguments);
|
||||
|
||||
element.addEventListener(type, listenerFn, useCapture);
|
||||
|
||||
return {
|
||||
destroy: function() {
|
||||
element.removeEventListener(type, listenerFn, useCapture);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds closest match and invokes callback.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Function}
|
||||
*/
|
||||
function listener(element, selector, type, callback) {
|
||||
return function(e) {
|
||||
e.delegateTarget = closest(e.target, selector);
|
||||
|
||||
if (e.delegateTarget) {
|
||||
callback.call(element, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = delegate;
|
||||
|
||||
},{"./closest":1}]},{},[2])(2)
|
||||
});
|
||||
24
node_modules/delegate/karma.conf.js
generated
vendored
24
node_modules/delegate/karma.conf.js
generated
vendored
|
|
@ -1,24 +0,0 @@
|
|||
module.exports = function(karma) {
|
||||
karma.set({
|
||||
plugins: ['karma-browserify', 'karma-chai', 'karma-sinon', 'karma-mocha', 'karma-phantomjs-launcher'],
|
||||
|
||||
frameworks: ['browserify', 'chai', 'sinon', 'mocha'],
|
||||
|
||||
files: [
|
||||
'src/**/*.js',
|
||||
'test/**/*.js',
|
||||
'./node_modules/phantomjs-polyfill/bind-polyfill.js'
|
||||
],
|
||||
|
||||
preprocessors: {
|
||||
'src/**/*.js' : ['browserify'],
|
||||
'test/**/*.js': ['browserify']
|
||||
},
|
||||
|
||||
browserify: {
|
||||
debug: true
|
||||
},
|
||||
|
||||
browsers: ['PhantomJS']
|
||||
});
|
||||
}
|
||||
31
node_modules/delegate/package.json
generated
vendored
31
node_modules/delegate/package.json
generated
vendored
|
|
@ -1,31 +0,0 @@
|
|||
{
|
||||
"name": "delegate",
|
||||
"description": "Lightweight event delegation",
|
||||
"version": "3.2.0",
|
||||
"repository": "zenorocha/delegate",
|
||||
"license": "MIT",
|
||||
"main": "src/delegate.js",
|
||||
"keywords": [
|
||||
"event",
|
||||
"delegate",
|
||||
"delegation"
|
||||
],
|
||||
"devDependencies": {
|
||||
"browserify": "^13.1.0",
|
||||
"chai": "^3.5.0",
|
||||
"karma": "^1.3.0",
|
||||
"karma-browserify": "^5.1.0",
|
||||
"karma-chai": "^0.1.0",
|
||||
"karma-mocha": "^1.2.0",
|
||||
"karma-phantomjs-launcher": "^1.0.2",
|
||||
"karma-sinon": "^1.0.4",
|
||||
"mocha": "^3.1.2",
|
||||
"phantomjs-polyfill": "0.0.2",
|
||||
"simulant": "^0.2.2",
|
||||
"sinon": "^1.17.6"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "browserify src/delegate.js -s delegate -o dist/delegate.js",
|
||||
"test": "karma start --single-run"
|
||||
}
|
||||
}
|
||||
99
node_modules/delegate/readme.md
generated
vendored
99
node_modules/delegate/readme.md
generated
vendored
|
|
@ -1,99 +0,0 @@
|
|||
# delegate
|
||||
|
||||
Lightweight event delegation.
|
||||
|
||||
## Install
|
||||
|
||||
You can get it on npm.
|
||||
|
||||
```
|
||||
npm install delegate --save
|
||||
```
|
||||
|
||||
If you're not into package management, just [download a ZIP](https://github.com/zenorocha/delegate/archive/master.zip) file.
|
||||
|
||||
## Setup
|
||||
|
||||
###### Node (Browserify)
|
||||
|
||||
```js
|
||||
var delegate = require('delegate');
|
||||
```
|
||||
|
||||
###### Browser (Standalone)
|
||||
|
||||
```html
|
||||
<script src="dist/delegate.js"></script>
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Add event delegation
|
||||
|
||||
#### With the default base (`document`)
|
||||
|
||||
```js
|
||||
delegate('.btn', 'click', function(e) {
|
||||
console.log(e.delegateTarget);
|
||||
}, false);
|
||||
```
|
||||
|
||||
#### With an element as base
|
||||
|
||||
```js
|
||||
delegate(document.body, '.btn', 'click', function(e) {
|
||||
console.log(e.delegateTarget);
|
||||
}, false);
|
||||
```
|
||||
|
||||
#### With a selector (of existing elements) as base
|
||||
|
||||
```js
|
||||
delegate('.container', '.btn', 'click', function(e) {
|
||||
console.log(e.delegateTarget);
|
||||
}, false);
|
||||
```
|
||||
|
||||
#### With an array/array-like of elements as base
|
||||
|
||||
```js
|
||||
delegate(document.querySelectorAll('.container'), '.btn', 'click', function(e) {
|
||||
console.log(e.delegateTarget);
|
||||
}, false);
|
||||
```
|
||||
|
||||
### Remove event delegation
|
||||
|
||||
#### With a single base element (default or specified)
|
||||
|
||||
```js
|
||||
var delegation = delegate(document.body, '.btn', 'click', function(e) {
|
||||
console.log(e.delegateTarget);
|
||||
}, false);
|
||||
|
||||
delegation.destroy();
|
||||
```
|
||||
|
||||
#### With multiple elements (via selector or array)
|
||||
|
||||
Note: selectors are always treated as multiple elements, even if one or none are matched. `delegate()` will return an array.
|
||||
|
||||
```js
|
||||
var delegations = delegate('.container', '.btn', 'click', function(e) {
|
||||
console.log(e.delegateTarget);
|
||||
}, false);
|
||||
|
||||
delegations.forEach(function (delegation) {
|
||||
delegation.destroy();
|
||||
});
|
||||
```
|
||||
|
||||
## Browser Support
|
||||
|
||||
| <img src="https://clipboardjs.com/assets/images/chrome.png" width="48px" height="48px" alt="Chrome logo"> | <img src="https://clipboardjs.com/assets/images/edge.png" width="48px" height="48px" alt="Edge logo"> | <img src="https://clipboardjs.com/assets/images/firefox.png" width="48px" height="48px" alt="Firefox logo"> | <img src="https://clipboardjs.com/assets/images/ie.png" width="48px" height="48px" alt="Internet Explorer logo"> | <img src="https://clipboardjs.com/assets/images/opera.png" width="48px" height="48px" alt="Opera logo"> | <img src="https://clipboardjs.com/assets/images/safari.png" width="48px" height="48px" alt="Safari logo"> |
|
||||
|:---:|:---:|:---:|:---:|:---:|:---:|
|
||||
| Latest ✔ | Latest ✔ | Latest ✔ | 9+ ✔ | Latest ✔ | Latest ✔ |
|
||||
|
||||
## License
|
||||
|
||||
[MIT License](http://zenorocha.mit-license.org/) © Zeno Rocha
|
||||
33
node_modules/delegate/src/closest.js
generated
vendored
33
node_modules/delegate/src/closest.js
generated
vendored
|
|
@ -1,33 +0,0 @@
|
|||
var DOCUMENT_NODE_TYPE = 9;
|
||||
|
||||
/**
|
||||
* A polyfill for Element.matches()
|
||||
*/
|
||||
if (typeof Element !== 'undefined' && !Element.prototype.matches) {
|
||||
var proto = Element.prototype;
|
||||
|
||||
proto.matches = proto.matchesSelector ||
|
||||
proto.mozMatchesSelector ||
|
||||
proto.msMatchesSelector ||
|
||||
proto.oMatchesSelector ||
|
||||
proto.webkitMatchesSelector;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the closest parent that matches a selector.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @return {Function}
|
||||
*/
|
||||
function closest (element, selector) {
|
||||
while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
|
||||
if (typeof element.matches === 'function' &&
|
||||
element.matches(selector)) {
|
||||
return element;
|
||||
}
|
||||
element = element.parentNode;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = closest;
|
||||
78
node_modules/delegate/src/delegate.js
generated
vendored
78
node_modules/delegate/src/delegate.js
generated
vendored
|
|
@ -1,78 +0,0 @@
|
|||
var closest = require('./closest');
|
||||
|
||||
/**
|
||||
* Delegates event to a selector.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @param {Boolean} useCapture
|
||||
* @return {Object}
|
||||
*/
|
||||
function _delegate(element, selector, type, callback, useCapture) {
|
||||
var listenerFn = listener.apply(this, arguments);
|
||||
|
||||
element.addEventListener(type, listenerFn, useCapture);
|
||||
|
||||
return {
|
||||
destroy: function() {
|
||||
element.removeEventListener(type, listenerFn, useCapture);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delegates event to a selector.
|
||||
*
|
||||
* @param {Element|String|Array} [elements]
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @param {Boolean} useCapture
|
||||
* @return {Object}
|
||||
*/
|
||||
function delegate(elements, selector, type, callback, useCapture) {
|
||||
// Handle the regular Element usage
|
||||
if (typeof elements.addEventListener === 'function') {
|
||||
return _delegate.apply(null, arguments);
|
||||
}
|
||||
|
||||
// Handle Element-less usage, it defaults to global delegation
|
||||
if (typeof type === 'function') {
|
||||
// Use `document` as the first parameter, then apply arguments
|
||||
// This is a short way to .unshift `arguments` without running into deoptimizations
|
||||
return _delegate.bind(null, document).apply(null, arguments);
|
||||
}
|
||||
|
||||
// Handle Selector-based usage
|
||||
if (typeof elements === 'string') {
|
||||
elements = document.querySelectorAll(elements);
|
||||
}
|
||||
|
||||
// Handle Array-like based usage
|
||||
return Array.prototype.map.call(elements, function (element) {
|
||||
return _delegate(element, selector, type, callback, useCapture);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds closest match and invokes callback.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Function}
|
||||
*/
|
||||
function listener(element, selector, type, callback) {
|
||||
return function(e) {
|
||||
e.delegateTarget = closest(e.target, selector);
|
||||
|
||||
if (e.delegateTarget) {
|
||||
callback.call(element, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = delegate;
|
||||
45
node_modules/delegate/test/closest.js
generated
vendored
45
node_modules/delegate/test/closest.js
generated
vendored
|
|
@ -1,45 +0,0 @@
|
|||
var closest = require('../src/closest');
|
||||
|
||||
describe('closest', function() {
|
||||
before(function() {
|
||||
var html = '<div id="a">' +
|
||||
'<div id="b">' +
|
||||
'<div id="c"></div>' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
|
||||
document.body.innerHTML += html;
|
||||
|
||||
global.a = document.querySelector('#a');
|
||||
global.b = document.querySelector('#b');
|
||||
global.c = document.querySelector('#c');
|
||||
});
|
||||
|
||||
after(function() {
|
||||
document.body.innerHTML = '';
|
||||
});
|
||||
|
||||
it('should return the closest parent based on the selector', function() {
|
||||
assert.ok(closest(global.c, '#b'), global.b);
|
||||
assert.ok(closest(global.c, '#a'), global.a);
|
||||
assert.ok(closest(global.b, '#a'), global.a);
|
||||
});
|
||||
|
||||
it('should return itself if the same selector is passed', function() {
|
||||
assert.ok(closest(document.body, 'body'), document.body);
|
||||
});
|
||||
|
||||
it('should not throw on elements without matches()', function() {
|
||||
var fakeElement = {
|
||||
nodeType: -1, // anything but DOCUMENT_NODE_TYPE
|
||||
parentNode: null,
|
||||
matches: undefined // undefined to emulate Elements without this function
|
||||
};
|
||||
|
||||
try {
|
||||
closest(fakeElement, '#a')
|
||||
} catch (err) {
|
||||
assert.fail();
|
||||
}
|
||||
});
|
||||
});
|
||||
116
node_modules/delegate/test/delegate.js
generated
vendored
116
node_modules/delegate/test/delegate.js
generated
vendored
|
|
@ -1,116 +0,0 @@
|
|||
var delegate = require('../src/delegate');
|
||||
var simulant = require('simulant');
|
||||
|
||||
describe('delegate', function() {
|
||||
before(function() {
|
||||
var html = '<ul>' +
|
||||
'<li><a>Item 1</a></li>' +
|
||||
'<li><a>Item 2</a></li>' +
|
||||
'<li><a>Item 3</a></li>' +
|
||||
'<li><a>Item 4</a></li>' +
|
||||
'<li><a>Item 5</a></li>' +
|
||||
'</ul>';
|
||||
|
||||
document.body.innerHTML += html;
|
||||
|
||||
global.container = document.querySelector('ul');
|
||||
global.anchor = document.querySelector('a');
|
||||
|
||||
global.spy = sinon.spy(global.container, 'removeEventListener');
|
||||
});
|
||||
|
||||
after(function() {
|
||||
global.spy.restore();
|
||||
document.body.innerHTML = '';
|
||||
});
|
||||
|
||||
it('should add an event listener', function(done) {
|
||||
delegate(global.container, 'a', 'click', function() {
|
||||
done();
|
||||
});
|
||||
|
||||
simulant.fire(global.anchor, simulant('click'));
|
||||
});
|
||||
|
||||
it('should remove an event listener', function() {
|
||||
var delegation = delegate(global.container, 'a', 'click', function() {});
|
||||
|
||||
delegation.destroy();
|
||||
assert.ok(global.spy.calledOnce);
|
||||
});
|
||||
|
||||
it('should use `document` if the element is unspecified', function(done) {
|
||||
delegate('a', 'click', function() {
|
||||
done();
|
||||
});
|
||||
|
||||
simulant.fire(global.anchor, simulant('click'));
|
||||
});
|
||||
|
||||
it('should remove an event listener the unspecified base (`document`)', function() {
|
||||
var delegation = delegate('a', 'click', function() {});
|
||||
var spy = sinon.spy(document, 'removeEventListener');
|
||||
|
||||
delegation.destroy();
|
||||
assert.ok(spy.calledOnce);
|
||||
|
||||
spy.restore();
|
||||
});
|
||||
|
||||
it('should add event listeners to all the elements in a base selector', function() {
|
||||
var spy = sinon.spy();
|
||||
delegate('li', 'a', 'click', spy);
|
||||
|
||||
var anchors = document.querySelectorAll('a');
|
||||
simulant.fire(anchors[0], simulant('click'));
|
||||
simulant.fire(anchors[1], simulant('click'));
|
||||
assert.ok(spy.calledTwice);
|
||||
});
|
||||
|
||||
it('should remove the event listeners from all the elements in a base selector', function() {
|
||||
var items = document.querySelectorAll('li')
|
||||
var spies = Array.prototype.map.call(items, function (li) {
|
||||
return sinon.spy(li, 'removeEventListener');
|
||||
});
|
||||
|
||||
var delegations = delegate('li', 'a', 'click', function() {});
|
||||
delegations.forEach(function (delegation) {
|
||||
delegation.destroy();
|
||||
});
|
||||
|
||||
spies.every(function (spy) {
|
||||
var success = spy.calledOnce;
|
||||
spy.restore();
|
||||
return success;
|
||||
});
|
||||
});
|
||||
|
||||
it('should add event listeners to all the elements in a base array', function() {
|
||||
var spy = sinon.spy();
|
||||
var items = document.querySelectorAll('li')
|
||||
delegate(items, 'a', 'click', spy);
|
||||
|
||||
var anchors = document.querySelectorAll('a')
|
||||
simulant.fire(anchors[0], simulant('click'));
|
||||
simulant.fire(anchors[1], simulant('click'));
|
||||
assert.ok(spy.calledTwice);
|
||||
});
|
||||
|
||||
it('should remove the event listeners from all the elements in a base array', function() {
|
||||
var items = document.querySelectorAll('li')
|
||||
var spies = Array.prototype.map.call(items, function (li) {
|
||||
return sinon.spy(li, 'removeEventListener');
|
||||
});
|
||||
|
||||
var delegations = delegate(items, 'a', 'click', function() {});
|
||||
delegations.forEach(function (delegation) {
|
||||
delegation.destroy();
|
||||
});
|
||||
|
||||
spies.every(function (spy) {
|
||||
var success = spy.calledOnce;
|
||||
spy.restore();
|
||||
return success;
|
||||
});
|
||||
});
|
||||
});
|
||||
22
node_modules/good-listener/.editorconfig
generated
vendored
22
node_modules/good-listener/.editorconfig
generated
vendored
|
|
@ -1,22 +0,0 @@
|
|||
# EditorConfig helps developers define and maintain consistent
|
||||
# coding styles between different editors and IDEs
|
||||
# http://editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
# Change these settings to your own preference
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
# We recommend you to keep these unchanged
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[{package.json,bower.json}]
|
||||
indent_size = 2
|
||||
1
node_modules/good-listener/.npmignore
generated
vendored
1
node_modules/good-listener/.npmignore
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
node_modules
|
||||
3
node_modules/good-listener/.travis.yml
generated
vendored
3
node_modules/good-listener/.travis.yml
generated
vendored
|
|
@ -1,3 +0,0 @@
|
|||
language: node_js
|
||||
node_js:
|
||||
- stable
|
||||
11
node_modules/good-listener/bower.json
generated
vendored
11
node_modules/good-listener/bower.json
generated
vendored
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"name": "good-listener",
|
||||
"description": "A more versatile way of adding & removing event listeners",
|
||||
"version": "1.2.1",
|
||||
"license": "MIT",
|
||||
"main": "dist/good-listener.js",
|
||||
"keywords": [
|
||||
"event",
|
||||
"listener"
|
||||
]
|
||||
}
|
||||
25
node_modules/good-listener/demo/destroy.html
generated
vendored
25
node_modules/good-listener/demo/destroy.html
generated
vendored
|
|
@ -1,25 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Destroy</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Write some markup -->
|
||||
<button class="target">Click me</button>
|
||||
<button class="target">Click me</button>
|
||||
<button class="target">Click me</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/good-listener.js"></script>
|
||||
|
||||
<!-- 3. Remove listener by calling the destroy function -->
|
||||
<script>
|
||||
var listener = listen('.target', 'click', function(e) {
|
||||
console.info(e);
|
||||
});
|
||||
|
||||
listener.destroy();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
30
node_modules/good-listener/demo/multiple.html
generated
vendored
30
node_modules/good-listener/demo/multiple.html
generated
vendored
|
|
@ -1,30 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Selector</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Write some markup -->
|
||||
<button data-a>Click me</button>
|
||||
<button data-a>Click me</button>
|
||||
<button data-a>Click me</button>
|
||||
<button data-b>Click me</button>
|
||||
<button data-b>Click me</button>
|
||||
<button data-b>Click me</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/good-listener.js"></script>
|
||||
|
||||
<!-- 3. Add listener by passing a string selector -->
|
||||
<script>
|
||||
listen('[data-a]', 'click', function(e) {
|
||||
console.info(e);
|
||||
});
|
||||
|
||||
listen('[data-b]', 'click', function(e) {
|
||||
console.info(e);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
23
node_modules/good-listener/demo/node.html
generated
vendored
23
node_modules/good-listener/demo/node.html
generated
vendored
|
|
@ -1,23 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Node</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Write some markup -->
|
||||
<button id="target">Click me</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/good-listener.js"></script>
|
||||
|
||||
<!-- 3. Add listener by passing a HTML element -->
|
||||
<script>
|
||||
var target = document.getElementById('target');
|
||||
|
||||
listen(target, 'click', function(e) {
|
||||
console.info(e);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
25
node_modules/good-listener/demo/nodelist.html
generated
vendored
25
node_modules/good-listener/demo/nodelist.html
generated
vendored
|
|
@ -1,25 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>NodeList</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Write some markup -->
|
||||
<button>Click me</button>
|
||||
<button>Click me</button>
|
||||
<button>Click me</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/good-listener.js"></script>
|
||||
|
||||
<!-- 3. Add listener by passing a list of HTML elements -->
|
||||
<script>
|
||||
var targets = document.querySelectorAll('button');
|
||||
|
||||
listen(targets, 'click', function(e) {
|
||||
console.info(e);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
23
node_modules/good-listener/demo/selector.html
generated
vendored
23
node_modules/good-listener/demo/selector.html
generated
vendored
|
|
@ -1,23 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Selector</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Write some markup -->
|
||||
<button class="target">Click me</button>
|
||||
<button class="target">Click me</button>
|
||||
<button class="target">Click me</button>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/good-listener.js"></script>
|
||||
|
||||
<!-- 3. Add listener by passing a string selector -->
|
||||
<script>
|
||||
listen('.target', 'click', function(e) {
|
||||
console.info(e);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
228
node_modules/good-listener/dist/good-listener.js
generated
vendored
228
node_modules/good-listener/dist/good-listener.js
generated
vendored
|
|
@ -1,228 +0,0 @@
|
|||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.listen = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
||||
var DOCUMENT_NODE_TYPE = 9;
|
||||
|
||||
/**
|
||||
* A polyfill for Element.matches()
|
||||
*/
|
||||
if (typeof Element !== 'undefined' && !Element.prototype.matches) {
|
||||
var proto = Element.prototype;
|
||||
|
||||
proto.matches = proto.matchesSelector ||
|
||||
proto.mozMatchesSelector ||
|
||||
proto.msMatchesSelector ||
|
||||
proto.oMatchesSelector ||
|
||||
proto.webkitMatchesSelector;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the closest parent that matches a selector.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @return {Function}
|
||||
*/
|
||||
function closest (element, selector) {
|
||||
while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
|
||||
if (element.matches(selector)) return element;
|
||||
element = element.parentNode;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = closest;
|
||||
|
||||
},{}],2:[function(require,module,exports){
|
||||
var closest = require('./closest');
|
||||
|
||||
/**
|
||||
* Delegates event to a selector.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @param {Boolean} useCapture
|
||||
* @return {Object}
|
||||
*/
|
||||
function delegate(element, selector, type, callback, useCapture) {
|
||||
var listenerFn = listener.apply(this, arguments);
|
||||
|
||||
element.addEventListener(type, listenerFn, useCapture);
|
||||
|
||||
return {
|
||||
destroy: function() {
|
||||
element.removeEventListener(type, listenerFn, useCapture);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds closest match and invokes callback.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Function}
|
||||
*/
|
||||
function listener(element, selector, type, callback) {
|
||||
return function(e) {
|
||||
e.delegateTarget = closest(e.target, selector);
|
||||
|
||||
if (e.delegateTarget) {
|
||||
callback.call(element, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = delegate;
|
||||
|
||||
},{"./closest":1}],3:[function(require,module,exports){
|
||||
/**
|
||||
* Check if argument is a HTML element.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.node = function(value) {
|
||||
return value !== undefined
|
||||
&& value instanceof HTMLElement
|
||||
&& value.nodeType === 1;
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if argument is a list of HTML elements.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.nodeList = function(value) {
|
||||
var type = Object.prototype.toString.call(value);
|
||||
|
||||
return value !== undefined
|
||||
&& (type === '[object NodeList]' || type === '[object HTMLCollection]')
|
||||
&& ('length' in value)
|
||||
&& (value.length === 0 || exports.node(value[0]));
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if argument is a string.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.string = function(value) {
|
||||
return typeof value === 'string'
|
||||
|| value instanceof String;
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if argument is a function.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.fn = function(value) {
|
||||
var type = Object.prototype.toString.call(value);
|
||||
|
||||
return type === '[object Function]';
|
||||
};
|
||||
|
||||
},{}],4:[function(require,module,exports){
|
||||
var is = require('./is');
|
||||
var delegate = require('delegate');
|
||||
|
||||
/**
|
||||
* Validates all params and calls the right
|
||||
* listener function based on its target type.
|
||||
*
|
||||
* @param {String|HTMLElement|HTMLCollection|NodeList} target
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listen(target, type, callback) {
|
||||
if (!target && !type && !callback) {
|
||||
throw new Error('Missing required arguments');
|
||||
}
|
||||
|
||||
if (!is.string(type)) {
|
||||
throw new TypeError('Second argument must be a String');
|
||||
}
|
||||
|
||||
if (!is.fn(callback)) {
|
||||
throw new TypeError('Third argument must be a Function');
|
||||
}
|
||||
|
||||
if (is.node(target)) {
|
||||
return listenNode(target, type, callback);
|
||||
}
|
||||
else if (is.nodeList(target)) {
|
||||
return listenNodeList(target, type, callback);
|
||||
}
|
||||
else if (is.string(target)) {
|
||||
return listenSelector(target, type, callback);
|
||||
}
|
||||
else {
|
||||
throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an event listener to a HTML element
|
||||
* and returns a remove listener function.
|
||||
*
|
||||
* @param {HTMLElement} node
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listenNode(node, type, callback) {
|
||||
node.addEventListener(type, callback);
|
||||
|
||||
return {
|
||||
destroy: function() {
|
||||
node.removeEventListener(type, callback);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an event listener to a list of HTML elements
|
||||
* and returns a remove listener function.
|
||||
*
|
||||
* @param {NodeList|HTMLCollection} nodeList
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listenNodeList(nodeList, type, callback) {
|
||||
Array.prototype.forEach.call(nodeList, function(node) {
|
||||
node.addEventListener(type, callback);
|
||||
});
|
||||
|
||||
return {
|
||||
destroy: function() {
|
||||
Array.prototype.forEach.call(nodeList, function(node) {
|
||||
node.removeEventListener(type, callback);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an event listener to a selector
|
||||
* and returns a remove listener function.
|
||||
*
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listenSelector(selector, type, callback) {
|
||||
return delegate(document.body, selector, type, callback);
|
||||
}
|
||||
|
||||
module.exports = listen;
|
||||
|
||||
},{"./is":3,"delegate":2}]},{},[4])(4)
|
||||
});
|
||||
24
node_modules/good-listener/karma.conf.js
generated
vendored
24
node_modules/good-listener/karma.conf.js
generated
vendored
|
|
@ -1,24 +0,0 @@
|
|||
module.exports = function(karma) {
|
||||
karma.set({
|
||||
plugins: ['karma-browserify', 'karma-chai', 'karma-sinon', 'karma-mocha', 'karma-phantomjs-launcher'],
|
||||
|
||||
frameworks: ['browserify', 'chai', 'sinon', 'mocha'],
|
||||
|
||||
files: [
|
||||
'src/**/*.js',
|
||||
'test/**/*.js',
|
||||
'./node_modules/phantomjs-polyfill/bind-polyfill.js'
|
||||
],
|
||||
|
||||
preprocessors: {
|
||||
'src/**/*.js' : ['browserify'],
|
||||
'test/**/*.js': ['browserify']
|
||||
},
|
||||
|
||||
browserify: {
|
||||
debug: true
|
||||
},
|
||||
|
||||
browsers: ['PhantomJS']
|
||||
});
|
||||
}
|
||||
35
node_modules/good-listener/package.json
generated
vendored
35
node_modules/good-listener/package.json
generated
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"name": "good-listener",
|
||||
"description": "A more versatile way of adding & removing event listeners",
|
||||
"version": "1.2.2",
|
||||
"repository": "zenorocha/good-listener",
|
||||
"license": "MIT",
|
||||
"main": "src/listen.js",
|
||||
"keywords": [
|
||||
"event",
|
||||
"listener"
|
||||
],
|
||||
"dependencies": {
|
||||
"delegate": "^3.1.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"browserify": "^13.0.0",
|
||||
"chai": "^3.5.0",
|
||||
"karma": "^1.3.0",
|
||||
"karma-browserify": "^5.0.1",
|
||||
"karma-chai": "^0.1.0",
|
||||
"karma-mocha": "^1.2.0",
|
||||
"karma-phantomjs-launcher": "^1.0.0",
|
||||
"karma-sinon": "^1.0.4",
|
||||
"mocha": "^3.1.2",
|
||||
"phantomjs-polyfill": "0.0.2",
|
||||
"phantomjs-prebuilt": "^2.1.3",
|
||||
"simulant": "^0.2.2",
|
||||
"sinon": "^1.17.3",
|
||||
"watchify": "^3.7.0"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "browserify src/listen.js -s listen -o dist/good-listener.js",
|
||||
"test": "karma start --single-run"
|
||||
}
|
||||
}
|
||||
91
node_modules/good-listener/readme.md
generated
vendored
91
node_modules/good-listener/readme.md
generated
vendored
|
|
@ -1,91 +0,0 @@
|
|||
# good-listener
|
||||
|
||||
[](https://travis-ci.org/zenorocha/good-listener)
|
||||
|
||||
> A more versatile way of adding & removing event listeners.
|
||||
|
||||

|
||||
|
||||
## Install
|
||||
|
||||
You can get it on npm.
|
||||
|
||||
```
|
||||
npm install good-listener --save
|
||||
```
|
||||
|
||||
Or bower, too.
|
||||
|
||||
```
|
||||
bower install good-listener --save
|
||||
```
|
||||
|
||||
If you're not into package management, just [download a ZIP](https://github.com/zenorocha/good-listener/archive/master.zip) file.
|
||||
|
||||
## Setup
|
||||
|
||||
###### Node (Browserify)
|
||||
|
||||
```js
|
||||
var listen = require('good-listener');
|
||||
```
|
||||
|
||||
###### Browser (Standalone)
|
||||
|
||||
```html
|
||||
<script src="dist/good-listener.js"></script>
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Add an event listener
|
||||
|
||||
By passing a string selector [(see full demo)](https://github.com/zenorocha/good-listener/blob/master/demo/selector.html).
|
||||
|
||||
```js
|
||||
listen('.btn', 'click', function(e) {
|
||||
console.log(e);
|
||||
});
|
||||
```
|
||||
|
||||
Or by passing a HTML element [(see full demo)](https://github.com/zenorocha/good-listener/blob/master/demo/node.html).
|
||||
|
||||
```js
|
||||
var logo = document.getElementById('logo');
|
||||
|
||||
listen(logo, 'click', function(e) {
|
||||
console.log(e);
|
||||
});
|
||||
```
|
||||
|
||||
Or by passing a list of HTML elements [(see full demo)](https://github.com/zenorocha/good-listener/blob/master/demo/nodelist.html).
|
||||
|
||||
```js
|
||||
var anchors = document.querySelectorAll('a');
|
||||
|
||||
listen(anchors, 'click', function(e) {
|
||||
console.log(e);
|
||||
});
|
||||
```
|
||||
|
||||
### Remove an event listener
|
||||
|
||||
By calling the `destroy` function that returned from previous operation [(see full demo)](https://github.com/zenorocha/good-listener/blob/master/demo/destroy.html).
|
||||
|
||||
```js
|
||||
var listener = listen('.btn', 'click', function(e) {
|
||||
console.log(e);
|
||||
});
|
||||
|
||||
listener.destroy();
|
||||
```
|
||||
|
||||
## Browser Support
|
||||
|
||||
| <img src="https://clipboardjs.com/assets/images/chrome.png" width="48px" height="48px" alt="Chrome logo"> | <img src="https://clipboardjs.com/assets/images/edge.png" width="48px" height="48px" alt="Edge logo"> | <img src="https://clipboardjs.com/assets/images/firefox.png" width="48px" height="48px" alt="Firefox logo"> | <img src="https://clipboardjs.com/assets/images/ie.png" width="48px" height="48px" alt="Internet Explorer logo"> | <img src="https://clipboardjs.com/assets/images/opera.png" width="48px" height="48px" alt="Opera logo"> | <img src="https://clipboardjs.com/assets/images/safari.png" width="48px" height="48px" alt="Safari logo"> |
|
||||
|:---:|:---:|:---:|:---:|:---:|:---:|
|
||||
| Latest ✔ | Latest ✔ | Latest ✔ | 9+ ✔ | Latest ✔ | Latest ✔ |
|
||||
|
||||
## License
|
||||
|
||||
[MIT License](http://zenorocha.mit-license.org/) © Zeno Rocha
|
||||
49
node_modules/good-listener/src/is.js
generated
vendored
49
node_modules/good-listener/src/is.js
generated
vendored
|
|
@ -1,49 +0,0 @@
|
|||
/**
|
||||
* Check if argument is a HTML element.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.node = function(value) {
|
||||
return value !== undefined
|
||||
&& value instanceof HTMLElement
|
||||
&& value.nodeType === 1;
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if argument is a list of HTML elements.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.nodeList = function(value) {
|
||||
var type = Object.prototype.toString.call(value);
|
||||
|
||||
return value !== undefined
|
||||
&& (type === '[object NodeList]' || type === '[object HTMLCollection]')
|
||||
&& ('length' in value)
|
||||
&& (value.length === 0 || exports.node(value[0]));
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if argument is a string.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.string = function(value) {
|
||||
return typeof value === 'string'
|
||||
|| value instanceof String;
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if argument is a function.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.fn = function(value) {
|
||||
var type = Object.prototype.toString.call(value);
|
||||
|
||||
return type === '[object Function]';
|
||||
};
|
||||
95
node_modules/good-listener/src/listen.js
generated
vendored
95
node_modules/good-listener/src/listen.js
generated
vendored
|
|
@ -1,95 +0,0 @@
|
|||
var is = require('./is');
|
||||
var delegate = require('delegate');
|
||||
|
||||
/**
|
||||
* Validates all params and calls the right
|
||||
* listener function based on its target type.
|
||||
*
|
||||
* @param {String|HTMLElement|HTMLCollection|NodeList} target
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listen(target, type, callback) {
|
||||
if (!target && !type && !callback) {
|
||||
throw new Error('Missing required arguments');
|
||||
}
|
||||
|
||||
if (!is.string(type)) {
|
||||
throw new TypeError('Second argument must be a String');
|
||||
}
|
||||
|
||||
if (!is.fn(callback)) {
|
||||
throw new TypeError('Third argument must be a Function');
|
||||
}
|
||||
|
||||
if (is.node(target)) {
|
||||
return listenNode(target, type, callback);
|
||||
}
|
||||
else if (is.nodeList(target)) {
|
||||
return listenNodeList(target, type, callback);
|
||||
}
|
||||
else if (is.string(target)) {
|
||||
return listenSelector(target, type, callback);
|
||||
}
|
||||
else {
|
||||
throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an event listener to a HTML element
|
||||
* and returns a remove listener function.
|
||||
*
|
||||
* @param {HTMLElement} node
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listenNode(node, type, callback) {
|
||||
node.addEventListener(type, callback);
|
||||
|
||||
return {
|
||||
destroy: function() {
|
||||
node.removeEventListener(type, callback);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an event listener to a list of HTML elements
|
||||
* and returns a remove listener function.
|
||||
*
|
||||
* @param {NodeList|HTMLCollection} nodeList
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listenNodeList(nodeList, type, callback) {
|
||||
Array.prototype.forEach.call(nodeList, function(node) {
|
||||
node.addEventListener(type, callback);
|
||||
});
|
||||
|
||||
return {
|
||||
destroy: function() {
|
||||
Array.prototype.forEach.call(nodeList, function(node) {
|
||||
node.removeEventListener(type, callback);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an event listener to a selector
|
||||
* and returns a remove listener function.
|
||||
*
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listenSelector(selector, type, callback) {
|
||||
return delegate(document.body, selector, type, callback);
|
||||
}
|
||||
|
||||
module.exports = listen;
|
||||
111
node_modules/good-listener/test/is.js
generated
vendored
111
node_modules/good-listener/test/is.js
generated
vendored
|
|
@ -1,111 +0,0 @@
|
|||
var is = require('../src/is');
|
||||
|
||||
describe('is', function() {
|
||||
before(function() {
|
||||
global.node = document.createElement('div');
|
||||
global.node.setAttribute('id', 'foo');
|
||||
global.node.setAttribute('class', 'foo');
|
||||
document.body.appendChild(global.node);
|
||||
});
|
||||
|
||||
after(function() {
|
||||
document.body.innerHTML = '';
|
||||
});
|
||||
|
||||
describe('is.node', function() {
|
||||
it('should be considered as node', function() {
|
||||
assert.ok(is.node(document.getElementById('foo')));
|
||||
assert.ok(is.node(document.getElementsByTagName('div')[0]));
|
||||
assert.ok(is.node(document.getElementsByClassName('foo')[0]));
|
||||
assert.ok(is.node(document.querySelector('.foo')));
|
||||
});
|
||||
|
||||
it('should not be considered as node', function() {
|
||||
assert.notOk(is.node(undefined));
|
||||
assert.notOk(is.node(null));
|
||||
assert.notOk(is.node(false));
|
||||
assert.notOk(is.node(true));
|
||||
assert.notOk(is.node(function () {}));
|
||||
assert.notOk(is.node([]));
|
||||
assert.notOk(is.node({}));
|
||||
assert.notOk(is.node(/a/g));
|
||||
assert.notOk(is.node(new RegExp('a', 'g')));
|
||||
assert.notOk(is.node(new Date()));
|
||||
assert.notOk(is.node(42));
|
||||
assert.notOk(is.node(NaN));
|
||||
assert.notOk(is.node(Infinity));
|
||||
assert.notOk(is.node(new Number(42)));
|
||||
});
|
||||
});
|
||||
|
||||
describe('is.nodeList', function() {
|
||||
it('should be considered as nodeList', function() {
|
||||
assert.ok(is.nodeList(document.getElementsByTagName('div')));
|
||||
assert.ok(is.nodeList(document.getElementsByClassName('foo')));
|
||||
assert.ok(is.nodeList(document.querySelectorAll('.foo')));
|
||||
});
|
||||
|
||||
it('should not be considered as nodeList', function() {
|
||||
assert.notOk(is.nodeList(undefined));
|
||||
assert.notOk(is.nodeList(null));
|
||||
assert.notOk(is.nodeList(false));
|
||||
assert.notOk(is.nodeList(true));
|
||||
assert.notOk(is.nodeList(function () {}));
|
||||
assert.notOk(is.nodeList([]));
|
||||
assert.notOk(is.nodeList({}));
|
||||
assert.notOk(is.nodeList(/a/g));
|
||||
assert.notOk(is.nodeList(new RegExp('a', 'g')));
|
||||
assert.notOk(is.nodeList(new Date()));
|
||||
assert.notOk(is.nodeList(42));
|
||||
assert.notOk(is.nodeList(NaN));
|
||||
assert.notOk(is.nodeList(Infinity));
|
||||
assert.notOk(is.nodeList(new Number(42)));
|
||||
});
|
||||
});
|
||||
|
||||
describe('is.string', function() {
|
||||
it('should be considered as string', function() {
|
||||
assert.ok(is.string('abc'));
|
||||
assert.ok(is.string(new String('abc')));
|
||||
});
|
||||
|
||||
it('should not be considered as string', function() {
|
||||
assert.notOk(is.string(undefined));
|
||||
assert.notOk(is.string(null));
|
||||
assert.notOk(is.string(false));
|
||||
assert.notOk(is.string(true));
|
||||
assert.notOk(is.string(function () {}));
|
||||
assert.notOk(is.string([]));
|
||||
assert.notOk(is.string({}));
|
||||
assert.notOk(is.string(/a/g));
|
||||
assert.notOk(is.string(new RegExp('a', 'g')));
|
||||
assert.notOk(is.string(new Date()));
|
||||
assert.notOk(is.string(42));
|
||||
assert.notOk(is.string(NaN));
|
||||
assert.notOk(is.string(Infinity));
|
||||
assert.notOk(is.string(new Number(42)));
|
||||
});
|
||||
});
|
||||
|
||||
describe('is.fn', function() {
|
||||
it('should be considered as function', function() {
|
||||
assert.ok(is.fn(function () {}));
|
||||
});
|
||||
|
||||
it('should not be considered as function', function() {
|
||||
assert.notOk(is.fn(undefined));
|
||||
assert.notOk(is.fn(null));
|
||||
assert.notOk(is.fn(false));
|
||||
assert.notOk(is.fn(true));
|
||||
assert.notOk(is.fn([]));
|
||||
assert.notOk(is.fn({}));
|
||||
assert.notOk(is.fn(/a/g));
|
||||
assert.notOk(is.fn(new RegExp('a', 'g')));
|
||||
assert.notOk(is.fn(new Date()));
|
||||
assert.notOk(is.fn(42));
|
||||
assert.notOk(is.fn(NaN));
|
||||
assert.notOk(is.fn(Infinity));
|
||||
assert.notOk(is.fn(new Number(42)));
|
||||
});
|
||||
});
|
||||
});
|
||||
135
node_modules/good-listener/test/listen.js
generated
vendored
135
node_modules/good-listener/test/listen.js
generated
vendored
|
|
@ -1,135 +0,0 @@
|
|||
var listen = require('../src/listen');
|
||||
var simulant = require('simulant');
|
||||
|
||||
describe('good-listener', function() {
|
||||
before(function() {
|
||||
global.node = document.createElement('div');
|
||||
global.node.setAttribute('id', 'foo');
|
||||
global.node.setAttribute('class', 'foo');
|
||||
document.body.appendChild(global.node);
|
||||
});
|
||||
|
||||
after(function() {
|
||||
document.body.innerHTML = '';
|
||||
});
|
||||
|
||||
describe('listen', function() {
|
||||
it('should throw an error since arguments were not passed', function(done) {
|
||||
try {
|
||||
listen();
|
||||
}
|
||||
catch(error) {
|
||||
assert.equal(error.message, 'Missing required arguments');
|
||||
done();
|
||||
}
|
||||
});
|
||||
|
||||
it('should throw an error since "target" was invalid', function(done) {
|
||||
try {
|
||||
listen(null, 'click', function() {});
|
||||
}
|
||||
catch(error) {
|
||||
assert.equal(error.message, 'First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
|
||||
done();
|
||||
}
|
||||
});
|
||||
|
||||
it('should throw an error since "type" was invalid', function(done) {
|
||||
try {
|
||||
listen('.btn', false, function() {});
|
||||
}
|
||||
catch(error) {
|
||||
assert.equal(error.message, 'Second argument must be a String');
|
||||
done();
|
||||
}
|
||||
});
|
||||
|
||||
it('should throw an error since "callback" was invalid', function(done) {
|
||||
try {
|
||||
listen('.btn', 'click', []);
|
||||
}
|
||||
catch(error) {
|
||||
assert.equal(error.message, 'Third argument must be a Function');
|
||||
done();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('listenNode', function() {
|
||||
before(function() {
|
||||
global.target = document.querySelector('#foo');
|
||||
global.spy = sinon.spy(global.target, 'removeEventListener');
|
||||
});
|
||||
|
||||
after(function() {
|
||||
global.spy.restore();
|
||||
});
|
||||
|
||||
it('should add an event listener', function(done) {
|
||||
listen(global.target, 'click', function() {
|
||||
done();
|
||||
});
|
||||
|
||||
simulant.fire(global.target, simulant('click'));
|
||||
});
|
||||
|
||||
it('should remove an event listener', function() {
|
||||
var listener = listen(global.target, 'click', function() {});
|
||||
|
||||
listener.destroy();
|
||||
assert.ok(global.spy.calledOnce);
|
||||
});
|
||||
});
|
||||
|
||||
describe('listenNodeList', function() {
|
||||
before(function() {
|
||||
global.targets = document.querySelectorAll('.foo');
|
||||
global.spy = sinon.spy(global.targets[0], 'removeEventListener');
|
||||
});
|
||||
|
||||
after(function() {
|
||||
global.spy.restore();
|
||||
});
|
||||
|
||||
it('should add an event listener', function(done) {
|
||||
listen(global.targets, 'click', function() {
|
||||
done();
|
||||
});
|
||||
|
||||
simulant.fire(global.targets[0], simulant('click'));
|
||||
});
|
||||
|
||||
it('should remove an event listener', function() {
|
||||
var listener = listen(global.targets, 'click', function() {});
|
||||
|
||||
listener.destroy();
|
||||
assert.ok(global.spy.calledOnce);
|
||||
});
|
||||
});
|
||||
|
||||
describe('listenSelector', function() {
|
||||
before(function() {
|
||||
global.target = document.querySelector('.foo');
|
||||
global.spy = sinon.spy(document.body, 'removeEventListener');
|
||||
});
|
||||
|
||||
after(function() {
|
||||
global.spy.restore();
|
||||
});
|
||||
|
||||
it('should add an event listener', function(done) {
|
||||
listen('.foo', 'click', function() {
|
||||
done();
|
||||
});
|
||||
|
||||
simulant.fire(global.target, simulant('click'));
|
||||
});
|
||||
|
||||
it('should remove an event listener', function() {
|
||||
var listener = listen('.foo', 'click', function() {});
|
||||
|
||||
listener.destroy();
|
||||
assert.ok(global.spy.calledOnce);
|
||||
});
|
||||
});
|
||||
});
|
||||
22
node_modules/select/.editorconfig
generated
vendored
22
node_modules/select/.editorconfig
generated
vendored
|
|
@ -1,22 +0,0 @@
|
|||
# EditorConfig helps developers define and maintain consistent
|
||||
# coding styles between different editors and IDEs
|
||||
# http://editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
# Change these settings to your own preference
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
# We recommend you to keep these unchanged
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[{package.json,bower.json}]
|
||||
indent_size = 2
|
||||
1
node_modules/select/.npmignore
generated
vendored
1
node_modules/select/.npmignore
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
node_modules
|
||||
3
node_modules/select/.travis.yml
generated
vendored
3
node_modules/select/.travis.yml
generated
vendored
|
|
@ -1,3 +0,0 @@
|
|||
language: node_js
|
||||
node_js:
|
||||
- stable
|
||||
13
node_modules/select/bower.json
generated
vendored
13
node_modules/select/bower.json
generated
vendored
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"name": "select",
|
||||
"version": "1.1.0",
|
||||
"description": "Programmatically select the text of a HTML element",
|
||||
"license": "MIT",
|
||||
"main": "dist/select.js",
|
||||
"keywords": [
|
||||
"range",
|
||||
"select",
|
||||
"selecting",
|
||||
"selection"
|
||||
]
|
||||
}
|
||||
26
node_modules/select/demo/contenteditable.html
generated
vendored
26
node_modules/select/demo/contenteditable.html
generated
vendored
|
|
@ -1,26 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>contenteditable</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<button type="button">Select</button>
|
||||
<p contenteditable>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio totam adipisci, saepe ad vero dignissimos laborum non eum eveniet aperiam, consequuntur repellendus architecto inventore iusto blanditiis quasi commodi voluptatum vitae!</p>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/select.js"></script>
|
||||
|
||||
<!-- 3. Select! -->
|
||||
<script>
|
||||
var p = document.querySelector('p');
|
||||
var button = document.querySelector('button');
|
||||
|
||||
button.addEventListener('click', function(e) {
|
||||
var selected = select(p);
|
||||
console.log(selected);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
30
node_modules/select/demo/dropdown.html
generated
vendored
30
node_modules/select/demo/dropdown.html
generated
vendored
|
|
@ -1,30 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>dropdown</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<button type="button">Select</button>
|
||||
<select>
|
||||
<option>Option 1</option>
|
||||
<option selected>Option 2</option>
|
||||
<option>Option 3</option>
|
||||
</select>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/select.js"></script>
|
||||
|
||||
<!-- 3. Select! -->
|
||||
<script>
|
||||
var dropdown = document.querySelector('select');
|
||||
var button = document.querySelector('button');
|
||||
|
||||
button.addEventListener('click', function(e) {
|
||||
var selected = select(dropdown);
|
||||
console.log(selected);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
26
node_modules/select/demo/editable.html
generated
vendored
26
node_modules/select/demo/editable.html
generated
vendored
|
|
@ -1,26 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>editable</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<button type="button">Select</button>
|
||||
<input type="text" value="Lorem ipsum">
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/select.js"></script>
|
||||
|
||||
<!-- 3. Select! -->
|
||||
<script>
|
||||
var input = document.querySelector('input');
|
||||
var button = document.querySelector('button');
|
||||
|
||||
button.addEventListener('click', function(e) {
|
||||
var selected = select(input);
|
||||
console.log(selected);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
28
node_modules/select/demo/multiple.html
generated
vendored
28
node_modules/select/demo/multiple.html
generated
vendored
|
|
@ -1,28 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>multiple</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. Define some markup -->
|
||||
<button type="button">Select</button>
|
||||
<input type="text" value="Lorem ipsum">
|
||||
<textarea>Lorem ipsum</textarea>
|
||||
|
||||
<!-- 2. Include library -->
|
||||
<script src="../dist/select.js"></script>
|
||||
|
||||
<!-- 3. Select! -->
|
||||
<script>
|
||||
var input = document.querySelector('input');
|
||||
var textarea = document.querySelector('textarea');
|
||||
var button = document.querySelector('button');
|
||||
|
||||
button.addEventListener('click', function(e) {
|
||||
console.log(select(input));
|
||||
console.log(select(textarea));
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user