text-slicer 1.2.0 → 1.3.1-dev.0

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/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  </div>
11
11
 
12
12
  <p align="center">TextSlicer is designed to split text within an HTML element into separate words and/or characters, wrapping each word and/or character in separate span elements.</p>
13
- <p align="center"><sup>850B gzipped</sup></p>
13
+ <p align="center"><sup>1kB gzipped</sup></p>
14
14
  <p align="center"><a href="https://codepen.io/ux-ui/full/vYMoGoG">Demo</a></p>
15
15
  <br>
16
16
 
package/dist/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";var l=Object.defineProperty;var d=(a,t,e)=>t in a?l(a,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[t]=e;var i=(a,t,e)=>d(a,typeof t!="symbol"?t+"":t,e);class o{constructor(t={}){i(this,"textElement");i(this,"originalText");i(this,"splitMode");i(this,"cssVariables");i(this,"dataAttributes");i(this,"charIndexCounter");var e;if(this.textElement=t.container instanceof HTMLElement?t.container:document.querySelector(t.container||".text-slicer"),!this.textElement)return this.originalText="",this.splitMode="both",this.cssVariables=!1,this.dataAttributes=!1,void(this.charIndexCounter=0);this.originalText=((e=this.textElement.textContent)==null?void 0:e.trim())||"",this.splitMode=t.splitMode||"both",this.cssVariables=t.cssVariables||!1,this.dataAttributes=t.dataAttributes||!1,this.charIndexCounter=0}split(){if(!this.textElement)return;this.clear(),this.charIndexCounter=0;const t=document.createDocumentFragment(),e=this.originalText.split(" "),s=this.originalText.length;this.splitMode==="words"||this.splitMode==="both"?this.splitWords(t,e):this.splitMode==="chars"&&this.splitChars(t),this.textElement.appendChild(t),this.cssVariables&&(this.textElement.style.setProperty("--word-total",e.length.toString()),this.textElement.style.setProperty("--char-total",s.toString()))}splitWords(t,e){e.forEach((s,n)=>{if(this.splitMode==="both"){const r=this.createWordSpan(n,s);s.split("").forEach(h=>{const c=this.createCharSpan(h);r.append(c)}),t.append(r)}else{const r=this.createWordSpan(n);r.append(document.createTextNode(s)),t.append(r)}n<e.length-1&&t.append(o.createSpaceSpan())})}splitChars(t){this.originalText.split("").forEach(e=>{const s=this.createCharSpan(e);t.append(s)})}createWordSpan(t,e=""){const s=document.createElement("span");return s.classList.add("word"),this.dataAttributes&&s.setAttribute("data-word",e),this.cssVariables&&s.style.setProperty("--word-index",t.toString()),s}createCharSpan(t){const e=document.createElement("span");return e.textContent=t,this.dataAttributes&&e.setAttribute("data-char",t),t===" "?e.classList.add("whitespace"):(e.classList.add("char"),this.cssVariables&&e.style.setProperty("--char-index",this.charIndexCounter.toString()),this.charIndexCounter+=1),e}static createSpaceSpan(){const t=document.createElement("span");return t.classList.add("whitespace"),t.textContent=" ",t}clear(){this.textElement&&(this.textElement.innerHTML="")}init(){this.split()}}module.exports=o;
1
+ "use strict";var c=Object.defineProperty;var o=(t,e,r)=>e in t?c(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var a=(t,e,r)=>o(t,typeof e!="symbol"?e+"":e,r);module.exports=class{constructor({container:t=".text-slicer",splitMode:e="both",cssVariables:r=!1,dataAttributes:n=!1}={}){a(this,"textElement");a(this,"originalText");a(this,"splitMode");a(this,"cssVariables");a(this,"dataAttributes");a(this,"charIndexCounter",0);var i,s;this.textElement=t instanceof HTMLElement?t:document.querySelector(t),this.originalText=((s=(i=this.textElement)==null?void 0:i.textContent)==null?void 0:s.trim())||"",this.splitMode=e,this.cssVariables=r,this.dataAttributes=n}init(){if(!this.textElement)return;this.clear(),this.charIndexCounter=0;const t=document.createDocumentFragment(),e=this.originalText.split(" ");switch(this.splitMode){case"words":this.renderWords(t,e,!1);break;case"chars":this.renderChars(t,this.originalText);break;case"both":this.renderWords(t,e,!0)}this.textElement.append(t),this.cssVariables&&(this.textElement.style.setProperty("--word-total",e.length.toString()),this.textElement.style.setProperty("--char-total",this.originalText.length.toString()))}renderWords(t,e,r){e.forEach((n,i)=>{const s=this.createSpan("word",n);this.cssVariables&&s.style.setProperty("--word-index",i.toString()),r?[...n].forEach(h=>s.append(this.createCharSpan(h))):s.textContent=n,t.append(s),i<e.length-1&&t.append(this.createSpaceSpan())})}renderChars(t,e){[...e].forEach(r=>t.append(this.createCharSpan(r)))}createCharSpan(t){const e=this.createSpan(t===" "?"whitespace":"char",t);return t!==" "&&this.cssVariables&&e.style.setProperty("--char-index",(this.charIndexCounter++).toString()),e}createSpan(t,e){const r=document.createElement("span");return r.classList.add(t),e&&(r.textContent=e,this.dataAttributes&&r.setAttribute(`data-${t}`,e)),r}createSpaceSpan(){return this.createSpan("whitespace"," ")}clear(){this.textElement&&(this.textElement.innerHTML="")}};
package/dist/index.d.ts CHANGED
@@ -1,23 +1,24 @@
1
- declare class TextSlicer {
1
+ type SplitMode = 'words' | 'chars' | 'both';
2
+ type TextSlicerOptions = {
3
+ container?: HTMLElement | string;
4
+ splitMode?: SplitMode;
5
+ cssVariables?: boolean;
6
+ dataAttributes?: boolean;
7
+ };
8
+ export default class TextSlicer {
2
9
  private readonly textElement;
3
- private originalText;
10
+ private readonly originalText;
4
11
  private readonly splitMode;
5
12
  private readonly cssVariables;
6
13
  private readonly dataAttributes;
7
14
  private charIndexCounter;
8
- constructor(options?: {
9
- container?: HTMLElement | string;
10
- splitMode?: 'words' | 'chars' | 'both';
11
- cssVariables?: boolean;
12
- dataAttributes?: boolean;
13
- });
14
- split(): void;
15
- private splitWords;
16
- private splitChars;
17
- private createWordSpan;
15
+ constructor({ container, splitMode, cssVariables, dataAttributes, }?: TextSlicerOptions);
16
+ init(): void;
17
+ private renderWords;
18
+ private renderChars;
18
19
  private createCharSpan;
19
- private static createSpaceSpan;
20
+ private createSpan;
21
+ private createSpaceSpan;
20
22
  private clear;
21
- init(): void;
22
23
  }
23
- export default TextSlicer;
24
+ export {};
package/dist/index.es.js CHANGED
@@ -1,64 +1,57 @@
1
- var l = Object.defineProperty;
2
- var d = (a, t, e) => t in a ? l(a, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : a[t] = e;
3
- var i = (a, t, e) => d(a, typeof t != "symbol" ? t + "" : t, e);
4
- class o {
5
- constructor(t = {}) {
6
- i(this, "textElement");
7
- i(this, "originalText");
8
- i(this, "splitMode");
9
- i(this, "cssVariables");
10
- i(this, "dataAttributes");
11
- i(this, "charIndexCounter");
12
- var e;
13
- if (this.textElement = t.container instanceof HTMLElement ? t.container : document.querySelector(t.container || ".text-slicer"), !this.textElement) return this.originalText = "", this.splitMode = "both", this.cssVariables = !1, this.dataAttributes = !1, void (this.charIndexCounter = 0);
14
- this.originalText = ((e = this.textElement.textContent) == null ? void 0 : e.trim()) || "", this.splitMode = t.splitMode || "both", this.cssVariables = t.cssVariables || !1, this.dataAttributes = t.dataAttributes || !1, this.charIndexCounter = 0;
1
+ var o = Object.defineProperty;
2
+ var l = (n, t, e) => t in n ? o(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
3
+ var a = (n, t, e) => l(n, typeof t != "symbol" ? t + "" : t, e);
4
+ class p {
5
+ constructor({ container: t = ".text-slicer", splitMode: e = "both", cssVariables: r = !1, dataAttributes: i = !1 } = {}) {
6
+ a(this, "textElement");
7
+ a(this, "originalText");
8
+ a(this, "splitMode");
9
+ a(this, "cssVariables");
10
+ a(this, "dataAttributes");
11
+ a(this, "charIndexCounter", 0);
12
+ var h, s;
13
+ this.textElement = t instanceof HTMLElement ? t : document.querySelector(t), this.originalText = ((s = (h = this.textElement) == null ? void 0 : h.textContent) == null ? void 0 : s.trim()) || "", this.splitMode = e, this.cssVariables = r, this.dataAttributes = i;
15
14
  }
16
- split() {
15
+ init() {
17
16
  if (!this.textElement) return;
18
17
  this.clear(), this.charIndexCounter = 0;
19
- const t = document.createDocumentFragment(), e = this.originalText.split(" "), s = this.originalText.length;
20
- this.splitMode === "words" || this.splitMode === "both" ? this.splitWords(t, e) : this.splitMode === "chars" && this.splitChars(t), this.textElement.appendChild(t), this.cssVariables && (this.textElement.style.setProperty("--word-total", e.length.toString()), this.textElement.style.setProperty("--char-total", s.toString()));
21
- }
22
- splitWords(t, e) {
23
- e.forEach((s, n) => {
24
- if (this.splitMode === "both") {
25
- const r = this.createWordSpan(n, s);
26
- s.split("").forEach((h) => {
27
- const c = this.createCharSpan(h);
28
- r.append(c);
29
- }), t.append(r);
30
- } else {
31
- const r = this.createWordSpan(n);
32
- r.append(document.createTextNode(s)), t.append(r);
33
- }
34
- n < e.length - 1 && t.append(o.createSpaceSpan());
35
- });
36
- }
37
- splitChars(t) {
38
- this.originalText.split("").forEach((e) => {
39
- const s = this.createCharSpan(e);
40
- t.append(s);
18
+ const t = document.createDocumentFragment(), e = this.originalText.split(" ");
19
+ switch (this.splitMode) {
20
+ case "words":
21
+ this.renderWords(t, e, !1);
22
+ break;
23
+ case "chars":
24
+ this.renderChars(t, this.originalText);
25
+ break;
26
+ case "both":
27
+ this.renderWords(t, e, !0);
28
+ }
29
+ this.textElement.append(t), this.cssVariables && (this.textElement.style.setProperty("--word-total", e.length.toString()), this.textElement.style.setProperty("--char-total", this.originalText.length.toString()));
30
+ }
31
+ renderWords(t, e, r) {
32
+ e.forEach((i, h) => {
33
+ const s = this.createSpan("word", i);
34
+ this.cssVariables && s.style.setProperty("--word-index", h.toString()), r ? [...i].forEach((c) => s.append(this.createCharSpan(c))) : s.textContent = i, t.append(s), h < e.length - 1 && t.append(this.createSpaceSpan());
41
35
  });
42
36
  }
43
- createWordSpan(t, e = "") {
44
- const s = document.createElement("span");
45
- return s.classList.add("word"), this.dataAttributes && s.setAttribute("data-word", e), this.cssVariables && s.style.setProperty("--word-index", t.toString()), s;
37
+ renderChars(t, e) {
38
+ [...e].forEach((r) => t.append(this.createCharSpan(r)));
46
39
  }
47
40
  createCharSpan(t) {
48
- const e = document.createElement("span");
49
- return e.textContent = t, this.dataAttributes && e.setAttribute("data-char", t), t === " " ? e.classList.add("whitespace") : (e.classList.add("char"), this.cssVariables && e.style.setProperty("--char-index", this.charIndexCounter.toString()), this.charIndexCounter += 1), e;
41
+ const e = this.createSpan(t === " " ? "whitespace" : "char", t);
42
+ return t !== " " && this.cssVariables && e.style.setProperty("--char-index", (this.charIndexCounter++).toString()), e;
50
43
  }
51
- static createSpaceSpan() {
52
- const t = document.createElement("span");
53
- return t.classList.add("whitespace"), t.textContent = " ", t;
44
+ createSpan(t, e) {
45
+ const r = document.createElement("span");
46
+ return r.classList.add(t), e && (r.textContent = e, this.dataAttributes && r.setAttribute(`data-${t}`, e)), r;
47
+ }
48
+ createSpaceSpan() {
49
+ return this.createSpan("whitespace", " ");
54
50
  }
55
51
  clear() {
56
52
  this.textElement && (this.textElement.innerHTML = "");
57
53
  }
58
- init() {
59
- this.split();
60
- }
61
54
  }
62
55
  export {
63
- o as default
56
+ p as default
64
57
  };
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(s,n){typeof exports=="object"&&typeof module<"u"?module.exports=n():typeof define=="function"&&define.amd?define(n):(s=typeof globalThis<"u"?globalThis:s||self).TextSlicer=n()})(this,function(){"use strict";var l=Object.defineProperty;var d=(s,n,t)=>n in s?l(s,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[n]=t;var a=(s,n,t)=>d(s,typeof n!="symbol"?n+"":n,t);class s{constructor(t={}){a(this,"textElement");a(this,"originalText");a(this,"splitMode");a(this,"cssVariables");a(this,"dataAttributes");a(this,"charIndexCounter");var e;if(this.textElement=t.container instanceof HTMLElement?t.container:document.querySelector(t.container||".text-slicer"),!this.textElement)return this.originalText="",this.splitMode="both",this.cssVariables=!1,this.dataAttributes=!1,void(this.charIndexCounter=0);this.originalText=((e=this.textElement.textContent)==null?void 0:e.trim())||"",this.splitMode=t.splitMode||"both",this.cssVariables=t.cssVariables||!1,this.dataAttributes=t.dataAttributes||!1,this.charIndexCounter=0}split(){if(!this.textElement)return;this.clear(),this.charIndexCounter=0;const t=document.createDocumentFragment(),e=this.originalText.split(" "),i=this.originalText.length;this.splitMode==="words"||this.splitMode==="both"?this.splitWords(t,e):this.splitMode==="chars"&&this.splitChars(t),this.textElement.appendChild(t),this.cssVariables&&(this.textElement.style.setProperty("--word-total",e.length.toString()),this.textElement.style.setProperty("--char-total",i.toString()))}splitWords(t,e){e.forEach((i,o)=>{if(this.splitMode==="both"){const r=this.createWordSpan(o,i);i.split("").forEach(c=>{const h=this.createCharSpan(c);r.append(h)}),t.append(r)}else{const r=this.createWordSpan(o);r.append(document.createTextNode(i)),t.append(r)}o<e.length-1&&t.append(s.createSpaceSpan())})}splitChars(t){this.originalText.split("").forEach(e=>{const i=this.createCharSpan(e);t.append(i)})}createWordSpan(t,e=""){const i=document.createElement("span");return i.classList.add("word"),this.dataAttributes&&i.setAttribute("data-word",e),this.cssVariables&&i.style.setProperty("--word-index",t.toString()),i}createCharSpan(t){const e=document.createElement("span");return e.textContent=t,this.dataAttributes&&e.setAttribute("data-char",t),t===" "?e.classList.add("whitespace"):(e.classList.add("char"),this.cssVariables&&e.style.setProperty("--char-index",this.charIndexCounter.toString()),this.charIndexCounter+=1),e}static createSpaceSpan(){const t=document.createElement("span");return t.classList.add("whitespace"),t.textContent=" ",t}clear(){this.textElement&&(this.textElement.innerHTML="")}init(){this.split()}}return s});
1
+ (function(t,e){typeof exports=="object"&&typeof module<"u"?module.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).TextSlicer=e()})(this,function(){"use strict";var c=Object.defineProperty;var h=(t,e,s)=>e in t?c(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var a=(t,e,s)=>h(t,typeof e!="symbol"?e+"":e,s);return class{constructor({container:t=".text-slicer",splitMode:e="both",cssVariables:s=!1,dataAttributes:n=!1}={}){a(this,"textElement");a(this,"originalText");a(this,"splitMode");a(this,"cssVariables");a(this,"dataAttributes");a(this,"charIndexCounter",0);var i,r;this.textElement=t instanceof HTMLElement?t:document.querySelector(t),this.originalText=((r=(i=this.textElement)==null?void 0:i.textContent)==null?void 0:r.trim())||"",this.splitMode=e,this.cssVariables=s,this.dataAttributes=n}init(){if(!this.textElement)return;this.clear(),this.charIndexCounter=0;const t=document.createDocumentFragment(),e=this.originalText.split(" ");switch(this.splitMode){case"words":this.renderWords(t,e,!1);break;case"chars":this.renderChars(t,this.originalText);break;case"both":this.renderWords(t,e,!0)}this.textElement.append(t),this.cssVariables&&(this.textElement.style.setProperty("--word-total",e.length.toString()),this.textElement.style.setProperty("--char-total",this.originalText.length.toString()))}renderWords(t,e,s){e.forEach((n,i)=>{const r=this.createSpan("word",n);this.cssVariables&&r.style.setProperty("--word-index",i.toString()),s?[...n].forEach(o=>r.append(this.createCharSpan(o))):r.textContent=n,t.append(r),i<e.length-1&&t.append(this.createSpaceSpan())})}renderChars(t,e){[...e].forEach(s=>t.append(this.createCharSpan(s)))}createCharSpan(t){const e=this.createSpan(t===" "?"whitespace":"char",t);return t!==" "&&this.cssVariables&&e.style.setProperty("--char-index",(this.charIndexCounter++).toString()),e}createSpan(t,e){const s=document.createElement("span");return s.classList.add(t),e&&(s.textContent=e,this.dataAttributes&&s.setAttribute(`data-${t}`,e)),s}createSpaceSpan(){return this.createSpan("whitespace"," ")}clear(){this.textElement&&(this.textElement.innerHTML="")}}});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "text-slicer",
3
- "version": "1.2.0",
3
+ "version": "1.3.1-dev.0",
4
4
  "description": "TextSlicer is designed to split text within an HTML element into separate words and/or characters, wrapping each word and/or character in separate span elements.",
5
5
  "author": "ux-ui.pro",
6
6
  "license": "MIT",
@@ -16,39 +16,43 @@
16
16
  "scripts": {
17
17
  "clean": "rimraf dist",
18
18
  "build": "vite build",
19
- "lint:js": "eslint **/*.{ts,js}",
20
- "lint:fix:js": "eslint **/*.{ts,js} --fix",
21
- "format:js": "prettier --write **/*.{ts,js}",
19
+ "lint:js": "eslint src/**/*.{ts,js}",
20
+ "lint:fix:js": "eslint src/**/*.{ts,js} --fix",
21
+ "format:js": "prettier --write src/**/*.{ts,js}",
22
22
  "lint:fix": "yarn lint:fix:js && yarn format:js"
23
23
  },
24
24
  "source": "src/index.ts",
25
25
  "main": "dist/index.cjs.js",
26
26
  "module": "dist/index.es.js",
27
+ "browser": "./dist/index.umd.js",
27
28
  "types": "dist/index.d.ts",
28
29
  "exports": {
29
- "types": "./dist/index.d.ts",
30
- "import": "./dist/index.es.js",
31
- "require": "./dist/index.cjs.js"
30
+ ".": {
31
+ "require": "./dist/index.cjs.js",
32
+ "import": "./dist/index.es.js",
33
+ "default": "./dist/index.umd.js"
34
+ },
35
+ "./dist/*": "./dist/*"
32
36
  },
33
37
  "files": [
34
38
  "dist/"
35
39
  ],
36
40
  "devDependencies": {
37
- "@eslint/js": "9.21.0",
41
+ "@eslint/js": "9.22.0",
38
42
  "@rollup/plugin-terser": "0.4.4",
39
- "@types/node": "22.13.8",
40
- "@typescript-eslint/eslint-plugin": "8.25.0",
41
- "@typescript-eslint/parser": "8.25.0",
42
- "eslint": "9.18.0",
43
- "eslint-config-prettier": "10.0.2",
43
+ "@types/node": "22.13.10",
44
+ "@typescript-eslint/eslint-plugin": "8.26.0",
45
+ "@typescript-eslint/parser": "8.26.0",
46
+ "eslint": "9.22.0",
47
+ "eslint-config-prettier": "10.1.1",
44
48
  "eslint-import-resolver-typescript": "3.8.3",
45
49
  "eslint-plugin-import": "2.31.0",
46
50
  "globals": "16.0.0",
47
- "prettier": "3.5.2",
51
+ "prettier": "3.5.3",
48
52
  "rimraf": "6.0.1",
49
53
  "typescript": "5.8.2",
50
- "vite": "6.2.0",
51
- "vite-plugin-dts": "4.5.1"
54
+ "vite": "6.2.1",
55
+ "vite-plugin-dts": "4.5.3"
52
56
  },
53
57
  "keywords": [
54
58
  "text",
@@ -60,11 +64,8 @@
60
64
  "effects",
61
65
  "fragment",
62
66
  "words",
63
- "characters",
64
67
  "HTML",
65
- "processing",
66
68
  "CSS",
67
- "variables",
68
69
  "web",
69
70
  "development",
70
71
  "frontend",
@@ -73,8 +74,6 @@
73
74
  "custom",
74
75
  "effects",
75
76
  "textslicer",
76
- "js",
77
- "webdev",
78
- "textprocessing"
77
+ "js"
79
78
  ]
80
79
  }