tablewrap 1.0.5 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.env.example CHANGED
@@ -1 +1 @@
1
- DOMAIN=http://vielhuber.local.vielhuber.de
1
+ DOMAIN=http://vielhuber.vielhuber.dev
package/.eslintrc.js CHANGED
File without changes
@@ -0,0 +1,41 @@
1
+ name: CI
2
+
3
+ env:
4
+ CI: true
5
+
6
+ on:
7
+ push:
8
+ tags:
9
+ - 'v*'
10
+ - '[0-9]*'
11
+
12
+ jobs:
13
+ publish:
14
+ runs-on: ubuntu-latest
15
+
16
+ permissions:
17
+ contents: read
18
+ id-token: write
19
+
20
+ steps:
21
+ - name: Checkout
22
+ uses: actions/checkout@v6
23
+
24
+ - name: Node
25
+ uses: actions/setup-node@v6
26
+ with:
27
+ node-version-file: '.nvmrc'
28
+ registry-url: 'https://registry.npmjs.org'
29
+ package-manager-cache: false
30
+
31
+ - name: NPM
32
+ run: npm install
33
+
34
+ - name: Verify version
35
+ run: test "$(node -p "require('./package.json').version")" = "${GITHUB_REF_NAME#v}"
36
+
37
+ - name: Build
38
+ run: npm run prod --if-present
39
+
40
+ - name: Publish
41
+ run: npm publish
package/.nvmrc ADDED
@@ -0,0 +1 @@
1
+ lts/*
package/README.md CHANGED
@@ -1,36 +1,38 @@
1
- # 🖇 tablewrap 🖇
2
-
3
- tablewrap is a small javascript helper that wraps your html tables on small viewports column-wise.
4
-
5
- ![demo](https://raw.githubusercontent.com/vielhuber/tablewrap/master/tablewrap.gif)
6
-
7
- ## features
8
-
9
- - no modification of existing css styles needed
10
- - no extra markup needed
11
- - performant and lightweight
12
- - comes as an es6 module
13
- - cross-browser-support (ie11)
14
- - support for preserving the first column
15
-
16
- ## installation
17
-
18
- ```bash
19
- npm install tablewrap
20
- ```
21
-
22
- ## usage
23
-
24
- ```js
25
- import Tablewrap from 'tablewrap';
26
-
27
- document.addEventListener('DOMContentLoaded', () => {
28
- let tablewrap = new Tablewrap({
29
- selector: 'table',
30
- breakpoint: 700,
31
- preserveFirstCol: true
32
- });
33
-
34
- tablewrap.destroy();
35
- });
36
- ```
1
+ [![build status](https://github.com/vielhuber/tablewrap/actions/workflows/ci.yml/badge.svg)](https://github.com/vielhuber/tablewrap/actions)
2
+
3
+ # 🖇 tablewrap 🖇
4
+
5
+ tablewrap is a small javascript helper that wraps your html tables on small viewports column-wise.
6
+
7
+ ![demo](https://raw.githubusercontent.com/vielhuber/tablewrap/main/tablewrap.gif)
8
+
9
+ ## features
10
+
11
+ - no modification of existing css styles needed
12
+ - no extra markup needed
13
+ - performant and lightweight
14
+ - comes as an es6 module
15
+ - cross-browser-support
16
+ - support for preserving the first column
17
+
18
+ ## installation
19
+
20
+ ```bash
21
+ npm install tablewrap
22
+ ```
23
+
24
+ ## usage
25
+
26
+ ```js
27
+ import Tablewrap from 'tablewrap';
28
+
29
+ document.addEventListener('DOMContentLoaded', () => {
30
+ let tablewrap = new Tablewrap({
31
+ selector: 'table',
32
+ breakpoint: 700,
33
+ preserveFirstCol: true
34
+ });
35
+
36
+ tablewrap.destroy();
37
+ });
38
+ ```
@@ -1,18 +1,15 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _tablewrap = _interopRequireDefault(require("./tablewrap"));
6
-
7
- document.addEventListener('DOMContentLoaded', function () {
8
- var t1 = new _tablewrap.default({
9
- selector: '.basic',
10
- breakpoint: 500
11
- });
12
- var t2 = new _tablewrap.default({
13
- selector: '.advanced',
14
- breakpoint: 400,
15
- preserveFirstCol: true
16
- }); //t1.destroy();
17
- //t2.destroy();
18
- });
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_tablewrap = require("./tablewrap.js");
3
+ //#region _js/demo.js
4
+ document.addEventListener("DOMContentLoaded", () => {
5
+ new require_tablewrap.default({
6
+ selector: ".basic",
7
+ breakpoint: 500
8
+ });
9
+ new require_tablewrap.default({
10
+ selector: ".advanced",
11
+ breakpoint: 400,
12
+ preserveFirstCol: true
13
+ });
14
+ });
15
+ //#endregion
@@ -1,158 +1,82 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
7
4
  });
8
- exports.default = void 0;
9
-
10
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
-
14
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
-
16
- require("mdn-polyfills/Array.prototype.forEach");
17
-
18
- require("mdn-polyfills/NodeList.prototype.forEach");
19
-
20
- require("mdn-polyfills/Node.prototype.remove");
21
-
22
- require("mdn-polyfills/Node.prototype.after");
23
-
24
- var Tablewrap =
25
- /*#__PURE__*/
26
- function () {
27
- function Tablewrap(args) {
28
- (0, _classCallCheck2.default)(this, Tablewrap);
29
- (0, _defineProperty2.default)(this, "args", {});
30
- (0, _defineProperty2.default)(this, "tables", []);
31
- (0, _defineProperty2.default)(this, "mediaQuery", null);
32
- (0, _defineProperty2.default)(this, "mediaQueryBind", null);
33
- this.args = args;
34
- this.buildMobileDom();
35
- this.addResizeListeners();
36
- }
37
-
38
- (0, _createClass2.default)(Tablewrap, [{
39
- key: "buildMobileDom",
40
- value: function buildMobileDom() {
41
- var _this = this;
42
-
43
- if (document.querySelector(this.args.selector) === null) {
44
- return;
45
- }
46
-
47
- document.querySelectorAll(this.args.selector).forEach(function (el) {
48
- var cols = el.querySelector('td').parentNode.children.length;
49
- var mobileTables = [];
50
-
51
- var _loop = function _loop(col) {
52
- if ('preserveFirstCol' in _this.args && _this.args.preserveFirstCol === true && col === 1) {
53
- return "continue";
54
- }
55
-
56
- var newDiv = el.cloneNode(true);
57
- var toRemove = [];
58
- newDiv.querySelectorAll('td').forEach(function (el2) {
59
- if ('preserveFirstCol' in _this.args && _this.args.preserveFirstCol === true && _this.prevAll(el2).length !== 0 && _this.prevAll(el2).length + 1 !== col || !('preserveFirstCol' in _this.args && _this.args.preserveFirstCol === true) && _this.prevAll(el2).length + 1 !== col) {
60
- toRemove.push(el2);
61
- }
62
- });
63
- toRemove.forEach(function (toRemove__value) {
64
- toRemove__value.remove();
65
- });
66
- mobileTables.push(newDiv);
67
- };
68
-
69
- for (var col = 1; col <= cols; col++) {
70
- var _ret = _loop(col);
71
-
72
- if (_ret === "continue") continue;
73
- }
74
-
75
- mobileTables = mobileTables.reverse();
76
-
77
- _this.tables.push({
78
- desktop: el,
79
- mobile: mobileTables
80
- });
81
- });
82
- }
83
- }, {
84
- key: "addResizeListeners",
85
- value: function addResizeListeners() {
86
- this.mediaQuery = window.matchMedia('(max-width: ' + this.args.breakpoint + 'px)');
87
- this.mediaQueryBind = this.callOnResize.bind(this);
88
- this.mediaQuery.addListener(this.mediaQueryBind);
89
- this.callOnResize(this.mediaQuery);
90
- }
91
- }, {
92
- key: "callOnResize",
93
- value: function callOnResize(mediaQuery) {
94
- if (mediaQuery.matches) {
95
- this.insertMobileVersion();
96
- } else {
97
- this.insertDesktopVersion();
98
- }
99
- }
100
- }, {
101
- key: "insertMobileVersion",
102
- value: function insertMobileVersion() {
103
- this.tables.forEach(function (tables__value) {
104
- if (tables__value.desktop.parentNode === null) {
105
- return;
106
- }
107
-
108
- tables__value.mobile.forEach(function (mobile__value) {
109
- tables__value.desktop.after(mobile__value);
110
- });
111
- tables__value.desktop.remove();
112
- });
113
- }
114
- }, {
115
- key: "insertDesktopVersion",
116
- value: function insertDesktopVersion() {
117
- this.tables.forEach(function (tables__value) {
118
- if (tables__value.desktop.parentNode !== null) {
119
- return;
120
- }
121
-
122
- tables__value.mobile.forEach(function (mobile__value, mobile__key) {
123
- if (mobile__key === 0) {
124
- mobile__value.after(tables__value.desktop);
125
- }
126
-
127
- mobile__value.remove();
128
- });
129
- });
130
- }
131
- }, {
132
- key: "prevAll",
133
- value: function prevAll(elem, filter) {
134
- var sibs = [];
135
-
136
- while (elem = elem.previousSibling) {
137
- if (elem.nodeType === 3) {
138
- continue;
139
- }
140
-
141
- if (!filter || filter(elem)) {
142
- sibs.push(elem);
143
- }
144
- }
145
-
146
- return sibs;
147
- }
148
- }, {
149
- key: "destroy",
150
- value: function destroy() {
151
- this.insertDesktopVersion();
152
- this.mediaQuery.removeListener(this.mediaQueryBind);
153
- }
154
- }]);
155
- return Tablewrap;
156
- }();
157
-
158
- exports.default = Tablewrap;
5
+ //#region _js/tablewrap.js
6
+ var Tablewrap = class {
7
+ args = {};
8
+ tables = [];
9
+ mediaQuery = null;
10
+ mediaQueryBind = null;
11
+ constructor(args) {
12
+ this.args = args;
13
+ this.buildMobileDom();
14
+ this.addResizeListeners();
15
+ }
16
+ buildMobileDom() {
17
+ if (document.querySelector(this.args.selector) === null) return;
18
+ document.querySelectorAll(this.args.selector).forEach((el) => {
19
+ let cols = el.querySelector("td").parentNode.children.length;
20
+ let mobileTables = [];
21
+ for (let col = 1; col <= cols; col++) {
22
+ if ("preserveFirstCol" in this.args && this.args.preserveFirstCol === true && col === 1) continue;
23
+ let newDiv = el.cloneNode(true);
24
+ let toRemove = [];
25
+ newDiv.querySelectorAll("td").forEach((el2) => {
26
+ if ("preserveFirstCol" in this.args && this.args.preserveFirstCol === true && this.prevAll(el2).length !== 0 && this.prevAll(el2).length + 1 !== col || !("preserveFirstCol" in this.args && this.args.preserveFirstCol === true) && this.prevAll(el2).length + 1 !== col) toRemove.push(el2);
27
+ });
28
+ toRemove.forEach((toRemove__value) => {
29
+ toRemove__value.remove();
30
+ });
31
+ mobileTables.push(newDiv);
32
+ }
33
+ mobileTables = mobileTables.reverse();
34
+ this.tables.push({
35
+ desktop: el,
36
+ mobile: mobileTables
37
+ });
38
+ });
39
+ }
40
+ addResizeListeners() {
41
+ this.mediaQuery = window.matchMedia("(max-width: " + this.args.breakpoint + "px)");
42
+ this.mediaQueryBind = this.callOnResize.bind(this);
43
+ this.mediaQuery.addListener(this.mediaQueryBind);
44
+ this.callOnResize(this.mediaQuery);
45
+ }
46
+ callOnResize(mediaQuery) {
47
+ if (mediaQuery.matches) this.insertMobileVersion();
48
+ else this.insertDesktopVersion();
49
+ }
50
+ insertMobileVersion() {
51
+ this.tables.forEach((tables__value) => {
52
+ if (tables__value.desktop.parentNode === null) return;
53
+ tables__value.mobile.forEach((mobile__value) => {
54
+ tables__value.desktop.after(mobile__value);
55
+ });
56
+ tables__value.desktop.remove();
57
+ });
58
+ }
59
+ insertDesktopVersion() {
60
+ this.tables.forEach((tables__value) => {
61
+ if (tables__value.desktop.parentNode !== null) return;
62
+ tables__value.mobile.forEach((mobile__value, mobile__key) => {
63
+ if (mobile__key === 0) mobile__value.after(tables__value.desktop);
64
+ mobile__value.remove();
65
+ });
66
+ });
67
+ }
68
+ prevAll(elem, filter) {
69
+ let sibs = [];
70
+ while (elem = elem.previousSibling) {
71
+ if (elem.nodeType === 3) continue;
72
+ if (!filter || filter(elem)) sibs.push(elem);
73
+ }
74
+ return sibs;
75
+ }
76
+ destroy() {
77
+ this.insertDesktopVersion();
78
+ this.mediaQuery.removeListener(this.mediaQueryBind);
79
+ }
80
+ };
81
+ //#endregion
82
+ exports.default = Tablewrap;
package/_html/index.html CHANGED
@@ -1,17 +1,15 @@
1
- <!DOCTYPE html>
1
+ <!doctype html>
2
2
  <html lang="de">
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
- <meta
6
- name="viewport"
7
- content="width=device-width, initial-scale=1, maximum-scale=5, minimum-scale=1"
8
- />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5, minimum-scale=1" />
9
6
  <title>tablewrap</title>
10
- <link
11
- rel="stylesheet"
12
- href="http://yui.yahooapis.com/3.4.1/build/cssreset/cssreset-min.css"
13
- />
14
7
  <style>
8
+ * {
9
+ box-sizing: border-box;
10
+ margin: 0;
11
+ padding: 0;
12
+ }
15
13
  td {
16
14
  padding: 10px 5px;
17
15
  border: 1px solid #000;
package/_js/demo.js CHANGED
File without changes
package/_js/tablewrap.js CHANGED
@@ -1,8 +1,3 @@
1
- import 'mdn-polyfills/Array.prototype.forEach';
2
- import 'mdn-polyfills/NodeList.prototype.forEach';
3
- import 'mdn-polyfills/Node.prototype.remove';
4
- import 'mdn-polyfills/Node.prototype.after';
5
-
6
1
  export default class Tablewrap {
7
2
  args = {};
8
3
  tables = [];
package/package.json CHANGED
@@ -1,53 +1,43 @@
1
1
  {
2
2
  "scripts": {
3
- "js:browserify": "browserify ./_js/tablewrap.js --outfile ./_public/tablewrap.js --debug --transform babelify",
4
- "js:uglify": "uglifyjs --compress --mangle --output ./_public/tablewrap.js ./_public/tablewrap.js",
5
- "js:babel": "npx babel ./_js/ --out-dir ./_build/_js/",
6
- "js:demo:browserify": "browserify ./_js/demo.js --outfile ./_public/demo.js --debug --transform babelify",
7
- "js": "npm-run-all --sequential js:browserify js:uglify js:babel js:demo:browserify",
8
- "js:dev": "npm-run-all --sequential js:browserify js:babel js:demo:browserify",
9
- "html": "html-minifier --collapse-whitespace --output ./_public/index.html ./_html/index.html",
10
- "html:dev": "html-minifier --output ./_public/index.html ./_html/index.html",
11
- "browsersync": "from-env cross-var browser-sync start --reload-debounce 3000 --proxy %DOMAIN --files \"./_public/*.js\"",
12
- "watch:js": "onchange ./_js/*.js ./_js/**/*.js --initial --wait --delay 500 --await-write-finish -- onerror \"npm run js:dev --silent\" --title \"watch:js\" --message \"build failed\" --sound mute",
13
- "watch:html": "onchange ./_html/*.html ./_html/**/*.html --initial --wait --delay 500 --await-write-finish -- onerror \"npm run html:dev --silent\" --title \"watch:html\" --message \"build failed\" --sound mute",
14
- "build": "npm-run-all --parallel js html",
15
- "dev": "npm-run-all --parallel watch:* browsersync"
3
+ "js:vite": "vite build --logLevel error --mode dist",
4
+ "js:minify": "terser --compress --mangle --comments false --output ./_public/tablewrap.js ./_public/tablewrap.js",
5
+ "js:package": "vite build --logLevel error --mode package",
6
+ "js:demo:vite": "vite build --logLevel error --mode demo",
7
+ "js": "npm-run-all --sequential js:vite js:minify js:package js:demo:vite",
8
+ "js:dev": "npm-run-all --sequential js:vite js:package js:demo:vite",
9
+ "html": "html-minifier-next --collapse-whitespace --output ./_public/index.html ./_html/index.html",
10
+ "html:dev": "html-minifier-next --output ./_public/index.html ./_html/index.html",
11
+ "watch:js": "onchange ./_js/*.js ./_js/**/*.js --initial --poll 250 --delay 250 --await-write-finish 500 -- onerror \"npm run js:dev --silent\" --title \"watch:js\" --message \"build failed\" --sound mute",
12
+ "watch:html": "onchange ./_html/*.html ./_html/**/*.html --initial --poll 250 --delay 250 --await-write-finish 500 -- onerror \"npm run html:dev --silent\" --title \"watch:html\" --message \"build failed\" --sound mute",
13
+ "prod": "npm-run-all --parallel js html",
14
+ "dev": "npm-run-all --parallel watch:*"
16
15
  },
17
16
  "devDependencies": {
18
- "@babel/cli": "^7.2.3",
19
- "@babel/core": "^7.3.4",
20
- "@babel/plugin-proposal-class-properties": "^7.3.4",
21
- "@babel/plugin-proposal-object-rest-spread": "^7.3.4",
22
- "@babel/plugin-proposal-optional-chaining": "^7.2.0",
23
- "@babel/plugin-transform-runtime": "^7.3.4",
24
- "@babel/polyfill": "^7.2.5",
25
- "@babel/preset-env": "^7.3.4",
26
- "@babel/runtime": "^7.3.4",
27
- "babelify": "^10.0.0",
28
- "browser-sync": "^2.26.3",
29
- "browserify": "^16.2.3",
30
- "cli-error-notifier": "^2.1.0",
31
- "cross-var": "^1.1.0",
32
- "eslint": "^5.14.1",
33
- "from-env": "^1.1.2",
34
- "html-minifier": "^4.0.0",
35
- "mdn-polyfills": "^5.16.0",
36
- "node-sass": "^4.11.0",
17
+ "cli-error-notifier": "^3.0.2",
18
+ "eslint": "^10.5.0",
19
+ "html-minifier-next": "^7.0.0",
37
20
  "npm-run-all": "^4.1.5",
38
- "onchange": "^5.2.0",
39
- "postcss-cli": "^6.1.2",
40
- "postcss-url": "^8.0.0",
41
- "uglify": "^0.1.5"
21
+ "onchange": "^7.1.0",
22
+ "postcss-cli": "^11.0.1",
23
+ "postcss-url": "^10.1.4",
24
+ "terser": "^5.48.0",
25
+ "vite": "^8.0.16"
26
+ },
27
+ "overrides": {
28
+ "@babel/core": "^7.29.7",
29
+ "shell-quote": "^1.8.4",
30
+ "uuid": "^11.1.1",
31
+ "ws": "^8.21.0"
42
32
  },
43
33
  "name": "tablewrap",
44
- "version": "1.0.5",
34
+ "version": "1.1.3",
45
35
  "description": "",
46
36
  "main": "_build/_js/tablewrap.js",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+ssh://git@github.com/vielhuber/tablewrap.git"
40
+ },
47
41
  "author": "",
48
- "license": "ISC",
49
- "browserslist": [
50
- "> 0.25%",
51
- "not dead"
52
- ]
42
+ "license": "ISC"
53
43
  }
package/postcss.config.js CHANGED
File without changes
package/tablewrap.gif CHANGED
File without changes
package/vite.config.js ADDED
@@ -0,0 +1,61 @@
1
+ import { defineConfig } from 'vite';
2
+
3
+ export default defineConfig(({ mode }) => {
4
+ if (mode === 'dist') {
5
+ return {
6
+ build: {
7
+ outDir: '_public',
8
+ rollupOptions: {
9
+ input: './_js/tablewrap.js',
10
+ output: {
11
+ format: 'iife',
12
+ entryFileNames: 'tablewrap.js',
13
+ },
14
+ },
15
+ sourcemap: false,
16
+ minify: false,
17
+ emptyOutDir: false,
18
+ },
19
+ };
20
+ }
21
+ if (mode === 'demo') {
22
+ return {
23
+ build: {
24
+ outDir: '_public',
25
+ rollupOptions: {
26
+ input: './_js/demo.js',
27
+ output: {
28
+ format: 'iife',
29
+ entryFileNames: 'demo.js',
30
+ },
31
+ },
32
+ sourcemap: false,
33
+ minify: false,
34
+ emptyOutDir: false,
35
+ },
36
+ };
37
+ }
38
+ if (mode === 'package') {
39
+ return {
40
+ build: {
41
+ outDir: '_build/_js',
42
+ lib: {
43
+ entry: {
44
+ tablewrap: './_js/tablewrap.js',
45
+ demo: './_js/demo.js',
46
+ },
47
+ formats: ['cjs'],
48
+ fileName: (format, entryName) => entryName + '.js',
49
+ },
50
+ rollupOptions: {
51
+ output: {
52
+ exports: 'named',
53
+ },
54
+ },
55
+ sourcemap: false,
56
+ minify: false,
57
+ emptyOutDir: false,
58
+ },
59
+ };
60
+ }
61
+ });
package/.babelrc DELETED
@@ -1,15 +0,0 @@
1
- {
2
- "presets": [
3
- [
4
- "@babel/preset-env",
5
- {
6
- "shippedProposals": true
7
- }
8
- ]
9
- ],
10
- "plugins": [
11
- "@babel/plugin-transform-runtime",
12
- "@babel/plugin-proposal-class-properties",
13
- "@babel/plugin-proposal-optional-chaining"
14
- ]
15
- }