tiny-essentials 1.21.3 → 1.21.5

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.
@@ -2526,6 +2526,27 @@ class TinyHtml {
2526
2526
  blur() {
2527
2527
  return TinyHtml.blur(this);
2528
2528
  }
2529
+ /**
2530
+ * Select the text content of an input or textarea element.
2531
+ *
2532
+ * @param {TinyHtml|HTMLInputElement|HTMLTextAreaElement} el - The element or a selector string.
2533
+ * @returns {TinyHtml|HTMLInputElement|HTMLTextAreaElement}
2534
+ */
2535
+ static select(el) {
2536
+ const elem = TinyHtml._preHtmlElem(el, 'select');
2537
+ if (elem instanceof HTMLInputElement || elem instanceof HTMLTextAreaElement)
2538
+ elem.select();
2539
+ else
2540
+ throw new Error('Element must be an <input> or <textarea> to use select().');
2541
+ return el;
2542
+ }
2543
+ /**
2544
+ * Select the text content of an input or textarea element.
2545
+ * @returns {TinyHtml|HTMLInputElement|HTMLTextAreaElement}
2546
+ */
2547
+ select() {
2548
+ return TinyHtml.select(this);
2549
+ }
2529
2550
  /**
2530
2551
  * Interprets a value as a boolean `true` if it matches a common truthy representation.
2531
2552
  *
@@ -3445,6 +3466,170 @@ class TinyHtml {
3445
3466
  id() {
3446
3467
  return TinyHtml.id(this);
3447
3468
  }
3469
+ /**
3470
+ * Returns the BigInt content of the element.
3471
+ * @param {TinyElement} el - Target element.
3472
+ * @returns {bigint|null} The BigInt content or null if none.
3473
+ */
3474
+ static toBigInt(el) {
3475
+ const elem = TinyHtml._preElem(el, 'toBigInt');
3476
+ const txt = elem.textContent?.trim();
3477
+ let value = null;
3478
+ try {
3479
+ value = BigInt(txt ?? '');
3480
+ }
3481
+ catch {
3482
+ value = null;
3483
+ }
3484
+ return value;
3485
+ }
3486
+ /**
3487
+ * Returns the BigInt content of the element.
3488
+ * @returns {bigint|null}
3489
+ */
3490
+ toBigInt() {
3491
+ return TinyHtml.toBigInt(this);
3492
+ }
3493
+ /**
3494
+ * Set BigInt content of elements.
3495
+ * @param {TinyElement|TinyElement[]} el
3496
+ * @param {bigint} value
3497
+ * @returns {TinyElement|TinyElement[]}
3498
+ */
3499
+ static setBigInt(el, value) {
3500
+ if (typeof value !== 'bigint')
3501
+ throw new Error('Value is not a valid BigInt.');
3502
+ TinyHtml._preElems(el, 'setBigInt').forEach((el) => (el.textContent = value.toString()));
3503
+ return el;
3504
+ }
3505
+ /**
3506
+ * Set BigInt content of the element.
3507
+ * @param {bigint} value
3508
+ * @returns {TinyElement|TinyElement[]}
3509
+ */
3510
+ setBigInt(value) {
3511
+ return TinyHtml.setBigInt(this, value);
3512
+ }
3513
+ /**
3514
+ * Returns the Date content of the element.
3515
+ * @param {TinyElement} el - Target element.
3516
+ * @returns {Date|null} The Date content or null if invalid.
3517
+ */
3518
+ static toDate(el) {
3519
+ const elem = TinyHtml._preElem(el, 'toDate');
3520
+ const txt = elem.textContent?.trim();
3521
+ if (!txt)
3522
+ return null;
3523
+ const d = new Date(txt);
3524
+ return Number.isNaN(d.getTime()) ? null : d;
3525
+ }
3526
+ /**
3527
+ * Returns the Date content of the element.
3528
+ * @returns {Date|null}
3529
+ */
3530
+ toDate() {
3531
+ return TinyHtml.toDate(this);
3532
+ }
3533
+ /**
3534
+ * Set Date content of elements.
3535
+ * @param {TinyElement|TinyElement[]} el
3536
+ * @param {Date} value
3537
+ * @returns {TinyElement|TinyElement[]}
3538
+ */
3539
+ static setDate(el, value) {
3540
+ if (!(value instanceof Date) || Number.isNaN(value.getTime()))
3541
+ throw new Error('Value is not a valid Date.');
3542
+ TinyHtml._preElems(el, 'setDate').forEach((el) => (el.textContent = value.toISOString()));
3543
+ return el;
3544
+ }
3545
+ /**
3546
+ * Set Date content of the element.
3547
+ * @param {Date} value
3548
+ * @returns {TinyElement|TinyElement[]}
3549
+ */
3550
+ setDate(value) {
3551
+ return TinyHtml.setDate(this, value);
3552
+ }
3553
+ /**
3554
+ * Returns the JSON content of the element.
3555
+ * @param {TinyElement} el - Target element.
3556
+ * @returns {any|null} The parsed JSON content or null if invalid.
3557
+ */
3558
+ static toJson(el) {
3559
+ const elem = TinyHtml._preElem(el, 'toJson');
3560
+ const txt = elem.textContent?.trim();
3561
+ if (!txt)
3562
+ return null;
3563
+ try {
3564
+ return JSON.parse(txt);
3565
+ }
3566
+ catch {
3567
+ return null;
3568
+ }
3569
+ }
3570
+ /**
3571
+ * Returns the JSON content of the element.
3572
+ * @returns {any|null}
3573
+ */
3574
+ toJson() {
3575
+ return TinyHtml.toJson(this);
3576
+ }
3577
+ /**
3578
+ * Set JSON content of elements.
3579
+ * @param {TinyElement|TinyElement[]} el
3580
+ * @param {any} value
3581
+ * @param {number|string} [space] - Indentation level or string for formatting.
3582
+ * @returns {TinyElement|TinyElement[]}
3583
+ */
3584
+ static setJson(el, value, space) {
3585
+ TinyHtml._preElems(el, 'setJson').forEach((el) => (el.textContent = JSON.stringify(value, null, space)));
3586
+ return el;
3587
+ }
3588
+ /**
3589
+ * Set JSON content of the element.
3590
+ * @param {any} value
3591
+ * @param {number|string} [space] - Indentation level or string for formatting.
3592
+ * @returns {TinyElement|TinyElement[]}
3593
+ */
3594
+ setJson(value, space) {
3595
+ return TinyHtml.setJson(this, value, space);
3596
+ }
3597
+ /**
3598
+ * Returns the number content of the element.
3599
+ * @param {TinyElement} el - Target element.
3600
+ * @returns {number|null} The text content or null if none.
3601
+ */
3602
+ static toNumber(el) {
3603
+ const elem = TinyHtml._preElem(el, 'toNumber');
3604
+ return typeof elem.textContent === 'string' ? parseFloat(elem.textContent.trim()) : null;
3605
+ }
3606
+ /**
3607
+ * Returns the number content of the element.
3608
+ * @returns {number|null} The text content or null if none.
3609
+ */
3610
+ toNumber() {
3611
+ return TinyHtml.toNumber(this);
3612
+ }
3613
+ /**
3614
+ * Set number content of elements.
3615
+ * @param {TinyElement|TinyElement[]} el
3616
+ * @param {number} value
3617
+ * @returns {TinyElement|TinyElement[]}
3618
+ */
3619
+ static setNumber(el, value) {
3620
+ if (typeof value !== 'number')
3621
+ throw new Error('Value is not a valid number.');
3622
+ TinyHtml._preElems(el, 'setNumber').forEach((el) => (el.textContent = value.toString()));
3623
+ return el;
3624
+ }
3625
+ /**
3626
+ * Set number content of the element.
3627
+ * @param {number} value
3628
+ * @returns {TinyElement|TinyElement[]}
3629
+ */
3630
+ setNumber(value) {
3631
+ return TinyHtml.setNumber(this, value);
3632
+ }
3448
3633
  /**
3449
3634
  * Returns the text content of the element.
3450
3635
  * @param {TinyElement} el - Target element.
@@ -4056,135 +4241,155 @@ class TinyHtml {
4056
4241
  * Registers an event listener on the specified element.
4057
4242
  *
4058
4243
  * @param {TinyEventTarget|TinyEventTarget[]} el - The target to listen on.
4059
- * @param {string} event - The event type (e.g. 'click', 'keydown').
4244
+ * @param {string|string[]} events - The event type (e.g. 'click', 'keydown').
4060
4245
  * @param {EventListenerOrEventListenerObject|null} handler - The callback function to run on event.
4061
4246
  * @param {EventRegistryOptions} [options] - Optional event listener options.
4062
4247
  * @returns {TinyEventTarget|TinyEventTarget[]}
4063
4248
  */
4064
- static on(el, event, handler, options) {
4065
- if (typeof event !== 'string')
4066
- throw new TypeError('The event name must be a string.');
4067
- TinyHtml._preEventTargetElems(el, 'on').forEach((elem) => {
4068
- elem.addEventListener(event, handler, options);
4069
- if (!__eventRegistry.has(elem))
4070
- __eventRegistry.set(elem, {});
4071
- const events = __eventRegistry.get(elem);
4072
- if (!events)
4073
- return;
4074
- if (!Array.isArray(events[event]))
4075
- events[event] = [];
4076
- events[event].push({ handler, options });
4077
- });
4249
+ static on(el, events, handler, options) {
4250
+ if (typeof events !== 'string' &&
4251
+ (!Array.isArray(events) || !events.every((event) => typeof event === 'string')))
4252
+ throw new TypeError('The events must be a string or array of strings.');
4253
+ for (const event of Array.isArray(events) ? Array.from(new Set(events)) : [events]) {
4254
+ if (typeof event !== 'string')
4255
+ throw new TypeError('The event name must be a string.');
4256
+ TinyHtml._preEventTargetElems(el, 'on').forEach((elem) => {
4257
+ elem.addEventListener(event, handler, options);
4258
+ if (!__eventRegistry.has(elem))
4259
+ __eventRegistry.set(elem, {});
4260
+ const events = __eventRegistry.get(elem);
4261
+ if (!events)
4262
+ return;
4263
+ if (!Array.isArray(events[event]))
4264
+ events[event] = [];
4265
+ events[event].push({ handler, options });
4266
+ });
4267
+ }
4078
4268
  return el;
4079
4269
  }
4080
4270
  /**
4081
4271
  * Registers an event listener on the specified element.
4082
4272
  *
4083
- * @param {string} event - The event type (e.g. 'click', 'keydown').
4273
+ * @param {string|string[]} events - The event type (e.g. 'click', 'keydown').
4084
4274
  * @param {EventListenerOrEventListenerObject|null} handler - The callback function to run on event.
4085
4275
  * @param {EventRegistryOptions} [options] - Optional event listener options.
4086
4276
  * @returns {TinyEventTarget|TinyEventTarget[]}
4087
4277
  */
4088
- on(event, handler, options) {
4089
- return TinyHtml.on(this, event, handler, options);
4278
+ on(events, handler, options) {
4279
+ return TinyHtml.on(this, events, handler, options);
4090
4280
  }
4091
4281
  /**
4092
4282
  * Registers an event listener that runs only once, then is removed.
4093
4283
  *
4094
4284
  * @param {TinyEventTarget|TinyEventTarget[]} el - The target to listen on.
4095
- * @param {string} event - The event type (e.g. 'click', 'keydown').
4285
+ * @param {string|string[]} events - The event type (e.g. 'click', 'keydown').
4096
4286
  * @param {EventListenerOrEventListenerObject} handler - The callback function to run on event.
4097
4287
  * @param {EventRegistryOptions} [options={}] - Optional event listener options.
4098
4288
  * @returns {TinyEventTarget|TinyEventTarget[]}
4099
4289
  */
4100
- static once(el, event, handler, options = {}) {
4101
- if (typeof event !== 'string')
4102
- throw new TypeError('The event name must be a string.');
4103
- TinyHtml._preEventTargetElems(el, 'once').forEach((elem) => {
4104
- /** @type {EventListenerOrEventListenerObject} */
4105
- const wrapped = (e) => {
4106
- TinyHtml.off(elem, event, wrapped);
4107
- if (typeof handler === 'function')
4108
- handler(e);
4109
- };
4110
- TinyHtml.on(elem, event, wrapped, typeof options === 'boolean' ? options : { ...options, once: true });
4111
- });
4290
+ static once(el, events, handler, options = {}) {
4291
+ if (typeof events !== 'string' &&
4292
+ (!Array.isArray(events) || !events.every((event) => typeof event === 'string')))
4293
+ throw new TypeError('The events must be a string or array of strings.');
4294
+ for (const event of Array.isArray(events) ? Array.from(new Set(events)) : [events]) {
4295
+ if (typeof event !== 'string')
4296
+ throw new TypeError('The event name must be a string.');
4297
+ TinyHtml._preEventTargetElems(el, 'once').forEach((elem) => {
4298
+ /** @type {EventListenerOrEventListenerObject} */
4299
+ const wrapped = (e) => {
4300
+ TinyHtml.off(elem, event, wrapped);
4301
+ if (typeof handler === 'function')
4302
+ handler(e);
4303
+ };
4304
+ TinyHtml.on(elem, event, wrapped, typeof options === 'boolean' ? options : { ...options, once: true });
4305
+ });
4306
+ }
4112
4307
  return el;
4113
4308
  }
4114
4309
  /**
4115
4310
  * Registers an event listener that runs only once, then is removed.
4116
4311
  *
4117
- * @param {string} event - The event type (e.g. 'click', 'keydown').
4312
+ * @param {string|string[]} events - The event type (e.g. 'click', 'keydown').
4118
4313
  * @param {EventListenerOrEventListenerObject} handler - The callback function to run on event.
4119
4314
  * @param {EventRegistryOptions} [options={}] - Optional event listener options.
4120
4315
  * @returns {TinyEventTarget|TinyEventTarget[]}
4121
4316
  */
4122
- once(event, handler, options = {}) {
4123
- return TinyHtml.once(this, event, handler, options);
4317
+ once(events, handler, options = {}) {
4318
+ return TinyHtml.once(this, events, handler, options);
4124
4319
  }
4125
4320
  /**
4126
4321
  * Removes a specific event listener from an element.
4127
4322
  *
4128
4323
  * @param {TinyEventTarget|TinyEventTarget[]} el - The target element.
4129
- * @param {string} event - The event type.
4324
+ * @param {string|string[]} events - The event type.
4130
4325
  * @param {EventListenerOrEventListenerObject|null} handler - The function originally bound to the event.
4131
4326
  * @param {boolean|EventListenerOptions} [options] - Optional listener options.
4132
4327
  * @returns {TinyEventTarget|TinyEventTarget[]}
4133
4328
  */
4134
- static off(el, event, handler, options) {
4135
- if (typeof event !== 'string')
4136
- throw new TypeError('The event name must be a string.');
4137
- TinyHtml._preEventTargetElems(el, 'off').forEach((elem) => {
4138
- elem.removeEventListener(event, handler, options);
4139
- const events = __eventRegistry.get(elem);
4140
- if (events && events[event]) {
4141
- events[event] = events[event].filter((entry) => entry.handler !== handler);
4142
- if (events[event].length === 0)
4143
- delete events[event];
4144
- }
4145
- });
4329
+ static off(el, events, handler, options) {
4330
+ if (typeof events !== 'string' &&
4331
+ (!Array.isArray(events) || !events.every((event) => typeof event === 'string')))
4332
+ throw new TypeError('The events must be a string or array of strings.');
4333
+ for (const event of Array.isArray(events) ? Array.from(new Set(events)) : [events]) {
4334
+ if (typeof event !== 'string')
4335
+ throw new TypeError('The event name must be a string.');
4336
+ TinyHtml._preEventTargetElems(el, 'off').forEach((elem) => {
4337
+ elem.removeEventListener(event, handler, options);
4338
+ const events = __eventRegistry.get(elem);
4339
+ if (events && events[event]) {
4340
+ events[event] = events[event].filter((entry) => entry.handler !== handler);
4341
+ if (events[event].length === 0)
4342
+ delete events[event];
4343
+ }
4344
+ });
4345
+ }
4146
4346
  return el;
4147
4347
  }
4148
4348
  /**
4149
4349
  * Removes a specific event listener from an element.
4150
4350
  *
4151
- * @param {string} event - The event type.
4351
+ * @param {string|string[]} events - The event type.
4152
4352
  * @param {EventListenerOrEventListenerObject|null} handler - The function originally bound to the event.
4153
4353
  * @param {boolean|EventListenerOptions} [options] - Optional listener options.
4154
4354
  * @returns {TinyEventTarget|TinyEventTarget[]}
4155
4355
  */
4156
- off(event, handler, options) {
4157
- return TinyHtml.off(this, event, handler, options);
4356
+ off(events, handler, options) {
4357
+ return TinyHtml.off(this, events, handler, options);
4158
4358
  }
4159
4359
  /**
4160
4360
  * Removes all event listeners of a specific type from the element.
4161
4361
  *
4162
4362
  * @param {TinyEventTarget|TinyEventTarget[]} el - The target element.
4163
- * @param {string} event - The event type to remove (e.g. 'click').
4363
+ * @param {string|string[]} events - The event type to remove (e.g. 'click').
4164
4364
  * @returns {TinyEventTarget|TinyEventTarget[]}
4165
4365
  */
4166
- static offAll(el, event) {
4167
- if (typeof event !== 'string')
4168
- throw new TypeError('The event name must be a string.');
4169
- TinyHtml._preEventTargetElems(el, 'offAll').forEach((elem) => {
4170
- const events = __eventRegistry.get(elem);
4171
- if (events && events[event]) {
4172
- for (const entry of events[event]) {
4173
- elem.removeEventListener(event, entry.handler, entry.options);
4366
+ static offAll(el, events) {
4367
+ if (typeof events !== 'string' &&
4368
+ (!Array.isArray(events) || !events.every((event) => typeof event === 'string')))
4369
+ throw new TypeError('The events must be a string or array of strings.');
4370
+ for (const event of Array.isArray(events) ? Array.from(new Set(events)) : [events]) {
4371
+ if (typeof event !== 'string')
4372
+ throw new TypeError('The event name must be a string.');
4373
+ TinyHtml._preEventTargetElems(el, 'offAll').forEach((elem) => {
4374
+ const events = __eventRegistry.get(elem);
4375
+ if (events && events[event]) {
4376
+ for (const entry of events[event]) {
4377
+ elem.removeEventListener(event, entry.handler, entry.options);
4378
+ }
4379
+ delete events[event];
4174
4380
  }
4175
- delete events[event];
4176
- }
4177
- });
4381
+ });
4382
+ }
4178
4383
  return el;
4179
4384
  }
4180
4385
  /**
4181
4386
  * Removes all event listeners of a specific type from the element.
4182
4387
  *
4183
- * @param {string} event - The event type to remove (e.g. 'click').
4388
+ * @param {string|string[]} events - The event type to remove (e.g. 'click').
4184
4389
  * @returns {TinyEventTarget|TinyEventTarget[]}
4185
4390
  */
4186
- offAll(event) {
4187
- return TinyHtml.offAll(this, event);
4391
+ offAll(events) {
4392
+ return TinyHtml.offAll(this, events);
4188
4393
  }
4189
4394
  /**
4190
4395
  * Removes all event listeners of all types from the element.
@@ -4226,34 +4431,39 @@ class TinyHtml {
4226
4431
  * Triggers all handlers associated with a specific event on the given element.
4227
4432
  *
4228
4433
  * @param {TinyEventTarget|TinyEventTarget[]} el - Target element where the event should be triggered.
4229
- * @param {string} event - Name of the event to trigger.
4434
+ * @param {string|string[]} events - Name of the event to trigger.
4230
4435
  * @param {Event|CustomEvent|CustomEventInit} [payload] - Optional event object or data to pass.
4231
4436
  * @returns {TinyEventTarget|TinyEventTarget[]}
4232
4437
  */
4233
- static trigger(el, event, payload = {}) {
4234
- if (typeof event !== 'string')
4235
- throw new TypeError('The event name must be a string.');
4236
- TinyHtml._preEventTargetElems(el, 'trigger').forEach((elem) => {
4237
- const evt = payload instanceof Event || payload instanceof CustomEvent
4238
- ? payload
4239
- : new CustomEvent(event, {
4240
- bubbles: true,
4241
- cancelable: true,
4242
- detail: payload,
4243
- });
4244
- elem.dispatchEvent(evt);
4245
- });
4438
+ static trigger(el, events, payload = {}) {
4439
+ if (typeof events !== 'string' &&
4440
+ (!Array.isArray(events) || !events.every((event) => typeof event === 'string')))
4441
+ throw new TypeError('The events must be a string or array of strings.');
4442
+ for (const event of Array.isArray(events) ? Array.from(new Set(events)) : [events]) {
4443
+ if (typeof event !== 'string')
4444
+ throw new TypeError('The event name must be a string.');
4445
+ TinyHtml._preEventTargetElems(el, 'trigger').forEach((elem) => {
4446
+ const evt = payload instanceof Event || payload instanceof CustomEvent
4447
+ ? payload
4448
+ : new CustomEvent(event, {
4449
+ bubbles: true,
4450
+ cancelable: true,
4451
+ detail: payload,
4452
+ });
4453
+ elem.dispatchEvent(evt);
4454
+ });
4455
+ }
4246
4456
  return el;
4247
4457
  }
4248
4458
  /**
4249
4459
  * Triggers all handlers associated with a specific event on the given element.
4250
4460
  *
4251
- * @param {string} event - Name of the event to trigger.
4461
+ * @param {string|string[]} events - Name of the event to trigger.
4252
4462
  * @param {Event|CustomEvent|CustomEventInit} [payload] - Optional event object or data to pass.
4253
4463
  * @returns {TinyEventTarget|TinyEventTarget[]}
4254
4464
  */
4255
- trigger(event, payload = {}) {
4256
- return TinyHtml.trigger(this, event, payload);
4465
+ trigger(events, payload = {}) {
4466
+ return TinyHtml.trigger(this, events, payload);
4257
4467
  }
4258
4468
  ///////////////////////////////////////////////////////////////
4259
4469
  /**
@@ -587,6 +587,17 @@ Checks whether the element exists at the given index.
587
587
 
588
588
  ---
589
589
 
590
+ ### `forEach(callback)`
591
+
592
+ Iterates over all elements in the current instance, executing the provided callback on each one.
593
+
594
+ * **Parameters**:
595
+
596
+ * `callback`: `(element: TinyHtml, index: number, items: TinyHtml[]) => void`
597
+ Function invoked for each element. Receives the current `TinyHtml`, its index, and the full list.
598
+
599
+ ---
600
+
590
601
  ### `get(index)`
591
602
  Returns the raw DOM element associated with this instance.
592
603
 
@@ -1317,6 +1328,89 @@ element.id(); // → "my-element-id"
1317
1328
 
1318
1329
  ---
1319
1330
 
1331
+ ### 📝 `.toBigInt()` / `TinyHtml.toBigInt(el)`
1332
+
1333
+ Gets the **BigInt** content of the element (returns `null` if invalid or empty).
1334
+
1335
+ ```js
1336
+ element.toBigInt(); // → 123n
1337
+ ```
1338
+
1339
+ ---
1340
+
1341
+ ### ✍️ `.setBigInt(value)` / `TinyHtml.setBigInt(el, value)`
1342
+
1343
+ Sets the **BigInt** content of one or more elements. Throws if `value` is not a BigInt.
1344
+
1345
+ ```js
1346
+ element.setBigInt(456n);
1347
+ ```
1348
+
1349
+ ---
1350
+
1351
+ ### 📝 `.toDate()` / `TinyHtml.toDate(el)`
1352
+
1353
+ Gets the **Date** content of the element (returns `null` if invalid).
1354
+
1355
+ ```js
1356
+ element.toDate(); // → 2025-08-31T00:00:00.000Z
1357
+ ```
1358
+
1359
+ ---
1360
+
1361
+ ### ✍️ `.setDate(value)` / `TinyHtml.setDate(el, value)`
1362
+
1363
+ Sets the **Date** content of one or more elements. Throws if `value` is not a valid `Date`.
1364
+
1365
+ ```js
1366
+ element.setDate(new Date("2025-08-31T00:00:00Z"));
1367
+ ```
1368
+
1369
+ ---
1370
+
1371
+ ### 📝 `.toJson()` / `TinyHtml.toJson(el)`
1372
+
1373
+ Gets the **JSON** content of the element (returns `null` if invalid or empty).
1374
+
1375
+ ```js
1376
+ element.toJson(); // → { a: 1, b: 2 }
1377
+ ```
1378
+
1379
+ ---
1380
+
1381
+ ### ✍️ `.setJson(value, space)` / `TinyHtml.setJson(el, value, space)`
1382
+
1383
+ Sets the **JSON** content of one or more elements.
1384
+ `space` is optional and can be a number or string for indentation.
1385
+
1386
+ ```js
1387
+ element.setJson({ a: 1, b: 2 }); // minified
1388
+ element.setJson({ a: 1, b: 2 }, 2); // 2-space indentation
1389
+ element.setJson({ a: 1, b: 2 }, "\t"); // tab indentation
1390
+ ```
1391
+
1392
+ ---
1393
+
1394
+ ### 📝 `.toNumber()` / `TinyHtml.toNumber(el)`
1395
+
1396
+ Gets the **number** content of the element (returns `null` if invalid or empty).
1397
+
1398
+ ```js
1399
+ element.toNumber(); // → 42
1400
+ ```
1401
+
1402
+ ---
1403
+
1404
+ ### ✍️ `.setNumber(value)` / `TinyHtml.setNumber(el, value)`
1405
+
1406
+ Sets the **number** content of one or more elements. Throws if `value` is not a number.
1407
+
1408
+ ```js
1409
+ element.setNumber(99);
1410
+ ```
1411
+
1412
+ ---
1413
+
1320
1414
  ### 📝 `.text()` / `TinyHtml.text(el)`
1321
1415
 
1322
1416
  Gets the text content of the element (returns `null` if none).
@@ -2238,6 +2332,20 @@ tinyElem.blur();
2238
2332
 
2239
2333
  ---
2240
2334
 
2335
+ ### 🖊️ `TinyHtml.select(el)` / `el.select()`
2336
+
2337
+ Selects all the text inside the given element.
2338
+
2339
+ ```js
2340
+ TinyHtml.select(element);
2341
+ // or
2342
+ tinyElem.select();
2343
+ ```
2344
+
2345
+ ⚠️ Throws an error if the target element is not an `<input>` or `<textarea>`.
2346
+
2347
+ ---
2348
+
2241
2349
  ## 🌐 Window Scroll & Viewport Helpers
2242
2350
 
2243
2351
  These methods let you control and query scroll positions and viewport size with simple, readable functions.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tiny-essentials",
3
- "version": "1.21.3",
3
+ "version": "1.21.5",
4
4
  "description": "Collection of small, essential scripts designed to be used across various projects. These simple utilities are crafted for speed, ease of use, and versatility.",
5
5
  "scripts": {
6
6
  "test": "npm run test:mjs && npm run test:cjs && npm run test:js",