{"_id":"@acusti/textual","_rev":"13-919d1ea0f037b376e4987626b9ec1c88","name":"@acusti/textual","dist-tags":{"latest":"0.10.0"},"versions":{"0.1.0":{"name":"@acusti/textual","version":"0.1.0","author":{"url":"http://acusti.ca","name":"andrew patton","email":"andrew@acusti.ca"},"license":"Unlicense","_id":"@acusti/textual@0.1.0","maintainers":[{"name":"acusti","email":"andrew@acusti.ca"}],"homepage":"https://github.com/acusti/uikit/tree/main/packages/textual#readme","bugs":{"url":"https://github.com/acusti/uikit/issues"},"dist":{"shasum":"ad53f845d5ca0d0be30d2da4371ca61f4ed2ff39","tarball":"https://registry.npmjs.org/@acusti/textual/-/textual-0.1.0.tgz","fileCount":6,"integrity":"sha512-W0cG+3Gxv6jSS/fWbTMD5rhNf0XtLZujU8e1STVO/yQj7rYBIsuNc4BvM0y7of+sc0nXSsPhA/jhIqn3ALpcZg==","signatures":[{"sig":"MEUCICvWbLKKvv0sxxZh7lAMp7IshiRVNuuiTKiCpdc6aftqAiEAumFzqBu4C4s3Pqjd3cyn6EbfMkM0iPrs7xifmSKVSvM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":4462,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhMUHnCRA9TVsSAnZWagAAnS8P/0Z2lVgqLinHZxpmACuC\nG2zBUzvL/DCF/stebyLHfXo23tlVzER5I34sGqGyffxn2tVyvM7IHNSGhMcZ\nhCFxCfbJqQsohnUUNxPDQ/M4JUehJuIfUincXPjmZnEoLp8JwgGSeP7aTZFy\nroZ9nT/W56yaxdBASIDbf82pxY47uXt9tKrofydZB2XtZc3G+jVqzqZb+IZC\nUoi4zAlJ+NA3Osdbc9BRKKPhR7N+gN19lzvY4WjylfZHn7Dyyzaj2oPx8E4W\n0WROnlkXSlOlWxFpVFfpdOorhPZS3F5jerN1e/OjJ5WX61qJuT0XSVksOf8n\nILU+UU6rZ8YT9ubImRa0ay8GFTlentrkAVwm7CPCF4oRM/YLy+9WuuNOpuAB\nmud3CH7/seBYsKW6rz0E/X6DukalAw+jcrcETnmnf21CG5F3SXiNyZA+Hf1G\nF0xe6aYQ5Q2gRIa+2XZJgVlDTx3pYo0Lp2gMbT9Wgs3Gwim7eo3KtD3tWHMj\naWDDrtuXxaanCfgAKaHAbbhpOCb6y4l2vvUUBPABGnmfOWfuuoO5KKFR6D1G\nuKT55u0fWMH+I0YSVOzT/NmveWk/l07+peqDm+8HDvAYhloXxEQUpRU+VGHy\nT47HfozHE4OrerLoOQXDvEm3igTxdZPsDwaXfyGuFSXZUooBV/N12iOIYQOZ\n5UKa\r\n=IjQM\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","_npmUser":{"name":"acusti","email":"andrew@acusti.ca"},"repository":{"url":"git+https://github.com/acusti/uikit.git","type":"git"},"_npmVersion":"7.20.6","description":"[![latest version](https://img.shields.io/npm/v/@acusti/textual?style=for-the-badge)](https://www.npmjs.com/package/@acusti/textual) [![dependencies status](https://img.shields.io/david/acusti/uikit?path=packages%2Ftextual&style=for-the-badge)](https://da","directories":{},"sideEffects":false,"_nodeVersion":"16.6.2","_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.2.3"},"_npmOperationalInternal":{"tmp":"tmp/textual_0.1.0_1630618087279_0.06394009767760123","host":"s3://npm-registry-packages"}},"0.2.0":{"name":"@acusti/textual","version":"0.2.0","author":{"url":"https://www.acusti.ca","name":"andrew patton","email":"andrew@acusti.ca"},"license":"Unlicense","_id":"@acusti/textual@0.2.0","maintainers":[{"name":"acusti","email":"andrew@acusti.ca"}],"homepage":"https://github.com/acusti/uikit/tree/main/packages/textual#readme","bugs":{"url":"https://github.com/acusti/uikit/issues"},"dist":{"shasum":"e00f802944279775ed83bb09934d0058edf368c7","tarball":"https://registry.npmjs.org/@acusti/textual/-/textual-0.2.0.tgz","fileCount":8,"integrity":"sha512-xndifI9IZUCG3IEWdbRU2ZnDQrc3iVglaSqvI38tbxpRIAEk+EDhwTFEez2ESBRcBiAauowJlDmymlo6wC+dzw==","signatures":[{"sig":"MEUCIQCfL4H+xOpEmYYsQBp+NvHY1oP6jd5iDL2qDsjblqyNQAIgLvMLzxhAm03O31XYLqAifbyxiIhFRLSu0onuvtqyMIw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":10483,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiL7qrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrhBg/8CwjLWyLGtsSs5WhxV/XKgY/MogO9y/WfAiRCnSqQmKU/gNRv\r\ntRv5irwXpSodtblmw/kFeDGPzUSNe3ETMaBaTjKenQHuihOykCrSv/RhjxNA\r\nJ3jzxpbdhyX7GEoAqnqn9kuAcy44CiyCXWwq8XsU9wTqX+Yo/JETlwP3aAWc\r\nthbQRqD4GaxXka3kCAywnrDFnHD90/FHrvnHSUphrPXbNUmhxJsxJOjZh6Lz\r\nRLCj920xqncD9zzEO+goFi6J+TB1nHB2lUQp/7CqEvLYcYttXAwWVwW4gD5m\r\nDSdICCFQ2F4BVEIG1w+mvn1gPMmoVMQznSD8RQT2zoUIsYG13lDGccmMg6G5\r\nOZGW7cO1xvH8LRJ8coZWlXCIF8qHJHBvcptHkbtnN/R4eYYfQyGGRPiD0bJx\r\nWKVINIBIulYHPUssgHs5uqnFaSr1RatV4pvspp4/q1M4GrGDhAVjJnymjcIZ\r\nBhfnqioPmuNQojtLdzJbAdcotPGOTmATMh1ZLpkVGSywYf7CAT3fljPH80dk\r\nkLiF22ZEa96CatpsOgnlM3NNmBsS2XyNDvdrhBFK7V9z5dxt3Ej4PnlDwriY\r\nS+NRWnfBBrBofEuT5SphZ2X+zQuQWzXTAgj1vSs4IbAPe7IMmhmWCDHwIZD3\r\nTKUB4hyrk5wk+39IMlrcGUBmCvmS/aTYG88=\r\n=27yL\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"ec629a640ddaf864fe3ff9dfa5cb91f315a483bd","_npmUser":{"name":"acusti","email":"andrew@acusti.ca"},"repository":{"url":"git+https://github.com/acusti/uikit.git","type":"git"},"_npmVersion":"8.5.4","description":"[![latest version](https://img.shields.io/npm/v/@acusti/textual?style=for-the-badge)](https://www.npmjs.com/package/@acusti/textual) [![dependencies status](https://img.shields.io/david/acusti/uikit?path=packages%2Ftextual&style=for-the-badge)](https://da","directories":{},"sideEffects":false,"_nodeVersion":"17.3.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.4.3"},"_npmOperationalInternal":{"tmp":"tmp/textual_0.2.0_1647295147740_0.6945866816045754","host":"s3://npm-registry-packages"}},"0.3.0":{"name":"@acusti/textual","version":"0.3.0","keywords":["utils","utilities","string","text","format","formatting","typescript","ts","flow","isomorphic","universal"],"author":{"url":"https://www.acusti.ca","name":"andrew patton","email":"andrew@acusti.ca"},"license":"Unlicense","_id":"@acusti/textual@0.3.0","maintainers":[{"name":"acusti","email":"andrew@acusti.ca"}],"homepage":"https://github.com/acusti/uikit/tree/main/packages/textual#readme","bugs":{"url":"https://github.com/acusti/uikit/issues"},"dist":{"shasum":"a775ffb2f3380266e847266fb8d2dfaed95b816b","tarball":"https://registry.npmjs.org/@acusti/textual/-/textual-0.3.0.tgz","fileCount":8,"integrity":"sha512-/odqEYhCL2WXVOAgdadrxjq2yHVZjvdieWM7ZgurbXgKCevMQ0jH9yf6VTjHmDGy0pA27lIw0TnV09DSld/3Jw==","signatures":[{"sig":"MEYCIQCeNHc5USNKDYMl2rv+sOKoyiEeDsKJmsz8cRF5iBKC8gIhAMGo+kIDnktfCSEFtnJiYjOto4aKzCndPJ2NuapsIwV7","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":11067,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjiWBbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr+xRAAkD2WbfkIqIp+Qr/qatlRR5UuuQ8lr5z5eEPqTiWV6cdvoUZA\r\nteDoppuSaz2RImTh8e8vQFWwE+ihfS7IOSoOvURJX7yMRxjD9bkdwKnjKVSz\r\niweMrzuVncFJLsEfm7/9ht5wRUTLR2HcFDThjBHQC8LmTW+4Af2mNBH27Zgj\r\nv+8NYPFIZHzC8VOaXsQm+z2f7FDvbVCrTaw2bGFyYN6UrCxgpg1Wn76k2QvS\r\nHPr/0rCR4aBGjscNmMGx9c0sPHiZyCRFMSzz5MftLdRLze+6blbDwWbxPd8K\r\nrButpGPqYDXG9LOA6cUO1QQaSWqIec7xbvPuP6tvmGWHNihuBNt2y15v7Ece\r\nx2ksQlMpTgPOR9tIFQ4AosDXK8KkUegUH+OIMJd2lYczRTljNY8lqFz1wrhg\r\nFHNKyMoQ/uTDbiQ9ez4AF8ggx8rxqQ9IWWyjoyXCbsRlx8WPdbLhXPOgw21I\r\nrywJiZ3gPtFPy/YqR1Crk+xK6WK+uH9/8Mr+uq6HrjNWBK4QyyjubKpRqemp\r\nrFcKFRbsfbSmDcw652sCqIWGZF/VymAmd++LE6fGfigcLw53a2o1uyYSEdfb\r\npDL6q9moPXlJ5hkiA0iWBYhur79jtbtNuPpF4sFoEE1+qaqJX0RMr+M3biYW\r\n/FRkQ3fc2q/96P8xSdGyGnOOPX/7QSYnHwM=\r\n=FekC\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"49610e9d477c3c96b490fb374215117eae6d4996","_npmUser":{"name":"acusti","email":"andrew@acusti.ca"},"repository":{"url":"git+https://github.com/acusti/uikit.git","type":"git","directory":"packages/textual"},"_npmVersion":"8.15.0","description":"Utilities for transforming and formatting text (i.e. strings)","directories":{},"sideEffects":false,"_nodeVersion":"18.7.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.9.3"},"_npmOperationalInternal":{"tmp":"tmp/textual_0.3.0_1669947483071_0.6343780642617443","host":"s3://npm-registry-packages"}},"0.4.0":{"name":"@acusti/textual","version":"0.4.0","keywords":["utils","utilities","string","text","format","formatting","typescript","ts","flow","isomorphic","universal"],"author":{"url":"https://www.acusti.ca","name":"andrew patton","email":"andrew@acusti.ca"},"license":"Unlicense","_id":"@acusti/textual@0.4.0","maintainers":[{"name":"acusti","email":"andrew@acusti.ca"}],"homepage":"https://github.com/acusti/uikit/tree/main/packages/textual#readme","bugs":{"url":"https://github.com/acusti/uikit/issues"},"dist":{"shasum":"e29f775c67ac333ee4dcea21b970bd94a4efa0b2","tarball":"https://registry.npmjs.org/@acusti/textual/-/textual-0.4.0.tgz","fileCount":12,"integrity":"sha512-W+JC/3ktCXj4E3kaNMd6eWmPhP0Sqv2kVqct8PAZ2YsXl2+NcfVniMU04uuayIevDJfRdA3qI6MHdquO1+qhFA==","signatures":[{"sig":"MEYCIQDUZl3sK/+v51bycQf9p5DoGqo1ntbzDtH8n8/8wQyjEAIhAPlo+ITEsXTjgIH9pBNq+k9lYLIsCBaeooxYtEmFDkOX","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":19333},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"254fc34d4cced0e04858c8e97dbf4b53b662d4d7","_npmUser":{"name":"acusti","email":"andrew@acusti.ca"},"repository":{"url":"git+https://github.com/acusti/uikit.git","type":"git","directory":"packages/textual"},"_npmVersion":"10.2.3","description":"Utilities for transforming and formatting text (i.e. strings)","directories":{},"sideEffects":false,"_nodeVersion":"20.10.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.1.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/textual_0.4.0_1703790195939_0.10739572222037741","host":"s3://npm-registry-packages"}},"0.4.1":{"name":"@acusti/textual","version":"0.4.1","keywords":["utils","utilities","string","text","format","formatting","typescript","ts","flow","isomorphic","universal"],"author":{"url":"https://www.acusti.ca","name":"andrew patton","email":"andrew@acusti.ca"},"license":"Unlicense","_id":"@acusti/textual@0.4.1","maintainers":[{"name":"acusti","email":"andrew@acusti.ca"}],"homepage":"https://github.com/acusti/uikit/tree/main/packages/textual#readme","bugs":{"url":"https://github.com/acusti/uikit/issues"},"dist":{"shasum":"7d37c0d9974c37ee59f555d0fad5b9daba572d25","tarball":"https://registry.npmjs.org/@acusti/textual/-/textual-0.4.1.tgz","fileCount":12,"integrity":"sha512-XPjhe8n5hs/lDiZyYyR35U3aifzSycyA8W8FSV1GZ9Jc2imuVQo8KsgMP+5nk7zphwdYpzKo1kRhabVPYIy2Ig==","signatures":[{"sig":"MEQCIEN/xqlqCTqlia/qeelu3nMAFv4zBP4+oxfcUPn6yiJ5AiB4VV14gZBej3TlXb0h6sDErkxIV0li+O0033CeScIvZQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":19382},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"e9c6481223323731573761a49dbbc62670eae094","scripts":{"test":"vitest"},"_npmUser":{"name":"acusti","email":"andrew@acusti.ca"},"repository":{"url":"git+https://github.com/acusti/uikit.git","type":"git","directory":"packages/textual"},"_npmVersion":"10.2.3","description":"Utilities for transforming and formatting text (i.e. strings)","directories":{},"sideEffects":false,"_nodeVersion":"20.10.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.1.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/textual_0.4.1_1705959849165_0.13141592837285487","host":"s3://npm-registry-packages"}},"0.5.0":{"name":"@acusti/textual","version":"0.5.0","keywords":["utils","utilities","string","text","format","formatting","typescript","ts","flow","isomorphic","universal"],"author":{"url":"https://www.acusti.ca","name":"andrew patton","email":"andrew@acusti.ca"},"license":"Unlicense","_id":"@acusti/textual@0.5.0","maintainers":[{"name":"acusti","email":"andrew@acusti.ca"}],"homepage":"https://github.com/acusti/uikit/tree/main/packages/textual#readme","bugs":{"url":"https://github.com/acusti/uikit/issues"},"dist":{"shasum":"cd8f22bb047aebff17bbc95ea774039bc53e42d0","tarball":"https://registry.npmjs.org/@acusti/textual/-/textual-0.5.0.tgz","fileCount":12,"integrity":"sha512-cOHnBhHxm2t6LZrffT6etP7RLtvTMTjl/PVhxeK8IRCjcDlOW4yLxOct1d3Sp5n4abaq1xfdxczZ0wv3ufychg==","signatures":[{"sig":"MEUCIEa8nCncXev3pN7a0qd52h5DZH87vSahuX3kTCqAR0i/AiEAi4hqDKyWlzOvIfEW0GScfk7cE7obyb27SMTc9cHhjw0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":20320},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"5a8cab13061e3279d8c0f278a86b0e06f01f034d","scripts":{"test":"vitest"},"_npmUser":{"name":"acusti","email":"andrew@acusti.ca"},"repository":{"url":"git+https://github.com/acusti/uikit.git","type":"git","directory":"packages/textual"},"_npmVersion":"10.2.3","description":"Utilities for transforming and formatting text (i.e. strings)","directories":{},"sideEffects":false,"_nodeVersion":"20.10.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.1.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/textual_0.5.0_1706031599440_0.9303139298487333","host":"s3://npm-registry-packages"}},"0.6.0":{"name":"@acusti/textual","version":"0.6.0","keywords":["utils","utilities","string","text","format","formatting","typescript","ts","flow","isomorphic","universal"],"author":{"url":"https://www.acusti.ca","name":"andrew patton","email":"andrew@acusti.ca"},"license":"Unlicense","_id":"@acusti/textual@0.6.0","maintainers":[{"name":"acusti","email":"andrew@acusti.ca"}],"homepage":"https://github.com/acusti/uikit/tree/main/packages/textual#readme","bugs":{"url":"https://github.com/acusti/uikit/issues"},"dist":{"shasum":"79343165acb323e7b81ca4cd62acf7f163e07d24","tarball":"https://registry.npmjs.org/@acusti/textual/-/textual-0.6.0.tgz","fileCount":12,"integrity":"sha512-/ReSL1bd3zt1AODzzTvggtGIjFvKDr80pKLuZEj3LQbgzNeCl2yc/GXkFVdym14a3fFh3HnKsvvgNXrc7xDhHg==","signatures":[{"sig":"MEUCIQCk9Yx/2nqifPmlifcxTad5J5a6D7DN0N3On9oxJKQuiwIgYWYJ/A14NE6vARJE+N03iev4jpq9s6KCsLohAbipymw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":23902},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"34e35ccdfd41ac5b8407d8284b73663d54108abf","scripts":{"test":"vitest"},"_npmUser":{"name":"acusti","email":"andrew@acusti.ca"},"repository":{"url":"git+https://github.com/acusti/uikit.git","type":"git","directory":"packages/textual"},"_npmVersion":"10.2.4","description":"Utilities for transforming and formatting text (i.e. strings)","directories":{},"sideEffects":false,"_nodeVersion":"21.6.2","_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.1.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/textual_0.6.0_1710523127606_0.28639887048259705","host":"s3://npm-registry-packages"}},"0.6.1":{"name":"@acusti/textual","version":"0.6.1","keywords":["utils","utilities","string","text","format","formatting","typescript","ts","flow","isomorphic","universal"],"author":{"url":"https://www.acusti.ca","name":"andrew patton","email":"andrew@acusti.ca"},"license":"Unlicense","_id":"@acusti/textual@0.6.1","maintainers":[{"name":"acusti","email":"andrew@acusti.ca"}],"homepage":"https://github.com/acusti/uikit/tree/main/packages/textual#readme","bugs":{"url":"https://github.com/acusti/uikit/issues"},"dist":{"shasum":"8a9551b00891db8745847b8a074b92201798037a","tarball":"https://registry.npmjs.org/@acusti/textual/-/textual-0.6.1.tgz","fileCount":12,"integrity":"sha512-kZXZNvdmfoaxCu1ytgj17xs/0dS95BVHBsbUyOsM8ukHgEQZj3a+XzV2DCbH4EJUAUZkXJMFaPyJP2wDkwW+Lg==","signatures":[{"sig":"MEYCIQDHwglFlqfSIYMWDBABww5ViYSdwcWALzyewg6pHSzCKwIhAM7zpQQSbnhufVbvjCvyyHcUf+2oB81mHhltO2b0911u","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24789},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"50f5d782fe23dbbaebb154beefa4e83b75059036","scripts":{"test":"vitest"},"_npmUser":{"name":"acusti","email":"andrew@acusti.ca"},"repository":{"url":"git+https://github.com/acusti/uikit.git","type":"git","directory":"packages/textual"},"_npmVersion":"10.2.4","description":"Utilities for transforming and formatting text (i.e. strings)","directories":{},"sideEffects":false,"_nodeVersion":"21.6.2","_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.1.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/textual_0.6.1_1710523507648_0.24649024074278292","host":"s3://npm-registry-packages"}},"0.7.0":{"name":"@acusti/textual","version":"0.7.0","keywords":["utils","utilities","string","text","format","formatting","typescript","ts","flow","isomorphic","universal"],"author":{"url":"https://www.acusti.ca","name":"andrew patton","email":"andrew@acusti.ca"},"license":"Unlicense","_id":"@acusti/textual@0.7.0","maintainers":[{"name":"acusti","email":"andrew@acusti.ca"}],"homepage":"https://github.com/acusti/uikit/tree/main/packages/textual#readme","bugs":{"url":"https://github.com/acusti/uikit/issues"},"dist":{"shasum":"9c10506d76c923dbd9d0c8c27121a0436fd82a72","tarball":"https://registry.npmjs.org/@acusti/textual/-/textual-0.7.0.tgz","fileCount":12,"integrity":"sha512-mXjfdu6LtESwrQ7r+bLwjkDcF82YV9ni1Sa8d6/0jZTRdhyrZtiRwPcLDciClnH3hX53vvEux0ak21cx3bWqPw==","signatures":[{"sig":"MEQCIB3eP1NVle7YI5Y6+rutm8k52TtbfIjQAU+Oun3Q9U9VAiBk0ccX5sLdNK9aZiXvdESYzE5w5rcdcHdxRE5/R+m+Jg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24246},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"138288ea0b9417f66942eb419e09a21f84e61fd6","scripts":{"test":"vitest"},"_npmUser":{"name":"acusti","email":"andrew@acusti.ca"},"repository":{"url":"git+https://github.com/acusti/uikit.git","type":"git","directory":"packages/textual"},"_npmVersion":"10.8.2","description":"Utilities for transforming and formatting text (i.e. strings)","directories":{},"sideEffects":false,"_nodeVersion":"22.7.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","typescript":"5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/textual_0.7.0_1734627327646_0.5327977189900486","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@acusti/textual","version":"0.8.0","keywords":["utils","utilities","string","text","format","formatting","typescript","ts","flow","isomorphic","universal"],"author":{"url":"https://www.acusti.ca","name":"andrew patton","email":"andrew@acusti.ca"},"license":"Unlicense","_id":"@acusti/textual@0.8.0","maintainers":[{"name":"acusti","email":"andrew@acusti.ca"}],"homepage":"https://github.com/acusti/uikit/tree/main/packages/textual#readme","bugs":{"url":"https://github.com/acusti/uikit/issues"},"dist":{"shasum":"aa73d63904aec3310edcd9faa117ab93e4c60856","tarball":"https://registry.npmjs.org/@acusti/textual/-/textual-0.8.0.tgz","fileCount":12,"integrity":"sha512-FaPVeimldQIKr21ihXGaTO4mL2NQE7OM+24vibj9ir95pfNZbi0j1K6zL9hG2wpTFmRbQFe+y3FfTFBsRNoaZQ==","signatures":[{"sig":"MEUCIEyEA/tiUTXQVyfb8iv8zd8eEohJ0btExnUlrx6S9e+jAiEAhYfsYarZ77t7OYZaXJaojNl/4YQ/xo4hi1GNL7icrBY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24212},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"f7b9c709590d20f31d79898030974f40cd73e68d","scripts":{"test":"vitest"},"_npmUser":{"name":"acusti","email":"andrew@acusti.ca"},"repository":{"url":"git+https://github.com/acusti/uikit.git","type":"git","directory":"packages/textual"},"_npmVersion":"10.9.2","description":"Utilities for transforming and formatting text (i.e. strings)","directories":{},"sideEffects":false,"_nodeVersion":"23.11.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.1","typescript":"5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/textual_0.8.0_1744399574495_0.4109523840432907","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@acusti/textual","version":"0.9.0","keywords":["utils","utilities","string","text","format","formatting","typescript","ts","isomorphic","universal"],"author":{"url":"https://www.acusti.ca","name":"andrew patton","email":"andrew@acusti.ca"},"license":"Unlicense","_id":"@acusti/textual@0.9.0","maintainers":[{"name":"acusti","email":"andrew@acusti.ca"}],"homepage":"https://github.com/acusti/uikit/tree/main/packages/textual#readme","bugs":{"url":"https://github.com/acusti/uikit/issues"},"dist":{"shasum":"6a4722c6481a167ae99f1f72cec634a08fc73a2c","tarball":"https://registry.npmjs.org/@acusti/textual/-/textual-0.9.0.tgz","fileCount":5,"integrity":"sha512-v/XDvHY/2A1Kwha0JMkss0hwOuqNNknTBlcKPDHAhxZ2CfT/7ruY6Ie+MvpoCqKHQAjsFF+9KAUi9kL6tLMBXg==","signatures":[{"sig":"MEUCIQCMddH+lJzipCk3cXeP7TDqzogNlOh2y6P8zaN6r9JpgAIgAuDY0pJlVWzsjSFjvp8TUDJM3ugaO0p3CDQj4stfHNQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7003},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"11ef240d8f08d99bbc9a65f62ec4274cf9c086a8","scripts":{"test":"vitest","build":"vite build"},"_npmUser":{"name":"acusti","email":"andrew@acusti.ca"},"repository":{"url":"git+https://github.com/acusti/uikit.git","type":"git","directory":"packages/textual"},"_npmVersion":"10.9.2","description":"Utilities for transforming and formatting text (i.e. strings)","directories":{},"sideEffects":false,"_nodeVersion":"23.11.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.3.5","vitest":"^3.1.4","typescript":"5.8.3","unplugin-dts":"^1.0.0-beta.0"},"_npmOperationalInternal":{"tmp":"tmp/textual_0.9.0_1748819288022_0.9272928357757035","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@acusti/textual","version":"0.10.0","type":"module","sideEffects":false,"exports":"./dist/index.js","main":"./dist/index.js","types":"./dist/index.d.ts","description":"Utilities for transforming and formatting text (i.e. strings)","keywords":["utils","utilities","string","text","format","formatting","typescript","ts","isomorphic","universal"],"scripts":{"test":"vitest","build":"vite build"},"repository":{"type":"git","url":"git+https://github.com/acusti/uikit.git","directory":"packages/textual"},"author":{"name":"andrew patton","email":"andrew@acusti.ca","url":"https://www.acusti.ca"},"license":"Unlicense","bugs":{"url":"https://github.com/acusti/uikit/issues"},"homepage":"https://github.com/acusti/uikit/tree/main/packages/textual#readme","devDependencies":{"typescript":"5.9.2","unplugin-dts":"^1.0.0-beta.6","vite":"^7.1.2","vitest":"^3.2.4"},"_id":"@acusti/textual@0.10.0","gitHead":"033905e307c2945a0a04f34df1045c4bc5207558","_nodeVersion":"24.1.0","_npmVersion":"11.3.0","dist":{"integrity":"sha512-Qmil949Rz7J1N+WXSHUXU+WR3mi2hO3bfgWlYJgwjg6YKfqNQtyoTewPXdtutFIRQjUXouB+syYi7C+zuvmfKw==","shasum":"6740a711a12e60d70d9de7ceb650807b34367c87","tarball":"https://registry.npmjs.org/@acusti/textual/-/textual-0.10.0.tgz","fileCount":5,"unpackedSize":17587,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCk/sN9mux0UtpRe9s9Oycqd/wJacuVMM74WdBqzmpQJAIhAI5O8ttveGavuCq4t9NOa6k1kq74MhK6yEnziu0ltiy0"}]},"_npmUser":{"name":"acusti","email":"andrew@acusti.ca"},"directories":{},"maintainers":[{"name":"acusti","email":"andrew@acusti.ca"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/textual_0.10.0_1756149204638_0.3048028173219013"},"_hasShrinkwrap":false}},"time":{"created":"2021-09-02T21:28:07.218Z","modified":"2025-08-25T19:13:24.998Z","0.1.0":"2021-09-02T21:28:07.406Z","0.2.0":"2022-03-14T21:59:07.861Z","0.3.0":"2022-12-02T02:18:03.251Z","0.4.0":"2023-12-28T19:03:16.151Z","0.4.1":"2024-01-22T21:44:09.321Z","0.5.0":"2024-01-23T17:39:59.650Z","0.6.0":"2024-03-15T17:18:47.763Z","0.6.1":"2024-03-15T17:25:07.814Z","0.7.0":"2024-12-19T16:55:27.817Z","0.8.0":"2025-04-11T19:26:14.680Z","0.9.0":"2025-06-01T23:08:08.201Z","0.10.0":"2025-08-25T19:13:24.824Z"},"bugs":{"url":"https://github.com/acusti/uikit/issues"},"author":{"name":"andrew patton","email":"andrew@acusti.ca","url":"https://www.acusti.ca"},"license":"Unlicense","homepage":"https://github.com/acusti/uikit/tree/main/packages/textual#readme","keywords":["utils","utilities","string","text","format","formatting","typescript","ts","isomorphic","universal"],"repository":{"type":"git","url":"git+https://github.com/acusti/uikit.git","directory":"packages/textual"},"description":"Utilities for transforming and formatting text (i.e. strings)","maintainers":[{"name":"acusti","email":"andrew@acusti.ca"}],"readme":"# @acusti/textual\n\n[![latest version](https://img.shields.io/npm/v/@acusti/textual?style=for-the-badge)](https://www.npmjs.com/package/@acusti/textual)\n[![maintenance status](https://img.shields.io/npms-io/maintenance-score/@acusti/textual?style=for-the-badge)](https://npms.io/search?q=%40acusti%2Ftextual)\n[![downloads per month](https://img.shields.io/npm/dm/@acusti/textual?style=for-the-badge)](https://www.npmjs.com/package/@acusti/textual)\n[![bundle size](https://deno.bundlejs.com/badge?q=@acusti/textual)](https://bundlejs.com/?q=%40acusti%2Ftextual)\n\nUtilities for transforming and formatting text (i.e. strings). These\nfunctions provide common text manipulation operations that are useful in UI\ndevelopment, from capitalizing text to extracting initials and parsing\nnames from email addresses.\n\n## Installation\n\n```bash\nnpm install @acusti/textual\n# or\nyarn add @acusti/textual\n```\n\n## Key Features\n\n- **Tree-shakeable** - All functions are named exports for optimal bundling\n- **Zero dependencies** - Lightweight with no external dependencies\n- **TypeScript support** - Fully typed with comprehensive type definitions\n- **Pure functions** - No side effects, always return new values\n- **Unicode aware** - Handles international characters correctly\n\n## Quick Start\n\n```js\nimport {\n    capitalize,\n    getInitials,\n    getNameFromEmail,\n} from '@acusti/textual';\n\n// Capitalize text like CSS text-transform: capitalize\nconst title = capitalize('hello world'); // => 'Hello World'\n\n// Extract initials from names\nconst initials = getInitials('John Doe Smith'); // => 'JDS'\n\n// Parse display name from email\nconst name = getNameFromEmail('john.doe@example.com'); // => 'John Doe'\n```\n\n## API Reference\n\n### `capitalize(text: string): string`\n\nReturns input text with equivalent formatting to the\n`text-transform: capitalize` CSS property. Capitalizes the first letter of\neach word.\n\n```js\nimport { capitalize } from '@acusti/textual';\n\ncapitalize('hello world'); // => 'Hello World'\ncapitalize('iOS app development'); // => 'IOS App Development'\ncapitalize('mary-jane watson'); // => 'Mary-Jane Watson'\ncapitalize('hello.world'); // => 'Hello.World'\ncapitalize(''); // => ''\n```\n\n**Parameters:**\n\n- `text` (string): The text to capitalize\n\n**Returns:**\n\n- (string): The capitalized text\n\n### `getInitials(name: string, maxLength?: number): string`\n\nExtracts uppercase initials from the input string. For single words, uses\nuppercase letters and numbers. For multiple words, uses the first character\nof each word.\n\n```js\nimport { getInitials } from '@acusti/textual';\n\n// Multiple words - first letter of each word\ngetInitials('John Doe Smith'); // => 'JDS'\ngetInitials('Mary-Jane Watson'); // => 'MJW'\ngetInitials('Dr. Martin Luther King Jr.'); // => 'DMLKJ'\n\n// Single words - uppercase letters and numbers\ngetInitials('iPhone'); // => 'PI'\ngetInitials('iOS15'); // => 'IOS'\ngetInitials('user123'); // => 'U'\n\n// Limit length\ngetInitials('Very Long Name Here', 2); // => 'VL'\ngetInitials('Single', 1); // => 'S'\n\n// Edge cases\ngetInitials(''); // => ''\ngetInitials('123'); // => ''\n```\n\n**Parameters:**\n\n- `name` (string): The name to extract initials from\n- `maxLength` (number, optional): Maximum number of initials to return.\n  Defaults to 3\n\n**Returns:**\n\n- (string): The uppercase initials\n\n### `getNameFromEmail(email: string): string`\n\nConverts an email address into a formatted display name by extracting the\nusername part and treating `.` and `+` as space separators.\n\n```js\nimport { getNameFromEmail } from '@acusti/textual';\n\ngetNameFromEmail('john.doe@example.com'); // => 'John Doe'\ngetNameFromEmail('mary.jane.watson@company.co.uk'); // => 'Mary Jane Watson'\ngetNameFromEmail('user+tag@domain.com'); // => 'User Tag'\ngetNameFromEmail('firstname.lastname+work@corp.com'); // => 'Firstname Lastname Work'\n\n// Handles edge cases\ngetNameFromEmail('singlename@example.com'); // => 'Singlename'\ngetNameFromEmail('user123@test.com'); // => 'User123'\ngetNameFromEmail(''); // => ''\ngetNameFromEmail('invalid-email'); // => 'Invalid Email'\n```\n\n**Parameters:**\n\n- `email` (string): The email address to extract a name from\n\n**Returns:**\n\n- (string): The formatted display name\n\n## Usage Examples\n\n### User Profile Display\n\n```tsx\nimport { getInitials, getNameFromEmail } from '@acusti/textual';\n\nfunction UserAvatar({ user }) {\n    const displayName = user.name || getNameFromEmail(user.email);\n    const initials = getInitials(displayName);\n\n    return (\n        <div className=\"user-avatar\">\n            <div className=\"avatar-circle\">\n                {user.avatar ? (\n                    <img src={user.avatar} alt={displayName} />\n                ) : (\n                    <span className=\"initials\">{initials}</span>\n                )}\n            </div>\n            <span className=\"display-name\">{displayName}</span>\n        </div>\n    );\n}\n```\n\n### Form Field Formatting\n\n```tsx\nimport { capitalize } from '@acusti/textual';\n\nfunction NameInput({ value, onChange }) {\n    const handleBlur = (e) => {\n        // Auto-capitalize names when user finishes editing\n        const capitalized = capitalize(e.target.value.toLowerCase());\n        onChange(capitalized);\n    };\n\n    return (\n        <input\n            type=\"text\"\n            value={value}\n            onChange={(e) => onChange(e.target.value)}\n            onBlur={handleBlur}\n            placeholder=\"Enter full name\"\n        />\n    );\n}\n```\n\n### Contact List\n\n```tsx\nimport { getInitials, capitalize } from '@acusti/textual';\n\nfunction ContactCard({ contact }) {\n    const initials = getInitials(contact.name);\n    const formattedName = capitalize(contact.name);\n\n    return (\n        <div className=\"contact-card\">\n            <div\n                className=\"contact-avatar\"\n                style={{ backgroundColor: getAvatarColor(initials) }}\n            >\n                {initials}\n            </div>\n            <div className=\"contact-info\">\n                <h3>{formattedName}</h3>\n                <p>{contact.email}</p>\n                <p>{contact.phone}</p>\n            </div>\n        </div>\n    );\n}\n\n// Helper function to generate consistent colors based on initials\nfunction getAvatarColor(initials) {\n    const colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7'];\n    const index = initials.charCodeAt(0) % colors.length;\n    return colors[index];\n}\n```\n\n### Email Suggestion\n\n```tsx\nimport { getNameFromEmail, capitalize } from '@acusti/textual';\n\nfunction EmailSignup({ email, onNameSuggest }) {\n    const suggestedName = email ? getNameFromEmail(email) : '';\n\n    return (\n        <form>\n            <input\n                type=\"email\"\n                value={email}\n                onChange={(e) => setEmail(e.target.value)}\n                placeholder=\"Enter your email\"\n            />\n\n            {suggestedName && (\n                <div className=\"name-suggestion\">\n                    <p>Is your name {capitalize(suggestedName)}?</p>\n                    <button\n                        type=\"button\"\n                        onClick={() =>\n                            onNameSuggest(capitalize(suggestedName))\n                        }\n                    >\n                        Yes, use this name\n                    </button>\n                </div>\n            )}\n        </form>\n    );\n}\n```\n\n### Team Member Directory\n\n```tsx\nimport {\n    getInitials,\n    getNameFromEmail,\n    capitalize,\n} from '@acusti/textual';\n\nfunction TeamDirectory({ members }) {\n    return (\n        <div className=\"team-directory\">\n            {members.map((member) => {\n                const displayName =\n                    member.name || getNameFromEmail(member.email);\n                const formattedName = capitalize(displayName);\n                const initials = getInitials(displayName);\n\n                return (\n                    <div key={member.id} className=\"team-member\">\n                        <div className=\"member-avatar\">\n                            {member.photo ? (\n                                <img\n                                    src={member.photo}\n                                    alt={formattedName}\n                                />\n                            ) : (\n                                <div\n                                    className=\"initials-avatar\"\n                                    title={formattedName}\n                                >\n                                    {initials}\n                                </div>\n                            )}\n                        </div>\n\n                        <div className=\"member-info\">\n                            <h3>{formattedName}</h3>\n                            <p className=\"role\">\n                                {capitalize(member.role || 'team member')}\n                            </p>\n                            <p className=\"department\">\n                                {capitalize(member.department || '')}\n                            </p>\n                        </div>\n                    </div>\n                );\n            })}\n        </div>\n    );\n}\n```\n\n### Comment System\n\n```tsx\nimport { getInitials, getNameFromEmail } from '@acusti/textual';\n\nfunction CommentCard({ comment }) {\n    const authorName =\n        comment.author?.name ||\n        getNameFromEmail(comment.author?.email || '');\n    const authorInitials = getInitials(authorName);\n\n    return (\n        <div className=\"comment\">\n            <div className=\"comment-avatar\">\n                <span className=\"avatar-text\">{authorInitials}</span>\n            </div>\n\n            <div className=\"comment-content\">\n                <div className=\"comment-header\">\n                    <span className=\"author-name\">{authorName}</span>\n                    <time className=\"comment-date\">\n                        {new Date(comment.createdAt).toLocaleDateString()}\n                    </time>\n                </div>\n\n                <p className=\"comment-text\">{comment.text}</p>\n            </div>\n        </div>\n    );\n}\n```\n\n## Common Use Cases\n\n- **User avatars** - Generate initials for profile pictures\n- **Display names** - Create readable names from email addresses\n- **Form validation** - Auto-capitalize user input for consistency\n- **Contact lists** - Format names consistently across the application\n- **User onboarding** - Suggest display names during account creation\n- **Team directories** - Display member information uniformly\n- **Comment systems** - Show author names and initials\n- **Email templates** - Format recipient names properly\n\n## Best Practices\n\n### Input Sanitization\n\nAlways validate input before processing:\n\n```js\nimport { capitalize, getInitials } from '@acusti/textual';\n\nfunction safeCapitalize(input) {\n    if (typeof input !== 'string') return '';\n    return capitalize(input.trim());\n}\n\nfunction safeGetInitials(input, maxLength = 3) {\n    if (typeof input !== 'string') return '';\n    return getInitials(input.trim(), maxLength);\n}\n```\n\n### Internationalization\n\nThe functions works fully with unicode characters where the concept of\ncapitalization makes sense.\n\n```js\nimport { capitalize } from '@acusti/textual';\n\n// Works with international characters\ncapitalize('josé maría'); // => 'José María'\ncapitalize('björk guðmundsdóttir'); // => 'Björk Guðmundsdóttir'\ncapitalize('ælfgyva'); // => 'Ælfgyva'\ngetInitials('ólafur arnalds'); // => 'ÓA'\n```\n\n### Performance\n\nAll functions are optimized for performance and can handle large datasets:\n\n```js\nimport { getInitials } from '@acusti/textual';\n\n// Efficient for processing large lists\nconst userInitials = users.map((user) => ({\n    ...user,\n    initials: getInitials(user.name),\n}));\n```\n","readmeFilename":"README.md"}